Feature 01
A standalone magazine website
The magazine has its own identity, separate from the publisher's business site.


A literary magazine held in nine academic libraries, now at its own address.
Ma Kẹkẹ is a literary magazine of short and flash fiction about contemporary African life. It is held in nine academic libraries and runs an annual award with Pan-African partners.
Despite that standing, it had no home of its own. It sat as one section of the publisher's website, so readers had to dig through a business site to find the stories, and back issues were hard to browse. A magazine taken seriously by libraries and literary partners was presented like an afterthought.
Feature 01
The magazine has its own identity, separate from the publisher's business site.


Feature 02
Every issue is available to read in one place, easy to browse from newest to oldest.

Feature 03
Stories are laid out for reading on phones, tablets and desktop computers, and readers can listen to a story instead (beta).

Feature 04
Pages for submissions and the monthly contest, so writers know how to take part.
Feature 05
New issues and stories can be added without touching code.
Feature 06
Each issue and story is stored in a consistent, structured way, so the archive can later appear in other products, such as a reading app, without being re-entered.
Feature 07
Analytics set up for the first time.
The magazine now looks like what it is: an established literary publication with its own address that libraries, award partners and writers can link to and cite.
The full archive is readable. Back issues that were hard to find are now easy to browse and share.
Each audience gets its own site. Readers and writers come here for the literature; authors seeking publishing services go to the publisher's site.
The archive became a lasting asset. Because the content is well organised, the back catalogue can be reused in future products, not just read on the web.
Measurements in place for the first time. The magazine can now track readership going forward.
A fully static Next.js and TypeScript export, styled with Tailwind CSS, on Render's static hosting, built from its own Strapi CMS with PostgreSQL; Cloudinary for images; ElevenLabs text-to-speech for story narration, saved ahead of time as static audio; sitemap generated at build; Google Analytics.
How a request is served: from a reader's phone over HTTPS to static HTML on Render, which relies on Cloudinary. Strapi CMS is used only when editors publish and ElevenLabs only when narration is generated.
Reader's phone
Any browser, no sign-in
Static HTML on Render
Pre-built pages; no server runs when someone reads
Managed services
Strapi CMS
Used only when editors publish; triggers a rebuild
ElevenLabs
Text-to-speech, used only when narration is generated
Cloudinary
Images
No server runs when readers visit, so hosting is static-site cheap. The CMS is only needed when editors publish.
Editors publish issues in the CMS; a rebuild turns them into static pages.
Plain static HTML loads fast on low bandwidth and low-end phones. Free, with no sign-in, and a published accessibility statement.
The public site holds no user data and has no runtime server, so its attack surface is minimal.
Narration is generated once with the ElevenLabs API and shipped as a static MP3. Readers still load only static files, and the API key stays private.