u/darc_knigh

Image 1 — I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
Image 2 — I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
Image 3 — I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
Image 4 — I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
Image 5 — I built Oja — a self-hosted calorie tracker that reads food photos straight from an Immich album
▲ 0 r/mynetdiary+1 crossposts

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.

u/darc_knigh — 10 days ago