Learn in cycles. Move in a line.
A practice of continuous inquiry and forward flow — tlflow.cc
Most systems organize work by state: backlog, ready, doing, blocked, done, someday, version two. Several of those quietly mean not now.
Throughline organizes work by sequence instead. One ordered line runs from past, through Now, into the future. Completed work becomes history rather than piling up in a column, and future work sits ahead of the present in the order we currently believe it should happen.
It is deliberately not a project-management methodology. You never complete a practice.
| term | meaning |
|---|---|
| Practice | the whole of it; you get better by doing it and never complete it |
| the Line | the ordered continuity of work through time |
| Flow | movement along the Line; one direction, forward |
| the Window | the current field of attention |
| Inquiry | the learning that decides what comes next |
| Cycles | repeated experiments, unrolled onto the Line |
| Now | the moving boundary between observation and intention |
Three claims make it mechanical rather than aspirational:
- Status is position. "Done" is not a flag, it is a location — behind Now.
- Markers are landmarks, not buckets. "After launch" is a place on the line.
- The Window is a view. Now is stored; the window is wherever you look.
A single Rust binary — a terminal UI and a command line at once, so a person and a coding agent can both work from the same record. One line lives in one readable Markdown file in your repository.
$ tlflow advance --result "sixteen diagrams, seven generated by tl itself"
what does that change? tlflow move · tlflow add · tlflow drop
$ tlflow add "generate the diagrams" --after now
$ tlflow line
● sketch the practice ^k3f
● pick the name ^m2a
● write docs/method.md ^q1d
│ NOW
○ generate the diagrams ^pc4
○ build the ribbon ^r7e
◆ v0.1
○ MCP server ^t9a
Placement is required — there is no backlog to drop things into.
Status: the POC is complete. 155 tests, clippy clean. Throughline now
manages its own construction — .throughline/line.md is this project's line,
and it passes tlflow check.
The practice is written up in docs/method.md.
curl -fsSL https://raw.githubusercontent.com/DanielCarmingham/throughline/main/install.sh | sh
Or cargo install --path tlflow from a clone. Then:
tlflow init # start a line in any repo
tlflow # open the terminal UI
tlflow --help # refs, examples, every flag
The manual — every command, the keymap, the file format, config and themes. The practice — what any of it is for.
tlflow mcp serves the line as typed MCP tools over stdio — line, window,
now, add, advance, move_item, check — so an agent works from
structured data instead of parsing terminal output. The handshake carries
instructions that teach the vocabulary, so a fresh agent learns the practice
without being told.
{ "mcpServers": { "throughline": { "command": "tlflow", "args": ["mcp"] } } }Every tool re-reads the file before acting: it is the source of truth, and a person may have edited it between calls.
Two ship built in — dark and light. A user theme is a TOML file naming only
the tokens it changes:
# .throughline/themes/solarized.toml
base = "dark"
[tokens]
now = "#268bd2"
marker = "#d33682"
past = "#586e75"
blocked = "#cb4b16"tlflow --theme solarized # or TL_THEME, or theme = in config.toml
tlflow doctor # lists what is available
Unknown token names are an error, not silence — a typo that quietly does nothing leaves a theme looking almost right with no way to tell which line is dead.
| path | what |
|---|---|
tlflow/ |
the Rust binary |
site/ |
tlflow.cc — Astro, deployed via uncloud |
docs/ |
design spec and implementation plan |
brand/ |
logo artwork and the tracer that generates every derived asset |
.throughline/ |
this project's own line — Throughline, dogfooded |
Trunk-based: commit to main, no long-lived branches. A feature branch is a
temporal bucket for code, which is the thing §7 argues
against.
Version control is jj colocated with git, so both work.
MIT — see LICENSE.