Member-only story
Architecture Series #6: Modern ADRs
Record why your architecture looks the way it does, before someone “fixes” it
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)









