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.

+0.6

new paying users a day on average, with minimal marketing spend

4.8 / 5.0

Rating: App Store 4.8 ยท Google Play 5.0

01 / The path

What it took to get here

01 Idea

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.

02 Product

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.

03 Launch

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.

04 Paying users

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

Paying users Paying, auto-renew on Free trial

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:

01 Said "nothing logged", logged three

"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.

02 Removed more than asked

"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".

03 Deleted the whole plate

"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.

04 Answered with its own thoughts

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.

05 "Logged", with nothing logged

"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.