ONCE Campfire is Basecamp's chat app: a small, MIT-licensed Rails application you can read whole. It's here because of what it does after the response — seven Action Cable channels, model-side broadcasts, turbo_stream templates. Blog, Lobsters, and Mastodon are all request-in, HTML-out. Campfire is the axis none of them test.
Status: work in progress — deep analysis and partial transpilation work today, in the browser. The milestone being built toward is "two tabs, one room, one live message": an emitted binary serving a signed-in room, with a posted message fanning out over the cable to the other tab.
Why Campfire
Feature-dense where Roundhouse is thin, and small enough to hold in your
head: roughly 3,700 lines of application Ruby across seventeen models,
forty-odd controllers, and eighty views. That combination is the point.
Mastodon proves the analysis scales; Campfire pushes it sideways into
constructs a read-heavy app never reaches for —
broadcast_append_to and friends firing from model callbacks,
turbo_stream_from in views, channels authorizing their own
streams, a .turbo_stream.erb response picked by the
Accept header.
It is also the sharpest version of the deployment argument. Campfire ships as a Docker image that wants Ruby, Redis, and a job runner beside it. The thing Roundhouse is aiming at is one static binary that holds the WebSockets itself — same app, same behavior, none of the runtime around it. That's a claim worth being held to, which is why it's a milestone here rather than a bullet point.
What works today
Open it in the IDE: the whole app ingests, and hover types, completion, request traceroute, and the coverage ledger answer across it — client-side, no app boot, no database. Open it in the Playground and it transpiles to any target, emitting what it can and leaving a diagnostic on every construct not yet modeled.
The unmodeled constructs are the interesting part, and they are on screen rather than in a footnote: each one is a diagnostic on its exact line. That ledger is the worklist — the same bar the blog already meets perfectly, Lobsters is close to, and Mastodon is climbing toward. Serving a live room is the next rung, not a finished claim.
A diagnostic says a construct wasn't modeled; it doesn't say whether what was emitted behaves. Campfire's own test suite answers that, and the conformance page publishes the result: every test file the app declares, run against a Roundhouse emit of it, with the failures clustered into a ranked list of what each one is waiting on. Two things make that number worth reading. The app is pinned to a fixed commit, so it is rebuilt on every push to this repo and any movement belongs to a Roundhouse change rather than to upstream drift. And the page lists what the harness stubs in to get the suite running at all — a pass rate propped up by the harness is not a pass rate about the emit, so the props are on the page beside it.
Further reading
- ONCE Campfire — the product, and its self-hosted deployment story
- Conformance vs Comprehension — the project and its oracle
Source: basecamp/once-campfire
(MIT), pinned to a fixed commit; the shipped bundle embeds its LICENSE and
that commit.