Kenya-Tanzania rail link moves closer as Voi–Taveta project hits 70 per cent

The Voi–Taveta railway rehabilitation is 70 per cent complete, creating jobs and boosting economic activity in Taita-Taveta County. (Photo: X/Kenya Railways)

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.

Kenya Railways cautions passengers against fraudulent Madaraka Express ticket sellers

Rachael Mutabasi

 · 

1 week agoRead nextOpens a fresh page.

Kenya Railways says the Voi–Taveta Meter Gauge Railway rehabilitation has reached 70 per cent of earthworks, paving the way for improved cross-border trade, passenger transport and regional connectivity with Tanzania.

The rehabilitation of the 130-kilometre Voi–Taveta meter-gauge railway, a key rail corridor linking Kenya and Tanzania, has reached 70 per cent completion of earthworks, bringing the restoration of cross-border rail transport closer to reality.
Kenya Railways said the project, being implemented in Taita-Taveta County, is also creating employment opportunities for local communities while boosting economic activity across the region.
“The rehabilitation of the 130-kilometre Voi–Taveta Meter Gauge Railway Line has reached another significant milestone, with 70 per cent of the earthworks now complete, while continuing to create employment opportunities for local communities and stimulate economic activity across Taita-Taveta County,” the corporation said in a statement.

More To Read

  • Kenya Railways cautions passengers against fraudulent Madaraka Express ticket sellers
  • High Court blocks Kenya Railways bid to evict Muthurwa estate residents
  • Probe launched after Magadi train catches fire in Kajiado
  • Voi residents urge land reclamation to protect schools, health facilities and public amenities
  • Court petition seeks removal of Kenya Railways MD amid governance, transparency concerns
  • China Road Corporation urges court to throw out bid to halt Riruta-Ngong railway project

According to Kenya Railways, the project will restore a vital transport corridor between Kenya and Tanzania, providing a more efficient and cost-effective option for both passenger and cargo transport.
“Upon completion, the rehabilitated railway will provide a more efficient and cost-effective transport corridor for passengers and cargo, facilitate cross-border trade with Tanzania, promote tourism, reduce the cost of doing business, and unlock new economic opportunities for communities along the corridor,” the corporation said.
The project also includes the construction of a dry port in Voi and new railway stations at Voi, Mwatate, Bura, Maktau and Taveta.

Latest Stories

  • ECOWAS backs Ghana’s anti-xenophobia push at AU, endorses reparatory justice agenda
  • Kindiki says political differences should not destroy national unity, urges Kenyans to reject division
  • Sh32 billion Covid relief fraud suspect flown to US as Somalia deepens law enforcement cooperation
  • 𝐄𝐚𝐬𝐭𝐥𝐞𝐢𝐠𝐡 𝐕𝐨𝐢𝐜𝐞 𝐚𝐭 𝐍𝐢𝐧𝐞 – DCI opens probe into Ol Kalou by-election violence

Kenya Railways said Taveta Station will connect Kenya’s railway network with Tanzania, strengthening regional connectivity and supporting cross-border trade.
“The project also includes the development of a dry port in Voi, positioning the town as a strategic logistics and trade hub. In addition, new railway stations will be constructed at Voi, Mwatate, Bura, Maktau and Taveta, with Taveta Station linking Kenya’s railway network to Tanzania and strengthening regional connectivity,” the statement said.
The corporation said the project reflects the government’s commitment to revitalising the Meter Gauge Railway network to boost trade, attract investment and support sustainable socio-economic growth.

Other Topics To Read

Top Stories Today

  • Kindiki urges Kenyans to reject division and protect national unity
  • Voi–Taveta railway upgrade hits 70 per cent completion
  • ECOWAS backs Ghana’s anti-xenophobia push at AU
  • US praises Somalia after suspect in Sh32 billion Covid fraud is extradited
  • DCI investigates violence and armed goons in Ol Kalou mini-poll
  • Kenyan seafarers unite to push for jobs, welfare and maritime reforms

`;
}

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 withdraw billions from Boma Yangu despite growth in housing savingsNews
|Lucy Mumbi
|13 hours ago
ECOWAS backs Ghana’s anti-xenophobia push at AU, endorses reparatory justice agendaAfrica
|Mwangi Maina
|30 minutes ago
DCI to probe violence and armed goons in Ol Kalou by-election, says MurkomenNews
|Rachael Mutabasi
|3 hours ago
Kenya-Tanzania rail link moves closer as Voi–Taveta project hits 70 per centNews
|Rachael Mutabasi
|11 minutes ago
Manhunt launched after two murder suspects escape Mombasa police custodyCoast
|Farhiya Hussein
|7 hours ago
Ol Kalou violence: Amnesty Kenya wants CS Murkomen to account for police failure during pollsNews
|Lucy Mumbi
|8 hours ago

Two American service members killed in Jordan amid renewed US-Iran hostilitiesWorld
|Bashir Mbuthia
|1 day ago
Catholic bishops urge Kenyans to reject divisive politics ahead of 2027 pollsNews
|Lucy Mumbi
|6 hours ago
Hunger deepens for displaced families in Sudan’s El ObeidSudan
|UN News
|15 hours ago
Shadows of past political violence shape lives of young Africans for years: A study of nine countriesAfrica
|The Conversation
|2 hours ago

Share.
Leave A Reply

Exit mobile version