Symphony State / Open source

Every state source,in concert.

Compose server data, local UI, URL state, persistence, and optimistic updates with one predictable React hook.

The shiftbloom Bloom mark

React 19 · TypeScript · Apache-2.0

Architecture / 01

Four sources. One score.

Keep each store independent. Symphony State stages their updates, resolves dependencies, and commits one consistent view.

  1. 01Server cacheTanStack Query / SWR
  2. 02UI stateLocal component state
  3. 03URL paramsSearch params / routing
  4. 04PersistencelocalStorage / IndexedDB

Conductor

Symphony State

Stage → reconcile → derive → commit

Deterministic / observable

Independent inputsSingle-wave commit → UI

Live score / 03

Hear the state change.

Four short moves show URL, server, local, and derived state resolving through one conductor.

01
02
03
04

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.

⬢url
◈ui
⬡server
Wireless Headphones△derived
USB-C Hub△derived
Mechanical Keyboard△derived
4K Webcam△derived
Portable SSD△derived
Smart Speaker△derived
Monitor Arm△derived
Standing Desk△derived

Score

0 events

This 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.

Principles / 04

Clear rules. Fewer surprises.

  1. 01

    Orchestration, not ownership

    Each source keeps its store. Symphony State coordinates reads, writes, and conflict resolution across all of them.

  2. 02

    Single-wave commits

    Updates are staged, dependency-ordered, and committed atomically. No cascading re-renders or stale intermediate states.

  3. 03

    Observable state

    Every value carries its provenance. The Score shows which source is driving, what was reconciled, and why.

  4. 04

    Composable adapters

    Atom, Zustand, Redux, TanStack Query, and URL params plug into the stores you already use. No migration required.

  5. 05

    Explicit precedence

    Priority, freshness, staleness, and custom rules resolve conflicts between server, optimistic, and persisted state.

  6. 06

    Quiet rendering

    Subscribers are notified only for touched sections. Components whose state did not change stay untouched.

Open by default / 05

We grow in public. We ship the work. We leave the door open.