Johannesburg Latest News
IOL
EThekwini mayoral candidates clash over municipal billing crisis
eThekwini mayoral hopefuls faced tough questions at an IOL Town Hall Debate on Wednesday, addressing the city's water crisis, sewage failures, electricity disruptions, billing complaints and plans for their first 100 days in office.
IOL
" A schedule I control": Oosthuizen quits LIV Golf for DP World Tour return
Louis Oosthuizen will relinquish his Southern Guards GC captaincy to rejoin the DP World Tour in 2027
The Citizen
Recipe of the day: Brie, cherry and herb omelette
This omelette combines creamy brie, sweet cherries and fresh herbs for a delicious breakfast. Serve it with crispy bacon for an extra treat. Brie, cherry and herb omelette Ingredients 4 eggs 2 Tbsp cream or milk 1 Tbsp butter ½ cup fresh cherries, halved and pitted 80g brie, sliced 1 Tbsp chopped chives or parsley Salt & black pepper Method Beat eggs with cream, salt, and ground black pepper. Melt the butter in a pan, pour in eggs. When nearly set, scatter over the cherries, brie, and herbs. Fold gently, cook 1-2 minutes until brie melts. Delicious with a helping of crispy bacon, I highly recommend it *This recipe is courtesy of juicydelicious Print Brie, cherry and herb omelette Author: Jenny Morris Ingredients 4 eggs 2 Tbsp cream or milk 1 Tbsp butter ½ cup fresh cherries, halved and pitted 80g brie, sliced 1 Tbsp chopped chives or parsley Salt & black pepper Instructions 1. Beat eggs with cream, salt, and ground black pepper. 2. Melt the butter in a pan, pour in eggs. 3. When nearly set, scatter over the cherries, brie, and herbs. 4. Fold gently, cook 1–2 minutes until brie melts. 5. Delicious with a helping of crispy bacon, I highly recommend it window.trCommon={"minRating":6,"ajaxurl":"https:\/\/www.citizen.co.za\/wp-admin\/admin-ajax.php","ratingNonce":"","postId":4721460}; 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 ); });
The Citizen
Transport Month: Will electric vehicles replace taxis in SA? Santaco launches pilot fleet of 10 EVs
The South African Meter Taxi and E-Hailing Association (SAMTEA), an affiliate of the South African National Taxi Council (Santaco), has launched a pilot fleet of 10 BYD Dolphin Surf electric vehicles for e-hailing in Sandton as part of October Transport Month. On Tuesday afternoon, Santaco national spokesperson Mmatshikhidi Rebecca Phala said the launch aligns with the month’s overarching theme of building a safe, sustainable, reliable and affordable transport system. Evolving e-hailing landscape According to Phala, the launch opens doors to innovation, sustainability and new opportunities within the evolving e-hailing landscape. “This happens at a time [when] people are panicking because the fuel prices keep going up,” Phala remarked. She said electric vehicles would operate in the e-hailing space. “Our commuters are spending a lot more money to be ferried from point A to point B on a daily basis. “The launch of these electrified fleets of vehicles couldn’t have come at a better time. “We are doing this where there is a lot of conversation around the safety and compliance in the public transport industry,” Phala added. Technological advancements “There’s a lot of technology that still needs to be installed, starting with tracking devices, the use of telematics (which is the combination of telecommunications and informatics to send, receive and store digital information over long distances).” “So we are moving away from issues and the problems that we are having in the climate, including issues of cash reliance,” Phala said. Santaco President Abnar Tsebe said that practical charging solutions will be pursued at local taxi ranks, depots and suitable facilities. He also supported the launch alongside its partners. The future of mobility Advocate Nobuhle Mazolo of SAMTEA noted that the future of transport will not be shaped by those who merely predict change, but by those prepared to lead it. “That is why we are here today, not simply to unveil electric-powered vehicles, but to make a statement about who will shape, participate in and benefit from the future of mobility in South Africa,” Mazolo stated. Highlighting the importance of collaboration, she explained that the initiative was established following the 2020 Lekgotla resolution to integrate the minibus industry with taxi formations. “And that is where transport is going in the future,” Mazolo said. “If we are divided, we will actually not be moving forward, particularly in this public transport industry.” Innovation “So SAMTEA, as an affiliate of Santaco, is today launching and expressing what this relationship should deliver: innovation led by an industry structure, supported by a national vision, with BYD vehicles as a starting point. “These vehicles may seem modest in a vast transport industry, but every lasting transformation begins with a decision to act,” Mazolo noted. Taxi operators and financing Mazolo said the real test was whether an operator can finance the vehicle, charge it reliably, maintain it affordably, earn a decent living, and provide safe, accessible transportation. “If you cannot answer these questions, electrification remains a showcase rather than a solution,” Mazolo said. This is the beginning Mazolo further said that, for Santaco, the longer horizon includes exploring electric minibus taxis and industry participation in infrastructure, which is why members of the city and government were present. “The infrastructure that will power them matters, because you cannot have a vehicle that you cannot absolutely utilise,” Mazolo said. She said the initial pilot launch had been a long time coming and showcased what had been happening in the background over the last few years. “We are not announcing that transition as accomplished today; we are beginning to build the evidence of partnerships and commercial discipline that can make this possible,” Mazolo noted. Embracing the EV shift Mazolo said the shift to electric vehicles requires changes in how the e-hailing industry operates, with operators needing to take a more active role in the broader electric vehicle value chain. “We cannot demand a place in the future whilst refusing to change how we do business today; something needs to shift: organisation, reliable operational data , professionalism, formalisation, safety, compliance, and collective bargaining powers are no longer optional,” Mazolo pointed out. “We must move beyond being purchasers of vehicles to becoming owners and participants in the charging energy technology, maintenance and skill value chain,” she added. She said women, people living with disabilities and young people must have a meaningful stake in this future. Collaborative efforts Mazolo challenged business partners to help build models that work on the road and for the people. “Do not sell this industry a vision that works only on the presentation slide,” she stressed. “Technology is only transformative when its benefits reach the driver, the operator and the passenger,” Mazolo said. “That means affordable financing, fair platforms, economics, dependable charging, battery and after-sales support, fleet safety and skills transfer.” Call for government support for EV transition Mazolo called on government to assist with the transition to electric vehicles in the public transport industry. “We are not asking for an exemption from the rules; we are asking for an enabling framework that keeps pace with innovation, coherent operating requirements, licensing that works, charging infrastructure and appropriate transport facilities,” she asserted. Proper transport facilities Mazolo stressed the need for proactive energy planning to support the transition to electric vehicles. “We need realistic energy planning because what happens in this country is that we plan after the fact, and we have seen it,” Mazolo added. She emphasised the need for appropriate transport facilities, realistic energy planning, appropriate transport facilities and access to development finance. “So let us judge the next phase by results and not applause, actual cost per kilometre, vehicle reliability, charging access, driver earnings, passenger safety and opportunities created for local enterprises,” Mazolo stated. She concluded that this initiative aimed to change perceptions of the taxi industry. This initiative was done in collaboration with BYD, C-Track and Bolt, marking a new chapter in the taxi industry’s stance on electric mobility.
The South African
Bomb scare at Eastern Cape airport prompts emergency response
Police have activated a multidisciplinary response team following a bomb threat at King Phalo International Airport in KuGompo City in the Eastern Cape. Police spokesperson Brigadier Nobuntu Gantana said officers received an anonymous call alleging that a bomb was on board FlySafair flight FA388 that had landed at the airport from Johannesburg. All 182 passengers and six crew members safely disembarked from the aircraft, with authorities now managing the scene and investigating the origin of the threat. Bomb disposal unit and K9 dogs deployed Gantana confirmed that a multidisciplinary response team had been activated and was at the airport. The response includes the Bomb Disposal Unit, K9 explosive detection dogs, hostage negotiators, Disaster Management, Airport Security and Emergency Medical Services. “The scene is being managed by the relevant authorities, and investigations into the origin of the threat are ongoing. No further information is available at this stage,” Gantana said. Investigation underway Police have not provided further details about the aircraft, the nature of the alleged threat or whether any suspicious items have been found. The investigation into the anonymous call is continuing. Authorities have yet to release additional information about the incident or indicate when normal operations at the airport will resume. Full FlySafair statement FlySafair confirms that it was informed of a potential security threat relating to flight FA388, operating from Johannesburg to East London this morning, with 182 passengers and 6 crew on board. The aircraft continued its journey and landed safely at King Phalo Airport at 08:49. All passengers have since safely disembarked. All relevant authorities were informed immediately, and we are cooperating fully with them. As confirmed in the media statement issued by the Office of the SAPS Provincial Commissioner, Eastern Cape, a multi-disciplinary response team is on site, and the aircraft is being held as part of standard security protocols. The scene is being managed by the authorities, with the support of King Phalo Airport. There have been no flight cancellations as a result of this incident, and all other FlySafair operations are running as normal. We thank our crew and ground staff for managing the situation calmly and in line with established safety and security procedures. We also apologise for any inconvenience caused and thank our passengers for their patience and understanding. We extend our sincere thanks to the South African Police Service, King Phalo Airport and all the emergency and security teams on site for their swift and professional response. As this is an active investigation, we are unable to comment further at this stage. Enquiries relating to the investigation should be directed to SAPS: Brigadier Nobuntu Gantana, 082 337 9402. The safety of our passengers and crew remains our highest priority. This breaking news story is being updated and more details will be published shortly. Please refresh the page for the fullest version.
The South African
NSFAS 2027 applications near 870 000. The clock is ticking
National Student Financial Aid Scheme (NSFAS) 2027 applications are closing in on 870,000. And there are just days left to apply. NSFAS says it won’t extend the deadline. So if you’re planning to study in 2027 and need funding, now’s the time to act. NSFAS has received 868,626 applications for the 2027 funding cycle, according to its latest application dashboard, dated 19 October. In a media release on Tuesday, 20 October, the scheme urged students who haven’t yet applied to do so before the deadline. WHEN DO NSFAS 2027 APPLICATIONS CLOSE? Applications close at 23:59 on Saturday, 31 October 2026. There will be no extension. The NSFAS board has already confirmed this. HOW TO APPLY NSFAS spokesperson Ishmael Mnisi said applications can be submitted through the official NSFAS website, or the scheme’s official mobile app. He urged applicants to make sure all their supporting documents are submitted correctly, and that consent forms are completed where required, to help NSFAS verify their applications. HOW MANY PEOPLE HAVE APPLIED? Demand has been strong since applications opened on 18 September. NSFAS received 51,474 applications in the first four days alone. By 19 October, that figure had grown to more than 868,000. WHO QUALIFIES? NSFAS funds qualifying students at public universities and technical and vocational education and training (TVET) colleges. Applicants generally need a combined gross household income of R350,000 or less a year, or R600,000 or less for applicants with disabilities. BEWARE OF NSFAS SCAMS Applying for NSFAS is free. Never pay anyone to apply on your behalf, and never share your myNSFAS password or one-time PIN (OTP). You can report NSFAS scams to the Vuvuzela fraud hotline on 0860 247 653. HAVE YOU APPLIED FOR NSFAS FUNDING FOR 2027? Let us know in the comments below…
TechCentral
Vodacom pitches a lighter AI rulebook as Pretoria redraws its policy
The telecoms group wants one body to coordinate AI rules, with existing sector regulators doing the enforcing.
TechCentral
Disney opens its vault to Netflix in South Africa
Disney shows are streaming on Netflix in South Africa as the former opens its vault to its rival.