Garissa Airstrip upgrade attracts new airline as expanded facilities increase flight options

The upgraded Garissa Airstrip will boost connectivity with new Nairobi-Garissa flights, expanding travel options and supporting trade and investment. (Photo: Handout)

Listen to article

4 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.

Garissa Referral Hospital ends theft after security overhaul, draws interest from other counties

Abdirahman Khalif

 · 

5 days agoRead nextOpens a fresh page.

The upgraded Garissa Airstrip has attracted a second scheduled airline, with four weekly Nairobi-Garissa flights expected to improve regional connectivity, trade and investment.

The recent expansion of Garissa Airstrip is beginning to transform air travel in northern Kenya, with the upgraded facility attracting a new airline just weeks after the improved runway became operational.
The development is expected to boost flight options for passengers travelling between Nairobi and Garissa while supporting trade, investment and broader economic growth in the region.
Skyward Express has announced it will launch scheduled flights between Nairobi and Garissa, becoming the latest airline to serve the route after years in which Freedom Airlines was the county’s main scheduled operator.

More To Read

  • Garissa Referral Hospital ends theft after security overhaul, draws interest from other counties
  • KURA allocates Sh400 million for road upgrades in Garissa’s Bura and Balambala
  • Nairobi, Mombasa among counties with highest long-overdue pending bills
  • Garissa leaders convene security meeting after wave of stabbings, phone thefts
  • Renegade Air suspends Wajir flights temporarily over ongoing runway maintenance works
  • KUPPET raises alarm over teacher safety in North Eastern, urges action

The move is being seen as an early sign that the upgraded airstrip is attracting more airline operators to invest in Garissa.
Ahead of the launch, officials from Skyward Express paid a courtesy call on the Garissa County Government, where they met a county delegation led by Roads, Transport and Public Works Executive Committee Member Nassir Mohamed Aden. The discussions centred on the airline’s planned operations and the opportunities created by the upgraded airport infrastructure.
The airline is set to begin commercial operations with its inaugural flight on Friday, August 7. It will then operate four weekly flights on Mondays, Wednesdays, Fridays and Sundays, offering travellers a faster alternative to the roughly six-hour road journey between Nairobi and Garissa.

Latest Stories

  • Lakes that ‘breathe’ ancient carbon: A surprising find in the Congo Basin
  • Ebola reaches major transport hub of Kisangani as DR Congo outbreak expands across five provinces
  • US launches campaign to block ICC probes of American officials and military, citing threat to sovereignty
  • Africa’s youth are finding jobs – but not the ones they imagined

Speaking during the visit, Skyward Express delegation leader Augustine Mogoi said the airline had acquired an additional aircraft to support the new route and was preparing for future expansion as passenger demand grows.
He said the improvements at Garissa Airstrip now allow the airline to deploy both its 37-seater and 50-seater aircraft on the route.
“We will handle departures and arrivals from Wilson Airport where we have a dedicated terminal for our passengers, including a VIP lounge for the convenience, speed of access and comfort of our customers,” Mogoi said.
Mogoi also praised the Garissa County Government for investing in a passenger terminal, noting that many airport projects prioritise runway expansion while overlooking passenger facilities, even though terminals are where travellers spend most of their time and where much of an airport’s daily operations take place.
The expansion of Garissa Airstrip was jointly funded by the Garissa County Government and the Kenya Airports Authority. Under the partnership, the county government built a new passenger terminal, while the Kenya Airports Authority upgraded the operational side of the airport by extending the runway to 1.2 kilometres and widening it to 23 metres.
The project also included the construction of two 55-metre taxiways, a 230-metre aircraft parking apron and two turn pads.
The upgrades have improved aircraft movement within the airstrip and increased its capacity to handle more flights.
The enhanced infrastructure now enables the airstrip to accommodate larger aircraft, creating opportunities for more airlines to introduce scheduled services to Garissa. County officials believe the project will strengthen Garissa’s position as an aviation hub for northern Kenya and neighbouring regions.
They also expect the improved air connectivity to boost trade, tourism, investment and the hospitality sector in Garissa and neighbouring Tana River County.
According to county officials, the additional flights will make travel easier for residents, investors, development partners and business people travelling between Garissa, Nairobi and other parts of the country.
The arrival of a second scheduled airline is expected to increase competition on the route, giving passengers more travel options while improving access to the region.

Other Topics To Read

Top Stories Today

  • Fuel prices remain unchanged as EPRA retains pump rates for another month
  • Study finds Congo Basin lakes ‘breathing’ ancient carbon into atmosphere
  • Ebola reaches major transport hub of Kisangani as DRC outbreak expands across five provinces
  • US launches campaign to block ICC probes of American officials and military
  • Africa’s youth are finding jobs – but not the ones they imagined
  • Ong’ondo Were murder trial witness says he was paid Sh50,000 after shooting

`;
}

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

Viwandani MCA Aaron Kang’ara Wangare charged over violent Donholm robbery and property damageCity Affairs
|Carolyne Kubwa
|6 hours ago
Lakes that ‘breathe’ ancient carbon: A surprising find in the Congo BasinClimate Change
|The Conversation
|2 hours ago

US launches campaign to block ICC probes of American officials and military, citing threat to sovereigntyWorld
|Bashir Mbuthia
|3 hours ago

Spotify data: Nairobi emerges as Africa’s top Gen Z music streaming cityTechnology
|Margaret Wanjiru
|12 hours ago
DRC Ebola outbreak becomes third-largest ever as unknown transmission chains fuel spreadHealth
|Bashir Mbuthia
|8 hours ago
IG Kanja deploys over 1,000 police officers to secure Ol Kalou by-electionNews
|Mary Wambui
|12 hours ago
World Cup history: A timeline of Africa’s greatest moments on the fieldSports
|The Conversation
|9 hours ago

World Bank asks Kenya to improve use of public funds amid rising debt concernsNews
|Lucy Mumbi
|13 hours ago

Dry weather to dominate Kenya as selected counties brace for rainfallNews
|Lucy Mumbi
|17 hours ago
Former LSK president Faith Odhiambo calls for action against organisers and funders of political violenceNews
|Rachael Mutabasi
|18 hours ago

Share.
Leave A Reply

Exit mobile version