IOL
Rassie Erasmus calls injury crisis a myth as he has mega options with Junior Springboks coming through
Springbok coach Rassie Erasmus says he has plenty of selection options as players return from injury and youngsters put up their hands.
IOL
Witness statements, CCTV footage bring police closer to Cleveland mass shooting suspects
Police say they are closing in on suspects behind the Cleveland informal settlement mass shooting after obtaining statements from survivors and gathering crucial CCTV footage.
The Citizen
Recipe of the day: Coconut water tequila cocktail, the perfect FIFA World Cup opening night sip
With the 2026 FIFA World Cup kicking off tonight, South Africans are gearing up for an exciting but very late evening of football. The opening ceremony and first match will run deep into the night, which means many fans might skip a big meal and reach for something lighter to enjoy while cheering on the teams. This simple Coconut Water Tequila Cocktail is the ideal solution. Coconut water-based and super refreshing, it’s light enough for late-night sipping without weighing you down. Coconut water is also having a major moment right now, thanks to Trim’s infectious hit song of the same name that’s been dominating playlists across Mzansi and beyond. As summer entertaining kicks into high gear, easy, low-lift cocktails like this one are becoming must-haves for backyard braais, beach weekends, and big sporting events. This two-ingredient wonder pairs Vita Coco Original Coconut Water with Teremana Tequila for a clean, tropical twist that’s never overly sweet or heavy. Coconut water is a naturally light, subtly sweet tropical flavour with hydrating electrolytes, while tequila adds smooth citrus and agave notes. The result is a balanced, sessionable drink that feels like a mini-vacation in a glass, perfect for everything from casual gatherings to staying sharp while watching the World Cup. Coconut Water Tequila Cocktail Recipe Serves: 1 Ingredients: 4 oz Vita Coco Original Coconut Water 1.5 oz Teremana Tequila Lime wedge or wheel, for garnish Method: Build the drink directly in a glass filled with ice. Stir gently to combine. Garnish with a fresh lime wedge or wheel. Serve in a highball or rocks glass and enjoy immediately. It takes under a minute to make, leaving you plenty of time to settle in before kick-off. Pro Tip: Keep a few cans of Vita Coco chilled in the fridge so you can whip these up all tournament long. The electrolytes make it a smarter choice when you’re planning a long night of football. Whether you’re hosting friends for the World Cup or just looking for an easy summer sipper, this Coconut Water Tequila Cocktail delivers maximum refreshment with minimum effort. Cheers to the beautiful game and great summer vibes! Print Recipe of the day: Coconut water tequila cocktail, the perfect FIFA World Cup opening night sip Coconut water brings a naturally light, subtly sweet tropical flavour with hydrating electrolytes, while tequila adds smooth citrus and agave notes. The result is a balanced, sessionable drink that feels like a mini-vacation in a glass. Author: Kaunda Selisho Ingredients Ingredients: 4 oz Vita Coco Original Coconut Water 1.5 oz Teremana Tequila Lime wedge or wheel, for garnish Instructions Method: Build the drink directly in a glass filled with ice. Stir gently to combine. Garnish with a fresh lime wedge or wheel. window.trCommon={"minRating":6,"ajaxurl":"https:\/\/www.citizen.co.za\/wp-admin\/admin-ajax.php","ratingNonce":"","postId":4516092}; window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.smoothScroll = { init() { document.addEventListener( 'click', ( e ) => { let anchor = e.target; if ( anchor.tagName !== 'A' ) { anchor = anchor.closest( 'a.tasty-recipes-scrollto' ); } if ( ! anchor || ! anchor.classList.contains( 'tasty-recipes-scrollto' ) ) { return; } const elementHref = anchor.getAttribute( 'href' ); if ( ! elementHref ) { return; } e.preventDefault(); this.goToSelector( elementHref ); }); }, goToSelector( selector ) { const element = document.querySelector( selector ); if ( ! element ) { return; } element.scrollIntoView( { behavior: 'smooth' } ); } }; document.addEventListener( 'DOMContentLoaded', () => window.TastyRecipes.smoothScroll.init() ); window.TastyRecipes = window.TastyRecipes || {}; window.TastyRecipes.staticTooltip = { element: null, tooltipElement: null, deleting: false, init( element ) { if ( this.deleting ) { return; } this.element = element; this.buildElements(); }, destroy() { if ( ! this.tooltipElement || this.deleting ) { return; } this.deleting = true; this.tooltipElement.classList.remove( 'opened' ); setTimeout( () => { this.tooltipElement.remove(); this.deleting = false; }, 500 ); }, buildElements() { const tooltipElement = document.createElement( 'div' ); tooltipElement.classList.add( 'tasty-recipes-static-tooltip'); tooltipElement.setAttribute( 'id', 'tasty-recipes-tooltip' ); const currentTooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); if ( currentTooltipElement ) { document.body.replaceChild( tooltipElement, currentTooltipElement ); } else { document.body.appendChild( tooltipElement ); } this.tooltipElement = document.getElementById( 'tasty-recipes-tooltip' ); }, show() { if ( ! this.tooltipElement ) { return; } const tooltipTop = this.element.getBoundingClientRect().top + window.scrollY - 10 // 10px offset. - this.tooltipElement.getBoundingClientRect().height; const tooltipLeft = this.element.getBoundingClientRect().left - ( this.tooltipElement.getBoundingClientRect().width / 2 ) + ( this.element.getBoundingClientRect().width / 2 ) - 1; const posLeft = Math.max( 10, tooltipLeft ); this.maybeRemoveTail( posLeft !== tooltipLeft ); this.tooltipElement.setAttribute( 'style', 'top:' + tooltipTop + 'px;left:' + posLeft + 'px;' ); this.tooltipElement.classList.add( 'opened' ); }, maybeRemoveTail( removeTail ) { if ( removeTail ) { this.tooltipElement.classList.add( 'tr-hide-tail' ); } else { this.tooltipElement.classList.remove( 'tr-hide-tail' ); } }, changeMessage( message ) { if ( ! this.tooltipElement ) { return; } this.tooltipElement.innerHTML = message; } }; window.TastyRecipes.ajax = { sendPostRequest( url, data, success, failure ) { const xhr = new XMLHttpRequest(); xhr.open( 'POST', url, true ); xhr.send( this.preparePostData( data ) ); xhr.onreadystatechange = () => { if ( 4 !== xhr.readyState ) { return; } if ( xhr.status === 200 ) { success( JSON.parse( xhr.responseText ) ); return; } failure( xhr ); }; xhr.onerror = () => { failure( xhr ); }; }, preparePostData( data ) { const formData = new FormData(); for ( const key in data ) { formData.append( key, data[key] ); } return formData; }, }; window.TastyRecipes.ratings = { defaultRating: 0, currentRatingPercentage: 100, savingRating: false, init( minRating ) { this.minRating = minRating; this.formWatchRating(); this.closeTooltipWhenClickOutside(); this.addBodyClassBasedOnSelectedRating(); this.backwardCompFormRatingPosition(); }, formWatchRating() { const ratings = document.querySelectorAll('.tasty-recipes-no-ratings-buttons [data-rating]'); if ( ratings.length { event.preventDefault(); this.defaultRating = event.target.closest( '.checked' ).dataset.rating; this.setCheckedStar( event.target ); this.maybeSendRating( this.defaultRating, event.target ); this.setRatingInForm( this.defaultRating ); } ); } }, closeTooltipWhenClickOutside() { window.addEventListener( 'click', e => { // Bailout (don't remove the tooltip) when the clicked element is a rating star, or it's the tooltip itself. if ( e.target.closest( '.tasty-recipes-rating' ) || e.target.classList.contains( 'tasty-recipes-static-tooltip' ) ) { return; } window.TastyRecipes.staticTooltip.destroy(); } ); }, setRatingInForm( rating ) { const ratingInput = document.querySelector( '#respond .tasty-recipes-rating[value="' + rating + '"]' ); if ( ! ratingInput ) { return; } ratingInput.click(); }, addBodyClassBasedOnSelectedRating() { const ratingInputs = document.querySelectorAll( 'input.tasty-recipes-rating' ); if ( ! ratingInputs ) { return; } for ( const ratingInput of ratingInputs ) { ratingInput.addEventListener( 'click', currentEvent => { const selectedRating = currentEvent.target.getAttribute( 'value' ); this.handleBodyClassByRating( selectedRating ); this.toggleCommentTextareaRequired( selectedRating ); } ); } }, handleBodyClassByRating( rating ) { if ( rating < this.minRating ) { document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' ); return; } document.body.classList.add( 'tasty-recipes-selected-minimum-rating' ); }, toggleCommentTextareaRequired( rating ) { const commentTextarea = document.getElementById( 'comment' ); if ( ! commentTextarea ) { return; } if ( rating < this.minRating ) { commentTextarea.setAttribute( 'required', '' ); return; } commentTextarea.removeAttribute( 'required' ); }, maybeSendRating( rating, element ) { if ( this.savingRating === rating ) { return; } this.savingRating = rating; window.TastyRecipes.staticTooltip.init( element ); const recipeCardElement = element.closest( '.tasty-recipes' ); if ( ! recipeCardElement ) { window.TastyRecipes.staticTooltip.destroy(); return; } window.TastyRecipes.ajax.sendPostRequest( window.trCommon.ajaxurl, { action: 'tasty_recipes_save_rating', rating, nonce: window.trCommon.ratingNonce, post_id: window.trCommon.postId, recipe_id: recipeCardElement.dataset.trId, }, ( response ) => { window.TastyRecipes.staticTooltip.changeMessage( response.data.message ); window.TastyRecipes.staticTooltip.show(); this.updateAverageText( response.data, recipeCardElement ); this.maybeFillCommentForm( response.data ); // Hide the tooltip after 5 seconds. setTimeout( () => { this.maybeResetTooltip( recipeCardElement, response.data, rating ); }, 5000 ); }, () => { this.resetTooltip( recipeCardElement ); } ); }, updateAverageText( data, recipeCardElement ) { if ( ! data.average ) { return; } this.setRatingPercent( data ); if ( ! data.count ) { return; } const quickLink = document.querySelector( '.tasty-recipes-rating-link' ); if ( quickLink ) { this.setTextInContainer( quickLink, data ); this.setPartialStar( quickLink ); } const cardStars = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); cardStars.dataset.trDefaultRating = data.average; this.setTextInContainer( recipeCardElement.querySelector( '.tasty-recipes-rating' ), data ); }, setTextInContainer( container, data ) { if ( ! container ) { return; } if ( data.label ) { const ratingLabelElement = container.querySelector( '.rating-label' ); if ( ratingLabelElement ) { ratingLabelElement.innerHTML = data.label; } return; } const averageElement = container.querySelector( '.average' ); if ( averageElement ) { averageElement.textContent = data.average; } const countElement = container.querySelector( '.count' ); if ( countElement ) { countElement.textContent = data.count; } }, setPartialStar( container ) { const highestStar = container.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( highestStar ) { highestStar.dataset.trClip = this.currentRatingPercentage; } }, setRatingPercent( data ) { this.defaultRating = data.average.toFixed( 1 ); const parts = data.average.toFixed( 2 ).toString().split( '.' ); this.currentRatingPercentage = parts[1] ? parts[1] : 100; if ( this.currentRatingPercentage === '00' ) { this.currentRatingPercentage = 100; } }, setCheckedStar( target ) { const cardRatingContainer = target.closest( '.tasty-recipes-ratings-buttons' ); const selectedRatingElement = cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( selectedRatingElement ) { delete selectedRatingElement.dataset.trChecked; } const thisStar = target.closest( '.tasty-recipes-rating' ); thisStar.dataset.trChecked = 1; thisStar.querySelector( '[data-tr-clip]' ).dataset.trClip = 100; }, maybeFillCommentForm( data ) { if ( ! data.comment || ! data.comment.content ) { return; } const commentForm = document.querySelector( '#commentform' ); if ( ! commentForm ) { return; } const commentBox = commentForm.querySelector( '[name=comment]' ); if ( ! commentBox || commentBox.value ) { return; } // Add comment details for editing. commentBox.innerHTML = data.comment.content; if ( data.comment.name ) { commentForm.querySelector( '[name=author]' ).value = data.comment.name; commentForm.querySelector( '[name=email]' ).value = data.comment.email; } }, maybeResetTooltip( recipeCardElement, data, rating ) { if ( this.savingRating === rating ) { this.resetTooltip( recipeCardElement, data ); } }, resetTooltip( recipeCardElement, data ) { window.TastyRecipes.staticTooltip.destroy(); this.savingRating = false; // Reset the default rating. const cardRatingContainer = recipeCardElement.querySelector( '.tasty-recipes-ratings-buttons' ); if ( cardRatingContainer ) { this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating; cardRatingContainer.dataset.trDefaultRating = this.defaultRating; this.resetSelectedStar( cardRatingContainer, data ); } }, resetSelectedStar( cardRatingContainer ) { const selectedRatingElement = cardRatingContainer.querySelector( '[data-rating="' + Math.ceil( this.defaultRating ) + '"]' ); if ( selectedRatingElement ) { selectedRatingElement.querySelector( '[data-tr-clip]' ).dataset.trClip = this.currentRatingPercentage; selectedRatingElement.parentNode.dataset.trChecked = 1; } const previousSelectedElement= cardRatingContainer.querySelector( '[data-tr-checked]' ); if ( previousSelectedElement ) { const currentSelectedRating = previousSelectedElement.querySelector('[data-rating]'); if ( currentSelectedRating !== selectedRatingElement ) { delete previousSelectedElement.dataset.trChecked; } } }, backwardCompFormRatingPosition() { const ratingsButtons = document.querySelector( '#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons' ); if ( ! ratingsButtons ) { return; } const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons); if ( ! ratingsButtonsStyles.display.includes( 'flex' ) ) { ratingsButtons.style.direction = 'rtl'; } if ( typeof tastyRecipesRating !== 'undefined' ) { // Select the rating that was previously selected in admin. ratingsButtons.querySelector( '.tasty-recipes-rating[value="' + tastyRecipesRating + '"]' ).checked = true; } const ratingSpans = ratingsButtons.querySelectorAll( '.tasty-recipes-rating' ); for (const ratingSpan of ratingSpans) { ratingSpan.addEventListener( 'click', event => { if ( ratingSpan === event.target ) { return; } ratingSpan.previousElementSibling.click(); } ); } } }; (function(callback) { if (document.readyState !== "loading") { callback(); } else { window.addEventListener( 'load', callback ); } })(() => { window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 ); }); Recipe supplied by Vita Coco and Teremana Tequila.
The Citizen
586 Nigerians repatriated from South Africa, with 268 on first flight
The Department of Home Affairs (DHA) has confirmed that 586 Nigerian nationals were processed for repatriation after being in South Africa illegally, with the first repatriation flight carrying 268 passengers. The first repatriation flight left in the morning on Thursday, carrying 268 passengers amid public demonstrations targeting undocumented foreign nationals. DHA repatriating 586 Nigerians found illegally in SA DHA said all the people processed were issued with emergency travel documents by the Nigerian High Commission, enabling their exit from South Africa and return to Nigeria. “Home Affairs is irrevocably committed to enforcing South Africa’s immigration laws and restoring the rule of law,” the Minister of Home Affairs, Dr Leon Schreiber, said. “Our ongoing orderly and lawful deportations and repatriations, which have increased by 46% over the past two years, [are] clear evidence of this.” According to the department, all those found to be living in South Africa illegally have been declared undesirable persons and consequently prohibited from re-entering the country for a period of five years. DHA acknowledged the cooperation and assistance provided by the Nigerian High Commission throughout the documentation and repatriation process. A second flight is scheduled to depart on Monday, 15 June. It will transport the remaining Nigerians from the group of 586 processed. Second flight on Monday The department reminded all foreign nationals residing in South Africa that they are required to be in possession of valid visas or other authorisations that entitle them to remain in South Africa lawfully. DHA said the foreign nationals must ensure that their immigration status remains compliant with South African immigration laws at all times and regularise their stay. On Sunday, President Cyril Ramaphosa unveiled the government’s strategy to tackle the escalating illegal immigration crisis. Schreiber said the department’s reform agenda was affirmed by the president. The government’s plans include the ongoing scale-up of the Electronic Travel Authorisation to record biometrics for every foreigner entering our country; the replacement of the fraud-prone green ID book with smart ID cards through our digital partnership with the banks; and the introduction of a cutting-edge digital identity system. “In this context of ongoing progress, the public is again urged to never engage in violence or take the law into their own hands,” the minister said.
The South African
Kaizer Chiefs tipped to sign Sipho Mbule but agent explains one problem
Former Orlando Pirates midfielder Sipho Mbule is reportedly looking for a move abroad having parted ways with the Buccaneers. The 28-year-old playmaker only spent just season at Pirates before he was released. The Soweto giants opted against renewing his contract. Teams like Kaizer Chiefs were urged to sign the talented midfielder, who is now a free agent. Sipho Mbule’s agent Mike Makaab told SABC Sport that the ex-Mamelodi Sundowns star was looking for a move outside South Africa. “We are looking at opportunities for Sipho,” Makaab said. “It’s still early days, but there has been a lot of interest. “He is open to considering a move and would like to further his career outside the borders of South Africa,” he concluded. Siwelele and Chiefs are believed to be the club interested in Mbule. Where will Sipho Mbule end up Former Kaizer Chiefs forward Benjamin Reed has urged his former club to sign Mbule. He believes the 28-year-old star can influence matches and turn things around for Amakhosi. “In South Africa, we hardly have the talent of players like Sipho Mbule,” Reed told KickOff. “I really don’t know what’s troubling this young man from his God-given talent.” “Mbule can influence a game on his own. Kaizer Chiefs need a crowd puller like Mbule. “That’s what we’ve been lacking lately as the culture of the club.” Sipho Mbule has played for SuperSport United, Mamelodi Sundowns, Sekhukhune United and Orlando Pirates in his eight-year career as a footballer. Should Chiefs sign the Master Chef?
The South African
SpaceX on cusp of record IPO that could make Elon Musk a trillionaire by Friday
SpaceX entered the final stretch on Thursday before its expected trading on Wall Street as part of the biggest initial public offering in history, which could propel co-founder Elon Musk to trillionaire status. If all goes as expected, the space and rocket company co-founded by Musk in 2002 will begin trading on the Nasdaq exchange on Friday morning, with all eyes on how Wall Street will absorb the blockbuster IPO that could send tremors across global markets. READ | Elon Musk agrees to pay R25 million over Twitter share buying Opening bell The company will be the first out of the gates among the tech and AI giants eyeing public markets, with OpenAI and Anthropic expected to follow, as both have filed with regulators for their own market debuts. For high-profile companies, the first day of trading traditionally sees executives ring the opening bell to mark the start of the session – in this case at New York’s Times Square, home of the Nasdaq. The IPO is Musk’s biggest financial gamble yet, with his xAI company and the X social media platform (formerly Twitter) also included in the SpaceX offering after the multi-billionaire folded them into the company earlier this year. Elite companies The offering, which will raise a record $75 billion, will easily outrank Saudi Aramco’s $29.4 billion debut on the public markets in 2019, the biggest ever. To reach that amount, the company will offer more than 555 million shares at an expected $135, placing SpaceX among Wall Street’s most elite companies with a valuation of just under $1.8 trillion. The terms of the offering are unlikely to change, analysts said, even if last-minute tweaks are possible before the company confirms its pricing and debut later on Thursday. The offering was more than four times oversubscribed by major banks and financial institutions, according to Bloomberg, with interest from everyday investors reported to be especially high. Between 20 and 30 percent of the shares will be reserved for these retail investors, a far greater proportion than is typically allocated in IPOs, giving Musk’s legions of fans a chance to buy a slice of the company. Data centers in space The success of the IPO rests squarely on investors’ faith in Musk as a visionary entrepreneur. The tech multi-billionaire will serve as chief executive, chief technology officer and board chairman of the newly traded company. The IPO is expected to mint thousands of new millionaires and many billionaires, with former and current employees – and a long list of investors – from the company’s near quarter-century history looking to cash in. The financials of the company are giving some on Wall Street pause, as the valuation largely depends on Musk delivering on promises worthy of science fiction, including putting data centers in space as well as people on Mars using as yet unproven technology. While the company is growing fast – revenue hit $18.7 billion in 2025 – it is also losing money, producing a net loss of $4.9 billion. In an extraordinary prediction, SpaceX’s filing claims it can pull in over $28.5 trillion in revenue from its various markets. Elon Musk’s fortune on Thursday stood at $785 billion according to the Forbes list of the world’s richest people, nearing three times the wealth of number two, Google co-founder Larry Page. A successful IPO could make him the first trillionaire in history on Friday. By Garrin Lambley © Agence France-Presse
TechCentral
Anthropic vs OpenAI and the bitter battle for the future of AI
The Sam Altman, Dario Amodei feud is shaping AI's biggest products – and now Wall Street's biggest listings.
TechCentral
MTN’s first AI target? Itself
MTN Group is targeting R30-billion in AI "value" by 2030, split across three bets it ranks by execution confidence.