Software Engineer · Nairobi

AnaMuraya

Open to workFrontend & full-stack

I build fast, tested, accessible web apps — software that holds up in production.

Currently: shipping side projects & open to full-time / contract

Ana Muraya, smiling in sunglasses and a tailored blazer.Hey! I'm Ana
Selected work

01Things I've built

Four projects, told as case studies — the problem, my role, the technical calls I made, and what came out the other side.

Product · Full-stack · Team

Yebo Sports

A mobile-first PWA for booking sports pitches in Ruaka, Kenya.

ProblemBooking a local pitch meant phone calls and double-bookings. We needed real-time slot availability and payment with the methods Kenyans actually use.
My roleFrontend engineer on a small team — the booking calendar, cart/checkout, and digital wallet flows.
Key callsStored slots in UTC but rendered in EAT so availability is never off by three hours; wired M-Pesa, Visa & Mastercard through one Pesapal checkout; shipped an installable, offline-tolerant PWA because most users arrive on mid-range Android over patchy data.
OutcomeA real facility moved from WhatsApp threads to self-serve booking — with a KES wallet and recurring weekly blocks for teams and schools.
Next.js 15React 19SupabaseTypeScriptPWAPesapalSass
Team · in production
Architecture: a POS device order flows through the POS Service and Order Service — authenticated, validated, processed — then routed over WebSocket to the matching order-confirmation board, or ignored if no board is connected.Architecture: a menu item created or updated on a POS client flows through the POS Service and Menu Service, is validated and stored in MongoDB, then pushed to the matching digital menu board, or ignored if not connected.Click to enlarge
Backend · Real-time · Team

Stream Signage

A digital drive-thru board that mirrors each order and the live menu as it's keyed in.

ProblemDrive-thru orders went wrong the same two ways: staff re-reading orders back to confirm, and menus that didn't know what was sold out. The fix was a board that mirrors the order in real time as it's entered and reflects menu changes the moment they happen.
My roleBackend engineer — I designed the adapter interface every POS integration plugs into, built the real-time sync layer, and owned the POS integrations end to end.
Key callsPut every POS behind one adapter interface so the core talks to all of them the same way and a new POS is an implementation, not a rewrite; drove the boards off DB-change webhooks over WebSocket so screen and source of truth never drift; modeled related data together in MongoDB to skip joins on the hot read path; documented the API in OpenAPI so integrators work off a contract.
OutcomeFive POS systems — Oracle, Clover, HolidayOil, Toast & Tableneeds — unified behind a single adapter, with orders and menu updates landing on confirmation boards in real time. The next POS is a new adapter, not a new project.
NestJSTypeScriptMongoDBWebSocketOpenAPIAWS · EC2/S3/CloudWatchAdapter pattern
Open source · Tooling

A component library, published

From copy-pasted components to a real, typed npm package.

ProblemI kept rebuilding the same inputs in every project. The real fix wasn't another folder of components — it was learning to ship a library properly.
My roleAuthor — the package, the build pipeline, and a written guide so teammates could publish their own.
Key callsShipped dual CJS + ESM bundles with generated .d.ts types for autocomplete; kept React a peerDependency to dodge duplicate-React bugs; benchmarked a plain tsc build against a Rollup pipeline and documented the tradeoffs; validated with npm link before publishing.
OutcomeA published, typed component module — and a walkthrough that's become the team's reference for setting up a first package.
TypeScriptRollupBabelStorybooknpm.d.ts types
Personal build · Frontend architecture

Bank of B.A.C

A trustworthy banking front end — deposits, transfers & statements.

ProblemMoney UIs are unforgiving — one stale balance or double-submitted transfer and the user stops trusting you. I built this to practise making a flow that feels as reliable as it behaves.
My roleSole engineer — architecture, the component library, state, and the entire test suite.
Key callsHeld account state in Context + TanStack Query so optimistic UI never drifts from source of truth; routed every form through React Hook Form to block impossible transactions before they fire; built components in isolation in Storybook and pinned behaviour with Jest + RTL.
OutcomeA fully-tested flow where deposits, withdrawals and transfers reconcile against a live statement — plus a reusable component library. Deployed on Vercel.
Next.jsTypeScriptSassReact Hook FormTanStack QueryContext APIJestRTLStorybook
A little about me

02The person behind the commits

I'm Ana — a software engineer in Nairobi who likes turning messy, real-world problems into software that's fast, tested, and kind to the person using it.

I live mostly in the React + TypeScript world, but I'm comfortable dropping to the backend with Node, Django and REST APIs when a feature needs it. I care about testing, accessibility, and the small details that make an interface feel considered.

Frontend

ReactNext.jsTypeScriptSassTanStack QueryReact Hook FormPWASvelte

Backend & data

NestJSNodeDjangoREST APIsWebSocketMongoDBSupabaseOpenAPIM-Pesa / Pesapal

Craft

JestReact Testing LibraryStorybookAccessibilityAWS · EC2/S3/CloudWatchCI/CDGit

Looking for

Full-time or contract — frontend or full-stack — on a team that sweats the details. Nairobi-based (GMT+3), happily remote.

Raised on early-2000s Cartoon Network & Saturday-morning cartoons — still my debugging soundtrack.

Play playlist
A DigiKids computer lab — rows of desks with monitors running a coding quiz.

Taught kids to code at DigiKids — Python, Pygames & Roblox.

I take the work seriously — not myself. A well-timed (and usually terrible) dad joke is part of my debugging ritual.

Tap for a (deliberately bad) dev joke →
a connected world
I'm based in Nairobi, Kenya 🇰🇪 — finding how far you are…
Let's talk

Building something good?
I'd love to hear about it.

Whether it's a role, a project, or just to swap notes on testing and cartoons — my inbox is open.