Kenya U20 Head Coach Salim Babu names provisional squad for AFCON
Kenya U20 Head Coach Salim Babu names provisional squad for AFCON
Read this story aloud
Listen to the clean text version of this article
Ready
3 min listen
Audio reading is not supported on this browser.
Kenya U20 head coach Salim Babu has named a 35-man provisional squad for the upcoming TotalEnergies U20 Africa Cup of Nations (AFCON), set to begin on April 27, 2025, in Egypt. The Rising Stars, drawn in Group C, will face defending champions Senegal, Zambia, and Sierra Leone as they aim to make an impact on the continental stage
Kenya U20 head coach Salim Babu has announced a 35-man provisional squad for the upcoming TotalEnergies U20 Africa Cup of Nations (AFCON), set to commence on April 27, 2025, in Egypt
The Rising Stars secured their place in the continental tournament after finishing as runners-up in the 2024 CECAFA U20 Qualifiers, where they narrowly lost to Tanzania in the final
Babu’s squad selection follows a series of training camps aimed at scouting top young talent from across the country. The final list features a blend of local and foreign-based players, including several key returnees from the CECAFA Qualifiers squad. Notable names include captain Amos Wanjala, Manzur Okwaro, Baron Ochieng, Aldrine Kibet, Tyron Kariuki, Kelly Madada, and Andreas Odhiambo
More To Read
- CAF opens bidding for 2028, 2032 and 2036 AFCON tournaments
- Egypt end 92-year wait to reach World Cup last 16
- President Yoweri Museveni backs single East African visa for 2027 AFCON
- FKF withdraws court case after FIFA, CAF intervene to resolve governance crisis
- Countdown begins as expanded WAFCON 2026 nears kick‑off in Morocco
- Kenya, Uganda and Tanzania gear up for historic 2027 AFCON
Kenya has been drawn in Group C, where they will face defending champions Senegal, Zambia, and Sierra Leone. The Rising Stars will begin their campaign against Sierra Leone on May 1, followed by Zambia on May 4, before concluding the group stage against Senegal on May 7
The team has now entered a residential training camp in Nairobi, with friendly matches lined up in preparation for the tournament
Provisional Squad
Latest Stories
- Mandera anti-illicit alcohol drive intensifies as officers target brewing and distribution rings
- Treasury denies claims government plans to borrow Sh1 trillion from sacco savings for infrastructure fund
- Police to mount checkpoints across Nairobi ahead of 2026 Saba Saba commemoration, warn against unlawful acts
- Government to launch forceful disarmament in Tana River County after amnesty ends
Goalkeepers
Benard Jairo (Kariobangi Sharks), Wycliford Oduor (Bidco United), Kevin Oduor (Nairobi United)
Defenders
Manzur Okwaro (KCB), Joseph Bate (MOFA), Jackson Sane (Mombasa Elite), Amos Wanjala (Athletic Club Torrellano), Charles Junior (Sofapaka), Baron Ochieng (Sofapaka), Humphrey Obina (Murang’a Seal), Telena Ochieng (Ulinzi Stars), Rodgers Wasega (Nairobi City Stars)
Midfielders
Andreas Odhiambo (Kariobangi Sharks), Stanley Wilson (AIK – Sweden), Zech Obiero (Leyton Orient – England), Kevin Wangaya, Emilio Brian (Ulinzi Stars), Irad Mshindi (KCB), Kelly Madada (AFC Leopards), Mark Shaban (Gor Mahia), Aldrine Kibet (Nastic – Spain), Humphrey Aroko (Kariobangi Sharks), Gilbert Abala (Nairobi City Stars), Hassan Beja (AFC Leopards), Ezekiel Omuri (Shabana), Tyron Kariuki (KCB), William Gitamu (Bandari), Javan Omondi (Ulinzi Stars), Elly Owande (Al Nasr – UAE), Emmanuel Osoro (FC Talanta), Jeremy Bissau (Brooke House College – Leicester, England)
Forwards
Lawrence Ouma (MOFA), Oliver Machaka (Kakamega Homeboyz), Henry Omollo (Kakamega Homeboyz), Luis Ingavi (Saginaw Valley State – USA)
Kenya will be aiming to make a strong impression in Egypt as they seek to advance past the group stage and challenge for continental glory
Other Topics To Read
Top Stories Today
- Saba Saba 2026: Police announce checkpoints in Nairobi
- Government denies plan to tap sacco savings for National Infrastructure Fund
- Woman arrested as Mandera intensifies war on illicit alcohol trade
- Government warns Tana River gun holders as forceful disarmament looms
- Suspects held over Kisii Linda Mwananchi violence as court awaits case file
- Duale, Oduor accused of defying High Court order on KNDI appointments
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killingsNews
|Lucy Mumbi
|1 day ago
CS Duale, Attorney General Oduor face contempt case over failure to implement KNDI court orderNews
|Carolyne Kubwa
|6 hours ago
Police to mount checkpoints across Nairobi ahead of 2026 Saba Saba commemoration, warn against unlawful actsNational
|Abdirahman Khalif
|3 hours ago
Treasury denies claims government plans to borrow Sh1 trillion from sacco savings for infrastructure fundNews
|Barack Oduor
|3 hours ago
Mandera anti-illicit alcohol drive intensifies as officers target brewing and distribution ringsNorthern Kenya
|Abdirahman Khalif
|3 hours ago
Quiet revolution behind foldable smartphones and why they’re making a comebackTechnology
|Margaret Wanjiru
|1 day ago
Suspects held over Linda Mwananchi convoy attack in Kisii remain in custody as missing files delay pleaNews
|Carolyne Kubwa
|4 hours ago
Zamzam fires warning over ODM nomination as Mombasa succession politics intensifyPolitics
|Farhiya Hussein
|1 day ago
Fresh cracks emerge in United Opposition over selection of 2027 flagbearerPolitics
|Barack Oduor
|11 hours ago
Pakistan to host next round of US-Iran talks on July 11Middle-East
|XINHUA
|1 day ago