npm · solid-objects

Durable Objects on the SQL database you already run

Give each room, cart, or job its own state. Solid Objects runs its calls one at a time and stores the result in the SQL database you already use, so work can continue after a restart.

Read the five-minute guide

How this compares

Four ways to keep two requests from corrupting one record. This table does not rank the projects. It shows what each one asks you to operate, and where each one stops.

Solid Objects A library in your app Cloudflare Durable Objects A managed platform celld A daemon on your VMs SQL transaction Already in your database
Runs with no new service Yes A Redis wake-up is optional No The Cloudflare platform No A daemon on every node Yes
State lives in the database you already run Yes SQLite, PostgreSQL, or MySQL No Managed storage for each object No One SQLite file for each object, in your bucket Yes
One call at a time for each identity Yes Yes Yes No Only inside one transaction
Work continues after a restart Yes Yes Yes No The transaction rolls back
Timers that survive a deploy Yes Reminders are rows Yes Alarms Yes Alarms No A column and a sweeper
Side effects commit with the state Yes A staged outbox No You write it No You write it No
Realtime updates to open pages Yes Committed projections Yes WebSockets Yes WebSockets No
One transaction across two identities No No No Yes In the same database
Runs with no vendor account Yes No Yes Yes

Delivery is ordered and at least once, so an external effect must be idempotent. Exactly once remains absent, despite its excellent branding. The full table, with a primary source for every row, is in docs/comparisons.md. External systems change. Check the primary source before you make an architecture decision.