{"slug": "show-hn-replaces-supabase-and-fastapi", "title": "Show HN: Replaces Supabase and FastAPI", "summary": "Jerrycan, an AI-native Rust backend framework and generation platform, replaces Supabase and FastAPI by letting AI agents design, generate, verify, and deploy complete backends from a single description. The framework enforces security and testing by default, producing crate-per-module workspaces with compiler-enforced boundaries for multi-agent development.", "body_md": "**Humanity's last backend. Built for AI agents.**\n\nThe AI-native Rust backend framework + generation platform. Agents design, generate, verify and package complete backends. You never write the code.\n\n[jerrycan.cc](https://jerrycan.cc) · [AI-native docs](/backant-io/jerrycan/blob/main/docs/ai) · [Why jerrycan exists](https://jerrycan.cc/blog/humanitys-last-backend-framework) · [llms.txt](https://jerrycan.cc/llms.txt)\n\n``` bash\n$ jerrycan new --design bookmarks.json       # describe it once\n  ✓ scaffolded a crate-per-module workspace\n\n$ jerrycan gen-tests --module bookmarks      # the test suite is generated for you\n  ✓ 8 acceptance tests written\n\n  …an agent fills in ~12 lines of obvious handler glue…\n\n$ jerrycan --json check                      # build · clippy · audit · tests · lints\n  {\"ok\":true,\"diagnostics\":[]}               # all green: safe + tested, no internals leaked\n```\n\n0.2.0, published onExpect rough edges as it grows.[crates.io]. Early but real.\n\n**Agents build it, you don't.** Describe the API once; jerrycan generates the workspace, a working data layer, and the tests. Handlers come out as a few lines of obvious glue.**Secure by default.** Secure response headers, body limits, strict input handling,**no internals leaked** in errors,`#![forbid(unsafe_code)]`\n\neverywhere, and stable`JC####`\n\ncodes that deep-link into the docs.**Tested before it's \"done\".** jerrycan*generates*the acceptance suite test-first;`jerrycan check`\n\nwon't go green until it passes. What the generator can't derive from the contract becomes an explicit`AGENT TODO`\n\nin the test file, so the gaps are named instead of silent.**Fail loud.** Conflicting routes are build-time errors*before*serving; missing dependencies and cycles are coded errors, not mysteries.**Multi-agent ready.** Generated apps are crate-per-module workspaces with compiler-enforced boundaries, so parallel agents merge without conflicts.**Deploy anywhere, deployed by the agent.**`jerrycan package`\n\nproduces a static binary, a hardened container image, k8s manifests, or a systemd unit, with an SBOM.`jerrycan deploy render`\n\nwrites a deploy kit the agent executes with an API key: design file to live URL, no human in the loop.**Docs that can't lie.** Every example in the docs is a doctest executed in CI.\n\n```\ncargo install jerrycan          # the CLI + MCP server\n```\n\nWire the MCP server into your agent, then ask for a backend in one prompt:\n\n```\n# Claude Code\nclaude mcp add jerrycan -- jerrycan mcp\n// Cursor / any stdio MCP client\n{ \"mcpServers\": { \"jerrycan\": { \"command\": \"jerrycan\", \"args\": [\"mcp\"] } } }\n```\n\nThe agent drives the whole loop: design → scaffold → gen-tests → implement → check → package → deploy. Claude Code users also get the bundled [ jerrycan-backend skill](/backant-io/jerrycan/blob/main/.claude/skills/jerrycan-backend) that guides the process end to end. Point any other agent at\n\n[docs/ai](/backant-io/jerrycan/blob/main/docs/ai)or\n\n[jerrycan.cc/llms.txt](https://jerrycan.cc/llms.txt); the docs are written to be sufficient on their own.\n\n```\n# In your app: the framework, with the extensions you need\ncargo add jerrycan --features db,auth,validate,observe\n```\n\nA route module is Flask's Blueprints, reborn with compiler-enforced boundaries. Everything a handler needs is visible in its signature, and **guards are just dependencies**:\n\n``` php\nuse jerrycan::prelude::*;\n\npub fn module() -> Module {\n    Module::new(\"todos\")\n        .route(\"/\", get(list).post(create))\n        .route(\"/{id}\", get(show).delete(remove))\n        .mount(\"/{id}/comments\", comments::module()) // subroutes nest arbitrarily\n        .provide(TodoRepo::new())                    // module-scoped dependency\n}\n\nasync fn list(repo: Dep<TodoRepo>) -> Result<Json<Vec<Todo>>> {\n    Ok(Json(repo.all().await?))\n}\n\nasync fn remove(_: Dep<Admin>, repo: Dep<TodoRepo>, Path(id): Path<i64>) -> Result<NoContent> {\n    repo.delete(id).await?;            // `Dep<Admin>` is the guard: a dependency that must resolve\n    Ok(NoContent)\n}\n```\n\nTesting runs real requests in memory, no sockets, and **any dependency can be faked in one line**:\n\n``` js\nlet t = app().into_test().override_dep(Db::fake());\nassert_eq!(t.get(\"/todos/\").await.status(), jerrycan::http::StatusCode::OK);\n```\n\nThe agent drives one fixed loop; jerrycan does the generation and the gating:\n\n```\njerrycan_design    → requirements become a validated design.json (pointed questions, not guesses)\njerrycan_scaffold  → a crate-per-module workspace, one route crate per module\njerrycan_gen_tests → failing acceptance tests, generated from the design\n   (the agent implements the handler bodies, guided by the docs tools)\njerrycan_check     → build + clippy + audit + tests + jerrycan lints, machine-readable diagnostics\njerrycan_package   → hardened artifacts + SBOM, only when everything is green\njerrycan_deploy    → a deploy kit for the target platform (Render first), run by the agent\n```\n\n**Project layout of the framework itself**\n\n```\ncrates/\n├── jerrycan          # facade + the CLI/MCP binary, apps depend on this\n├── jerrycan-core     # routing, extractors, DI, modules, middleware, errors, test client\n├── jerrycan-macros   # #[jerrycan::main]\n├── jerrycan-db       # data layer + migrations (SeaORM)\n├── jerrycan-auth     # sessions, JWT, OAuth2, guards\n├── jerrycan-validate  # validation + OpenAPI\n├── jerrycan-observe   # logs, /healthz, /metrics\n├── jerrycan-ratelimit # rate limiting (429 JC0429)\n└── jerrycan-jobs      # background jobs, cron, retries (Postgres / Redis)\ndocs/\n├── ai/               # the AI-native docs, every example is a CI-run doc-test\n└── contracts/        # MCP tool schemas, design.json schema, CLI UX spec\n```\n\nYes, and it's *measured*, not asserted. A **docs-only** agent (given only `jerrycan docs`\n\n, no framework source, no fixtures) builds real backends that pass `jerrycan check`\n\nand serve real HTTP:\n\n**5/5** of the reference CRUD apps: green on the first run, zero doc gaps.- The full\n**multi-tenant SaaS slice**: green across 6 modules + 2 background jobs, driven** live over HTTP**. Auth, per-tenant isolation, signed webhooks, CSV import, scoped API keys, OAuth. A** negative control**(breaking tenant scoping) correctly turns the gate** red**, so the green isn't hollow.\n\nIt's wired as an **un-skippable release gate** (CI + a fail-fast pre-publish block), so it can't silently regress. Full write-up: [ conformance/eval/results.md](/backant-io/jerrycan/blob/main/conformance/eval/results.md).\n\n**For:** CRUD-shaped, multi-tenant REST APIs. The backbone of most SaaS.\n\n**Not (yet):** realtime / WebSockets, GraphQL / gRPC, blob storage, edge / serverless. jerrycan runs as a normal long-lived service. We'd rather name the edges than oversell the middle.\n\njerrycan stands on the Rust ecosystem you already trust, and emits plain Rust you own:\n\n[Rust](https://www.rust-lang.org) · [Tokio](https://tokio.rs) · [hyper](https://hyper.rs) · [SeaORM](https://www.sea-ql.org/SeaORM/) · [serde](https://serde.rs) · [clippy](https://github.com/rust-lang/rust-clippy) · [cargo-audit](https://github.com/rustsec/rustsec)\n\n**Phases 0-4 + the full v2 cycle, all complete (click to expand)**\n\n| Phase | Scope | Status |\n|---|---|---|\n0 - Contracts |\nCore API spike (DI, modules, routing, serving) + AI docs + MCP/CLI contracts | ✅ complete |\n1 - Core loop |\n`jerrycan` CLI (new/generate/dev/check) + MCP server |\n✅ complete (incl. 1b hardening) |\n2 - Data & TDD |\njerrycan-db, jerrycan-validate + OpenAPI, per-module test generation | ✅ complete |\n3 - Production |\njerrycan-auth, jerrycan-observe, `jerrycan package` (Docker/k8s/binary/systemd) |\n✅ complete |\n4 - Hardening |\nFuzzing, agent evals, diagnostics polish → v0.1.0 | ✅ complete |\nv0.1.0 |\nFirst release, crates published on crates.io | 🚀 released |\nv2.0 - Data foundation |\nContract v1 (relations + `on_delete` , unique/index, enums, json, tenancy, jobs shape), SeaORM data layer, `schema.json` contract + `jerrycan_schema` tool, generated isolation tests |\n✅ complete |\nv2.0b - Core readiness |\nDual-lane body + per-route limits, param-carrying mounts, task-scoped DI, extension lifecycle, mockable `Clock` |\n✅ complete |\nv2.1 - Protocol surface |\n`Multipart` / `RawBody` (webhook signatures) / `StreamBody` extractors |\n✅ complete |\nv2.2 - Middleware kit |\nCORS in core; rate limiting as an extension (`429 JC0429` ) |\n✅ complete |\nv2.3 - jerrycan-jobs |\n`JobStore` (Postgres / Redis), retries + dead-letter, named queues, cron, idempotency, `run_at` |\n✅ complete (incl. v2.3b Redis Streams) |\nv2.4 - Auth expansion |\nOAuth2 client, encrypted token storage + key rotation, scoped API keys, mock IdP harness | ✅ complete |\nv2.5 - Eval gate → v0.2.0 |\nReference slice rebuilt on jerrycan, served live, every v2 feature driven over real HTTP, wired as a permanent, un-skippable CI + publish gate | ✅ complete |\n\nThe v1 plan is in the [v1 design spec](/backant-io/jerrycan/blob/main/docs/superpowers/specs/2026-06-09-jerrycan-design.md); the v2 roadmap is in the [v2 design spec](/backant-io/jerrycan/blob/main/docs/superpowers/specs/2026-06-11-jerrycan-v2-design.md); deferred items are in the [backlog](/backant-io/jerrycan/blob/main/docs/phase1-backlog.md).\n\n**Build · test · lint · bench · fuzz**\n\n```\ncargo test --workspace --all-features   # CI runs this, every docs example is a doc-test\ncargo clippy --workspace --all-targets --all-features -- -D warnings\ncargo fmt --all --check\ncargo bench                             # criterion benches (routing, extraction)\ncargo +nightly fuzz run <target>        # fuzz targets live in fuzz/ (outside the workspace)\n```\n\nThe project is built docs-first and test-first: documentation examples are the executable specification.\n\njerrycan is built by one developer and a fleet of agents. Sponsorship pays for the eval infrastructure, the deploy targets, and the time it takes to keep the gate honest.\n\nLicensed under the [MIT License](/backant-io/jerrycan/blob/main/LICENSE-MIT).\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be licensed under the MIT License, without any additional terms or conditions.\n\n[jerrycan.cc](https://jerrycan.cc) · [AI-native docs](/backant-io/jerrycan/blob/main/docs/ai) · GitHub [@backant-io](https://github.com/backant-io)", "url": "https://wpnews.pro/news/show-hn-replaces-supabase-and-fastapi", "canonical_source": "https://github.com/backant-io/jerrycan", "published_at": "2026-07-13 14:28:36+00:00", "updated_at": "2026-07-13 14:35:39.401493+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents", "artificial-intelligence"], "entities": ["Jerrycan", "Supabase", "FastAPI", "Claude Code", "Cursor"], "alternates": {"html": "https://wpnews.pro/news/show-hn-replaces-supabase-and-fastapi", "markdown": "https://wpnews.pro/news/show-hn-replaces-supabase-and-fastapi.md", "text": "https://wpnews.pro/news/show-hn-replaces-supabase-and-fastapi.txt", "jsonld": "https://wpnews.pro/news/show-hn-replaces-supabase-and-fastapi.jsonld"}}