Infra capabilities: the parts of the backend we keep forgetting
January 20, 2026
3
minute read

Tomas Halgas
Founder & CEO
Backends are usually described as two things: the rules of the system and the data it remembers. Domain logic defines what is allowed to happen, and the database records the results of what has happened.
In many modern stacks, even this framing collapses. The backend becomes “the database with an API.” There may be some logic layered on top, but it is thin, reactive, and entirely driven by requests coming from the frontend.
That model sounds complete until you ask a simple question:
What can this system do when no one is actively clicking a button?
That question reveals a large part of what real backend systems are responsible for, and it is also where many architectures quietly fall short.
The missing dimension is behavior over time
A database-plus-API backend is very good at responding to requests in the moment. A user clicks something, the backend checks permissions, reads or writes data, and returns a response. That interaction model is well understood and well supported.
Real products, however, quickly need more than that. They need systems that can keep working after a user leaves, wait and act later, react automatically when something changes, and survive partial failures without human intervention.
Those abilities do not come from schemas or business rules alone. They come from infrastructure that governs how the system behaves over time, not just how it responds right now.
Concretely, this shows up as a need for backends that can do things like:
continue work in the background after a request finishes
act at a specific time or after a delay
react to events rather than explicit API calls
maintain live or shared state without constant polling
retry, resume, or guarantee completion when things fail
When these capabilities are missing, entire classes of product features quietly disappear or turn into fragile hacks.
The silent limits of database-first backends
When a backend is essentially a database plus synchronous access to it, even if it includes a thin logic layer, it is locked into a narrow execution model. Everything happens immediately. Everything is user-triggered. Everything must finish quickly. Time is barely a first-class concept.
This is not a scaling problem. It is a capability ceiling.
Many products hit it long before they hit traffic limits. The system is not overloaded. It simply cannot behave in the ways the product increasingly requires.
This is why so many features that feel “advanced” are actually just expressions of missing backend behavior. Things like notifying a user when something finishes, making actions reversible for a short window, keeping collaborative state in sync, or guaranteeing that multi-step processes eventually complete.
Those features all rely on the same underlying abilities. If the backend cannot act independently, cannot remember intent over time, and cannot recover from partial failure, the product cannot make those promises.
A more complete way to think about backends
A real backend has three distinct responsibilities.
It needs to think, through domain logic that defines what is allowed. It needs to remember, through persistent state. And it needs to behave, through infrastructure that gives it autonomy, time-awareness, reactivity, and resilience.
Most teams design the first two deliberately. The third is often discovered accidentally, one painful feature at a time. If the underlying architecture does not support it, complexity leaks into product logic and frontend code.
Once you frame the problem this way, the question stops being whether you need “more infrastructure” and becomes something more fundamental:
What kinds of behavior do we want this system to be capable of at all?
That question is what separates backends that merely respond from backends that truly support real products.



