Skip to content
Full-Stack Engineer
Available for work

Olabode
Olusegun.

I build production systems that stay up. Seven years of client work, a CTO role, and contracted fintech engineering — now focused on production correctness: concurrency, reliability, recovery.

Production outcomes
0
double-bookings under concurrent load
350 RPS
baseline before any optimisation
100%
duplicate retries return original response
Location
Lagos · Nigeria · Open to remote
Read the principles ↓
© 2026 Olabode Olusegun
Background

I started writing software for clients in 2019. The first few years were frontend-heavy: building responsive interfaces, integrating APIs, translating what clients said they wanted into things that worked on their phones.

From 2020 to 2021, I was CTO of PeerCars — a vehicle marketplace — where the work shifted from writing code to making architectural decisions that other people's work depended on. That changed what I thought about.

A feature that works in a demo is easy. A system that handles concurrent users, fails gracefully, and recovers without manual intervention is a different problem. After PeerCars, I continued as an independent engineer and deliberately took on harder backend problems: payment systems, marketplace matching, booking flows where a race condition isn't an edge case — it's a Tuesday.

In 2023, a contract with Seerbit built the idempotency layer documented in Chapter 05 of this portfolio. ServiceBridge followed the same year. Servia in 2026. The eight principles here were not written in advance. They were extracted from what those systems forced me to understand.

Timeline
2019 – present
Freelance
Client software, web applications, production systems
2020 – 2021
CTO · PeerCars
Vehicle marketplace — architecture, product, technical leadership
2023
Contract · Seerbit
Payment infrastructure, subscription systems
2023 – present
Independent
Production systems — ServiceBridge, Servia
What is actually happening?

Observe

Before optimising anything in Servia, I didn't know how fast it was.

You cannot improve a system you cannot measure.

The first thing I did before touching Servia's performance was establish what actually existed. Not what I thought existed — what existed. I ran a k6 load test: 50 virtual users, 30 seconds, mixed read and write operations. The numbers came back: 350 RPS on reads, 120 RPS on writes, P95 latency under 180ms. I wrote them down before changing a single line of code.

Three weeks later, after adding Redis caching to the reservation lookup path, I ran the same test. P95 on that path dropped from 180ms to 47ms. Without the baseline, I would have shipped the change and believed it worked. With the baseline, I knew by exactly how much, on exactly which path, under exactly the same load conditions. The optimisation became verifiable rather than assumed.

Observability is not dashboards. It is the discipline of designing systems that expose their own internal state — so that when something fails at 2am in Lagos with no staging environment and a client losing money, you already know where to look. The first question is never "how do I make this faster?" It is "do I know how fast it is now?"

Axiom
"A number without a baseline is an opinion."
Evidence
Servia2026 · Solo
“I ran the k6 test before touching anything. Without that number, every change after it would have been guesswork.”

350 RPS reads, 120 RPS writes, P95 < 180ms — baseline established before any optimisation.

ServiceBridge2023 · Solo
“Sub-200ms was not a target. It was a measurement. The constraint came from the environment, not the spec.”

Sub-200ms API latency measured under real West African connectivity, not sandbox conditions.

Interactive Proof · 01
FROM: Servia · Operations Platform · 2026
10 identical requests. Watch them land.
01
02
03
04
05
06
07
08
09
10
What are we actually agreeing on?

Model

A payment amount passed as a string through Servia's API produced NaN in the UI.

A shared model of the domain prevents an entire class of bugs from being written.

Servia's backend is a stateless Express API. The frontend is a Next.js application. Early in development, I was passing payment amounts as strings through the API — because JSON doesn't enforce types and JavaScript doesn't complain when you multiply a string by a number in most contexts. The bug surfaced in testing: an amount processed as "100" instead of 100, and the formatted display showed NaN. Not a crash. Just wrong, silently, in production-facing code.

I created a shared TypeScript package — @packages/shared — that lives between the Express server and the Next.js frontend. Every request and response type is defined once in that package and consumed by both sides. The compiler enforces the contract at build time. The amount field is typed as number. Passing "100" is now a compile-time error, not a runtime mystery discovered by a customer.

The most expensive bugs are not logic errors. They are contract mismatches — where two parts of a system hold different beliefs about reality and only discover the disagreement in production. Modelling is the practice of encoding the domain into the type system so precisely that invalid states cannot be represented. Not just "what can go wrong?" but "what can we make structurally impossible?"

Axiom
"Make illegal states unrepresentable."
Evidence
Servia2026 · Solo
“The amount field is typed as number in @packages/shared. The string "100" is a compile error now, not a customer complaint later.”

Shared @packages/shared TypeScript package eliminates type contract drift between Express API and Next.js frontend.

Subscription Manager2023 · Solo (Contract)
“Zod schemas at the boundary meant any Seerbit response that didn't match our types failed loudly at the edge, not silently inside business logic.”

Zod runtime validation at every API boundary — the schema is the contract, not the documentation.

Interactive Proof · 02
FROM: Servia · Operations Platform · 2026
Client payload (frontend)
Schema (Zod contract)
{
  "userId": "string",
  "amount": "number",
  "currency": "string"
}
What can fail independently?

Isolate

Servia load test: 56 seats booked in a 50-seat room. Two concurrent requests, both got 200.

A system that fails together has not been designed — it has been assembled.

During Servia's load test, I simulated twenty clients trying to book the last remaining table slots at the same millisecond. The database was running on PostgreSQL's default Read Committed isolation. Two concurrent HTTP threads read the same seating capacity — 48 seats booked out of a 50-seat maximum — both calculated there was room for a party of 4, and both committed. The result was 56 seats booked in a 50-seat room. Under load, this wasn't a rare edge case. It happened consistently whenever capacity neared its limit.

The fix: wrap the check-and-insert flow inside a Prisma transaction block at SERIALIZABLE isolation level. PostgreSQL now tracks read-write dependencies across concurrent sessions. When it detects that a concurrent transaction has inserted a new booking since our query started, it aborts the second write and throws error P2034. The service layer intercepts that code, translates it to HTTP 409, and the client retries. Zero double-bookings since launch.

Isolation is not about microservices. It is not about containers. It is about whether a race — or a failure — in one part of the system can propagate into parts that should be unaffected. Correctness under concurrency is not free. The cost is explicit. The alternative — corruption — has no receipt.

Axiom
"Correctness under concurrency has a price. Pay it."
Evidence
Servia2026 · Solo
“56 seats booked in a 50-seat room. That number appeared in load testing, not in production — but it would have appeared in production first if I hadn't looked.”

Serializable isolation on the reservation route: P2034 → HTTP 409 → client retry. Zero double-bookings since launch.

ServiceBridge2023 · Solo
“One provider's connection failure was propagating to others' dashboards. Isolation boundaries made each tenant's failure independent.”

Multi-tenant request isolation prevents cascading failures across service provider connections.

Interactive Proof · 03
FROM: Servia · Operations Platform · 2026
Isolation:Read Committed
Seats remaining
1
Where does it break?

Stress

14.5% of Servia's booking requests threw database errors under load. That was the proof the system was working.

The system's real specification is what it does under load, not what it does in a demo.

At 50 concurrent virtual users executing booking creations over 30 seconds, 14.5% of Servia's requests threw PostgreSQL P2034 serialization errors. The first time I saw that number, I thought the system was broken. It wasn't. It was proof that the isolation logic was working exactly as designed: concurrent transactions were racing, PostgreSQL was detecting the conflicts, and the service layer was handling them cleanly. Every conflicting request aborted and retried successfully. Zero double-bookings across the entire test run. The error rate was the specification passing.

In ServiceBridge, the load test revealed something different. Redis Pub/Sub maintained sub-100ms notification delivery under sustained WebSocket connection storms. But at a specific connection count, the Node.js event loop started showing backpressure. That number — not an architectural estimate, a measured threshold — became the horizontal scaling trigger. The load test didn't break the system. It told me where the system's assumptions ended and the infrastructure needed to begin.

A load test is not a performance test. A performance test tells you how fast. A load test tells you where the assumptions were wrong. The number you find interesting is not the RPS — it is the failure mode. Every failure found in a load test is a failure that did not happen to a real customer. That is the only meaningful metric.

Axiom
"The failure mode is the specification."
Evidence
Servia2026 · Solo
“A 14.5% error rate is not a problem if every error is handled. The question is not "did it fail?" but "did the failure resolve correctly?"”

50 VUs, 30s, 14.5% P2034 collision rate — all retried cleanly. Zero double-bookings across the full test run.

ServiceBridge2023 · Solo
“The load test gave me the number at which the event loop started showing backpressure. That became the scaling trigger — not a guess.”

Redis Pub/Sub maintained sub-100ms notification delivery under sustained WebSocket connection storms.

Interactive Proof · 04
FROM: Servia · Operations Platform · 2026
Two systems. One is running at 14.5% error rate. Which one?
What happens when it breaks?

Recover

Seerbit webhooks don't always arrive. Sometimes they arrive twice. A subscription renewal could charge a merchant twice without a guard.

Resilience is not the absence of failure. It is the presence of recovery.

The Subscription Manager was built for Seerbit to handle recurring payments for merchant subscriptions. The core problem: payment webhooks don't always arrive. Sometimes they arrive 40 seconds late. Sometimes they arrive twice. A subscription renewal could trigger a charge, the webhook could fail to confirm it, the client could retry, and the merchant gets charged twice. I built the idempotency layer before touching any gateway integration — because the failure mode was known before the first line of production code was written.

Every payment request carries a client-generated idempotency key. Before contacting Seerbit's API, the service checks that key atomically against the database inside a transaction. If the key exists, the original response is returned — no new gateway contact, no new charge. The check happens at the database layer, not application code, because application code can race. The database cannot. Since deployment: duplicate retry requests return the original response 100% of the time.

Resilience is not the absence of failure. It is the presence of recovery. Every distributed system fails. The question is never "will this fail?" The question is "when this fails, what does the system do next?" The answer must be designed before the first request lands — not discovered after the first incident.

Axiom
"Design the recovery before you design the success path."
Evidence
Subscription Manager2023 · Solo (Contract — Seerbit)
“I designed for the retry before I designed for the success path. Seerbit's webhook delivery is non-deterministic. The system had to be.”

Idempotency keys checked atomically before gateway contact. Duplicate retries return original response. Zero duplicate charges.

Servia2026 · Solo
“A 409 tells the client exactly what happened and that it can try again. A 500 is an abdication at the moment the client most needs guidance.”

P2034 serialization errors translated to HTTP 409 with structured conflict body — client retries with exponential backoff.

Interactive Proof · 05
FROM: Subscription Manager · Fintech Infrastructure · 2025
Clicks
0
Charges
0
What are the real limits?

Constrain

ServiceBridge went offline for 11 minutes when a Flutterwave webhook timed out during a GTBank maintenance window. The booking was confirmed on the client. The driver was dispatched. The payment had not cleared.

Constraints are not the enemy of good design. They are the source of it.

In November 2023, ServiceBridge went down for 11 minutes. The cause: a Flutterwave payment webhook hit a GTBank maintenance window. The webhook timed out. The booking UI showed confirmed. The driver received the dispatch notification. The payment had not actually processed. Two users — a homeowner and a plumber — were operating on different beliefs about the state of the same transaction. The failure was not in the code. It was in the assumption that the payment provider's delivery guarantees were deterministic. In West Africa, during bank maintenance windows, they are not.

Every API payload was designed for bandwidth constraint: minimal JSON, no unnecessary nesting, aggressive multi-layer Redis caching, compressed WebSocket frames. When a user's connection dropped and reconnected, session state restored without re-fetching everything. The caching layer made that work. On slow connections, the system fell back gracefully instead of hanging. The constraint didn't limit the architecture — it forced a better one than any greenfield specification would have produced.

The engineers who produce the most durable work are not the ones with the most resources. They are the ones who made the constraints explicit and designed within them deliberately — not around them, and not in spite of them. A constraint is the brief. Not the obstacle.

Axiom
"The constraint is the brief."
Evidence
ServiceBridge2023 · Solo
“The constraint wasn't something to design around. It was the actual specification. Every decision about payload size and caching came from that.”

Multi-layer Redis caching and optimised payloads designed specifically for West African mobile network conditions.

Subscription Manager2023 · Solo (Contract — Seerbit)
“NGN volatility during bank maintenance windows is a real infrastructure constraint in West African fintech. The reconciliation pipeline exists because of it.”

Webhook reliability layer and automated reconciliation built for payment providers with non-deterministic delivery guarantees.

Interactive Proof · 06
FROM: ServiceBridge · Marketplace Engine · 2023
Move the slider. Watch the response narrow its claims.
4G3GSLOWOffline
4G · 20 Mbps
API Response
{
"id": "match_83hGx",
"status": "MATCHED",
"matchedAt": "2024-11-14T09:33:12Z",
"fare": { "amount": 2400, "currency": "NGN" },
"driver": { "id": "drv_22", "name": "Emeka A." },
"eta": "4 mins",
"driverLocation": { "lat": 6.52, "lng": 3.38 },
"vehiclePhoto": "https://cdn.../vehicle.jpg",
"driverRating": 4.87,
"routePolyline": "encoded_polyline_string…",
}
Full fidelity on fast connections. The constraint is invisible — until the network changes.
How does it reach production?

Ship

Servia's CI pipeline catches the type error that would have charged a customer the wrong amount.

Deployment should be the most boring event in the engineering lifecycle.

Servia's CI pipeline runs four gates on every pull request: ESLint, TypeScript strict mode, integration tests, and production build. Not just on merges to main — on every PR. The type-check gate is where that payment amount bug I described in Chapter 02 would have been caught before staging. The integration tests are where booking logic regressions surface before customers experience them. The build gate is where anything that would prevent deployment fails in 3 minutes rather than during a live release. Together they take under 3 minutes and have blocked exactly the kinds of failures they were designed to block.

The most expensive moment in software delivery is the one where a human makes a manual decision under pressure — at 2am with a hotfix in one hand and a production incident in the other. Every gate that depends on human judgment will sometimes be wrong under those conditions. Mandatory CI gates are not bureaucracy. They are the team's standards encoded as machine-checkable specifications. The linter means there is an agreed style. The type-checker means contracts are verified. The integration tests mean behaviour is documented as executable truth.

The goal is not deployment automation. The goal is that deployment is so reliably boring that it stops being an event and becomes a background process. That is when the team can focus on engineering instead of releases.

Axiom
"Boring deployments are a sign of mature engineering."
Evidence
Servia2026 · Solo
“The pipeline caught a type error in the payment module before it reached staging. That's the only metric that matters for a CI gate.”

Mandatory CI gates: lint → TypeScript strict → integration tests → build. Triggered on every PR, not only on main branch merges.

Subscription Manager2023 · Solo (Contract — Seerbit)
“Deployment is an event until it isn't. Automating the rollback removed the last human decision point from the critical path.”

Zero-downtime deployment with automated rollback on payment error rate threshold breach.

Interactive Proof · 07
FROM: Servia · Operations Platform · 2026
Introduce an error
1
Type check
tsc --noEmit
2
Lint
eslint
3
Unit tests
jest
4
Build
next build
What did the system teach you?

Evolve

ServiceBridge's HTTP polling destroyed the database connection pool in production. The architecture had seemed correct until it wasn't.

The most valuable engineering skill is knowing when you were wrong and changing.

ServiceBridge started with HTTP long-polling for match notifications. It was simple. It worked at the load we tested against. Under real production load, it destroyed the database connection pool. Every polling client — and at peak there were hundreds — was holding an open connection waiting for a response that might not come for 30 seconds. Connection pool exhaustion began at roughly 60 concurrent users. The system revealed the architecture's flaw in a way no upfront design review had. The plan had been correct for a system that didn't exist yet.

The rewrite to WebSockets via Socket.io was not the interesting part. The interesting part was understanding why the polling architecture had seemed correct. It was correct for the load I had imagined. Production load was different. The system taught me the gap between the model in my head and the model under real conditions. That gap is always where the actual engineering lives. Every post-mortem surfaces it. Most upfront design documents miss it entirely.

This body of work is not a record of projects. It is a record of what each system forced me to understand that I did not know before I built it. The double-booking bug at Servia required a working understanding of PostgreSQL isolation levels that did not exist for me before the bug did. The connection pool exhaustion at ServiceBridge required understanding the difference between the system I had designed and the system I had built. The most valuable engineering skill is not knowing the right answer. It is recognising when you were wrong and changing.

Axiom
"The system will always know more than the plan."
Evidence
ServiceBridge2023 · Solo
“The polling architecture seemed correct in design. Production told me otherwise. The rewrite wasn't the lesson. Understanding why the first version had seemed right was.”

HTTP polling replaced with WebSocket after connection pool exhaustion under production load revealed the architecture's flaw.

Servia2026 · Solo
“I didn't know what I didn't know about isolation levels until Servia showed me. That's what production systems are for.”

The double-booking bug under Read Committed was discovered in load testing — and required building a working understanding of PostgreSQL isolation that didn't exist before.

Interactive Proof · 08
FROM: ServiceBridge · Marketplace Engine · 2023
The plan vs what production said. Select any decision.
The Plan
What Production Said
Select a decision →
Available for work · Lagos / Remote

You have a
problem.
Let's solve it.

Payment systems that fail under retry. Marketplaces that can't scale. Booking systems that double-charge. These are solvable problems. I've solved all of them in production.