Lamu County residents harness wildlife, beaches to boost tourism
Lamu County residents harness wildlife, beaches to boost tourism
Read this story aloud
Listen to the clean text version of this article
Ready
5 min listen
Audio reading is not supported on this browser.
With its pristine environment and deep Swahili heritage, Lamu has long been a favoured destination, but locals are now seeking new ways to promote eco-tourism and preserve their natural surroundings
Residents of Lamu County are tapping into the region’s rich natural resources, from its wildlife-filled forests to turtle-nesting beaches, as they work to bolster tourism and secure sustainable economic growth.
With its pristine environment and deep Swahili heritage, Lamu has long been a favoured destination, but locals are now seeking new ways to promote eco-tourism and preserve their natural surroundings.
On Amu Island, donkeys vital to the community’s daily lives are given special care at a local sanctuary.
More To Read
- Lamu County urges US and Europe to review travel advisories, citing tourism and investment setbacks
The sanctuary provides free medical services to ensure these animals remain healthy and continue supporting livelihoods.
Dr Elvande Sande from the Donkey Sanctuary in Lamu urged residents to be more mindful of the animals’ welfare. “We encourage the people of Lamu to take care of their donkeys, especially when they fall ill, so they can keep serving the community,” said Dr Sande advising residents to ensure their donkeys receive proper nutrition and water daily.
Najma Swaleh, a resident of Amu Island, appraised the importance of donkeys to the local way of life. “These donkeys are like family to us. We have a responsibility as humans to ensure when they are sick, we take them to the sanctuary so they can recover and continue helping us,” she said.
Latest Stories
- Ruto vows no room for ethnic politics as he fronts development milestones in fresh re-election strategy
- Nigeria condemns killing of citizens in South Africa amid rising xenophobic violence
- Kenya’s civic space downgraded to ‘repressed’ amid surge in rights violations – report
- Controller of Budget calls for stricter controls on emergency spending after Sh144 billion used for debt repayment
School children and locals partake in beach clean up in Lamu Old Town. (Photo: Farhiya Hussein)
Lamu’s forests, home to giraffes, zebras, and elephants, along with its beaches, which serve as nesting grounds for endangered sea turtles, are seen as vital assets for eco-tourism. Residents are being encouraged to explore economic opportunities through wildlife conservation and tourism.
Ali Shebwana, a Kenya Wildlife Service (KWS) warden, highlighted the untapped potential of wildlife tourism in Lamu. “I urge the people of Lamu to recognise the significance of the wildlife in their forests and beaches. These animals can be an important economic asset if we manage them well,” said Shebwana.
Tourism stakeholders, including hoteliers across the Lamu archipelago, are also being urged to improve their facilities and practices to attract more visitors.
Speaking during a recent peace caravan and beach cleanup exercise in Lamu Old Town and Wiyoni, County Tourism Executive Aisha Miraj emphasized the importance of cleanliness and hospitality in drawing tourists.
“We are leading efforts to keep Lamu clean, especially our beaches, which are key tourist attractions. I encourage hoteliers to maintain cleanliness and use better public relations skills to attract international visitors,” said Miraj.
Lamu Tourism Executive Aisha Miraj. She is urging residents to maintain cleanliness of beaches and other areas to attract tourists. (Photo: Farhiya Hussein)
Professionalism
She further advised hoteliers to treat their guests with warmth and professionalism, which would boost bookings during the peak tourist season.
The county has also partnered with the Tourism Fund to train over 100 local tourism workers in hospitality. “We have provided training to hotel staff, managers, and other tourism players to help them offer the best service, but maintaining cleanliness is still key to improving the sector,” added Miraj.
Lamu Old Town, a UNESCO World Heritage site, remains a major draw for tourists due to its unique Swahili culture and architecture.
The town, one of the oldest surviving Swahili settlements on the East African coast, attracts hundreds of visitors each year, eager to experience its historical charm.
Fridah Njeri, Chair of the Lamu County Tourism Association, praised local efforts to clean up the beaches but stressed the ongoing challenges with waste disposal, especially plastics. “We still have a long way to go in addressing waste disposal on our beaches and in the ocean. But we are making progress, and it’s encouraging to see the community come together to keep Lamu clean,” said Njeri.
Lamu Tourism Association (LTA) Chairperson Fridah Njeri. (Photo: Farhiya Hussein)
With tourist numbers steadily increasing, especially during the high season, stakeholders in Lamu are optimistic that the county’s tourism sector could reach full capacity by the end of the year.
Governor Issa Timamy also urged residents to prioritize wildlife conservation and maintain the natural beauty of the area. “Our wildlife and environment are vital economic assets, and it is up to us to protect them for the benefit of future generations,” said Governor Timamy.
Other Topics To Read
Top Stories Today
- Ruto vows no room for ethnic politics as he fronts development milestones in fresh re-election strategy
- Nigeria condemns killing of citizens in South Africa amid rising xenophobic violence
- CoB calls for stricter controls on emergency spending after Sh144 billion used for debt repayment
- Kenya’s civic space downgraded to ‘repressed’ amid surge in rights violations – report
- Bellingham double fires 10-man England past Mexico into World Cup quarter-finals
- KQ flight to New York forced to return to Nairobi after mid-air technical glitch
`;
}
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
Ruto vows no room for ethnic politics as he fronts development milestones in fresh re-election strategyPolitics
|Barack Oduor
|18 minutes ago
Nigeria condemns killing of citizens in South Africa amid rising xenophobic violenceAfrica
|Mwangi Maina
|31 minutes ago
Controller of Budget calls for stricter controls on emergency spending after Sh144 billion used for debt repaymentNews
|Lucy Mumbi
|1 hour ago
Machakos Mitumba Market traders suffer heavy losses after midnight fireNews
|Lucy Mumbi
|23 hours ago
Haaland’s heroics send Norway into historic first World Cup quarter-final as Brazil crash outSports
|Erick Kariuki
|3 hours ago
Stephen Yiembe makes history as first Kenyan referee appointed for UEFA Super CupFootball
|Erick Kariuki
|12 hours ago
Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killingsNews
|Lucy Mumbi
|1 day ago
Saba Saba organisers notify police of planned peaceful demonstration to ParliamentNews
|Rachael Mutabasi
|13 hours ago
Taita Taveta County unveils cooperative fund to boost rural access to creditCoast
|Farhiya Hussein
|14 hours ago
DP Kindiki hails cooperatives as key to Kenya’s economic transformationNews
|Rachael Mutabasi
|1 day ago