Close Menu
    Facebook X (Twitter) Instagram
    • Home
    • Contact Us
    • About Us
    • Privacy Policy
    • Terms Of Service
    • Advertisement
    Wednesday, July 22
    Facebook X (Twitter) Instagram Pinterest Vimeo
    ABS Africa TV
    • Breaking News
    • Trending
    • Africa News
    • World News
    • Features
    • Technology
    • More
      • Sports
      • Politics
      • Culture
      • Lifestyle
      • Travel
      • Business
      • Environment
      • Legal
      • Health
      • Cameroon
      • Ambazonia
      • AfroSingles
      • Environ/Climate
      • Editorial
      • The Leak Magazine
    • Donate
    Subscription
    ABS Africa TV
    Home»Travel»Kenya-Tanzania rail link moves closer as Voi–Taveta project hits 70 per cent
    Travel

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

    Martin AkumaBy Martin AkumaJuly 19, 2026No Comments9 Mins Read
    Facebook Twitter Pinterest LinkedIn Tumblr Email
    Share
    Facebook Twitter LinkedIn Pinterest Email
    Post Views: 11

    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 savings

    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 hostilities

    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

    Closer KenyaTanzania Link moves Rail
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Martin Akuma
    • Website

    Related Posts

    Between Greensboro And Fayetteville Is North Carolina’s Safari Experience With Unique, Interactive Attractions

    July 22, 2026

    Stay alert: Canada issues stark travel advisory for citizens travelling to Kenya

    July 22, 2026

    Dan Carter Heads to South Africa as Women-Led Firms Turn Rugby’s Greatest Rivalry Into a Business Power Play

    July 22, 2026
    Leave A Reply Cancel Reply

    Search
    Latest Post

    144 refugees, migrants dead, missing off Mauritania coast: UNHCR

    July 22, 2026

    South Africa’s cost-of-living pressures mount

    July 22, 2026

    Nigeria seek final spots at ITTF Africa Youth Champs

    July 22, 2026

    Is a blockade of Bab el

    July 22, 2026

    Between Greensboro And Fayetteville Is North Carolina’s Safari Experience With Unique, Interactive Attractions

    July 22, 2026

    Subscribe to Updates

    Get the latest creative news from FooBar about art, design and business.

    • Facebook
    • Twitter
    • Pinterest
    • Instagram
    • YouTube
    • TikTok
    ABS TV and ABS Network News is a leading Pan-African 24/7 broadcasting network delivering nonstop news, talk shows, lifestyle programs, and digital media content worldwide through Satellite, Streaming Platforms, and Roku TV.
     
    Based in the United States, we connect Africa to the world while empowering creators, journalists, and brands through innovative media and broadcasting services.
    Facebook X (Twitter) Pinterest WhatsApp Instagram

    Our Picks

    144 refugees, migrants dead, missing off Mauritania coast: UNHCR

    South Africa’s cost-of-living pressures mount

    Nigeria seek final spots at ITTF Africa Youth Champs

    Most Popular

    Is a blockade of Bab el

    Between Greensboro And Fayetteville Is North Carolina’s Safari Experience With Unique, Interactive Attractions

    Paradox of industralisation agenda of Africa in an era of climate change, energy transition:

    © 2026 Copyright. All Rights Reserved by ABSAFRICATV
    • Privacy Policy
    • Terms of Services

    Type above and press Enter to search. Press Esc to cancel.

    We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.