<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg" -->

---
title: Solid Objects — Cloudflare Durable Objects for Rails
description: Solid Objects is a Ruby gem (v0.5.1) that ports the Cloudflare Durable Objects virtual-actor model to Rails, backed by PostgreSQL 14+, MySQL 8.0+, or SQLite...
canonical: https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Solid Objects — Cloudflare Durable Objects for Rails | daily.dev
og:description: Solid Objects is a Ruby gem (v0.5.1) that ports the Cloudflare Durable Objects virtual-actor model to Rails, backed by PostgreSQL 14+, MySQL 8.0+, or SQLite...
og:url: https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg
og:image: https://api.daily.dev/og/posts/pEYqPVOHg.png
og:image:alt: Solid Objects — Cloudflare Durable Objects for Rails
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Solid Objects — Cloudflare Durable Objects for Rails

**[Ruby Flow](https://daily.dev/sources/rubyflow)** · 11 min read · 6 upvotes · 0 comments

## Summary

Solid Objects is a Ruby gem (v0.5.1) that ports the Cloudflare Durable Objects virtual-actor model to Rails, backed by PostgreSQL 14+, MySQL 8.0+, or SQLite 3.35+ — no Redis required. Each actor has a stable addressable identity (Actor.ref("id")), durable JSON state in your existing database, a strictly ordered per-object mailbox, per-entity alarms via schedule, and fenced single-writer safety using monotonic generation tokens to prevent split-brain writes. On top of that, wrapping ERB in solid_object and declaring observables delivers automatic Turbo Stream live updates to every connected browser with no channel classes, no manual broadcasts, and no Stimulus. Canonical use cases shown include rate limiters, seat holds, shopping carts, sagas with transactional outbox effects, and chat rooms. Requires Ruby 3.3+ and Rails 8.0+.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://solidobjects.dev/>

## Questions this post answers

### How does Solid Objects guarantee ordering compared to Solid Queue's limits_concurrency?

Solid Objects assigns each actor a durable sequence so messages process earliest-first, one turn at a time, and a retrying failure blocks later messages until it resolves or dead-letters. Solid Queue's limits_concurrency only caps how many jobs run for a key; it explicitly makes no promise about order, so two jobs for the same record can still interleave or run backwards.

_Rails developers weighing background job ordering guarantees can follow deep dives like this on daily.dev._

### How does Solid Objects prevent split-brain writes from stale workers?

Every activation gets stamped with a monotonic generation number acting as a fencing token, and every state commit is conditional on owner plus generation plus an unexpired database-time lease. A stale owner's commit fails that predicate and the entire turn rolls back, including state, effects, reminders, and messages, unlike bare-expiry leases used elsewhere.

_Anyone architecting fenced concurrency in Rails can track patterns like this via daily.dev._

### What database and Ruby/Rails versions does Solid Objects require?

Solid Objects requires PostgreSQL 14+, MySQL 8.0+, or SQLite 3.35+ for storage, plus Ruby 3.3+ and Rails 8.0+ to run. It needs no Redis or separate service, similar to Solid Queue, Solid Cache, and Solid Cable, since it stores actor state in the relational database already in use.

_Rails developers evaluating new gems before adoption can check version requirements like these on daily.dev._

## Similar posts on daily.dev

- [GitHub - cardmagic/solid\_objects: A Ruby on Rails port of CloudFlare's Durable Objects using Solid Queue principles with automatic ERB reactivity](https://daily.dev/posts/github---cardmagic-solid-objects-a-ruby-on-rails-port-of-cloudflare-s-durable-objects-using-solid-q-mnyhorafh) · Ruby Flow · 2 upvotes · 0 comments
- [solid\_objects/docs/fit.md at main · cardmagic/solid\_objects](https://daily.dev/posts/solid-objects-docs-fit-md-at-main-cardmagic-solid-objects-wdhvumavj) · Ruby Flow · 1 upvotes · 0 comments
- [Cloudflare Durable Objects: state that lives in one place](https://daily.dev/posts/cloudflare-durable-objects-state-that-lives-in-one-place-bshikg52i) · Flavio Copes · 0 upvotes · 0 comments
- [Rails 8 Solid Cache: Database-Backed Cache Store](https://daily.dev/posts/rails-8-solid-cache-database-backed-cache-store-6lgeokcjo) · Saeloun · 0 upvotes · 0 comments
- [Durable Objects on Cloudflare – Master.dev Blog](https://daily.dev/posts/durable-objects-on-cloudflare-master-dev-blog-zl8uewo5b) · Frontend Masters · 0 upvotes · 0 comments

---

Tags: [#rails](https://daily.dev/tags/rails)

[View this post on daily.dev](https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Solid Objects — Cloudflare Durable Objects for Rails","url":"https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg"},"datePublished":"2026-08-08T20:53:30.606Z","dateModified":"2026-09-14T07:41:20.003Z","description":"Solid Objects is a Ruby gem (v0.5.1) that ports the Cloudflare Durable Objects virtual-actor model to Rails, backed by PostgreSQL 14+, MySQL 8.0+, or SQLite...","image":"https://media.daily.dev/image/upload/s--1KxV4ohY--/f_auto/v1722860400/public/Placeholder%2007","thumbnailUrl":"https://media.daily.dev/image/upload/s--1KxV4ohY--/f_auto/v1722860400/public/Placeholder%2007","isAccessibleForFree":true,"articleSection":"Ruby Flow","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Ruby Flow","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/a21aaa8bcbbf448193a016895c90a0e1","url":"https://daily.dev/sources/rubyflow"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":6},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"rails","timeRequired":"PT11M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Ruby Flow","item":"https://daily.dev/sources/rubyflow"},{"@type":"ListItem","position":3,"name":"Solid Objects — Cloudflare Durable Objects for Rails"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/solid-objects-cloudflare-durable-objects-for-rails-peyqpvohg#faq","mainEntity":[{"@type":"Question","name":"How does Solid Objects guarantee ordering compared to Solid Queue's limits_concurrency?","acceptedAnswer":{"@type":"Answer","text":"Solid Objects assigns each actor a durable sequence so messages process earliest-first, one turn at a time, and a retrying failure blocks later messages until it resolves or dead-letters. Solid Queue's limits_concurrency only caps how many jobs run for a key; it explicitly makes no promise about order, so two jobs for the same record can still interleave or run backwards. Rails developers weighing background job ordering guarantees can follow deep dives like this on daily.dev."}},{"@type":"Question","name":"How does Solid Objects prevent split-brain writes from stale workers?","acceptedAnswer":{"@type":"Answer","text":"Every activation gets stamped with a monotonic generation number acting as a fencing token, and every state commit is conditional on owner plus generation plus an unexpired database-time lease. A stale owner's commit fails that predicate and the entire turn rolls back, including state, effects, reminders, and messages, unlike bare-expiry leases used elsewhere. Anyone architecting fenced concurrency in Rails can track patterns like this via daily.dev."}},{"@type":"Question","name":"What database and Ruby/Rails versions does Solid Objects require?","acceptedAnswer":{"@type":"Answer","text":"Solid Objects requires PostgreSQL 14+, MySQL 8.0+, or SQLite 3.35+ for storage, plus Ruby 3.3+ and Rails 8.0+ to run. It needs no Redis or separate service, similar to Solid Queue, Solid Cache, and Solid Cable, since it stores actor state in the relational database already in use. Rails developers evaluating new gems before adoption can check version requirements like these on daily.dev."}}]}
```

