Dietinator is a local-first calorie tracker. Diary entries live in SQLite on your device. Food search and optional sync use the YAZIO database. No account needed. Works offline.
Android. Install the latest signed APK:
Every v* tag builds a signed APK via .github/workflows/release.yml. On first install, allow Install unknown apps for your browser. Updates keep your local SQLite data. The app checks GitHub releases on start and shows an update prompt in Settings.
Daily dashboard, Stats and trends, AI assistant
Food search and favorites, Food and portion details, Meal builder
Meal slot tracking and Goals and settings
- Local-first diary. Writes to
diary_entriesinexpo-sqlitewith WAL. Works fully offline. Food cache keeps past searches. - Dashboard. Calorie ring, macro bars, meal sections, water and weight quick-add, copy previous day, pull to refresh from YAZIO when online.
- Food search. Debounced YAZIO lookup, category icons, favorites and recents, serving sizes with remembered amounts, amount steppers with hold repeat, live budget impact before you save.
- Meals. Builder for reusable combos with auto nutrition math, plus Quick Add for direct kcal and macros. Per-meal budgets and inline entry edit.
- Barcode. Camera scan for EAN and UPC on device with cache lookup. Limited on web.
- Weight and water. Log water with presets, track weight with BMI and trend charts.
- Micronutrients. Fiber, sugar, saturated fat, sodium, potassium, calcium, iron on the dashboard and food detail.
- AI assistant. Optional, in Settings. Supports OpenAI, OpenRouter, Ollama and any OpenAI-compatible endpoint. Streams answers, runs tools against your local SQLite, asks before destructive writes, keeps history in SQLite. See ARCHITECTURE.md for the MCP endpoint at
/mcp. - Backup and export. JSON or CSV export, full SQLite backup and restore. All user initiated.
- Demo mode.
/?demo=1loads sample data, no account. Light and dark themes, system or manual.
| Area | Choice |
|---|---|
| Runtime | Node 22, see .nvmrc, packageManager is pnpm@11.22.0 |
| Framework | Expo SDK 56, React 19.2, React Native 0.85, expo-router in app/ |
| DB | expo-sqlite WAL, migrations in src/db/database.ts |
| UI | gluestack-ui v3 and NativeWind v4, global.css |
| Sync | yazio npm client, withRetry on 5xx and 429, offline-first |
| Tests | Jest and jest-expo, Playwright on the web build |
nvm use # 22, see .nvmrc
pnpm install
pnpm start # Metro on port 9082, scan QR with Expo Go
pnpm run web # or run in the browserPort 9082 avoids Windows Hyper-V collisions on 8081. To use another port, run pnpm start -- --port 9090.
Other commands:
pnpm run typecheck
pnpm run lint
pnpm run format:check
pnpm test
pnpm run test:e2e # builds dist/ and runs Playwright at phone size
pnpm run build:web # writes dist/- ARCHITECTURE.md - data model, local-first flow, release pipeline and the MCP bridge
- CHANGELOG.md - version history.
pnpm run releasetagsvX.Y.Z - CONTRIBUTING.md - ground rules and quality gates
Note. Dietinator uses an unofficial, reverse-engineered YAZIO API. Use it for yourself only. The API can change without notice. The local-first design keeps the diary and cache working when it does.