backendgym backendgym · bench Sign in with GitHubSign in

Backend practice on realistic problems.

Each project is a spec and a starter repository. You build it on your own machine, break it on purpose with the failure drills, and write down what happened.

01 pick a project 02 build on your machine 03 break it and write it up

By signing in you agree to the privacy policy.

# pay-once · drill D1

$ make up

✓ the service is up

✓ the load generator is ready

# then, on purpose:

Send one charge body twice with the same idempotency key. Compare the two responses, then list what was stored with `GET /charges`, the local inspection endpoint.

  • D1 Both responses describe the same charge, and `GET /charges` lists it once.
  • D2 The summary ends with `charges=1 duplicate_charges=0`.
  • D3 The second request gets a conflict, and the first charge is still the only one for that key.

record what happened, then write it up

Projects

Pick something to build or fix.

Scenarios, incidents and builds, from warmup to advanced.

01 · scenario Warm-up

The payment that happened twice

A mobile carrier dropped responses mid-checkout, the apps retried, and 17 customers paid twice. Make the charge endpoint safe to retry.

Python FastAPI
~4h Start →
02 · incident Warm-up

The reports that slowed Tuesday

A report filter shipped on Monday, and on Tuesday morning finance reports started timing out. Find out why, fix it, and show the p99 coming back down.

Python PostgreSQL
~3h Start →
03 · scenario Intermediate

The quota that multiplied

Three API instances each kept their own count, and one merchant blew through its limit. Make the limit hold across all of them.

suggested Python Redis Docker
~4h Start →
04 · scenario Intermediate

The orders that never reached the warehouse

Checkout kept taking orders while the broker was down, and 37 of them never reached the warehouse. Make the handoff survive an outage and a repeated delivery.

suggested Python flask RabbitMQ sqlite postgres Docker
~5h Start →
05 · incident Intermediate

Twice the shipping email

After a worker restart, SouthRoute customers got the same shipping email twice. Trace the delivery, restore one email per event, and show the duplicate count at zero.

Python RabbitMQ Docker
~3h Start →
06 · scenario Intermediate

The API nobody could see inside

Lumen Home found out about a catalog outage from customer tickets. Make the service show its four golden signals, and page someone before the next outage spreads.

suggested Python FastAPI Docker Prometheus Grafana
~5h Start →
07 · scenario Advanced

The checkout prices that vanished after a deploy

A deploy flushed Mira's price cache and the checkout fell over on the rush of misses that followed. Make cold reads safe, measure them, and keep checkout usable when Redis goes away.

suggested Python FastAPI Redis PostgreSQL
~5h Start →
08 · scenario Intermediate

The notification queue that made OTPs wait

A newsletter backlog made Bellbird's login codes wait while providers failed and throttled. Get urgent messages through, lose nothing, and measure it.

suggested Python FastAPI Redis
~5h Start →
09 · incident Advanced

The wallet that spent the same credit twice

One Hearth customer spent the same wallet credit twice and ended up below zero. Reproduce the negative balance, work out whether the slow PSP is involved, and restore the invariant.

Python FastAPI PostgreSQL
~5h Start →
10 · build Warm-up

Tasks, with accounts

A design studio lost a deadline to a shared spreadsheet. Build them a task list where each person signs in and sees only their own, from an empty repository to a URL they can open on a phone.

any stack
~12h Start →
series · 4 builds Warm-up → Advanced

The URL shortener

One system, grown step by step: short links for a grocery shop's SMS campaigns, from the first redirect to a campaign that brings a million clicks. Each step starts from the repository you shipped in the one before.

any stack · deploy every step

each step builds on the last Open the series →