Wiaan Mulder's late three-wicket burst meant South Africa would be batting again on day three when they bowled out the West Indies for 149 at the end of day two of the second Test in St Lucia on Saturday.
SCORECARD | West Indies v Proteas - 2nd Test
Mulder (3/1) removed Joshua Da Silva (7), Kemar Roach (1) and Jayden Seales (0) in quick succession to leave the hosts teetering on the brink.
Keshav Maharaj (2/47) collected Jermaine Blackwood to end the West Indies' innings and ensured that the Proteas would be batting with a lead of 149 on the third morning on Sunday.
Mulder's mesmeric spell saw the West Indies slip from 143/6 to 146/9, erasing the hard work done by Shai Hope (43) and Blackwood (49).
Their partnership helped the West Indies recover from 54/4 and avoid the shame of following on after winning the toss and bowling first.
Hope, who hasn't crossed 50 in his last 18 Test innings, had knuckled down for the fight. He mixed crisp driving with judicious defence.
That wasn't enough as Lungi Ngidi's (2/27) off-cutter that kept slightly low took the inside edge of his bat and cannoned into his stumps.
The partnership between Blackwood and Hope was worth 43, but psychologically, it was double its worth in gold.
Having slipped to 30/3 after the losses of Kraigg Braithwaite (0), Kieran Powell (5) and Roston Chase (4), the follow-on became a real prospect when Kyle Mayers (12) fell at 54.
Blackwood, who surpassed 2000 Test runs when he got to 44, channelled rare self-denial, especially after Hope's loss.
That self-denial was beyond Jason Holder (10), who, after being worked over by Kagiso Rabada (2/24), spooned a catch to Keegan Petersen at gully.
While Hope's wicket fell with the score on 97, Holder's scalp fell with the score on 115, leaving them a lot to do after the excellent pre-lunch bowling display that saw them bowl out South Africa for 298.
They denied De Kock (96) a second consecutive Test ton when Hope caught him at gully off Mayers.
They also precipitated a mini-collapse that did not allow SA to get past 300, but the work was undone when Brathwaite was out the first ball to Rabada through a leg-side catch that required a review.
Powell's review could not save him from being trapped leg-before by Ngidi while Chase was snared by Kyle Verreynne at backward short-leg off Anrich Nortje (1/41).
Mayer threw his wicket away when he wafted at a wide Maharaj delivery that Aiden Markram caught at first slip.