Your recipes, your pantry — kept as portable atproto records you can take anywhere. Buttery is a TanStack Start web app backed by Postgres, with a cron service that syncs recipe records from the atmosphere.
The monorepo has two services:
services/web— the app (@buttery/web)services/atproto-cron-sync— the periodic sync/backfill worker (@buttery/atproto-cron-sync)
Requires Docker (for the local Postgres) and mise, which manages the Node, pnpm, and Railway CLI versions this repo pins in mise.toml.
# Install mise (macOS/Linux). See https://mise.jdx.dev/installing-mise.html for other options.
curl https://mise.run | sh
# Install the pinned toolchain (Node, pnpm, Railway CLI) and run repo setup hooks
mise install
pnpm install
# Start local Postgres + inject DATABASE_URL (Railway local emulation)
railway dev # `railway dev down` to stop, `railway dev clean` to wipe data
# Run migrations against the dev DB
railway run --service buttery -- pnpm --filter=@buttery/web db:migrate:up
# Start the app on http://localhost:3000
pnpm devrailway run --service <svc> -- injects the Railway dev environment (DATABASE_URL, atproto credentials, etc.) into the wrapped command.
The cron sync pulls recipe records from the atmosphere into Postgres. Run one sweep manually with the cron service's environment:
# One sweep (writes to the DB)
railway run --service atproto-cron-sync -- pnpm --filter=@buttery/atproto-cron-sync sync:once
# Fetch + log without writing
railway run --service atproto-cron-sync -- pnpm --filter=@buttery/atproto-cron-sync sync:once --dry-runButtery is released under the GNU Affero General Public License v3.0.
Copyright (C) 2026 Daniel Cousineau