doc
rigger doc list <project> [--kind KIND] [--json]rigger doc show <project> <slug> [--json]rigger doc add <project> <title> [--kind KIND] [--slug SLUG] [--body TEXT|-]rigger doc edit <project> <slug> [--title TITLE] [--body TEXT|-]rigger doc remove <project> <slug|file>rigger doc files <project> [--json]rigger doc template <kind> [--write]A project’s plan, changes and diary are written out of the record. Its handwritten texts were the opposite: the vision, the prose of the decisions journal, the rituals only that project states about itself, and the research notes lived only as files in a hub. doc brings them in, so that the record holds everything and a hub becomes an export rather than a place where half the truth is kept.
The kinds
Section titled “The kinds”| Kind | How many | What it is |
|---|---|---|
vision |
one | The product compass: why this exists, and what it is not. |
decisions |
one | The prose preamble of the decisions journal. The entries themselves are events, not a document. |
rituals |
one | What only this project says about itself, over and above the line’s rituals. |
research |
many | A note dated to the day it was asked: the question, what was found, what was decided. |
other |
many | A text that is none of these - rather than a reason to invent a kind. |
A second document of a singular kind is refused by name, because two visions means nobody reads either:
$ rigger doc add rigger "Another" --kind visionerror: rigger already has a vision: 'vision-of-rigger'; edit it with `rigger doc edit rigger vision-of-rigger`Listing and reading
Section titled “Listing and reading”$ rigger doc list rigger3 documents: vision-of-rigger vision today Vision of rigger 2026-09-04-the-tool-for-projects research today 2026-09-04 - The tool for projects rituals rituals today RitualsA document is addressed by its slug, which is made from the title and then stays put: renaming a document does not move it. --kind narrows the list, and --json gives the same rows without the bodies, since the vision of a mature project is longer than the screen.
show prints the body and nothing else, so it can be redirected into a file:
$ rigger doc show rigger vision-of-rigger > vision.mdWith --json it prints the whole row instead - kind, title, body, and the days it was created and last written.
Writing
Section titled “Writing”add and edit open $EDITOR and take back whatever was saved:
$ rigger doc add rigger "Vision of rigger" --kind visionA new document does not start blank. It starts from the questions its kind exists to answer, because a blank file is the surest way to get a document nobody writes.
Skeletons of your own
Section titled “Skeletons of your own”doc template <kind> shows the skeleton a kind starts from, and --write puts it in the profile’s directory as doc.<kind>.md for you to edit:
$ rigger doc template vision# {{title}}
## Why
## The idea
## What it is made of
## Boundaries
## What success looks like
(the built-in skeleton; `rigger doc template vision --write` to make it yours){{title}} in the file becomes the document’s title. What rigger ships is in English, because everything it ships is - the headings you actually write under are yours, and this is how you say so without patching the binary. A kind with no file of its own keeps the skeleton that ships, and deleting the file goes back to it.
The profile’s directory comes first, then the data directory shared by every profile: a line of products and a ticket desk do not write the same kind of vision.
--body skips the editor, and --body - reads standard input, which is how a script or an assistant writes one:
$ rigger doc add rigger "Notes" --body -Leaving the editor without writing anything makes no document. On edit, emptying an existing one is refused: removing a document is doc remove, and it should be said rather than implied.
--title on its own renames a document without opening an editor. A rewrite keeps the day the document was started; only its updated_at moves.
The files that are not texts
Section titled “The files that are not texts”A hub keeps more than prose: voice samples beside the note that compares them, the raw scrape a seed list was cut from, the scripts an import was run with, the queries a benchmark was measured on. import keeps each of them in the record, byte for byte, at the path it lay at - since v0.33.0, so that deleting a hub loses nothing. doc files lists them:
$ rigger doc files sample3 files, 412.6 KB: Исследования/2026-09-23 — Голоса/one.wav 140.0 KB 2026-11-02 Исследования/2026-09-23 — Голоса/two.wav 272.4 KB 2026-11-02 Исследования/bench/queries.json 212 bytes 2026-11-02`rigger export sample --docs` writes them back into the hubThey are not documents: there is nothing in a sound file to read, show or search, so they have no slug, no kind and no body. export --docs writes them back with the texts, and doc remove takes one out of the record by its path - while the hub still has the file, the next import takes it in again, so remove it there too. A document of the same name always wins: a path is tried only when no document answers.
A file larger than 64 MB is not kept - one stray video would make every backup copy of the record that much larger. The import names it, and doctor --hubs counts it among what deleting the hub would lose.
Which editor
Section titled “Which editor”In order: RIGGER_EDITOR, then VISUAL or EDITOR, then scheda when it is installed, then the system default (notepad on Windows, vi elsewhere).
scheda is the line’s own markdown notepad, and it takes --wait FILE: the process stays alive until the tab is closed and gives back its status, which is the contract an $EDITOR has to meet. Preferring it when it is there means a vision is edited in the editor written for exactly that, with nothing to configure. Someone who has set EDITOR has said what they want, and that still wins.
The text is edited through a file in a directory of that rigger process’s own, under the temporary directory, and both are removed afterwards whether the edit succeeded or not: the file holds your prose, and leaving copies of it lying about is not something a record tool should do. Per process, because two rigger runs editing a document of the same name - two projects each with a vision, or two sittings at once - would otherwise share one scratch file, and whichever saved second would win.
doc list --json prints an array with one row per document, without the bodies.
| Field | Type | Meaning |
|---|---|---|
[] |
object | One document. |
[].slug |
string | What addresses the document. |
[].kind |
string | vision, decisions, rituals, research or other. |
[].title |
string | The title. |
[].bytes |
integer | The size of the body in bytes. |
[].updated_at |
string | The moment the document was last written, in RFC 3339 UTC. |
[].file |
string or null | The hub file it was read from and is written back to, relative to the hub; null for a text that never came from a hub. |
doc show --json prints the whole row.
| Field | Type | Meaning |
|---|---|---|
id |
integer | The document’s id in the record. |
project_id |
integer | The id of the project it belongs to. |
kind |
string | vision, decisions, rituals, research or other. |
slug |
string | What addresses the document: made from the title once, and then unchanged. |
title |
string | The title. |
body |
string | The whole text. |
created_at |
string | The moment the document was started, in RFC 3339 UTC. |
updated_at |
string | The moment it was last written, in RFC 3339 UTC. |
source_file |
string or null | The hub file the text was read from, when it came from one; null for a document written here. |
doc add and doc edit print the document they wrote.
| Field | Type | Meaning |
|---|---|---|
document |
object | The document as written; its fields are those of doc show. |
changed |
boolean | Whether the record changed; false when the text was the same as before. |
document.id |
integer | The document’s id in the record. |
document.project_id |
integer | The id of the project it belongs to. |
document.kind |
string | vision, decisions, rituals, research or other. |
document.slug |
string | What addresses the document: made from the title once, and then unchanged. |
document.title |
string | The title. |
document.body |
string | The whole text. |
document.created_at |
string | The moment the document was started, in RFC 3339 UTC. |
document.updated_at |
string | The moment it was last written, in RFC 3339 UTC. |
document.source_file |
string or null | The hub file the text was read from, when it came from one; null for a document written here. |
doc remove says what it removed: a document by its kind and address, a kept file by its path.
| Field | Type | Meaning |
|---|---|---|
removed |
object | What was removed. |
removed.project |
string | The name of the project it belonged to. |
removed.kind |
string | The kind the document had; absent for a file. |
removed.slug |
string | The address the document had; absent for a file. |
removed.file |
string | The path the kept file had in the hub; absent for a document. |
doc files --json lists the files the record keeps for the project’s hub, without their bytes.
| Field | Type | Meaning |
|---|---|---|
project |
string | The project’s name. |
files |
array | The kept files, sorted by path. |
files[] |
object | One file. |
files[].path |
string | Where it lies in the hub, with / between directories. |
files[].bytes |
integer | Its size. |
files[].updated_at |
string | When the record last took it in, in RFC 3339 UTC. |
doc template --json prints the skeleton, and where it came from or went to.
| Field | Type | Meaning |
|---|---|---|
kind |
string | The kind the skeleton is for. |
template |
string | The skeleton, with {{title}} still in it. |
from |
string or null | The path of the file the skeleton was read from; null for the built-in one or after --write. |
written |
string or null | The path --write created; null when nothing was written. |
What belongs here, and what does not
Section titled “What belongs here, and what does not”The record holds the work on a product: its projects, versions, tasks, events and questions, and the handwritten texts about how the product is made - the vision, the rituals, the preamble of the decisions journal, the research notes. Once they are here the hub is an export, and there is nothing in it left to edit by hand.
What stays outside is the material itself. For this line that means a notes vault keeps the songs, lyrics, artwork and channel analytics, the stories and everything belonging to a content project - things read with the eye, linked to each other, and shaped by no schema - outside the directory the hubs lie in.
The test is short: a file that describes how a product is run belongs in the record; a file that is the work belongs where the work lives. And whatever lies in the directory of the hubs is the record’s, whichever it is: since v0.33.0 the files there outside every project’s hub - a register of the marks, the line’s own research, a calendar - are the texts and files of the line’s own place, so that the directory can be deleted and written back whole (see import).