The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Mukoko News listing page.
Pan-African news, in one place.
"Mukoko" means beehive in Shona — where the community gathers and stores knowledge. Mukoko News aggregates hundreds of African newsrooms into one feed, so a reader in Harare can follow Lagos, Nairobi and Dakar without opening twenty tabs.
All 54 African Union member states are in scope. How many are live is a number the app measures rather than asserts — see Coverage.
Read the news → · Join the Discord → · Contribute →
The sibling repos. This one is the reader-facing web app. The gateway is the public API and MCP server; the pipeline does the ingestion and enrichment. Issues land in whichever repo owns the code.
This repository is the Next.js 15 frontend for Mukoko News, deployed on Vercel. It is one part of a three-repo platform:
| Repo | Role |
|---|---|
nyuchi/mukoko-news (this repo) | Web frontend — Next.js 15, Vercel |
nyuchi/mukoko-news-gateway | Public API + MCP server — Cloudflare Workers |
nyuchi/mukoko-news-pipeline | Data pipeline — Fly.io + Cloudflare |
The frontend reads news data directly from MongoDB Atlas via Next.js Server Actions.
<script> tagnews.mukoko.dev/mcpAll 54 African Union member states are in scope. The number that is live is a query, not a constant.
getLiveCoverageAction() counts the countries that actually cleared the publishing bar in
the last 30 days, and coverageFragment(n) / coverageClaim(n) in src/lib/constants.ts
are the only sanctioned wording — every page, meta tag and JSON-LD blurb interpolates one
of them. So a country that starts producing appears on its own, and one that goes quiet
drops off on its own, with no code change and nobody editing a number in a file.
This README deliberately does not print the current figure. A hard-coded count in a
document nothing tests is exactly how the app came to claim "16 African countries" on nine
surfaces that had each drifted apart. src/lib/__tests__/coverage-claim.test.ts enforces
the rule for src/; here it is enforced by not writing one down.
We welcome contributions to the frontend — UI improvements, new features, bug fixes, accessibility, tests, and documentation are all fair game. You do not need a database connection to contribute: the whole suite runs against mocked data, and most UI work can be done with the dev server pointed at the live API.
See CONTRIBUTING.md for the full guide, and come say hello in the Discord — it is the fastest way to get a question answered or to find out whether someone is already on the issue you picked.
Open http://localhost:3000.
src/components/src/app/public/embed/| Layer | Technology |
|---|---|
| Framework | Next.js 15, App Router, React 19 |
| Styling | Tailwind CSS 4, CSS variables |
| Components | Radix UI (accessible primitives) |
| Icons | Lucide React |
| Theme | next-themes |
| Auth | WorkOS AuthKit |
| Data | MongoDB Atlas via Server Actions |
| Tests | Vitest, React Testing Library |
| Deploy | Vercel |
Mzizi is the source of truth — the palette, the background
scale and the type ramp are read from its MCP (mzizi_get_tokens), not defined here.
src/app/globals.css holds this app's copy, and src/app/__tests__/design-tokens.test.ts
asserts every value against a checked-in Mzizi snapshot, so a drift fails CI rather than
shipping.
Seven African Minerals carry the brand; these four are the ones you meet first:
| Role | Light | Dark | Mineral |
|---|---|---|---|
--primary | #4B0082 | #B388FF | Tanzanite |
--secondary | #0047AB | #00B0FF | Cobalt |
--success | #004D40 | #64FFDA | Malachite |
--surface | #EEEEEC | #131211 | (Mzizi surface — a background step, not a mineral) |
Fonts: Noto Serif (display/headings), Noto Sans (UI/body), JetBrains Mono
(data and labels) — self-hosted via next/font.
Add a Mukoko News feed to any website:
Layouts: cards · compact · hero · ticker · list
Feeds: top · featured · latest · location
Country: any ISO 3166-1 alpha-2 code (e.g. ZW, KE, ZA, NG)
AI assistants and agents can query Pan-African news via the Model Context Protocol:
No authentication required. The MCP server lives in nyuchi/mukoko-news-gateway.
We take security seriously. Report vulnerabilities by email to security@nyuchi.com — please do not open a public GitHub issue. See SECURITY.md for details.
MIT — see LICENSE.
"Ndiri nekuti tiri" — I am because we are
Built by Nyuchi Technologies and open-source contributors.