The gap between the bar and the bowl
Your training app does not know what you ate. Your food app does not know what you lifted. Every interesting question lives in the space between them.

Here is a Tuesday that happens to everyone who lifts.
You get under the bar for your third set of squats and it moves like it is bolted to the floor. Same weight as last week. Same warm-up, same shoes, same time of day. The set that was a clean five is now an ugly three, and you rack it and stand there wondering what went wrong.
You open your training app. It shows you the three reps, marks the session incomplete, and offers to reduce the load next time. It does not ask what you ate. It has no way to ask, because it has never held a single gram of food data in its life.
You open your food app. It shows yesterday: 1,420 calories, which is roughly 800 short of what you need, because you were in meetings through lunch and had a sandwich at nine at night. It does not know about the squats. It has no idea you train at all.
Both apps are working correctly. Both are useless. The answer to your question was sitting across the gap between them, and neither one can reach across it.
Why the gap exists at all
It is not a conspiracy and it is not laziness. The split is structural, and it comes from how the two categories grew up.
Food logging was built for weight loss. Its unit of value is the daily total, its business model was originally premium subscriptions sold against a scale reading, and its hardest engineering problem is the size of the food database. Training apps were built for programme delivery. Their unit of value is the session, their hardest problem is exercise progression, and for most of their history their users were people who already knew how to eat and did not want to be nagged about it.
Two different problems, two different companies, two different databases that never needed to speak. By the time anyone noticed that the same person was using both, each had a decade of schema pointed the wrong way.
A training app that cannot see food can only ever tell you what happened. It can never tell you why.
The questions that die in the gap
Once you start listing them, the gap stops feeling like a minor integration gripe and starts feeling like the whole product.
Was that a bad session or a bad week of eating? A session that regresses after four days of eating 600 calories under maintenance is not a programming failure. Deloading is exactly the wrong response. But a training app in isolation cannot tell that case apart from genuine overreaching, so it treats both the same way.
Am I eating enough for the work I am actually doing? Not enough for a generic person of your height and weight. Enough for the eleven working sets of lower-body volume you did yesterday and the fourteen you have scheduled on Thursday. Protein targets that ignore training volume are guessing.
Is the weight moving the way I want it to move? Two kilograms down in a month means one thing when your lifts are climbing and something completely different when they are falling. The scale number alone cannot tell those apart. The scale number plus the log can.
What should I eat today? Not in the abstract. Today, on the day where you squat heavy at seven in the evening and will be in a canteen with nine options at one in the afternoon.
None of these are exotic. They are the ordinary questions that anybody who trains asks themselves every week, and the entire software category answers exactly none of them, because answering them requires one system to hold both halves.
What merging them actually requires
Saying "just put them in one app" is easy. Doing it means three things have to be true at once, and each one is a real constraint on the code.
One profile, not two
The same person object has to carry body mass, training experience, available equipment, diet, market, locale and units. The moment training keeps its own copy of your weight and nutrition keeps another, they drift, and every number downstream of them is quietly wrong. In our schema they are one row, and the engines read from it rather than from each other.
One timeline
A workout and a meal have to be the same kind of event, sortable against each other. That sounds trivial and it is not, because it means every food row and every set row needs client-generated identifiers, consistent timestamps, and a sync model that can merge two devices without a server handing out sequence numbers. We generate every id on the phone for exactly this reason.
One unit system, applied once
Kilograms and pounds, centimetres and feet, grams and ounces, plus the fact that a person in one market may want their body weight in pounds and their food in grams. If conversion happens in more than one place, rounding errors appear in the gap between them and users see a lift that says 102.5 kg on one screen and 102 kg on another. Everything is stored metric. Exactly one package converts. No engine is allowed to call it.
The part that is genuinely hard
Training data is close to universal. A back squat is a back squat in Manchester and in Pune. The bar weighs twenty kilograms in both places, the plates come in the same sizes, and five sets of five means the same thing to everyone.
Food is the opposite. Food is entirely local, and not just in the obvious way where different countries eat different things. The unit is local. A cup is a legal measure in the United States and a vague gesture nearly everywhere else. A katori is a real and useful serving unit and its size varies by household. A slice of bread is 28 grams in one market and 38 in another. The words are local too, and they are not translations of each other so much as different objects.
This is the reason so many "global" food apps feel like American apps with a currency switcher. The database was built around one market's assumptions and everything else was bolted on as a translation layer. We took the opposite bet: market, locale, cuisine and units are four independent fields on the profile, none of them inferred from any other, all of them defaulted from the device and all of them editable. An Indian passport holder living in Toronto who cooks Gujarati food and thinks in pounds is not an edge case we handle. It is the shape of the schema.
What that buys, concretely
When both halves live in one system, the app can say things neither half could say alone. It can notice that your squat has not moved in three weeks and that your average intake over those weeks was well under what your body mass and training volume call for, and it can say that the programme is not the problem. It can build a day's eating around the session that is actually scheduled. It can put nine canteen options in front of you at lunch ranked by what today needs, rather than by what a generic day needs.
And it can do all of it without a signal, because every write goes to the phone first and sync is a background concern. A gym in a basement is the normal case, not the failure case.
The rule behind all of this
Every number the app states comes from an engine, never from a language model. The coach can search, understand and phrase. If it states a figure that was not handed to it by the training or nutrition engine, that is a bug, and there is a check that strips it.
What is not done
Writing honestly about a product that has not shipped means saying what is missing. The dish catalog is still being reviewed by hand, one dish at a time, because a recipe with a wrong macro is worse than no recipe. Sign-in needs one more provider wired up before anybody outside the early group can use it. The programme engine has golden-case tests but not enough real-world weeks behind it yet.
The bet is not that we have finished. The bet is that the gap between the bar and the bowl is where the useful answers live, and that closing it is worth building the whole thing from one schema rather than gluing two together.


