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