No description
Find a file
Uwayss 6006bb2fa7
All checks were successful
Checks / checks (push) Successful in 1m11s
ci: stop naming the old runner image in the checks comment
2026-09-21 23:28:20 +03:00
.agents/skills/simple-english chore: set up the repository 2026-09-05 13:27:29 +03:00
.claude/skills chore: set up the repository 2026-09-05 13:27:29 +03:00
.github/workflows ci: stop naming the old runner image in the checks comment 2026-09-21 23:28:20 +03:00
cmd/lokma feat(bot): add the handlers, the commands and the entry point 2026-09-06 13:42:51 +03:00
internal feat(bot): add the handlers, the commands and the entry point 2026-09-06 13:42:51 +03:00
.env.example feat(ai): add the Gemini client with the model read from the environment 2026-09-06 13:03:13 +03:00
.git-blame-ignore-revs chore: set up the repository 2026-09-05 13:27:29 +03:00
.gitignore feat(tooling): add the module, the configuration and the env loader 2026-09-05 15:07:00 +03:00
AGENTS.md chore: set up the repository 2026-09-05 13:27:29 +03:00
BOT-SETUP.md docs(docs): split the setup and the deployment out of the README 2026-09-06 13:53:15 +03:00
CLAUDE.md chore: set up the repository 2026-09-05 13:27:29 +03:00
CONTRIBUTING.md docs(docs): split the setup and the deployment out of the README 2026-09-06 13:53:15 +03:00
DEPLOY.md docs(docs): split the setup and the deployment out of the README 2026-09-06 13:53:15 +03:00
go.mod feat(tooling): add the module, the configuration and the env loader 2026-09-05 15:07:00 +03:00
go.sum feat(tooling): add the module, the configuration and the env loader 2026-09-05 15:07:00 +03:00
LICENSE chore: set up the repository 2026-09-05 13:27:29 +03:00
README.md docs(docs): split the setup and the deployment out of the README 2026-09-06 13:53:15 +03:00
SECURITY.md chore: set up the repository 2026-09-05 13:27:29 +03:00
TODO.md docs(docs): split the setup and the deployment out of the README 2026-09-06 13:53:15 +03:00

Lokma

A simple Telegram bot for tracking what you eat

Send a photo of your plate, with or without a caption, or just write what you ate. The bot answers with the nutrition breakdown and keeps the entry. If it got something wrong, reply to its message and it corrects itself.

Doesn't comment on your food. No goals, no streaks, no advice.

🥚 Hard-boiled egg ×2 · Baked potato ×2

312 kcal
P 15g · C 38g · F 11g
Fiber 4g · Sodium 180mg
Iron 2.1mg · B12 1.1µg

~ assumed: medium potatoes

What you need

  • A Telegram bot token, from @BotFather
  • A Gemini API key, from AI Studio. Every user brings their own, so the free tier is per person.
  • A machine to run one 18 MB binary on

BOT-SETUP.md covers both, start to finish.

Use it

Send a photo. Reply to any of the bot's messages in a thread to correct it: "2 eggs, not 3", "no oil", "I only ate half". Every message in the thread stays live, so a reply to the first one still works three corrections later.

When the bot cannot tell a portion or a cooking method from the picture, it asks. Answer by replying. If you never answer, it keeps its best guess after six hours and marks it with a ~.

Command
/today Totals and one line per entry
/week The last 7 days
/undo Delete the last entry
/detail Per-item breakdown, as a reply
/retry Try again, as a reply
/export Download a CSV
/key Replace your API key
/forget Erase all of your data

The day starts at 04:00, not midnight, so a meal at 01:00 counts for the day that is ending.

Turkish, English and Arabic are supported. The bot answers in the language you write in.

Deploy

DEPLOY.md.

Contributing

Read CONTRIBUTING.md. It covers how to get an account, how to run the bot from source, the checks that must pass, and how commits are written.

License

MIT