Open to senior backend rolesLagos, Nigeria · UTC+1
Backends that other people’s money, mail and models run on.
I’m Micheal Macaulay — a backend engineer in Lagos. 5 years in Node.js, NestJS and TypeScript, mostly on the parts that are expensive to get wrong: payment integrations, email infrastructure, and the API contracts other teams build against.
Full overlap with London and Dublin. Afternoons overlap New York.

{
"name": "Micheal Macaulay",
"role": "Senior Backend Engineer",
"based": "Lagos, Nigeria",
"years": 5,
"stack": [
"NestJS",
"Node.js",
"TypeScript"
]
}Measured outcomes
- −25%
p95 latencyTechiHire
Before-and-after comparison on the heaviest read endpoints, after replacing repeated per-row relation lookups with indexed joins in PostgreSQL.
- 95%
test coverageTechiHire
Jest and Cypress coverage report across the unit, integration and end-to-end suites on the TechiHire API.
- −65%
memory per requestUpwork contract
Node process memory sampled before and after rewriting the endpoints to stop holding whole payloads in memory.
Three numbers, not eleven. These are the ones I can reconstruct on a call — the instrument, the baseline and the window. The rest of my work is described by what it does rather than by a percentage.
Selected work
All projects →- 2024
Email sync engineA German software company
A service that authenticates against IMAP mailboxes, syncs their contents into Elasticsearch, and pushes updates to connected clients over Socket.io in realtime. Containerised with Docker and documented in Swagger.
- Node.js
- IMAP
- Elasticsearch
- Socket.io
- Docker
- Swagger
- 2024
Case Flow InvestigatorA case-management consultancy
A desktop application for case workers: uploads of reports and supporting documents into a searchable store with role-based access, plus AI-assisted summarisation and transcription of case notes.
- Node.js
- RBAC
- Full-text search
- LLM integration
- 2025
Eyewear frame recommenderA French eyewear retailer
An image-driven recommendation flow: a shopper uploads a photo, a vision model reads it, and the service returns frame suggestions from the retailer’s WooCommerce catalogue.
- Node.js
- Claude API
- WooCommerce
- PHP bridge
- 2025
Streaming JSONL ingesterAn e-commerce client
A product-catalogue importer built on Node.js streams so that file size stops mattering: JSONL is parsed incrementally into Sequelize models and synchronised to MySQL, with rate limiting and concurrency control around the write path.
- Node.js
- Streams
- Sequelize
- MySQL
- Winston
- webpack
Experience
Full CV →- Mar '25 — Present
Lead Backend EngineerTechiHire
Employed · early-stage UK company · remote from Lagos
Lead the backend for a hiring platform, working with a distributed team across several time zones. I own the API surface, the data model and the deployment path.
- Jan '23 — Apr '25
Senior Backend Developer (Freelance)Upwork
Independent contracts · clients in Germany, France, India and the UK
Backend contracts for international clients: email infrastructure, third-party API integrations, data ingestion and AI-assisted features. Most engagements were one to three months, delivered solo against someone else’s existing codebase.
- Dec '21 — Jan '24
Backend EngineerMathis Fashion
Fashion e-commerce
Built and maintained the backend for a fashion e-commerce store — catalogue, orders, checkout and the payment gateway integration behind it.
- Nov '23 — Dec '23
Backend Track — team lead, capstone squadStutern Graduate Accelerator
Two-month programme, not employment
Led the backend squad on the capstone build — PayEase, a payments service for small businesses — and mentored less experienced developers on the cohort.
Working with AI
I have shipped model-backed features into three clients’ production workflows, across text, vision and speech. The interesting engineering is never the API call — it is everything around it.
Shipped into production
- 2025Vision
Eyewear frame recommenderA French eyewear retailer
A shopper uploads a photo; a vision model reads it and the service returns frame suggestions drawn from the retailer’s live WooCommerce catalogue.
A recommendation is only useful if it maps onto stock the shop actually has, so the model’s reading has to be reconciled against a catalogue it has never seen. Handling the response when it does not come back in the shape you asked for is most of the work.
- 2024Speech and text
Case note summarisation and transcriptionA case-management consultancy
Audio transcription and automatic summarisation of case notes inside a desktop application for case workers, alongside an assistant for querying stored records.
Sensitive records, so what may leave the machine and what may not is a design constraint before it is a feature. Long audio has to be chunked and reassembled, and a summary that quietly drops a detail is worse than no summary at all.
- 2022Text generation
Coverly — cover letter generationHNG Internship
Generates a cover letter tailored to a user’s details and a specific job description, behind JWT-authenticated API endpoints.
Built on GPT-3, well before structured output or tool use existed — which meant parsing prose the model returned in whatever shape it liked, and designing endpoints around a call slow enough that the request could not simply block on it.
How I actually use it
- Where I use it
- Daily, across the stack — scaffolding, unfamiliar APIs, test cases I would otherwise skip, and frontend work that is not my strongest suit. It is why I can take a full-stack ticket end to end rather than handing the UI to someone else.
- Where I don’t
- Schema design, auth boundaries, anything touching money, and any decision I would have to defend in a review. Not because a model cannot suggest one, but because I have to be able to explain why it is right, and reconstructing that after the fact is slower than deciding it up front.
- The rule I hold to
- I don’t ship what I can’t explain. That is the same rule this site runs on — the case studies stay unpublished until I have described the systems in my own words, rather than filling them with a plausible account of what they probably did.
- What it doesn’t change
- Reviewing a diff you did not type is still reviewing a diff. The failure mode is accepting something that looks right, and the defence is the same as it has always been: types, tests, and reading the thing before it goes in.
About
Most of what I build is invisible when it works. That is the job.
I started in electrical engineering and moved to backend work because the problems were more interesting: a payment that must not be charged twice, a mailbox sync that has to survive being interrupted, an API that half a dozen people are already building against.
I work with teams across the UK, Europe and the US from Lagos, which means my day already overlaps most of theirs. What I care about in a codebase is whether the next person can read it — so I document the contract, keep the error shapes consistent, and write the test that proves the thing I claimed.
Right now I’m deepening the operational side — the metrics, tracing and alerting I have not had to run before. There is a page on this site that says plainly what I have and have not done.

Contact
If you’re hiring for a backend or platform role, or you have a system that needs untangling, send me the details. This form posts to the NestJS API documented alongside this site — validated, rate limited, and stored before it is emailed, so nothing gets lost on the way.