Skip to content

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.

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:

Terminal window
$ rigger doc add rigger "Another" --kind vision
error: rigger already has a vision: 'vision-of-rigger'; edit it with `rigger doc edit rigger vision-of-rigger`
Terminal window
$ rigger doc list rigger
3 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 Rituals

A 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:

Terminal window
$ rigger doc show rigger vision-of-rigger > vision.md

With --json it prints the whole row instead - kind, title, body, and the days it was created and last written.

add and edit open $EDITOR and take back whatever was saved:

Terminal window
$ rigger doc add rigger "Vision of rigger" --kind vision

A 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.

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:

Terminal window
$ 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:

Terminal window
$ 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.

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:

Terminal window
$ rigger doc files sample
3 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 hub

They 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.

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.

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).

  • note - the events a decisions journal is made of.
  • export - writing a hub back out of the record.
  • import - reading a hub into it.
  • backup - the copy that matters more once the texts live here.