Sub-entries (dishes & ingredients)

A Property kind that lets one Entry hold a list of other Entries — a dish made of ingredients, a recipe of steps, a meal of foods. The ingredients vary every time, and each one is a real Entry that rolls up on its own.


Most Property kinds answer "what did you log?" with a number, some text, or a yes/no. Sub-entries answers it with other Entries. It's the "this thing is made of other tracked things" kind — the way you log a dish and the ingredients inside it.

The headline case is food: a Dish Collection with one Sub-entries Property called Ingredients. Log a dish, and you add whatever foods went into it — a hamburger today (beef, buns, sauce), a salad tomorrow (tomato, broccoli, olive oil). The ingredients change every single time, and that's the point.

The key idea: ingredients aren't fixed to the Collection

The parts vary from one log to the next — that's the whole point. With Sub-entries:

  • The Dish Collection only says "entries of this Collection can hold ingredients." It never decides which ingredients.
  • Each dish Entry holds its own, chosen as you log it.
  • The same Dish Collection produces a hamburger one day and a salad the next.

So you build one Dish Collection, and every dish you log is free to contain anything. (If a Collection's children are usually the same, you can give it a default starting set — still editable on every entry.)

How it works in the app

1. Add the Sub-entries Property. In the Collection builder, add a property and pick Sub-entries from the Other group. Give it a name that suits the Collection — Ingredients for a dish, Steps for a recipe. That's the only extra property a dish needs — the macros live on the foods, not the dish.

2. Log a dish. Create a Dish Entry. Its card shows an Ingredients list with a + Add button.

🍽  Hamburger
   Ingredients
   + Add

3. Add ingredients. Tap + Add and search your foods. Pick an existing one (🧀 Mozzarella) or type a new name to create it on the spot. Each pick becomes a child entry under this dish.

🍽  Hamburger
   Ingredients
   🥩  Beef
   🍞  Buns
   🥫  Sauce
   + Add

4. Fill in each ingredient's details. An ingredient is a normal Entry of its food Collection with its own Properties (grams, calories, …). On the dish's own page each ingredient is a toggle — click the triangle to collapse it to a single line, or expand it to edit its fields right there. They start expanded, so opening a "Sets" entry shows every set's reps ready to edit without leaving the page. (You can still click an ingredient's name to open its own full page.)

Open, reorder, duplicate, or remove a sub-entry

Tap a sub-entry's name or emoji to open its menu — the same on a phone and on a computer. (The name isn't a link any more; a stray tap can't whisk you away — you choose Open when you want to go in.) The menu:

  • Open — go to that sub-entry's own page. Since you rename a sub-entry on its own page, this is how you get there.
  • Move up / Move down — nudge this sub-entry one place. (Greyed out at the ends — the top row can't move up, the bottom can't move down.) On a phone, this is how you reorder.
  • Add below — drop in another of the same thing, right beneath this one, pre-filled with the same values so you only tweak what changed. This is how you log another set: open the menu on Pull-ups · 15 reps, tap Add below, and get a second Pull-ups · 15 reps ready to adjust.
  • Delete — send just this one sub-entry to Trash.
💪  Pull-ups   15 reps   ──▶  Open
(tap the name)                Move up
                              Move down
                              Add below   ← another set, copied
                              Delete

On a card, reordering is Move up / Move down — there's no dragging on a card. Want to drag? Open the entry's own page (tap the entry, or Open from the menu): there, on a computer, a six-dot grip () fades in at the start of each row when you hover it — drag it to reorder, with a line showing exactly where the row will drop. Dragging is desktop-only and lives only on that page; everywhere else you reorder with Move up / Move down in the menu.

Fold the list away. Tap the ▾ chevron beside the Sub-entries heading to collapse the whole list — handy for a long workout. Only the chevron toggles (the heading text itself does nothing, so a stray tap can't fold the list). It shows a count while collapsed; tap the chevron again to expand. Works on the card and the entry's own page.

Delete the whole dish and its ingredients go to Trash along with it — and they also drop out of your totals, so a meal you removed stops counting. Restore the dish later and every ingredient comes back together, exactly as it was.

Compact, list with values, a sets table, grouped sets, or full

By default the ingredient list is compact — one line per ingredient (emoji + name), like a checklist. Four other looks are a dropdown away:

Open the Dish Collection → Properties tab → the Ingredients row → the display dropdown (Compact list / List with values / Sets table / Grouped sets / Full cards).

List with values keeps the one-line rows but adds each child's numbers on the right with their units — 20 reps 12 kg — the way a fitness app lists a workout's sets. Values that weren't logged are simply left out (push-ups show just their reps, no dash where a weight would be), and each line shows its own Collection's emoji. If you want to pick which values show (and their order), set subEntryColumns in the card's Edit JSON — or use the dropdown for the common case.

Sets table turns the list into an editable grid — the classic gym-log layout, but with no header row and no SET numbers: each row leads with the exercise's emoji + name, then one column per value (KG, REPS, a ✓ for done), each showing its own label right beside it ("12 reps"), and a + Add row at the bottom. Type straight into any cell. A row's own missing value (Push-ups has no weight) just shows an empty cell. See The sets table for the full picture, including choosing which columns show.

Grouped sets is the workout look built for phones. Sets of the same exercise collapse into one block: the exercise's name prints once as a heading, a small header line names the columns once (Set / Reps / Kg), and each set becomes a numbered row with its values in neat aligned columns. Everything always fits your screen — long names get shortened with "…" instead of pushing the numbers off the edge, so there's never any sideways scrolling. Type straight into any cell. Tap a row's set number for its menu (Open / Move / Add below / Delete), tap + set under a block to add another set pre-filled from the last one, and use the small + Add at the bottom for a new exercise.

If your sub-entries mix a few different Collections (say, both Squats and Push-ups under one workout) and you pick a column by a name like "reps", it still lines up correctly even when the two Collections track "reps" under differently-named fields internally — Kaizendex matches columns by what you see on screen, not by internal wiring.

In Full mode each ingredient renders as its own mini card, and you can edit an ingredient's numbers right there. Compact is best for long checklists; List with values and Sets table are best for logged metrics you want to scan or fill in quickly; Grouped sets is best for workouts (especially on your phone); Full is best when you want everything visible and editable at a glance.

When a sub-entry's Collection has a yes/no field — like a routine item's Done — its compact row shows a real checkbox at the start of the line. Tick it right on the card and it saves instantly. That's what turns a Morning Routine (Woke up early, Brushed teeth, Sunscreen, Creatine…) into a checklist you can run each morning — each item is its own sub-entry, and the tick is its Done field. Sub-entries whose Collection has no yes/no field (a plain ingredient) just show the emoji + name, no box.

Checking things off is meant to feel good: the box pops with a little fireworks burst of confetti when you tick it. On your phone you don't even have to aim for the box — swipe the row sideways (either direction) and it completes itself (swipe a finished row again to un-tick it, no confetti). Works on whole todo cards in your log too. Prefer calm? Your theme decides whether it happens — see Appearance and themes.

A sub-entry can also be a rating instead of a checkbox. When its Collection has a number field named rating — for example a How did the day go item scored 1–10 — its compact row shows a number right after its name that you can type into (plain, just like any other number on a card — no box around it). Tap it, type the score, and it saves instantly (leave it blank until you're ready). So one Evening Routine can mix both: checkbox items you tick off, and a rating item you score at the end of the day. (Other numbers, like an ingredient's grams, stay name-only — only a rating field gets the inline number.)

Make it a todo list

A compact sub-entries list can become a proper todo list you fill in on the card. Three switches on the Sub-entries field — set in the card's Edit JSON — turn the plain emoji + name rows into a checklist you type straight into:

  • Hide the emoji, so every row is a clean checkbox + text instead of repeating the same icon all the way down.
  • Type the title right on the row — tap and write the todo, no need to open each one. (The row's ⋯ menu moves to a button on the right, so tapping the text always edits.)
  • Make "+ Add" drop a fixed kind every time — point it at, say, your Todo Collection, and + Add adds one instantly without asking what kind. The new row is ready to type, and pressing Enter adds the next — so you can rattle off a whole list.

The "+ Add drops a fixed kind" switch doesn't need JSON at all: open the Sub-entries field's property settings (the field's ⋯ menu → Adjust settings, on the card builder or right on an entry page) and set Add button creates to the Collection you want. Clear it with the little × to get the search picker back.

Add a Done yes/no field to that row's Collection (for the checkbox from the section above) and you've got a Daily Todos card: tick items off, type new ones, all without leaving the card. The three switches are off by default, so a dish's ingredient list stays exactly as it was.

Start every entry with the same sub-entries

Sometimes a Collection's children barely change — a Bench press that's always three Sets, a Smoothie that always starts from the same base. Instead of adding them by hand every time, give the Collection a default sub-entries list, and every new entry is born with them already attached.

Open the Collection → Properties tab → the Sub-entries row → Add default sub-entry. Search your Collections (or create one on the spot), and it joins the starting set. Click a default to expand it and preset its values — a "Set" that always starts at 10 reps, say. Drag the grip on the left of each default to reorder them, and tap Default sub-entries to fold the list.

When you then log that Collection, the entry already contains those children — and you're still free to add more, remove them, or change their numbers for that one entry. It's a head start, not a fixed line-up:

  • Editing the defaults later only changes new entries — ones you already logged keep whatever they had.
  • Each default child is created with its own Collection's defaults first, then your preset values on top.
  • It goes one level deep: if a default child's Collection also has defaults of its own, those aren't expanded.
  • It works everywhere a log is created — the quick logger and the AI assistant included.

Why each ingredient is its own Entry

When you add "Mozzarella" to a dish, you're not typing a word — you're logging a Mozzarella Entry that happens to live inside the dish. That one design choice unlocks the analysis:

  • Your daily calories include every ingredient automatically — a banana eaten on its own and a banana inside a smoothie count exactly the same.
  • "How much cheese did I eat this year?" is a chart on the Mozzarella Collection — every dish's mozzarella is a real Mozzarella Entry, so they all add up.
  • No double-counting. The dish itself carries no macros; the numbers live on the ingredients, so totals are counted once.

This is the universal engine doing its job: ingredients are just Entries, and Entries roll up.

Dish as one entry, or broken down — your call

You don't have to break every meal into parts:

  • Flat — for a restaurant meal you only know the total of, give the Dish its own Calories/Protein Properties and type the total. One Entry, done.
  • Broken down — for a homemade meal, leave the macros off the dish and add ingredients with their own numbers.

Pick per meal. A quick photo-style "≈850 kcal pizza" is flat; "200g dough, 150g mozzarella, 80g sauce" is broken down.

Examples

🍔 DishIngredients (Sub-entries). The everyday meal log; name each one as you go (Hamburger, Salad, Stir-fry).

🥗 RecipeIngredients (Sub-entries) · steps (Page) · servings (Number). A reusable recipe with its parts and method.

🛒 Shopping tripItems (Sub-entries) · total (Number). Each item is its own Entry with a price.

🎒 Packing listItems (Sub-entries) · packed (True/false on each item). What went in the bag this trip.

Sub-entries vs Relation

Both connect things, but they're for different jobs:

KindWhat it doesExample
Sub-entriesHolds child Entries this entry ownsA dish's ingredients
RelationPoints at another Entry that stands on its ownA reading session → the Book it's from

Use Sub-entries when the parts belong to this one thing. Use Relation to link to something independent.

Next