A third path
Stop choosing between endpoint sprawl and loading everything.
Normalized collections keep the backend shape simple. Components can ask a fast local query engine for the exact joined, filtered, and aggregated view they need.
01
Endpoint per screen
The backend inherits every view and relationship the product invents.
02
Load everything
The browser receives broad payloads and repeatedly recomputes derived views.
03
Collections + live queries
Keep normalized records locally and ask for each view as a reactive query.
Live relational queries
Describe the view. DB keeps the result current.
Queries can filter, project, join, include, order, group, and aggregate across collections. Differential dataflow updates affected results incrementally as the underlying records change.
On-demand sync
The component query can shape the request.
With on-demand sync, predicates, ordering, limits, and offsets can reach the collection loader. Translate them into API parameters and load only the subset active views require.
Brownfield by design
Adopt collections without replacing the backend.
Start from the data source already in production. Components use the same live-query model whether records arrive through TanStack Query, an API, local persistence, or a sync engine.