Skip to content

Pantry Host 0.3.0

Choose a tag to compare

@jpdevries jpdevries released this 06 Jun 23:53
ecdd9f8

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 image crate (replaces sharp), rust-embed.
  • Footprint: ~7 MB stripped binary, ~7 MB RSS at runtime (vs 80–150 MB for the Node stack) — no node, tsx, esbuild, or sharp native 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 --operator on 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=true treats 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 the pantry-server crate 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.ts remains the path for older Postgres installs.

Full changelog: v0.2.0...v0.3.0