一个零行代码的 Web 框架
Rust off Rails 是一组 Markdown 文件,告诉编码智能体如何构建全栈 Rust Web 应用:一套受推崇的技术栈,一种布局,每件事只有一种做法。约定存在于文字之中。智能体来写代码。
curl -fsSL https://rustoffrails.org/install.sh | sh或者在 Claude Code 中:/plugin marketplace add rust-off-rails/rustoffrails
先阅读再管道执行:安装脚本·INSTALL.md
- 0行框架代码
- 60个 Markdown 文件
- 2个数据库,同一份代码
~/code/bookshelf, claude
- >/offrails:new bookshelf:人们记录和评论书籍,之后为移动应用提供 API
- ● 正在读取 AGENTS.md → 访谈 · 原则 · 结构 · 技术栈 · 工作流
- ? 账户?a) 魔法链接(推荐) b) 邮箱 + 密码 c) 仅限邀请 d) 无
- › a
- ? 谁拥有数据?a) 每个用户(推荐) b) 团队 c) 共享
- › 你来决定
- ? 前端?a) htmx(推荐) b) inertia c) spa d) api
- › b
- ? UI 库?a) React(推荐) b) Svelte
- › b
- ? 为其他程序提供 API?a) 无 b) REST + OpenAPI c) GraphQL d) 两者都要
- › b
- ◆ 计划:inertia + Svelte · API rest · 生产环境用 Postgres(本地用 SQLite)
- Book title、author、rating 1–5 · 属于 User
- Review body、stars 1–5 · 属于 Book
- API /api/v1/books、/api/v1/reviews · bearer tokens
- › yes
- +migration/src/m20261013_120000_create_books.rs
- +src/models/book.rs · src/controllers/books.rs
- +web/src/pages/Books/Index.svelte(另有 71 个)
- ✓cargo clippy --all-targets -- -D warnings
- ✓pnpm --dir web typecheck · svelte-check
- ✓cargo nextest run ·SQLite· 142 个通过
- ✓cargo nextest run ·Postgres 18· 142 个通过
- 完成定义:全绿。运行
bin/setup && bin/dev
它是什么
一个由决策而非代码构成的框架。
其他框架交付一个库。Rust off Rails 给你的智能体以判断力:它原本会即兴发挥的每一个选择,都已做出并写了下来。
根本规则
所有代码均由 AI 编写
每一行 Rust、SQL、HTML、CSS、TypeScript 以及每一个 Dockerfile 都由智能体编写。人类编写意图:规格说明在product/,在访谈中回答,在对话中反馈。永远不要写代码。这是其他规则所依赖的规则:样板代码免费,约定由智能体强制执行,规格始终是唯一事实来源。阅读 §0。
Markdown 就是框架
框架会附带一个库,而 Off Rails 附带一份精确的规格。任务队列、会话和 Inertia 适配器会以你拥有的代码形式渲染进你的应用。
强烈的观点,面向智能体
crate 选择、文件布局、命名、错误、测试:一次决定。智能体从不争论 ORM。不一致才是敌人,而非不完美。
开箱即用
认证、任务、邮件、缓存、上传、实时、部署:每一层都有指南和配方,因此智能体永远不会从空白页开始。浏览指南。
工作原理
访谈。规划。生成。通过。
智能体只问人类能回答的问题,把答案写下来,并且只有当编译器以及两个数据库上的测试套件都一致时才完成。
-
01
访谈
只问产品问题,每个都附带推荐的默认值。“谁能看到这个?”可以问;“用哪个 ORM?”永远不问。说“你来决定”,它就会采用默认值。
-
02
规划
一份紧凑的计划(资源、页面、任务、假设)写入
product/规格中,并附带验收标准。规格是持久的记录;聊天不是。 -
03
生成
生成器配方,由智能体运行:迁移 → 模型 → 失败的测试 → 控制器 → 视图,一次一个垂直切片。
-
04
通过
在 SQLite 上运行 fmt、clippy、测试以及Postgres,每条验收标准都追溯到测试,覆盖率门禁。通过,否则就等于没发生。
八项技能,每项对应一个任务
| 技能 | 它做什么 |
|---|---|
/offrails:new | 访谈 → 规划 → 应用骨架 → 规划的功能,通过 |
/offrails:feature | 先规格,后代码。不带参数时:构建product/ |
/offrails:scaffold | 应用前端模式下的完整资源 |
/offrails:generate | 任务、邮件器、频道、认证、模型、迁移、任务 |
/offrails:check | 完成定义:在 SQLite 和 Postgres 上运行 fmt、clippy、测试 |
/offrails:doctor | 对照文档中的每一条约定审计应用 |
/offrails:deploy | 部署配置和经过验证的镜像;在任何面向外部的操作前先确认 |
/offrails:upgrade | 推进应用内置的框架版本并迁移约定 |
你将如何使用它
你写意图。智能体写其他一切。
- 1
说出你想要什么,或者写在
product/features/*.md。用平实的英语。 - 2
智能体先写规格,再写代码:迁移、模型、视图、测试。
- 3
完成即通过在 SQLite 和 Postgres 上,每条验收标准都经过测试。
开发工具
查看在你的应用内。
内置的 Traces、性能分析器、本地邮箱、任务仪表盘和实时在线状态。你的智能体以 JSON 读取同样的数据,因此它可以检查自己的工作。
在 release 构建中,该仪表盘每个请求约消耗 1 µs,且默认仅在开发环境启用。
这笔交易
当打字免费时,什么会改变。
- 一个拥有数十万行的库
- 60 个 Markdown 文件
- 一个代码生成器二进制文件
generators/scaffold.md:智能体运行的一份配方- 约定优于配置
- 约定优于斟酌:智能体从不争论该用哪个 crate
- 为程序员幸福感而优化
- 为智能体正确性而优化:一切由编译器检查
- 魔法,为了省下按键
- 没有魔法。当你不用亲手敲代码时,显式代码的成本很低。
一口气说清技术栈
每个职责一个 crate。替换项不在讨论之列。
Axum·Tokio·SeaORM 本地 SQLite,生产环境 Postgres,同一份代码·Askama·Tailwind·lettre·tracing·一个二进制文件,一个 Docker 镜像
FRONTEND_MODE,在访谈中一次性选定
htmx 默认
Askama 模板,在编译期检查,外加 htmx。无需 Node。适用于 CRUD 应用、仪表盘、内容站点(比如本站)。
inertia
React 或 Svelte 页面,通过生成的 Inertia 适配器实现服务端路由和控制器。当你想要 JS UI 时的选择。
spa
独立的单页应用加 JSON API,适用于 UI 必须是独立应用的场景。类型从 Rust 经由ts-rs流转。
api 进行中
完全没有 UI:为移动应用、合作伙伴和脚本提供后端和带版本的 API。
UI_LIBRARYreact(默认)或svelte,用于inertia,spa和 htmx 岛屿APInone,rest(OpenAPI + tokens),graphql或both:一个公开的、带版本的 API,独立于 UI
而在数据库中:任务队列、缓存和发布/订阅。数据库是唯一的基础设施。
站在巨人的肩膀上
Rails 和 Phoenix 的精华,合而为一。
这里的好点子没有一个是新的。我们从两个我们喜爱的框架中取出了那些经受住时间考验的部分,赋予每个部分以 Rust 的形态,并把它们写下来给智能体使用。
来自 Ruby on Rails
- 约定优于配置,精炼为约定优于斟酌
- 生成器:
rails new和 scaffold,作为智能体运行的配方 - Active Record→ 模型和迁移
- Rails 8 身份验证:基于数据库的会话,生成并拥有
- Solid Queue,缓存和Cable:数据库就是基础设施,无需 Redis
- Turbo 8 页面刷新广播→ 通过 SSE 发送信号
- Action Mailer 预览
- Kamal,
/up和 Docker默认情况下 bin/rails任务→ 一个app二进制文件- 凭据与环境规范
来自 Elixir 和 Phoenix
- Oban:带状态、唯一任务、cron、稍后提醒的持久化任务
- Oban Web→ 实时
/admin/jobs仪表盘 - Swoosh 的本地邮箱→
/dev/mailbox - phx.gen.auth:魔法链接和“检查你的邮箱”开发提示
- LiveDashboard→ 那个
/dev工具箱 - 待处理迁移页面,带有其“运行迁移”按钮
- Ecto 的显式数据层:changesets,无回调
- Channels、Presence 和 PubSub 进行中
- 分布式节点和“让它崩溃”的监督机制 进行中
实地测试
真实应用,由智能体移植。
智能体将广受喜爱的开源应用从 Rails 移植到 Rust。它们遇到的每一个粗糙边缘都会反馈回框架。
-
来自 Fizzy 进行中
fizzyer
Fizzy 的看板和卡片,由智能体用 Rust 重建。
-
来自 FreeScout 进行中
一个 FreeScout 移植版
一个共享收件箱帮助台,由智能体在另一台机器上构建。
-
来自 Uptime Kuma 已构建
uptime-offrails
在 SQLite 和 Postgres 上 1530 个测试全部通过。
构建使用 GPT-6 Luna Claude Sonnet 5.5 Meta 的 Muse Wonder 1 通过 opencode 使用 GLM 5.3 Flash 目标:小而便宜的智能体也能完成实际工作。
开始使用
安装插件。描述应用。观察。
1使用 Claude Code(推荐)
/plugin marketplace add rust-off-rails/rustoffrails
/plugin install offrails@offrails然后,在一个空目录中:
/offrails:new bookshelf: people track the books they've read and review them智能体会采访你,确认计划,然后构建。技能也会在普通请求(“给我做一个新的 Rust Web 应用……”)时触发。
2使用 Codex、Cursor 或任何会读取的智能体AGENTS.md
Read /path/to/rustoffrails/AGENTS.md and make me a new app called "bookshelf".生成的应用带有AGENTS.md和一个内置的.offrails/,因此后续会话无需设置。
3然后
用平实的语言描述功能,或将它们写成规范放在product/:
Scaffold Book with title:string, author:string, published_on:date, rating:integer.
Users must be logged in to create books.