Boring architecture,chosen on purpose.
Most products do not fail because the framework was wrong. They fail because state ended up in three places, because nobody decided what happens when the payment provider is down, or because someone added a queue in month two and a cache in month three and now nothing is debuggable.
- SCOPE
- 3 products
- SHAPE
- Same spine
- STORE
- Postgres
- RULE
- Add nothing early
Every product I build has the same six parts.
Not because I am incurious, but because the shape is not where the value is. A typed client, one API surface, a relational database holding the truth, a cache only where reads got expensive, workers for anything slow, and third-party services kept at the edges. What changes between products is the domain model, and that is where the thinking should go.
One place, and everything else derives from it.
The first question on any project is which facts are true and where they are written down. Everything after that is derivation. If a number can be computed from the facts, it gets computed, or it gets stored in something explicitly labelled as derived and rebuildable with one command.
Complexity has to be earned by a measurement.
Every extra component is a thing that can fail at 2am, and a thing the next engineer has to understand. So each one needs a trigger, agreed in advance, rather than a hunch.
Decided before launch, not during the incident.
Every third party in the system gets the same three questions written down: what does the user see when it is down, what happens to the work that was in flight, and how do I know it happened without a customer telling me.
| WHEN THIS IS DOWN | THE USER SEES | THE WORK |
|---|---|---|
| Email provider | Nothing, it is not in their path | Queued, retried, alerted after N failures |
| Payment provider | A plain message, not a stack trace | Nothing marked paid without a confirmed webhook |
| File storage | Upload disabled, rest of app works | No half-written records pointing at nothing |
| The database | An honest status page | Point-in-time backups, restore actually tested |
Same shape, different hard parts.
The architecture barely changes between my three products. The domain problem changes completely, and that is where the weeks go.