At Rails World 2026, the creator of Ruby on Rails said two things that sent developers searching. The first was that hand-written code is no longer the normal way 37signals ships software. The second was that HEY’s backend is being rewritten in Rust, by AI agents. This report covers what was claimed, why Rust and coding agents fit together, where the argument breaks, and what 32 open-source Rust apps in the STACK IT FAST directory actually use when they write Rust.
1. What DHH announced
According to keynote recaps, DHH said 37signals now treats agents as the default producers of implementation code and hand-writing as the exception. HEY is being rebuilt as six native apps with a Rust mail backend. He claimed about 99% less CPU and 95% less memory than the Ruby version, a fleet shrinking from 100+ hosts to about 10 kept for redundancy, and joked that peak traffic might fit on a Raspberry Pi. These numbers come from the keynote; no benchmark has been published.
His summary of the language was the line that travelled: Rust is amazing “if you never, ever have to look at it yourself.” The interesting part is not that Rust is fast; that was never in doubt. It is the claim that the cost of Rust, the part that falls on humans, disappears when an agent writes it.
2. Why Rust and coding agents fit
An agent writes plausible code quickly and then needs something to tell it what is wrong. In dynamic languages that signal arrives at runtime, if a test happens to cover the path. In Rust most of it arrives from the compiler:
- Types as specification.
Result,Optionand newtypes make missing cases a compile error, andmatchmust be exhaustive. - The borrow checker. Data races and use-after-free become error messages with a line number and a suggested fix, which is exactly the input an agent loop needs.
- Compile-time SQL.
sqlx::query!checks queries against the real schema duringcargo build, so a renamed column fails the build instead of a request. - Clippy.
cargo clippy -- -D warningsflags unusedResults, needless clones and suspicious logic.
That turns the agent workflow into a loop: edit, cargo check, read the error, fix, repeat, then cargo clippy and cargo test. Every Rust rule on STACK IT FAST now ships that loop in its AGENTS.md.
3. The case against Rust for web apps
The counter-arguments are real, and they are the reason “nobody builds web apps in Rust” keeps coming up (Hacker News, “Farewell, Rust for web”):
- No Rails. There is no framework with Rails’ depth of conventions, gems and answered questions. You assemble Axum, an ORM or query layer, sessions, auth and templating yourself.
- Compile times. Agents feel this too: every loop iteration waits on the compiler. Workspaces,
cargo checkinstead of full builds and a fast linker help. - Dependency trees. A typical web service pulls in hundreds of crates.
- Most CRUD apps are not CPU-bound. If your bottleneck is the database, Rust’s speed buys you lower hosting bills, not faster pages.
A rewrite also carries the usual risk: as Bit Zesty points out, 37signals knows its own system completely and can keep the old one running. Most teams cannot.
4. What 32 open-source Rust apps actually use
We took every directory project whose GitHub language breakdown includes Rust, leaving out the five web frameworks themselves (Axum, Actix Web, Leptos, Loco, Dioxus). That gives 32 repos, 15 of them Rust-first. We parsed every Cargo.toml on their default branches, 822 manifests, for the crates they depend on. Development-only dependencies were excluded.
| Crate | Repos | What it does |
|---|---|---|
serde | 29 | Serialization |
tracing | 27 | Structured logs and spans |
reqwest | 27 | HTTP client |
tokio | 26 | Async runtime |
thiserror | 23 | Typed errors |
anyhow | 21 | Application errors |
hyper | 15 | HTTP primitives |
rustls | 15 | TLS without OpenSSL |
axum | 13 | Web framework |
tower | 13 | Middleware |
jsonwebtoken | 12 | JWT auth |
opentelemetry | 12 | Traces and metrics |
tonic | 10 | gRPC |
Axum won the web framework question. Of the 18 repos that depend on a Rust web framework, 13 use Axum: OpenObserve, SurrealDB, RustFS, Vector, SeaweedFS, authentik, Hoppscotch, Langfuse, Magnitude, vLLM, crates.io, Atuin and Kanidm. Four use Actix Web (Meilisearch, Qdrant, Lemmy, Hyperswitch), and Vaultwarden uses Rocket. The two frameworks are compared in Axum vs Actix Web.
The database layer is still open. sqlx appears in 6 repos (including Atuin, OpenObserve and authentik) and Diesel in 5 (crates.io, Lemmy, Hyperswitch, Vaultwarden, AppFlowy). rusqlite appears in 4 and SeaORM in 1. Many Rust-first projects are themselves databases or storage engines and bring their own storage (RocksDB, LMDB through heed).
Server-side HTML is rare, but it exists. Kanidm renders its whole self-service UI with Axum, Askama and htmx (axum-htmx, askama_web), and authentik’s Rust server also uses Askama. Elsewhere, MiniJinja appears in 3 repos, Tera in 2, and Handlebars and Maud in 1 each. Nobody in the sample ships a Leptos or Dioxus UI yet. Rust in open source is overwhelmingly the backend behind a TypeScript or native frontend, or a Tauri shell (Hoppscotch).
And little of it is agent-written yet. Before this report added ten new Rust projects, the directory had 31 approved projects with Rust in their stack: 22 classic (hand-written), 7 hybrid and 2 agent-heavy. All 10 of its Rust-first repos were classic. A few newer repos are clearly preparing for agents: Loco grades agents on framework tasks in CI, and Atuin, crates.io, Dioxus and Kanidm ship an AGENTS.md. If DHH is right, the classic share is the number that moves.
5. Four ways to build a web app in Rust
Each stack below has a free AGENTS.md, CLAUDE.md, Cursor rule and Agent Skill (SKILL.md) you can drop into a repo.
| You want | Stack | Rule |
|---|---|---|
| Server-rendered pages, minimal JavaScript, the closest thing to Rails + Hotwire | Axum + Askama + htmx + sqlx | Rust + Axum + htmx + Askama |
| One language end to end, reactive UI, server functions | Leptos (SSR + hydration) on Axum | Leptos full-stack |
| Conventions, generators, workers and mailers out of the box | Loco + SeaORM | Loco SaaS |
| A desktop app with a web UI and a Rust core | Tauri 2 + React | Tauri + React desktop |
| A JSON API or backend service | Axum + sqlx + PostgreSQL | Rust + Axum + PostgreSQL |
If you are unsure, start with Axum + htmx: it has the fewest moving parts and compiles fastest, and Kanidm runs its production UI on exactly that stack. Compare the full-stack options in Leptos vs Dioxus and the conventions question in Loco vs Axum. Move to Leptos when the UI needs real client-side state.
6. Takeaways
- Rust’s tax was always paid by humans. Agents change who pays it, which is why the language suddenly looks attractive for ordinary web apps.
- The default stack is settled: Tokio, Axum, Tower,
serde,tracing,thiserror. Pick a data layer (sqlxfor SQL-first, SeaORM or Diesel for an ORM) and a rendering model. - Give the agent the loop, not just the language.
cargo check,cargo clippy -- -D warningsandcargo testafter every change, nounwrap()in handlers, compile-time SQL. - Do not rewrite because of a keynote. The HEY numbers are claims from a team that owns its system end to end. New services and hot paths are a safer place to start.
Methodology. Repos are the 32 directory projects whose GitHub language breakdown includes Rust, excluding the Axum, Actix Web, Leptos, Loco and Dioxus framework repositories. Crate usage comes from every Cargo.toml on each repo’s default branch on 2 October 2026 (vendored, test, bench, fuzz and example manifests excluded; [dependencies], [build-dependencies] and [workspace.dependencies] counted). Delivery modes (classic, hybrid, agent) are the directory’s own classification. Browse all Rust projects on the Rust stack page.