Symphony State orchestrates server cache, UI state, URL params, and browser persistence
without forcing a monolithic global store.
Not another state library. A conductor that lets each source play its part, resolves conflicts with clear precedence, and makes every decision observable.
Architecture
Four sources, one conductor
Try it
15-second live demo
👉 Type 'usb' in the filter field
This updates URL state → derived list recomputes instantly. In a typical app, this would be two separate setState calls. Here it's one atomic transaction.
Score
0 eventsThis panel shows the event log — every state transaction, every source change, every derived recomputation. In a real app, this is what you'd see in the Symphony DevTools.
Key concepts
What makes it different
Orchestration, not ownership
Each source keeps its store. Symphony State coordinates reads, writes, and conflict resolution across all of them.
Single-wave commits
Updates are staged, dependency-ordered, and committed atomically. No cascading re-renders, no stale intermediate states.
Observable state
Every value carries its provenance. The Score panel shows which source is driving, what was reconciled, and why.
Composable adapters
Atom, Zustand, Redux, TanStack Query, URL params — plug in what you use. No migration required.
Reconciliation precedence
Server vs. optimistic vs. persisted? Priority, staleness, and custom rules decide deterministically.
Minimal re-renders
Subscribers are notified only for touched sections. Unchanged components stay untouched.
See it in action
An Inventory Dashboard that uses all four state sources, with a live Score panel showing every decision.