My personal fitness chat app. A Claude assistant that knows my meal plan and writes my daily log
HealthGitHub @godfreyponceOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗[!WARNING] This is my personal app. One user, one password, my meal plan. You can run it, but it will feed you my chicken and rice until you seed your own. Fork accordingly.
Kal is a Claude assistant with write access to my food log. It knows my profile, my meal plan, and what I have eaten today. Normal day: I tap a meal on the Today screen and it is logged. Off-plan day, which is the whole reason it exists: I tell it what I am about to eat, it finds real macros, rewrites today to fit, and logs what actually happened. The plan template is never touched.
the loopphone (PWA) ──► POST /api/chat ──► claude haiku
│
tool loop, max 8 rounds
│
┌─────────────────────────────┼─────────────────────────────┐
log_food search_nutrition (USDA + OFF) override_meal
set_meal_status fetch_page log_weigh_in
add_grocery get_day_summary add_memory_fact
search_foods get_weight_trend
└─────────────────────────────┼─────────────────────────────┘
▼
neon postgres (drizzle, 10 tables)
every write gets an Undo button
The frontend only speaks to that route and plain REST. Swap the model with one env var. Prompt caching cuts a turn from $0.0057 to $0.0009; a full off-plan conversation costs about three cents, and the chat shows me the running total while I type.
the one ruleThe model once saw 6× Chicken breast, guessed a serving size, and handed me a 372 g protein day. Never again:
The model never sees a bare multiplier. Every food line arrives resolved: weight, unit, macros.
Numbers come from a curated grocery library of things I actually buy, with label macros. When something new comes up, the chat climbs a ladder: nutrition databases first, then a product link or a photo of the label, and only then an estimate, labeled as one, which I have to approve before it writes anything.
what is not hererun it[!NOTE]
npm run db:seedwipes the database and installs the starter plan. Tests hit the live database, not mocks.
git clone https://github.com/godfreyponce/kal
npm install
# .env.local: DATABASE_URL, ANTHROPIC_API_KEY, APP_PASSWORD, SESSION_SECRET
npm run db:seed
npm run dev
Setup, usage, and architecture live in docs/. It runs my actual days at kal-delta.vercel.app. The login page will tell you that you shall not pass. It means it.
MIT © 2026 Godfrey Ponce