# The ledger

The ledger is the tracking table, and it is the foundation everything else reads from. One row per period, one column per tracked thing.

It is intentionally spreadsheet-shaped. A grid you can scan gives you something a stack of cards does not: you can see a gap, a streak or a slide with your eyes, before any analysis is involved.

## Columns

The standard set covers habits (wake by 7am, reading, vitamins), fitness (weight, push-ups, sit-ups, mile time, stairs, workout session) and nutrition (breakfast, lunch, dinner, snacks, an overall eating-quality rating). Every one of them, with types and units, is listed in the [metric reference](/docs/metrics).

Columns can be hidden, reordered, and resized. All of that is stored server-side against your account, so the layout you built on your laptop is the layout you get on your phone.

### Custom columns

Add columns for whatever the standard set does not cover. Each one gets a label and a description.

**Write the description properly.** It is not decoration. The coach reads it to understand what the column means, and fuzzy matching searches it — which is why asking about "nicotine" finds a column named "No Zyn", and why a column called "GMAD" with no description is opaque to everything downstream.

## Check-in frequency

Three rhythms, and the choice changes the shape of the table rather than just its density:

| Frequency | Each row is | You navigate by | Default window |
| --- | --- | --- | --- |
| Daily | A day | Month | 2 weeks |
| Weekly | A week | Quarter | A quarter |
| Monthly | A month | Year | A year |

It also sets the period the AI summarizes over, so a weekly tracker gets weekly narratives rather than daily ones.

## Saving

There is no save button. Every edit writes immediately to the database, field by field, with a brief indicator confirming it landed.

This follows from a deliberate architectural choice: MongoDB is the single source of truth and the browser keeps essentially no cache of your data. The cost is that the ledger needs a connection. The benefit is that two devices can never disagree, a refresh can never lose work, and there is no sync conflict to resolve because there is nothing to sync.

Saving a field also triggers two background actions: the day is re-embedded so semantic search stays current, and cached computations for your account are invalidated so the coach does not answer from a stale figure.

## WHOOP columns

If WHOOP is connected, its metrics can be shown as columns in the same table, merged into the same rows. You choose which ones — the full set is large, and most people want recovery, HRV, sleep and strain rather than all forty. See [WHOOP](/docs/whoop).

## Import and export

**CSV export** produces the raw ledger over any date range, headers matching the canonical field names.

**CSV import** maps incoming headers onto known fields and aliases, so an export from a previous tool usually lands without hand-editing. Imports go through a bulk upsert path, which is rate limited more tightly than normal edits because a single call can write hundreds of days.

Importing history is worth doing if you have it. The correlation engine, personal records and goal projections all improve with length, and backfilled days are treated identically to days entered live.

## Progress pictures

Photos attach to the record alongside the numbers, stored per user and retrievable as a series. Weight is a lagging and noisy signal; a monthly photo is often the clearer one.

## Related

- [Metric reference](/docs/metrics) — every field, type and unit
- [Concepts](/docs/concepts) — derived metrics, quality gating, the feature store
- [AI coach](/docs/ai-coach) — what the coach does with all of this
