Sitemap
Backend Engineers Club

Real-world backend engineering scalability, systems design, and the production failures nobody warns you about.

Member-only story

Architecture Series #6: Modern ADRs

15 min readOct 8, 2026

--

Press enter or click to view image in full size
Preserve the Why

Six months from now, a new developer opens your project.

They see an outbox table. A relay process. Sync services in an async-capable Django. A ForeignKey to the user model in a codebase that forbids cross-context dependencies.

New developer: “Why is this so complicated? Let’s just publish events after save.”

They delete the outbox. Tests pass. The deploy succeeds.

You can read this article for free via this link: Click Here 👈

Three weeks later:

Finance:  "Revenue in our reports doesn't match Stripe."
Support: "Customers paid, but never got a confirmation email."
You: "...who removed the outbox?"
New dev: "Nobody told me why it was there."

They weren’t careless. They were missing one thing: the reason.

In the last article, we made a lot of decisions:

→ Sync application services, async only at the edges
→ Events written to an outbox, in the same transaction
→ Repositories for writes, plain ORM queries for reads
→ Contexts talk only through api.py
→ One allowed exception: ForeignKey(settings.AUTH_USER_MODEL)

--

--

Anas Issath
Anas Issath

Written by Anas Issath

From Backend Developer to System Thinker

Backend Engineers Club
Backend Engineers Club

Published in Backend Engineers Club

Real-world backend engineering scalability, systems design, and the production failures nobody warns you about.