Ronald Ngala Utalii College to open doors in September after 12-year wait
Listen to article
3 min listen
Audio reading is not supported on this browser.
Ready
Thanks for listening. Continue with a related story, or tap the speaker icon on the next page to listen.
Sudan blames suspension of Ethiopian electricity imports among factors driving nationwide power cuts
Addis Standard
·
2 minutes agoRead nextOpens a fresh page.
The institution will offer diploma and short-term courses in hospitality, catering, housekeeping, seafaring and management.
The Ronald Ngala Utalii College in Kilifi County will officially admit its first cohort of 1,000 students on September 1, marking the operationalisation of the long-awaited tourism training institution more than a decade after its construction began.
This was announced by Tourism Principal Secretary Julius Bitok on Thursday, who declared the college 95 per cent ready to receive students, with final works being fast-tracked ahead of the opening.
“I can confirm that we are 95 per cent ready to welcome the first cohort of 1000 students on September 1. We have the necessary arrangements in place to make this a reality,” he said while on a tour of the facility on Thursday.
Tourism PS Julius Bitok at the Ronald Ngala Utalii College on July 23, 2026. (Photo: Courtesy)
The institution will offer diploma and short-term courses in hospitality, catering, housekeeping, seafaring and management, and is expected to strengthen Kenya’s tourism workforce while supporting the government‘s target of attracting five million international visitors annually by 2028.
At the same time, once fully developed, Bitok said the 40-acre campus designed as an advanced model of the Utalii College will have the capacity to accommodate 4,000 students.
Latest Stories
- Sudan blames suspension of Ethiopian electricity imports among factors driving nationwide power cuts
- Tigray displacement sites see renewed arrivals as aid gaps deepen
- Nakuru court acquits Senator Jackson Mandago in Sh1.1 billion Uasin Gishu scholarship case
- CECAFA boss backs Rwanda to host next three Kagame Cup editions
The PS regretted the long delay in its operationalisation and added that the government was contemplating inviting an investor under public-private-partnerships (PPP) to expedite the opening of the hotel that will also offer practical training to learners.
Notably, the college’s opening is expected to create at least 1,000 direct and indirect jobs and boost the host community’s economy.
It will also complement the Kenyan tourism sector’s drive to double the annual number of tourists into the country.
“We are committed to ensuring that we build capacity for tourism and hospitality. The opening will go a long way in ensuring that we meet our target of five million tourists by 2028,” the PS added.
A section of Ronald Ngala Utalii College. (Photo: Courtesy)
Kilifi County Governor Gideon Mung’aro said the opening of the college will be good news for job seekers eyeing the blue economy and who need relevant certification.
“We have had issues as agents come here to recruit seafarers. The last time I had a big team who wanted 600 people, but they went with only 59 due to a lack of certification,” the governor said.
The two further appealed to leaders to refrain from utterances that could harm the tourism industry.
“We urge leaders to weigh their words when they are talking about tourism as it is a very delicate product. What we’ve built in 10 years can be destroyed in a single day by a reckless statement,” said the governor.
Other Topics To Read
Top Stories Today
- Court acquits Senator Mandago in Sh1.1 billion scholarship scandal case
- Ronald Ngala Utalii College to open doors in September after 12-year wait
- Coast unveils big innovation push to create jobs for 2 million young people
- High Court nullifies Ruto’s Presidential Task Force on Public Debt Audit
- High Court allows National Infrastructure Fund Act to proceed, orders strict judicial oversight
- CS Miano ordered to appear before Senate on August 4 after missing Bomas project hearing
`;
}
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
UK cancels Laikipia military training exercise after Kenya fails to issue licencesNews
|Mary Wambui
|6 hours ago
Harambee Starlets guaranteed Sh19.5 million as CAF unveils record WAFCON prize moneyNews
|Erick Kariuki
|9 hours ago
From Twitter to X: How AI, video and payments are driving X’s evolution three years laterTechnology
|Margaret Wanjiru
|9 hours ago
‘I’m not mad’ – President Ruto insists free university education plan achievableNews
|Lucy Mumbi
|8 hours ago
CECAFA boss backs Rwanda to host next three Kagame Cup editionsSports
|The New Times
|1 hour ago
NTSA activates nationwide road safety inspections ahead of August school holidayNews
|Lucy Mumbi
|9 hours ago
KMTC opens September intake applications, sets August 11 deadline for studentsNews
|Lucy Mumbi
|1 day ago
Nakuru court acquits Senator Jackson Mandago in Sh1.1 billion Uasin Gishu scholarship caseNews
|Carolyne Kubwa
|1 hour ago
Tigray displacement sites see renewed arrivals as aid gaps deepenRegional
|Addis Standard
|20 minutes ago
Bankers want Parliament to rethink Sh250 million capital rule for microfinance firmsBusiness
|Rachael Mutabasi
|1 day ago
