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 or full

By default the ingredient list is compact — one line per ingredient (emoji + name), like a checklist. If you'd rather see each ingredient's full detail — its macros and fields — right on the card, switch the Ingredients property to Full cards:

Open the Dish Collection → Properties tab → the Ingredients row → the Compact / Full dropdown.

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 lists; Full is best when you want the macros visible 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.

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.

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 (Markdown) · 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:

| Kind | What it does | Example | |------|--------------|---------| | Sub-entries | Holds child Entries this entry owns | A dish's ingredients | | Relation | Points at another Entry that stands on its own | A 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