Case study · ppFIT · 2026
A food diary that fills itself in
ppFIT is an AI assistant you tell what you ate, and it keeps your calorie, water and weight diary for you. Below is how it works and the decisions it took to make its numbers trustworthy.
- Role:
- everything, from idea to deployment
- Year:
- 2026, beta in production
- Where:
- web, Telegram Mini App, bot
The problem isn't calories, it's routine
Every food tracker works the same way: find the product in a database, pick from a dozen similar ones, weigh it, type in the grams. At every meal, every day. Most people quit after a couple of weeks, not because they changed their mind about losing weight, but because they got tired of filling in forms.
I wanted to remove that step entirely. Not make the form faster, but replace it with a conversation: write "had cottage cheese and a coffee", and that's it. Or send a photo of the plate. The rest is the app's job.
If logging lunch takes longer than eating it, people abandon the diary within a week.
Rule one: never trust the model with numbers
The most dangerous thing about an AI product is how convincingly the model can be wrong. It can invent a portion, count the same dish differently each time or quietly drop an item from a list. In a chatbot that is annoying. In a diary people use to look after their health, it is unacceptable.
So in ppFIT the model never writes to the database. It only proposes an action: "add 250 g of oatmeal to breakfast". The server checks it against a dozen rules and only then saves it. Every number keeps its origin: in the interface a check mark means verified data, and "≈" means an AI estimate. The user always sees what can be trusted outright and what is worth double-checking.
A conversation, not a command
People don't write the way a parser expects: "a bowl of borscht", "a can of tuna", "same as yesterday", and ten minutes later "no, it was 200 grams". The meaning of every phrase depends on what was said before it.
I gave the assistant a memory of the current conversation: it remembers what it asked, can put a clarification on hold when the user changes the subject, asks for confirmation before deleting and lets you undo the last entry with one tap. Sometimes Balansik asks one question too many. That is deliberate: a question is cheaper than a wrong entry.
Three ways in, one person
Food is easier to share in Telegram, and charts are easier to read in a browser. So ppFIT lives in three places at once: a web app, a Mini App inside Telegram and a regular bot. Each has its own way to sign in, but a person must have one diary.
The trickiest part is linking Telegram to an existing account. Done naively, it risks giving someone else's Telegram access to someone else's data. So on first launch the app asks explicitly whether to create a new profile or sign in to an existing one, and in case of a conflict it reports an error honestly instead of silently merging data.
Cheap for real
The product had no budget for servers or DevOps. Everything runs on ordinary shared hosting: a static interface, PHP and MySQL, with no Node.js, queues or background workers.
In an AI product money leaks through model requests, so I measured first and chose second. I built a benchmark of 55 scenarios in three languages and compared models on accuracy and price. Now simple messages go to a fast, cheap model, complex ones go to a stronger one, and a budget limit keeps a single user from burning a month's budget. The estimated cost is about 20 cents per thousand requests. If the AI goes down completely, the diary keeps working manually.
Measure first, then choose the model. Otherwise you pay for the most expensive one just in case.
What came out of it
ppFIT is live in beta at ppfit.webmm.ru. Food can be logged with a phrase or a photo, in the browser or in Telegram, and in every channel it is the same diary.
- channels on one account
- 3
- channels on one account
- estimated AI cost per 1,000 requests
- ~$0.20
- estimated AI cost per 1,000 requests
- AI benchmark scenarios in RU, RO, EN
- 55
- AI benchmark scenarios in RU, RO, EN
- backend and frontend tests
- 660+
- backend and frontend tests