Design and review
Claude
Where a design gets argued with before it is built. It reads a whole plan at once, pushes back on the weak assumption, and drafts the tedious middle so my attention goes to the decisions that are actually load-bearing.
Abik MaharjanBackend DeveloperKathmandu
I build backend systems on Cloudflare: Workers at the front, Queues between them, Durable Objects where the state has to be authoritative, and Postgres behind Hyperdrive. Many small services instead of one large one — each with a single job, an explicit failure mode, and no server to keep alive. I care about the parts nobody sees, because those are the parts that fail at three in the morning.
Background

I build backend systems on Cloudflare, and I am most useful on the parts of a system that are hard to see.
That means distributed services rather than one application: Workers at the edge, Queues between them, Durable Objects where something has to be authoritative, R2 and KV for the state that suits them, and Postgres behind Hyperdrive as the system of record. Dozens of small deployments, each with one job, each replaceable without a migration plan.
Most of what I care about is unglamorous: a consumer that can be retried without doing the work twice, a webhook whose signature is checked before anything else happens, a secret that lives in a store rather than in a deploy, and a failure that surfaces as a dead-letter message instead of a silence. Delivery semantics, idempotency, and the authorization boundary are decisions I want made deliberately and written down, because the alternative is discovering them during an incident.
I work from Kathmandu, remotely, across time zones.
What I build with
Five primitives, one per layer of a request's life, chosen because the failure modes are knowable and the shape they push you towards is the right one. Each entry says what it actually does in the systems I build, not what its landing page claims.
Runtime
Every service is a Worker: an ESM module with a fetch handler, no framework underneath it, and a dependency list short enough to read in full. Code runs in the data centre the request arrived at, starts in a millisecond, and has no container, no image, and no idle instance behind it.
No cold-start tax and no server to keep alive means a service can be small enough to have exactly one job.
Messaging
The seam between accepting work and doing it. Producers acknowledge fast and get out of the request path; consumers process in batches, retry on their own terms, and drop what they cannot handle into a dead-letter queue instead of a log file. Delivery semantics are a decision made per lane, not a default inherited.
A slow dependency should back up a queue, never a request the caller is still waiting on.
Coordination
Where the system needs one authoritative copy of something and the guarantee that only one thing is touching it. Single-threaded, addressable by name, with SQLite storage and alarms that let an object wake itself up later — scheduling, sequencing, and any invariant that a race would otherwise destroy.
Strong consistency at a known address is worth more than a distributed lock you have to get right.
Data
The system of record: real constraints, real transactions, real migrations. Hyperdrive is what makes it reachable from a runtime with no long-lived connections — pooling and caching in front of the database so a Worker can query it without exhausting it.
Serverless compute is not a reason to give up the relational guarantees that outlive every service in front of them.
Composition
How the services find each other. Most of them have no public route at all: they are reachable only through a binding, worker to worker, without leaving Cloudflare's network. The public edge is one service that verifies the caller, and everything behind it can assume it has already been checked.
A private-by-default network makes the authorization boundary a place you can point at.
Selected projects
The production work is private, so what is here is the public half: tools I build for myself and keep using, plus a couple of apps. Every entry is a repository you can open and read — no screenshots standing in for code.
The full surface
The stack above is the spine. This is everything else the runtime provides that I reach for by name, grouped by the problem it solves — primitives and what they are for, with the systems they happen to run left out on purpose.
Compute
Small single-purpose Workers rather than one large service. No framework underneath them — a fetch handler, a router I can read in one screen, and a dependency list short enough to audit.
Composition
Most workers have no public route and no workers.dev subdomain at all. They are reachable only through a service binding, which makes the authorization boundary a single edge on the graph rather than a check repeated in twenty places.
Messaging
Ingestion and processing are separate deployments with a queue between them. The producer's job is to accept and acknowledge; the consumer's job is to be retried safely. Neither one can take the other down.
State and storage
Each store is picked for the shape of the data, not out of habit: strongly consistent coordination in one, hot lookups in another, bytes in a third, and the system of record in Postgres.
Identity and secrets
Nothing authenticates by comparing strings it was deployed with. Secrets resolve at runtime from a store the deployment pipeline cannot read, and every inbound request proves who it is before it reaches anything that matters.
Operations
A change is tested, deployed, and observable without anyone opening a dashboard to make it happen. The interesting part of a system should be the design, not the ritual around shipping it.
Roughly forty of these services are in production, each one a deployment of its own. The count is not the point — the point is that a service small enough to hold in your head is a service you can reason about at three in the morning, and the platform makes that shape cheap enough to actually commit to.
How the work gets made
I use AI tooling daily and would rather say so plainly than pretend otherwise. It is leverage on the mechanical parts — drafting, refactoring, arguing with a design before it is built. The architectural decisions, the trade-offs, and the responsibility for what ships are mine.
Design and review
Where a design gets argued with before it is built. It reads a whole plan at once, pushes back on the weak assumption, and drafts the tedious middle so my attention goes to the decisions that are actually load-bearing.
Implementation
In-editor work with the codebase in context: multi-file refactors, renames that hold across a project, and the mechanical edits that would otherwise break concentration. Fast enough to stay in the loop rather than around it.
Get in touch
Open to work and interesting problems.
Email is the fastest way to reach me. If you would rather read code than a CV, the public repositories are there — open one and tell me where it is weak. If you want to talk about the production work, ask and I will walk you through the architecture.
These are canned answers to the questions people usually ask. The panel in the corner reads from this same list — it is a script, not a language model.