Documents and rows
A document is one nested list. Rows go in, rows nest under rows, and that is the whole structure — a document does not contain another document, and there are no folders below it.
The API calls the same thing an outline (
/api/v1/workspaces/{workspaceId}/outlines). The app says document everywhere, because that is the word for a thing you write in. If you are reading the API reference, the two words mean one object.
Rows
A row carries a line of text, and optionally:
- a note — the smaller second line underneath, for the sentence that would otherwise make the row too long to scan;
- children — any number, nested as deep as you like. There is no depth limit;
- a task state — open or done. A row is only a task once you make it one;
- a priority — high, medium or low;
- a heading level — one of three, for the row that titles the block under it;
- any number of tags, and a colour each — see Tags;
- files, dropped on it or attached from its menu;
- an archived state, which takes it out of every list until you ask for it back — see The archive;
- a rhythm, on a task — the row comes back after it is ticked. See Repeating tasks;
- a plan — a period, and on a day also a start time and a duration. That is its own page.
Two rows are of a different kind: a divider is a horizontal rule, written by
typing --- on an empty row and pressing space or enter. Turning one back into
a bullet is in the row menu under More … — a divider has no text to type
into, so there is nowhere to undo it from.
Tasks
There is no separate "task" row type to pick and nothing to switch on: every
row can be ticked off. Ctrl/Cmd + Enter does it, and so does Mark as
done in the row menu.
The tick takes everything under the row with it. Ticking a heading ticks the items beneath it, however deep — a finished heading over unfinished work is a lie about the work, and it was reported as one.
Taking the tick off puts them back exactly as they were. A line that was open is open again; a line that had been ticked by hand before you ticked the row above it keeps its tick. So the way back is not "clear everything below", which is the other way to be wrong about the same subtree.
Priorities
Ctrl/Cmd + 1, 2 or 3 sets high, medium or low. Ctrl/Cmd + 0
removes it. A priority is independent of a plan — a row can be urgent and
unscheduled, or scheduled and unremarkable.
Text
Bold, italic, strikethrough, inline code, highlight and text colour work inside
a row and are shown on rows you are not editing. Links go in with
Ctrl/Cmd + K.
A typed URL is not turned into a link automatically, and neither is a pasted
one. In a document where rows are short, autolinking guesses wrong more often
than it helps; use Ctrl/Cmd + K when you mean a link.
The keyboard
Lithic is meant to be driven from the keyboard. Everything below works while the caret is in a row.
| Key | What it does |
|---|---|
Enter |
A new row where one is drawn under this one: on an unfolded row with children, its first child; otherwise the next sibling. A folded row keeps the sibling — writing a line into a closed branch would file it out of sight. At the start of a row that already has text: an empty row above, and the caret stays with the text. |
Tab / Shift+Tab |
Indent / outdent. Always swallowed, even when the move is impossible — otherwise the focus would jump out of the document. |
Alt+↑ / Alt+↓ |
Move the row among its siblings. |
Shift+Enter |
Open the note, or jump into it. Esc goes back to the row. |
Ctrl/Cmd+Enter |
Toggle done — the row and everything under it. |
Ctrl/Cmd+K |
Set or edit a link. |
Ctrl/Cmd+1 / 2 / 3 / 0 |
Priority high / medium / low / none. |
Backspace on an empty row |
Delete it and go up. Children are pulled up, not deleted. |
Delete on an empty row |
Delete it; the row below moves up. |
↑ / ↓ at the row's edge |
Previous / next row, keeping the caret's column. |
Ctrl/Cmd+↑ / ↓ |
To the start or the end of the document — of what the pane draws, so in the periods pane that pane's order rather than the tree's. |
Backspace at the start of a row |
Append this row to the one above; the caret sits on the seam. |
Delete at the end of a row |
Pull the row below up into this one. |
Ctrl/Cmd+Alt+1 / 2 / 3 / 0 |
Heading level 1 / 2 / 3 / none. The same level again makes it an ordinary row. Works on a row that is merely selected too (after Esc). |
Ctrl/Cmd+. |
Fold or unfold this row. |
Ctrl/Cmd+Alt+T |
Fold or unfold everything in this pane — see below. |
Ctrl/Cmd+Alt+. / , |
Zoom into the row / come back out one level. |
Shift+↑ / Shift+↓ at the row's edge |
Enter row-selection mode. |
Ctrl/Cmd+P |
Show or hide the planner pane. |
Ctrl/Cmd+B / I / E / Shift+S |
Bold / italic / inline code / strikethrough. |
Ctrl/Cmd+C / X |
Copy / cut the row and its subtree as Markdown. |
Esc |
Leave the text: the row keeps the keyboard, and the row chords still work. |
! / ~ |
Open the date / the duration picker, on a word of its own. ! reads up to four words: !tomorrow at 9:00, !every monday at 8:00. |
@ |
Link another document, or name a colleague. |
# |
Put a tag on the row — see Tags. |
Ctrl/Cmd+Shift+A |
Show or hide the agenda pane. |
Ctrl/Cmd+K (outside a row) |
Search every document in the workspace. |
Ctrl/Cmd+F |
Search the document you have open, and put the caret on the row you pick. |
Ctrl/Cmd+Z / Shift+Ctrl/Cmd+Z |
Undo / redo. |
Undo is one history, for text and structure alike, and one press is one
thing: a keystroke that acts on the document (Enter, Tab, Backspace, a
move) undoes on its own, while letters typed in a row collapse into the word you
were writing. Before 24 August 2026 the text half did not undo at all — if you
remember Ctrl/Cmd + Z doing nothing after deleting a word, that was this.
Two searches, two chords. Ctrl/Cmd + F searches the document in front
of you — every row, folded or archived, and the notes with them — and the row
you pick takes the caret. Every other pane that draws that row scrolls to it and
flashes it, so you can see where it sits. Ctrl/Cmd + K searches every
document in the workspace and opens the one you pick. It is one dialog either
way: whichever chord opened it, the other scope is one press away. With no
document open there is no switch, and Ctrl/Cmd + F stays the browser's.
On a phone
A row has four gestures and no chords.
- While you are typing, the row grows a second line: outdent, indent, up,
down, the supplementary description and done. One tap each, and the caret stays
where it is, so a new line can be indented without leaving it. The description
button is
Shift+Enterfor a thumb, and it opens exactly what the chord opens. The line goes when the keyboard goes. - Swipe right to archive, left to tick off. The same in every list — the document, the agenda, the periods, the projects, the tags view, and the planner's all-day rows. Neither is delete: a swipe shares its finger, its pixels and its direction with scrolling, so the gesture that slips costs a tick rather than a row. Deleting stays one press away, in the row menu.
- Shake the phone to undo, while a row has the caret — the same undo
Ctrl/Cmd+Zperforms, on the document rather than on the text field. - Press and hold the left margin for the same four moves, anchored to the row. This is the way when the keyboard is closed. A move that cannot be made is dimmed rather than missing.
- Hold, then drag to move the row somewhere else. Holding without moving is the strip above; moving without holding is a scroll, as it should be.
The ⋯ opens the row's whole menu as a sheet from the bottom edge, so the row it
acts on stays visible above it. On a phone that menu has three tabs, one per
question: Plan is when, Row is what, Order is where it sits and how it
goes away. Everything a mouse sees is there; it is one tap deeper instead of two
screens down.
There is no checkbox on a row. It was tried and taken out again on 11 September
2026: it took a quarter of the row's width, and it is a thing the desktop does
not draw either. The ✓ on the strip and the row's menu are where a task is
ticked off.
Nothing of ours floats over the keyboard, and that is four attempts' worth of decision rather than an omission. The last one was built and removed on the same day: the browser draws its own bar above the keyboard, web pages cannot hide it, and ours collided with it and slid under the keyboard on every scroll. The strip above is in the row instead, where nothing has to guess at a viewport.
Selecting several rows
Shift + an arrow at the edge of a row enters selection mode; from there:
| Key | What it does |
|---|---|
Shift+↑ / ↓ |
Extend the selection. |
Alt+↑ / ↓ |
Move the whole block. |
Tab / Shift+Tab |
Indent / outdent the whole block. |
Ctrl/Cmd+C / Ctrl/Cmd+X |
Copy / cut as Markdown. |
Backspace / Delete |
Delete the selection. |
Esc, or a plain arrow |
Back to writing. |
You can also Shift-click a second row, or drag across rows.
Tags
Type # at the start of a word and a picker opens: the tags this document
already has, narrowed as you keep typing, and Create tag "…" as the last entry.
Take one and the token you typed disappears — the tag becomes a chip at the right
of the row, in its own colour.
A row carries any number of tags. Two chips are drawn and the rest becomes +3,
whose tooltip lists them all: the row's own words are what the row is for.
The picker marks the tags the row already has with an ×, and choosing one
of those takes it off again — with the pointer or with Enter, since it is the
same row either way. With several rows selected the mark means "all of them
have it", so one press finishes the job on the rest and the next press clears
them all.
# needs a word start, so C# and "Ticket #17" open nothing, and a tag name
cannot contain a comma, a ] or a line break — the Markdown line separates tags
by comma and has no escape for one inside a name.
Name, colour and order live in ⋯ → Tags … — the menu beside the document's title, or the one on its row in the sidebar. Renaming a tag changes every row that carries it at once, because the name is kept in one place. Deleting one takes it off its rows and says how many were touched; nothing else is lost.
Tags belong to that document, like contexts. And they are not contexts:
| A context | A tag | |
|---|---|---|
| How many per row | exactly one, or none | any number |
| What it does | divides a day into bands you can see | says something about the row |
| Where you see it | as a band in the agenda | as a chip on the row |
The tags view
A document pane can also be ordered by tag: pick Tags in the pane's header and every tagged row is grouped under the tag it carries, with an Untagged group last so nothing is left out of the list.
This is the one view where the same row appears more than once — a row with two tags belongs under both, because a tag is something a row has, not a place it is. Only one of those is the real row: the group of its first tag in the document's tag order draws it as an ordinary line you can type in. The others draw it as a preview — the row's text, read-only. Press one and you land on the live copy.
Rows are drawn flat here, every one at the same level: a tag says nothing about where a row sits, so a tagged sub-task is its own line rather than something nested under a parent that may carry no tag at all.
Dropping a row on a group's heading adds that tag — it does not move the row out of the tags it already has, because a row can carry several. Taking one off stays where it was: the chip, or the row's menu.
Deleting a row
Whichever door it goes through — the row menu, Ctrl/Cmd + Backspace, the
phone's bar, or any of the lists — a deleted row says so, and the message
carries Undo. It is the same undo Ctrl/Cmd + Z performs, so it undoes
the last thing you did: type something in the seconds the message is up, and
the button takes that back instead of the deletion.
The message says how many rows went, and that number is often larger than
one: a row takes everything indented under it, and a filter can be hiding all of
it. A row whose children a filter is keeping off the screen says so before you
press anything — a quiet +3 among its other facts, naming how many are under
it.
The archive
Archiving takes a row out of every list without deleting it — the drawer for work that is done but worth keeping. It says so the way a deletion does, with the number of rows and an Undo: from where you sit the two look alike, because the row leaves the screen either way.
- One row: Archive in the row menu (right-click a row, or its
⋯). It takes everything indented under it with it, and oneCtrl/Cmd+Zbrings the whole block back. - Everything finished in this view: Archive completed in the pane's own
⋯menu. It asks first, with the number of rows that will go — a done row takes its children along, so that number is usually larger than the number of ticks you see. - Getting them back: the Archive switch at the top right of the pane. It appears as soon as a document has an archived row, says how many are hidden, and while it is on those rows are drawn with a dashed rule so you can tell which is which. Archive on an archived row reads Bring back from the archive.
The switch belongs to the pane, not to the document: one pane can show the archive while the one beside it does not, and a colleague opening the same document starts with theirs closed. Archived rows are hidden everywhere the rows are drawn — the tree, the periods view, the agenda and the planner — and they stay out of the search until you show them.
Files on a row
Drop a file on a row and it hangs off it; a picture is shown, everything else is a link with its name. Attach file … in the row menu (under More …) does the same thing for a keyboard or a phone, where a drop is not a gesture. Files belong to the row, so they travel with it into another document and go with it into the trash.
Folding and zooming
The handle at the left of a row folds its children. Folding is per browser, not part of the document: it is remembered on the machine you folded on, and a colleague opening the same document sees their own folds.
Everything at once: the ⇕ button at the top right of every view, and
Ctrl/Cmd + Alt + T. Both are toggles, and both fold what that view is
made of: the tree folds every row that has children, the periods view folds its
groups, and the agenda folds its days — which is the overview a month is worth
asking for. The calendar has nothing to fold and shows no button.
Alt-click a row — or its fold or drag handle — to zoom into it. The document is then drawn from that row down, with a breadcrumb above; each breadcrumb segment zooms back out. The row menu has the same thing under Zoom in. Zoom is not remembered: reload, and you are back at the top.
The zoom view
A second, differently shaped answer to the same wish, and worth telling apart
from the zoom above: the zoom view opens one row in a window of its own,
rather than redrawing the document around it. Zoom view in the row menu, or
Ctrl/Cmd + Alt + Enter.
The row's text is the window's title, and everything the row carries sits on that same title line — priority, tags, plan, deadline, length, repetition, note and files. The facts there are not just a caption: press one and its menu opens, the same menu the chip on the row itself offers. Under the title the row is drawn with its children, as an ordinary pane you can type and move rows in.
An appointment has a window of its own in the same shape, with its date, time
and place on the title line. Alt + Enter alone opens the smaller details
popover an appointment already had — the Ctrl/Cmd tells the two apart.
Dragging
Drag a row by its handle and the whole subtree comes with it. Dropping above or below a row makes it a sibling; dropping onto one makes it that row's first child.
Markdown
A document is Markdown, and the round trip is exact — parsing what was written gives the document back.
- A plain row
- A child
- [ ] An open task
- [x] A finished one [priority:: 1]
- A planned row [plannedFor:: 2026-08-03] [start:: 09:30] [duration:: 45]
A note belongs to the row above it, two spaces deeper.
- ---
- Two spaces per level.
- The marker carries the kind:
-is a bullet,- [ ]an open task,- [x]a finished one. A divider is- ---; a row whose text really is---is written- \---. - Links pass through as
[text](url). They are the only inline mark that does. - Attributes ride at the end of the row, in a fixed order:
[plannedFor:: …] [start:: HH:MM] [duration:: <minutes>] [estimate:: <minutes>] [planOrder:: …] [priority:: 1|2|3] [due:: YYYY-MM-DD] [archived:: <ISO instant>] [repeat:: <rule>] [repeatFrom:: done] [tags:: name, name]. Every one of them is optional, and one this dialect does not know stays in the row's text rather than being swallowed. Two are read but never written:[date:: …](an older spelling of a day plan) and[dayOrder:: …](ofplanOrder). - A rhythm is a rule, not a date list:
daily,3d,weekly,weekly:mo,th,2w:mo,monthly,monthly:3,monthly:last,monthly:2fr,yearly,yearly:12-24. It is written back canonically, so a hand-typedWeekly:MOsettles the first time the row is rewritten, and a rule that cannot be read is dropped rather than guessed at.[repeatFrom:: done]next to it counts from the tick instead of from the plan. - Tags travel by NAME, not by the id the document keeps them under, because an id means nothing in another document. A name your document does not have yet is created on the way in.
- A note follows on its own lines, two spaces deeper than its row, one line per paragraph.
What Markdown loses, on purpose: bold, italic, strikethrough, code, highlight and colour become plain text. Notes carry no links. Row identities do not survive a round trip — a document that leaves and comes back is the same text, not the same rows. Two tags of the same name become one, which is the price of speaking names.
That is a decision, not unfinished work. A row's text is usually a sentence, and a format that other tools can read is worth more here than a mark nobody else renders.
Getting Markdown in and out
- Paste it. Pasting multi-line Markdown into a row turns it into rows,
nesting and all. A single line pastes as text.
Shift-paste always pastes plain text, deliberately. - Copy it. Select rows and press
Ctrl/Cmd+C. - Download it. The document's
⋯menu — the same one in the sidebar row and at the top of the open document — offers Download as Markdown. It saves the whole document as one.mdfile named after it, and it is the same bytes the API below returns. - Fetch it.
GET /api/v1/workspaces/{workspaceId}/outlines/{outlineId}/markdownreturns the whole document with a strongETag. The workspace export puts every document under<collection>/outlines/*.md. - Write it back.
PUTto the same address replaces the document from Markdown. Send theETagyou read asIf-Matchand a412tells you somebody edited it meanwhile — read again and retry. A row you did not change keeps its files, its plan and its identity; rows your Markdown drops are deleted. A document open in another tab updates as you write. Prose with no-in it is not an outline and is refused with a400rather than emptying the document — an empty body is what clears it.
There is no file import. Pasting is the way in by hand and the API is the way in for a script; the download, the API and the workspace export are the ways out. Through the application, Markdown goes one direction — out.
What the app cannot do yet
- Import a file. Pasting Markdown is the way in by hand, the API the way in
for a script; there is no file picker. The way out is a button — the
⋯menu downloads the document — but it goes only the one way. - Nest documents. A document is one list. There are no folders below a collection and no document inside a document.
- Two tags with one name. They are allowed, and a Markdown round trip collapses them into one.