Lunch Buddy is an Angular PWA for tracking Lunch Money budget progress across the month.
- Production app: https://lunch-buddy.app
- Help and suggestions: #lunch-buddy @ Lunch Money Discord
- Shows expense and income category progress.
- Includes recurring expense projections and per-category activity.
- Supports category preferences (ordering, visibility, notification settings).
- Works offline with cached data and background sync support.
- Angular 21 (standalone components + signals + zoneless change detection)
- Vitest (via Angular unit-test builder)
- Playwright (E2E)
- Custom service worker for caching and background workflows
- Node.js
>=24.0.0 - npm
10+
npm install
npm startDev server: http://localhost:4200
These are optional and can be provided with NG_APP_* keys:
NG_APP_LUNCHMONEY_API_BASE- Base URL for Lunch Money API (or/v2for mock API)NG_APP_LUNCHMONEY_API_KEY- Default API key for local/dev usage
Values are baked into src/environments/runtime-env.generated.ts via npm run generate:env.
export NG_APP_LUNCHMONEY_API_BASE=/v2
export NG_APP_LUNCHMONEY_API_KEY=mock-api-key-12345
npm startNotes:
/v2is proxied tohttps://alpha.lunchmoney.devduring local dev.- Mock login accepts keys with length
>= 11.
Diagnostics endpoints use Upstash Redis and optional admin retrieval tooling.
Required server env vars:
UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKENDIAGNOSTICS_ADMIN_TOKEN(required to retrieve logs)
Optional for MCP setup tooling:
DIAGNOSTICS_WRITE_SECRET
Fetch logs locally:
DIAGNOSTICS_ADMIN_TOKEN=your_secret node tools/fetch-logs.mjs <supportCode>tools/fetch-logs.mjs uses VERCEL_URL if present, otherwise http://localhost:3000.
npm start- Start dev servernpm run build- Build production assetsnpm test- Run unit tests with coveragenpm run test:watch- Run unit tests in watch modenpm run test:e2e- Run Playwright testsnpm run lint- Auto-fix lint/style/format issuesnpm run lint:check- Run lint/style/format checksnpm run generate:env- Regenerate runtime env module
When entered in the login screen, the Lunch Money API key is stored in browser localStorage.
- See CONTRIBUTING.md for workflow and checks.
- Report security issues through SECURITY.md, not public issues.
This project is configured for Vercel (vercel.json), but can be deployed as static assets on other hosts.
- Build output directory:
dist/lunch-buddy - Ensure SPA routing falls back to
index.html
Pre-built images are published to GitHub Container Registry:
docker run -p 3000:3000 ghcr.io/astiskala/lunch-buddy:latest