




I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
I self-host Immich and end up photographing most of my meals anyway, so I built a small app that turns that habit into an automatic calorie log.
The idea: point Oja at an Immich album (say, "Food"). When a new photo shows up there, Oja sends it to a vision LLM, gets back the dish + estimated calories and macros, and logs it. No manual entry, no separate app — your Immich library is the input.
How it works
- Make an album in Immich and drop food photos into it
- Oja polls the album on a schedule and reads new images through the Immich API — read-only, it never modifies your library
- A vision model estimates kcal + protein/carbs/fat per item
Fix estimates by just talking to it
The AI guess is never perfect, so you correct it in plain English instead of fiddling with number fields:
- "I only had about 80% of this" → it scales the calories and macros down
- "no rice, and double the chicken" → it re-estimates the meal
- or just toggle a meal in/out of the day's total
Bring your own model — including local
No built-in AI service, no account. You choose the vision model:
- Or any OpenAI-compatible / Anthropic / Gemini endpoint if you prefer hosted
Your API key stays server-side and the image is proxied through Oja — it's never exposed to the browser.
Self-hosting
- Single Docker image, docker compose up, browser setup wizard (no config files to start)
- SQLite by default, optional Postgres
- Non-root container, no telemetry, MIT licensed
It's early (v0.1.0) and the estimates are only as good as the model you feed it — but for "roughly how much was that," it's been genuinely useful, and reusing photos I already take means I actually stick with it.
Code: https://github.com/sarworld/Oja
Docs: https://docs.ojatracker.com
Would love feedback, especially on what'd make it more useful for your setup.