Medical Research Skills for Claude Code, Codex, Cursor & Copilot
의사가 만든 58개 오픈소스 스킬로 의료 연구 전 과정을 지원
Calorie and macro tracker for web, Android and iPhone — barcode scanning, on-device nutrition-label OCR, offline-first sync, and AI-assisted logging over MCP.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A calorie and macro tracker for web, Android and iPhone — barcode scanning, on-device nutrition-label OCR, offline-first sync, and a food log you can hand to an AI agent.
Open the web app · Join the iOS beta · Join the Android beta
| 🌐 Web | bissbilanz.orellbuehler.ch — installable PWA, works offline |
| 🍎 iPhone / Apple Watch | TestFlight beta — widgets, watch app, Apple Health, fasting Live Activity |
| 🤖 Android / Wear OS | Google Play beta — opt in, then install from Play; Wear OS app, Health Connect, widgets |
Free, no ads, no tracking SDKs, no data selling. Try the mobile apps without an account at all — local-only mode keeps everything on device and migrates into your account if you later sign in.
Your food log is an MCP server. Connect Claude, ChatGPT or any MCP client and just say what you ate. 73 tools cover logging, foods, recipes, goals, weight, sleep, supplements, analytics and the AI task queue — OAuth-protected, so the agent only ever sees your data.
On-device label OCR and photo cut-outs. No barcode? Point the camera at the nutrition table. A shared Kotlin parser plus ML Kit reads it on Android, a native Vision-based parser on iOS — nothing leaves the phone either way. Food photos get the same treatment: one toggle cuts the food out of its background (ML Kit subject segmentation on Android, Vision on iOS), sticker-style.
Offline-first, for real. Every client writes optimistically to a local store (Dexie on web, SQLDelight on Android, SwiftData on iOS) and drains a sync queue with idempotency keys and last-write-wins conflict resolution. Log on a plane; it reconciles when you land.
43 extended nutrients. Beyond calories and the five macros — vitamins, minerals, amino acids — sourced from Open Food Facts and your own database.
Actually native. Not a wrapped web view: Jetpack Compose on Android, SwiftUI on iPhone, plus a Wear OS app, an Apple Watch app, home- and lock-screen widgets, and Health Connect / Apple Health integration.
| Track | Calories, protein, carbs, fat, fiber + 43 extended nutrients, per meal and per day |
| Log fast | Barcode scanner, camera label OCR, food photos with on-device background removal, favorites, recent foods, one-tap widgets |
| Recipes | Multi-ingredient recipes with automatic per-serving nutrition, cooking steps with a hands-free cooking mode, logging by cooked weight |
| Beyond food | Weight trend, sleep, water intake, activity calories, supplements, fasting timer with Live Activity, meal/weight/sleep reminders |
| Insights | Maintenance-calorie estimate from weight trend + intake, streaks, meal timing, food diversity, sleep/food correlation, customizable dashboard layout |
| AI | Natural-language logging via MCP, an agent task queue in both mobile apps, on-device meal estimation and task processing on iOS |
| Sync | Web, Android, iOS and watch stay in sync; conflict-safe and offline-tolerant |
| Accounts | Infomaniak, Google or Apple sign-in — or no account at all on mobile |
| Your data | Export everything to a portable archive; import it back, bulk-import foods/weight/sleep from CSV, share foods and recipes as .bissbilanz packages, merge duplicate foods |
| Languages | English and German |
flowchart LR
API["SvelteKit API on Bun<br/>Zod-validated · OpenAPI-generated clients"]
DB[("PostgreSQL<br/>Drizzle ORM")]
OFF["Open Food Facts"]
subgraph Clients
direction TB
W["Web PWA<br/>Svelte 5 + Dexie"]
A["Android + Wear OS<br/>Compose + SQLDelight"]
I["iPhone + Watch<br/>SwiftUI + SwiftData"]
end
C["Claude / any MCP client"]
W -- "REST + sync queue" --> API
A -- "REST + sync queue" --> API
I -- "REST + sync queue" --> API
C -- "/api/mcp (OAuth)" --> API
API --> DB
API --> OFF
The Zod validation schemas are the single source of truth: bun run api:generate emits
docs/openapi.json and from it both the TypeScript and Kotlin client models, so the web,
Android and iOS clients can't silently drift from the server.
Bissbilanz exposes a remote MCP server at /api/mcp (streamable HTTP; OAuth 2.1 with PKCE; connect an assistant from Settings → MCP on the web or
Settings → Connect an assistant in the mobile apps, scope mcp:access):
{
"mcpServers": {
"bissbilanz": {
"type": "http",
"url": "https://bissbilanz.orellbuehler.ch/api/mcp"
}
}
}
Then:
You: I had a chicken bowl with rice and avocado for lunch, and a flat white.
Assistant: Logged 4 items to Lunch — 812 kcal, 47 g protein. You're at 1,340 / 2,200 kcal and 89 / 160 g protein for the day.
Anything the app can do, the agent can do: log_food, search_foods, create_recipe,
get_daily_status, log_weight, get_streaks, get_sleep_food_correlation and 66 more — see docs/mcp.md for the full tool, prompt and resource list and how to connect each client.
An agent can also label the food database — list_unlabeled_foods plus set_food_labels_batch
gives every food the plain English nouns a camera would call it. Labels are a search tier
everywhere (bread finds Vollkornbrot) and how the phone matches a food from a camera frame.
| Layer | Choice |
|---|---|
| Web | SvelteKit 2 · Svelte 5 runes · Tailwind CSS 4 · shadcn-svelte · layerchart |
| Runtime | Bun (dev and production, via svelte-adapter-bun) |
| Data | PostgreSQL · Drizzle ORM · versioned migrations applied on boot |
| Mobile | Kotlin Multiplatform shared core · Jetpack Compose · SwiftUI · Ktor · SQLDelight · Koin |
| Offline | Dexie (web) · SQLDelight (Android) · SwiftData (iOS) · idempotent sync queue |
| AI | Model Context Protocol SDK · Apple Foundation Models (on-device) |
| Quality | Vitest · Playwright · Testcontainers · CodeQL · Semgrep · Trivy · Gitleaks |
src/ SvelteKit app — routes, API, server logic, Drizzle schema
lib/server/ auth, validation, MCP server, sync, security
mobile/
shared/ Kotlin Multiplatform core (models, API client, repositories, DI)
androidApp/ Jetpack Compose app
wearApp/ Wear OS app
iosApp/ SwiftUI app + widgets + Apple Watch app
drizzle/ SQL migrations and snapshots
crawler/ base food catalog importer
tests/ unit, integration (Testcontainers) and Playwright e2e suites
analytics-parity/ golden vectors keeping the TS and Kotlin analytics in step
scripts/ codegen, security scans, release helpers
store/ App Store and Play Console metadata
docs/ generated OpenAPI spec, the MCP and Siri guides, import formats and the release runbook
Requires Bun, PostgreSQL, and OAuth credentials for at least one
sign-in provider (see .env.example).
bun install
cp .env.example .env # fill in DATABASE_URL, SESSION_SECRET, an OIDC provider
bun run dev # migrations run automatically on start
bun run check # svelte-check + prettier
bun run test # unit tests (vitest)
bun run test:integration-db # DB integration tests (Testcontainers, needs Docker)
bun run test:mobile # Playwright e2e
bun run api:generate # regenerate OpenAPI spec + TS/Kotlin clients
bun run analytics:check # verify the TS/Kotlin analytics parity vectors
bun run constants:check # verify the generated shared constants
bun run security # Semgrep + bun audit + Trivy
bun run push:vapid # print a fresh VAPID key pair for Web Push
Uploaded food and recipe images (and AI meal photos) are written to UPLOAD_DIR
— ./uploads locally, /app/uploads in the Docker image — and only their URLs are
stored in the database. The image declares no volume for it, so a deployment has to
mount that path on persistent storage; otherwise every image 404s after the next
container replacement.
Web Push (logging and supplement reminders in the PWA) is optional: set VAPID_PUBLIC_KEY,
VAPID_PRIVATE_KEY and VAPID_SUBJECT (a mailto: or https:// contact URL) and the
Notifications section appears in Settings. Leave them unset and the feature stays hidden.
Rotating the public key invalidates existing browser subscriptions.
Android:
cd mobile && ./gradlew androidApp:assembleDebug
iOS requires macOS with Xcode; the shared KMP module builds as a static framework.
Cutting a release (tagging, versioning, what each workflow does, rollback): see docs/release.md.
Bissbilanz is free, with no ads and nothing to unlock. If it is useful to you, you can help cover hosting on the support page or via GitHub Sponsors — entirely voluntary, and it changes nothing in the app. Bugs and requests go to issues; security reports follow SECURITY.md.
PolyForm Noncommercial 1.0.0 — free to use, modify and share for any noncommercial purpose. Commercial use requires a separate license.