Macro based meal planner: how to balance taste and targets
Traditional meal planners force a choice between precise training macros and actual culinary flavour. We built a pipeline that delivers both.
Traditional meal planners force a choice between precise training macros and actual culinary flavour. We built a pipeline that delivers both.
KEXBI reads your taste through a small, deliberate structure called a taste profile. It runs across three inputs, and the whole system is applied on top of a settled macro plan.
Each input has a different job, and all three arrive at the same moment in the pipeline: after the day's numbers are already decided. The taste profile can change the composition, the ingredient character, and the naming of the meal. It cannot change the grams. That separation is the whole design.
The rest of the category treats a request like "give me a Thai week" as an input to the plan, and it goes wrong in three predictable ways.
Silence. Real nutrition apps (MyFitnessPal's core diary, Cronometer, MacroFactor, Noom) have no taste layer at all [6]. They are macro-and-logging engines. Ask for a Thai week and they point you at a search box.
Recipe apps dressed as meal planners. Eat This Much, PlateJoy while it lived, MyFitnessPal Premium+'s Meal Planner, Lifesum's diet plans [6]. Pick "Thai" from a filter and the app returns seven Thai recipes; your macros are whatever they add up to. Cuisine won the argument; your training day lost it. Coconut curry on a rest day, clear soup on the day you ran ten miles, because the recipe library never knew about either.
Language-model hallucination. Ask a chatbot for a Thai week and it writes you a beautiful one that calls for galangal on Wednesday, blind to your kitchen, your sleep, your training. When we weighed a leading chatbot's meals against a real food database, the misses on the prescribed macro split ran from 20 to 75 percent.
All three failures share a root cause: treating cuisine as an input to the plan, when a plan is not the right place for it. A taste profile treats it as an instruction about the surface of the plan, applied after the numbers are decided. Which is why KEXBI does not offer "cuisine" as a feature at all. A cuisine claim would mean cooking Thai food properly enough to satisfy a Thai grandmother, from your home pantry. That is not something we are trying to sell. A taste profile is honest about what it does: it recognises the flavour homes you identify with and steers the plan toward them, without ever pretending your risotto is Milanese.
Inside the taste profile, the "kitchens that feel like home" input carries the most machinery, so it is the piece worth explaining. It is built on one rule, and it is worth stating in full because everything else follows from it:
Each kitchen carries a label and a register, a single line describing the pairings and the methods that define it. Not a list of permitted foods. Not a set of recipes. A composition and naming steer.
Take the Italian register: olive oil, garlic, tomato, basil, parmesan; pasta, risotto, grilled fish, braises. Read it as a set of preferences, not permissions. Where your pool already carries olive oil, the register says reach for it before you reach for the butter. Where it carries garlic and tinned tomatoes, the register says those two belong together in this dish. If the engine has already decided you need 90 g of dry carbohydrate at midday, the register says make that risotto, and call it risotto.
The phrase doing the quiet work in that rule is the pool. The register operates on a pool of available ingredients. It does not define that pool, and it cannot reach outside it. What it can do is reach anywhere inside it, and the size of the inside is a decision you make separately, which is the subject of the next chapter.
The taste profile is one wizard step and one place in the app. You set it once, edit it any time. Three inputs, in order.
How far should new ingredients stretch from what you already cook?
Food adventurousness is a measurable trait, roughly one axis from cautious to adventurous [1]. KEXBI expresses that axis as three tiers rather than a slider; the code that consumes it needs a category, not a continuous value. Pick one. The choice shapes how a Surprise Me week widens the pool, and how far the register is allowed to reach when it does.
A multi-select of the seventeen home kitchens KEXBI carries at v1. Pick the ones that feel like your kitchen. Skipping keeps the mix broad; picking three or four narrows the register vocabulary the plan reaches for.
The third input is a hard skip. Not allergen (safety), not diet (goal); a preference refusal. Some dislikes are hardware: coriander tastes of soap for four to fourteen percent of people (OR6A2 olfactory receptor variant) [2]. Some are texture (offal, cephalopods, mushrooms, tofu). Some are ferment disgust (blue cheese). Some are heat tolerance. The class vocabulary follows the disgust and food-rejection taxonomy in the psychology literature [3], and the options line up with the foods people most often dislike in large surveys: in YouGov’s 2025 poll of US adults, anchovies, liver and sardines top the list, followed by tofu, squid and blue cheese [4].
The class-not-food approach matters because aversion is rarely one-food-deep. If you refuse octopus you almost certainly refuse squid; if you refuse blue cheese you probably do not want stilton served either. One tap covers the family. And because a preference refusal (unlike an allergen) carries no medical claim, "never" here is a firm steer on anything new the plan brings in. A safety-liability posture keeps allergens deliberately un-enforced by the app; a taste refusal has no such constraint, and is applied firmly to new ingredients.
Here is how the two interact, because this is where a lot of meal planners quietly mislead people.
Locked to your pantry. The pool is your kitchen. A Thai week is then a genuine constraint-satisfaction problem: the register steers toward lime, chilli and whatever aromatics you already hold, over the proteins and carbohydrates the training day has already specified. Nothing new appears on the list. The result leans Thai rather than arriving from Bangkok, and we would rather name it that way than pretend otherwise.
Pantry plus surprise me. You have opened the door. The pool widens beyond what you currently own, the shopping list rebuilds, and new ingredients are allowed in. In that mode, the register is exactly what decides which new ingredients arrive. Ask for a Thai week with the dial open and fish sauce, lemongrass and coconut milk land on your list. Ask for a Korean one and it is gochujang and gochugaru instead. Same dial, same permission, different register, different trolley.
So the honest version of the rule is two-part:
What does not change between those two modes is the number underneath. In both cases the register was handed a settled plan. It chose the fish sauce. It did not choose the 180 g of chicken, and it could not have.
The taste profile is only useful if it maps to your actual kitchen. And your actual kitchen, in KEXBI, is not an inventory. It is a model of your intent: the ingredients you usually keep, the ones you happily use, the ones you would buy again. Inside My Pantry, the Taste Profiles view shows you where each of the seventeen kitchens sits against that intent today.
The three tiers are worth stating plainly, because they are how the pantry setting from the previous chapter actually behaves.
The important detail is what does the grading. The app is explicit: "Your spices and essentials decide this, not your proteins." Chicken is chicken; what makes a meal Turkish is sumac, pul biber, mint and yoghurt. The staples decide the register. The proteins are just what carries them.
That is why the pantry dial and the taste profile compose so cleanly. Locked-pantry: only Ready kitchens are drawn from, and their registers work with what you own. Surprise Me: the pool widens to include the Away kitchens, and the register is what decides what fills the gap. A Thai-leaning surprise week fills with fish sauce and lemongrass. A Korean one fills with gochujang.
The safety of the whole design comes from one architectural fact: the taste profile runs last.
The order is fixed. Your exclusions and your pantry setting define the pool. Your body and your training day define the numbers. The engine solves the day, how much carbohydrate, how much protein, how much fat, and in which window each block lands. Only then does the register get a say, and its say covers composition, ingredient character within the pool, and naming.
A step that runs last cannot rewrite the steps that ran before it. That is not a policy enforced with a warning message; it is the shape of the pipeline. The register is handed a settled plan and a defined pool, and asked a narrow question: given this much protein, this much carbohydrate and this much fat, in this window, what is the most Turkish thing to do with it, and what should we call it?
Three things sit permanently outside its reach, in every mode:
This is the same principle applied elsewhere in the engine. Anything that determines how much you eat is deterministic and auditable. Anything that determines what it tastes like and what it is called is a steer applied on top. Flavour is the right place for judgement. Grams are not.
Seventeen registers ship in this release. Each is a single line doing two jobs: telling the chef what to season toward, and telling the plan what to call the result.
| Cuisine | The register |
|---|---|
| Italian | olive oil, garlic, tomato, basil, parmesan; pasta, risotto, grilled fish, braises |
| Thai | lime, fish sauce, chilli, coconut, lemongrass, Thai basil; stir-fries, curries, noodle soups |
| Indian | cumin, coriander, turmeric, garam masala, ginger-garlic; dal, curries, tandoor, rice and flatbreads |
| Japanese | soy, mirin, miso, dashi, sesame; rice bowls, grilled fish, noodle soups |
| Mexican | lime, chilli, cumin, coriander, black beans, corn; tacos, bowls, grilled meats, salsas |
| Middle Eastern | lemon, tahini, sumac, za'atar, cumin; grilled meats, mezze, pulses, flatbreads, yoghurt |
| Chinese | soy, ginger, garlic, spring onion, sesame, rice wine; stir-fries, steamed fish, noodle and rice dishes |
| French | butter, shallots, herbs, wine reductions; roasts, pan sauces, gratins, omelettes |
| Greek | olive oil, lemon, oregano, feta, yoghurt; grilled fish and meat, salads, bakes |
| Spanish | smoked paprika, garlic, olive oil, sherry vinegar; rice dishes, tortilla, grilled seafood, stews |
| British classics | roasts, pies, stews, fish and chips, cooked breakfast, porridge; root veg, gravy, mustard |
| American classics | grill, BBQ, Southern, diner: smoked and grilled proteins, burgers, cornbread, slaw, mac and cheese, sweet potato, pancakes; sweet-smoky rubs |
| Korean | gochujang, gochugaru, sesame, garlic, soy; kimchi, bibimbap, bulgogi, jjigae stews, rice bowls |
| Vietnamese | fish sauce, lime, mint, coriander, Thai basil, rice noodles; pho, bun, banh mi, fresh rolls, lemongrass grills |
| Caribbean | allspice, scotch bonnet, thyme, lime, coconut; jerk, rice and peas, plantain, curries, stews |
| Turkish | sumac, pul biber, cumin, mint, yoghurt, lemon; kebabs, pide, lentil soup, pilav, grilled vegetables |
| Filipino | soy, vinegar, garlic, calamansi, coconut; adobo, sinigang, pancit, braised and grilled meats, rice |
Two things to notice about the shape of those lines.
The first is that every register names seasonings before it names dishes. That ordering is deliberate, and it is what makes a locked pantry workable. The seasoning half is the part that survives contact with a narrow kitchen: you can cook something recognisably Turkish with sumac, cumin, mint and yoghurt over more or less any protein you own. The dish half is aspirational; it lands when the pool allows it.
The second is that British classics and American classics are named differently, and read differently. They lead with method rather than store-cupboard, because that is how they actually work. British cooking is a set of formats, the roast, the pie, the stew, the cooked breakfast, more than a spice signature. Naming it accurately matters more than making it symmetrical with the others.
The clearest way to see the taste profile working is to hold the training day still and change only the register in play. Same chicken, same rice, same green vegetable, same measured fat, sized for the same evening lift. Three registers, three different meals.
That is the promise of a steer over a whitelist. You are not choosing between eating well and eating what you want. You are choosing the accent the week is spoken in.
A taste profile (and its register mechanism) is a steer. It carries no doses, no sequencing and no biological claim. It is one line about pairings, methods and naming, and its job is to make the week feel like a week of Turkish-leaning food rather than a week of correctly-portioned inputs.
The seasoning itself comes from the spices and staples you keep, written into each recipe. The register decides the accent. Neither of them touches the grams.
Three honest limits.
A register is not an authenticity claim. On a locked pantry with no fish sauce, a Thai week will be Thai-leaning rather than Thai. The register steers toward the lime, chilli and aromatics you do have, and the result is a good plate of food that a Bangkok cook would recognise as a cousin rather than a relative. We would rather name that plainly than claim a cuisine we cannot cook from your shelves. Open the dial and it has more to reach for.
An open dial costs money and shelf space. Surprise-me weeks add to the list. A register makes that spend coherent rather than scattered, you buy the fish sauce once and three meals use it, but it is still a spend. If the weekly shop is the constraint, the dial is where to look first.
A taste profile does not rescue an under-fuelled day. No amount of gochujang turns a chronic energy shortfall into a training block. The taste profile runs last precisely because it is the least load-bearing thing in the stack, pleasant, motivating, and useful for adherence, but downstream of energy availability, protein and sleep.
Most meal planners treat cuisine as a category of recipe. That forces a choice: cook what you fancy, or hit your numbers. Everyone who has tried to do both inside one app knows which one quietly gives way.
KEXBI does not offer cuisine. It offers a taste profile: three inputs (an adventure dial, the kitchens that feel like home, a never-serve list), sitting on top of a settled macro plan, deciding the surface of the week without touching the grams underneath. Lock the pantry and it works with what you own. Open the dial, and the register is what makes the new arrivals add up to a week rather than a pile of jars.
Either way, the grams were decided before the taste profile was asked anything. You get a Thai-leaning week. The plan still works to the numbers the training day asked for.