Calvi / Product case study
From idea to paying users
Calvi is a calorie tracker with an assistant, Nora. You say what you ate in your own words, by voice or with a photo, and she counts the calories and macros and keeps the diary. It started as an idea and is now a live app on the App Store and Google Play that people pay for.
My role: sole developer and owner: Flutter app, Node.js backend, AI pipeline, admin panel, store releases, pricing and growth. 2026.
new paying users a day on average, with minimal marketing spend
Rating: App Store 4.8 ยท Google Play 5.0
01 / The path
What it took to get here
Scrolling my feed, I saw the same competitor's ad three times and installed it. Hugely popular, and the experience was poor. I knew I could build it better. A week later the first version was live on the App Store and Google Play.
Flutter, because I had already shipped other products with it. A known tool meant the week went into the product, not into learning a framework.
The first version was raw and went to friends, my first testers. They found where the AI went wrong, and their feedback shaped how Nora uses her tools and routes each request.
The first paying user arrived on day two, and bought a yearly plan. That was the proof people need this, and the reason I keep building it.
02 / Growth
Paying users, week after week
The growth has started, and it can keep going.
Every week ends with more paying users than it started with, on a marketing budget that is close to zero. The next step is putting money into the channels that already work.
The shape of the curve is real; the scale is left out on purpose.
03 / Teaching the AI
When Nora said one thing and did another
Every message first goes through a short routing step that picks a door: food, a correction, a question, the body, small talk. Behind each door Nora gets only the rules and tools that job needs, and the server checks every action before it reaches the diary. Most of that design came from real mistakes. A few of them:
"Don't log it, just count: borscht 300 ml, a spoon of sour cream, two slices of bread." Three dishes went into the diary, and the reply said nothing had been logged.
Fix: before Nora is pushed to log anything, the server looks for a refusal ("don't log", "just count") in the message. If it finds one, nothing is written, and Nora only gives the numbers.
"Only remove the marshmallow." Coffee and a milkshake disappeared too, because a two-letter word inside their names matched the start of "marshmallow".
Fix: one name matcher now serves deleting, fixing and moving. Words shorter than three letters never count, so "Coffee with milk" no longer matches "marshmallow".
"Remove one bar" on a photo of coffee, a protein bar and grapes deleted the entire entry, because Nora could only remove whole rows.
Fix: every entry from a photo keeps its parts. "Remove one bar" now finds the bar among them and takes away only its calories; the coffee and grapes stay as they were.
Sometimes the reply was the model thinking out loud in English, or empty, instead of an answer in the person's language.
Fix: the server checks each reply before sending it. If it is empty, or written in English for a person who speaks another language, the model is asked again and the person never sees the first draft.
"Water 1 l." Nora replied that she had logged a litre of water, but called no tool, and the diary stayed empty. The same sentence an hour later worked fine.
Fix: the server compares the words with the actions. If the reply says "logged" or "corrected" and no tool was called, the draft is thrown away and the model gets a second round: do it now, or answer without claiming it.
04 / Try it
Tell Nora what you ate
Calvi is free for soldiers of the Armed Forces of Ukraine, medics and teachers in frontline areas.