Plain-text spec · v0.1

Momentum.

The smallest plain-text format that tells you, in seconds, whether you're winning or losing.

#sales · ARR🟢 WINNING
$0 → $500K by Sep 3064% done · 48% of the clock

A checkbox measures effort. Momentum measures progress.

Turn the to-dos you already write into commitments you keep — and goals you reach.

The line

Every line is one task. Only the text is required; everything else is optional and order doesn't matter.

[x] [date] text…  #goal[/commitment][op N]  target:y value:s repeat:r due:z  +project  @area

x done  ·  #goal/commitment the hierarchy  ·  #goal = / += / −= move a number (bare = +1)  ·  target / value / repeat / due the bar  ·  +project · @area grouping

The scoreboard

You write the plain text; the engine reads your lines and hands back one view. The whole point is that board's last line — the verdict you couldn't see in the raw numbers.

you write this

(A) close $500K new ARR by Sep 30 #sales target:500000 value:0 due:2026-09-30 @revenue

book 10 discovery calls/wk #sales/discovery repeat:weekly target:10
send 3 proposals/wk #sales/proposals repeat:weekly target:3
land first enterprise logo #sales/logo target:1 due:2026-07-15

x 2026-06-26 discovery — Acme #sales/discovery
x 2026-06-27 discovery — Globex #sales/discovery
x 2026-06-25 proposal — Initech ($80K) #sales/proposals
x 2026-06-12 closed Wayne — $120K #sales+=120000
x 2026-06-20 closed Stark — $90K #sales+=90000
x 2026-06-27 closed Umbrella — $110K #sales+=110000

you see this

#sales · @revenue🟢 WINNING
$0 → $500K · day 87 of 183 · 96 days left
MOMENTUM · ARR closed$120K → $210K → $320K ↗
$500K target
Jun 12Jun 27≈ early Sep
LAG  ARR closed$320K / $500K
trend $120K→$210K→$320K ↗proj. $500K ≈ early Sep
LEAD discovery2 / 10 this wk
LEAD proposals1 / 3 this wk
MILESTONE first logo✅ done
⚠ Ahead on ARR — but that lead was built by earlier weeks. Discovery is light (2/10). Refill the pipe, or next month stalls.

10The rules

Every rule below earned its place against one test: can a person still write this by hand, and read the whole spec in one sitting? Anything that failed isn't here. Simplicity is the point — it's both the value and the moat.

01

One line, one task.

The task is the atom. Goals and commitments aren't a different kind of line — they're tasks too (rule 05).

02

x marks a task done.

Lowercase x and a space at the very start, then optionally the completion date. Same as todo.txt.

x 2026-06-27 discovery call — Acme #sales/discovery
03

Tags build the hierarchy.

A #goal is the top level; #goal/commitment nests under it with a slash. Tags are never declared — they exist the moment a task references one, exactly like a todo.txt +project. (In Obsidian, #sales/discovery renders as a navigable tag tree, free.)

04

@area is the cross-cut.

A life domain — @health, @revenue, @craft. Lets the board answer “how am I doing in this part of my life,” across goals.

05

A task with target: or repeat: is a goal or commitment; without either, an execution.

The only structural rule you need. The target:/repeat: marks the bar — on a top-level #goal it's the goal's own lag (a 4DX WIG); on a nested #goal/commitment it's the commitment. A task with neither is an execution: the work that counts toward one.

close $500K by Sep 30       #sales target:500000 due:2026-09-30
book 10 discovery calls/wk  #sales/discovery repeat:weekly target:10
x 2026-06-27 discovery — Acme #sales/discovery
06

Every update is one of three operators — bare is +=1.

This is the whole model, and it's tiny. A dated task moves its #goal's number one of four ways — and the current value is a fold: replay the events from the value: baseline, within the window repeat: sets.

you writeopeffect
#goal (bare)countvalue += 1  — a habit check / tally
#goal+=Naddvalue += N  — deals, dollars, reps
#goal-=Nsubtractvalue −= N  — burn down a backlog / debt
#goal=Nsetvalue = N  — a reading; latest date wins
x 2026-06-27 closed Umbrella — $110K #sales+=110000
x 2026-07-01 weigh-in                #weight=85.5

Use = for an absolute you read off (self-correcting); += / bare for a running total; −= to burn down. The series of dated events is your trend — you never overwrite, you log the next one.

07

A commitment's kind is inferred — never declared.

You don't write “lead” or “lag.” The keys + the operator decide it, and the kind decides how the fold is judged:

the commitment…is a…value / verdict
has repeat:leadfold of the window → count vs target, pro-rated
has repeat:dailyhabit✓ today + 🔥 streak
uses =, or accumulates to a due:lagfolded value → progress% vs clock%
target:1 + due:milestonefold ≥ 1 ? done : days-to-due
target: onlycumulativefold all-time vs target
08

The keys the engine reads.

Everything else you write is yours — unknown keys are ignored, so the format grows without breaking.

keymeaning
target:Nthe bar — count to hit per window, or value to reach. Defaults to 1 (so a daily habit is just repeat:daily). Accepts Nh/Nm.
value:Nthe baseline the fold starts from (default 0) — e.g. value:90 for a weight, value:100 for a backlog
repeat:daily · weekdays · weekly · monthly · quarterly · yearly — the window the fold resets on
due:DATEthe deadline (ISO YYYY-MM-DD)
09

(A) marks the focus.

A priority, exactly as in todo.txt — but on a goal it means the wildly important one: the goal you protect above the rest.

10

Progress is derived, never stored.

You never edit a “% done.” You log tasks; the board folds everything from (the events) + (the baseline) + (the targets) + (today's date). The file is a ledger, not a snapshot — which is why the history and the trend are free.

A complete example

Weight loss, read top to bottom: a focused goal with its own lag, two recurring lead commitments, a milestone, and the dated tasks that move them. Nothing announces its type. You never updated a number — you logged your week.

you write this

(A) lose 10kg: 90 → 80 by Sep 30 #weight target:80 value:90 due:2026-09-30 @health

stay under 1800 kcal #weight/deficit repeat:daily
work out #weight/workouts repeat:weekly target:4
run the city 10k #weight/race target:1 due:2026-08-15

x 2026-05-01 weigh-in #weight=90.0
x 2026-06-01 weigh-in #weight=87.1
x 2026-06-27 weigh-in #weight=85.8
x 2026-06-26 gym — legs #weight/workouts
x 2026-06-27 5k morning run #weight/workouts
x 2026-06-27 under 1800 kcal #weight/deficit

you see this

#weight · @health🟢 ON TRACK
90kg → 80kg · day 57 of 152 · 95 days left
MOMENTUM · weight90.0 → 87.1 → 85.8 kg ↘
80.0 target
May 1Jun 27≈ mid Sep
LAG  weight85.8 / 80.0 kg
trend 90.0→87.1→85.8 ↘proj. 80kg ≈ mid Sep
HABIT deficit✅ kept today
LEAD workouts2 / 4 this wk
MILESTONE city 10k⬜ due Aug 15
⚠ Weight's trending to 80 by mid-Sep — carried by the deficit, not the runs. Workouts are 2/4 and the 10k (Aug 15) has no training logged. The lag is winning; the leads that protect it are light.