Pantry Host 0.3.0
The largest release yet. Pantry Host gains a pure-Rust single-binary backend, a first-boot setup wizard, and a flashable Raspberry Pi Zero W image — turning self-hosting from a multi-step Node install into a flash-and-go appliance. Built on top of the Postgres → SQLite switch, the whole stack now runs comfortably on Pi 3-class (and Pi Zero W) hardware.
✨ Highlights
🦀 Rust GraphQL backend (packages/server)
A from-scratch Rust port of the Node graphql-server, and a drop-in replacement on port 4001 — the React app, web PWA, and MCP server talk to it unchanged.
- Stack: axum 0.8 + async-graphql 7 + rusqlite 0.31 (bundled SQLite, no system libsqlite3) + r2d2 pool, reqwest (rustls), pure-Rust
imagecrate (replacessharp), rust-embed. - Footprint: ~7 MB stripped binary, ~7 MB RSS at runtime (vs 80–150 MB for the Node stack) — no
node,tsx,esbuild, orsharpnative deps to wrangle on ARMv6. - Feature parity: full GraphQL query/mutation surface,
POST /upload(background variant pipeline),POST /fetch-recipe(3-tier scraper),generateRecipes(Anthropic), plus/api/recipe-ics,/api/lookup-barcode,/api/plu,/api/settings-*,/api/wikibooks, and embedded frontend serving.
🧭 First-boot installer (packages/installer-ui)
A guided setup wizard (Welcome → Tailscale → Bluesky → Summary) embedded directly into the Rust binary via rust-embed and served on first boot. No more "SSH in and run apt + tailscale + git clone."
📀 Bootable Pi Zero W image (packages/image)
A Docker-based flashable image builder: cp .env.image.example .env.image, fill in Wi-Fi, ./build.sh, ./flash.sh. The Pi reaches http://pantry.local in ~60–90s. Replaces the manual cross-compile + scp + systemd dance with a single dd.
- First-boot performance tuning + faster on-device SSH key generation.
- Auto-sets
tailscale --operatoron first boot and honors the system hostname when registering with the tailnet.
🗄️ Postgres → SQLite (#28)
The database layer is now SQLite end-to-end — Node 22's built-in node:sqlite for the app, rusqlite for the Rust server — with the schema as a single shared source of truth. Nothing networked to stand up; the DB is just a file.
✅ Integration test suite (#27, expanded in #29)
84 tests across 19 suites run against the actual Rust binary — GraphQL CRUD, image upload, recipe scraping, ICS export, barcode/PLU proxies, settings gating, and frontend OG-metadata injection.
🔧 Other changes
- Node 22 is the baseline (
.nvmrc). PANTRY_TRUST_LAN=truetreats LAN visitors as owners for trusted home-network deployments.
⬆️ Upgrade notes
- Umbrella versioning: every workspace package (
app,shared,web,marketing,mcp,feed,installer-ui) and thepantry-servercrate are now unified at 0.3.0, resolving prior manifest drift. - Choosing a backend: the Rust server is a drop-in for the Node
graphql-server— point clients at port 4001 either way. Pi Zero W / ARMv6 targets should prefer the Rust path (no native-dep workarounds). - Existing data: SQLite reads the same schema both runtimes share; the one-shot
scripts/migrate-postgres-to-sqlite.tsremains the path for older Postgres installs.
Full changelog: v0.2.0...v0.3.0