Rust off Rails 发布面向 AI 时代的 Rust Web 框架
Rust off Rails: The opinionated web stack for the AI era
Rust off Rails 发布一套不含框架代码的 Rust Web 框架,用 60 个 Markdown 文件规定技术栈、目录结构和开发约定,由编码智能体据此生成全部代码。
一个零行代码的 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
- › 是
- + 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
通过
fmt、clippy、在 SQLite 和 Postgres 上的测试,每条验收标准都追溯到测试,覆盖率门槛。通过,否则不算完成。
八项技能,每项对应一项工作
| 技能 | 它做什么 |
|---|---|
/offrails:new | 访谈 → 计划 → 应用骨架 → 计划的功能,通过 |
/offrails:feature | 规格先行,然后代码。无参数时:构建 product/ 中变更的内容 |
/offrails:scaffold | 应用前端模式下的完整资源 |
/offrails:generate | 任务、邮件发送器、频道、认证、模型、迁移、任务 |
/offrails:check | 完成定义:fmt、clippy、在 SQLite 和 Postgres 上的测试 |
/offrails:doctor | 对照文档中的每项约定审计应用 |
/offrails:deploy | 部署配置和已验证的镜像;在任何面向外部的操作前先确认 |
/offrails:upgrade | 推进应用内置的框架并迁移约定 |
你将如何使用它
你写意图。智能体写其他一切。
- 1
说出你想要什么,或写在
product/features/*.md中。用平实的英语。 - 2
智能体先写规格,再写代码:迁移、模型、视图、测试。
- 3
完成意味着通过 SQLite 和 Postgres,每条验收标准都经过测试。
开发工具
深入了解你的应用。
追踪、性能分析器、本地邮箱、任务仪表板和实时在线状态,内置。你的智能体以 JSON 读取相同数据,因此可以检查自己的工作。
在发布构建中,仪表板每个请求约花费 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
通过生成的 Inertia 适配器,使用服务端路由和控制器的 React 或 Svelte 页面。当你想要 JS UI 时的选择。
spa
一个单独的单页应用加 JSON API,适用于 UI 必须是独立应用的情况。类型通过 ts-rs 从 Rust 流转。
api 进行中
完全没有 UI:一个后端和面向移动应用、合作伙伴与脚本的版本化 API。
UI_LIBRARYreact(默认)或svelte,用于inertia、spa和 htmx 岛屿APInone、rest(OpenAPI + tokens)、graphql或both:一个公开的、版本化的 API,独立于 UI
而在数据库中:一个任务队列、一个缓存和 pub/sub。数据库是唯一的基础设施。
站在巨人的肩膀上
Rails 和 Phoenix 的精华,合二为一。
这里的好点子没有一个是新的。我们从两个我们热爱的框架中挑选了那些经受住时间考验的,赋予每个一个 Rust 的形态,并把它们写下来供 agent 使用。
来自 Ruby on Rails
- 约定优于配置,精炼为约定优于斟酌
- 生成器:
rails new和 scaffold,作为 agent 运行的配方 - Active Record → 模型和 迁移
- Rails 8 认证:数据库支持的会话,生成并拥有
- Solid Queue、Cache 和 Cable:数据库就是基础设施,无需 Redis
- Turbo 8 页面刷新广播 → 通过 SSE 发送信号
- Action Mailer 预览
- Kamal、
/up和 Docker 默认启用 bin/rails任务 → 一个app二进制文件- 凭据与环境纪律
来自 Elixir 和 Phoenix
- Oban:带状态的持久任务、唯一任务、cron、snooze
- Oban Web → 实时
/admin/jobs仪表盘 - Swoosh 的本地邮箱 →
/dev/mailbox - phx.gen.auth:魔法链接和“检查你的邮箱”开发提示
- LiveDashboard →
/dev工具箱 - 待处理迁移页面,带有其“运行迁移”按钮
- Ecto 的显式数据层:changesets,无回调
- Channels、Presence 和 PubSub 进行中
- 分布式节点和“让它崩溃”监督 进行中
还有
实地测试
真实应用,由 agent 移植。
Agent 将广受欢迎的开源应用从 Rails 移植到 Rust。它们遇到的每一个粗糙边缘都会反馈到框架中。
-
来自 Fizzy 进行中
fizzyer
Fizzy 的看板和卡片,由 agent 在 Rust 中重建。
-
来自 FreeScout 进行中
一个 FreeScout 移植
一个共享收件箱帮助台,由 agent 在另一台机器上构建。
-
来自 Uptime Kuma 已构建
uptime-offrails
在 SQLite 和 Postgres 上 1530 个测试全部通过。
使用 GPT-6 Luna Claude Sonnet 5.5 Meta 的 Muse Wonder 1 通过 opencode 使用 GLM 5.3 Flash 目标:小巧、廉价的 agent 也能完成真正的工作。
开始使用
安装插件。描述应用。观看。
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 themAgent 会采访你,确认一个计划,然后构建。技能也会在普通请求上触发(“给我做一个新的 Rust Web 应用……”)。
2 使用 Codex、Cursor 或任何读取 AGENTS.md 的 agent
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.来源:Hacker News · rustoffrails.org