Writing
How the editor turns plain text into notes, tasks and dates, and how to stay out of its way.
The journal and every page open as a plain-text document. You type, and thc keeps track of
the structure for you.
$ thc j # today's journal, cursor on a fresh line at the end
$ thc j fri # or yesterday, or 2026-10-02
$ thc p "Q4 Planning" # a page, by title or id
How the text becomes notes
| You write | It’s |
|---|---|
| A paragraph (lines with no blank line between) | One note. Enter inside it is just a line break |
| A blank line | The end of a note. The next text starts a new one |
- milk | A list item (one note). Enter continues the list |
1. first | A numbered item. Enter makes 2. |
[ ] call / [x] call | A task, open or done |
# Title, ## Section | A heading |
| Indented items | Children of the item above |
> quote, fenced code, --- | A quote, a code block, a rule |
Blank lines are yours. The blank lines you type stay exactly where they are when a line
changes kind (a task, back to text, nested with Tab), so the text never jumps. They’re
saved with the note, and thc edit, thc import and the Markdown export keep them.
Each note has its own identity, dates and history, and you never see that machinery. Delete the
[ ] and it’s plain text again, because what you see is the truth.
A few edges that behave the way your fingers expect:
- Enter on an empty list item ends the list.
- Backspace at the start of a paragraph joins it to the one above. On a task it takes the box off, then the bullet.
- ⇧Enter (or ⌃J) breaks a line without leaving the item.
- Long lines in a code block don’t wrap. They end in
→and scroll sideways while you’re in them. - Emoji, flags, accents and CJK are single characters: one arrow press, one backspace.
Dates, tags and priority, inline
Type them anywhere on a line:
| Token | Means |
|---|---|
due:fri, due:2026-10-10, due:"nov 1 9am" | A hard deadline |
sched:mon | When you plan to start. It shows in Today from then |
at:"tue 2pm" | An event at a time, with no task box |
every:2w, every:weekday, every!:1mo | Repeats. ! counts from when you finish |
!high !med !low | Priority |
#tag | A tag. It stays in the text |
[[Page]] | A link. A new name creates the page |
While you type, tokens are underlined, and the right column previews what they’ll set
(due fri · !high ✓), or says what it couldn’t read. When you leave the line, the dates and
priority move into that quiet column. Type a new token to change one, or click it.
Quoted text is never a token. Inside “double quotes” or backticks, nothing is read as a
date, priority, tag or link. That’s how you write about the syntax:
[•] personal Today Inbox 2 Tasks Pages Journal Search Log 1 Sat Oct 3 · 10:41 ─────────────────────────────────────────────────━━━━━━━━━────────────────────────────────────────── § Journal › Sun 04 Oct SUN 04 OCT 2026 THU 01 • FRI 02 • SAT 03 • [SUN 04] MON 05 TUE 06 WED 07 ───────────────────────────────────────────────────────────────────────────────────────────── Write "due:fri" in quotes and it stays text. due:fri bare is a date, due fri · !high ✓ !high a priority, #lisbon a tag.▮ § sun 04 oct · 19 words · autosaved ⌃T task ⌃O open ⌃P ⌃N day Esc done F1 keys thc 0.9.65
[•] personal Today Inbox 2 Tasks Pages Journal Search Log 1 Sat Oct 3 · 10:41 ─────────────────────────────────────────────────━━━━━━━━━────────────────────────────────────────── § Journal › Sun 04 Oct SUN 04 OCT 2026 THU 01 • FRI 02 • SAT 03 • [SUN 04] MON 05 TUE 06 WED 07 ───────────────────────────────────────────────────────────────────────────────────────────── Write "due:fri" in quotes and it stays text. due:fri bare is a date, due fri · !high ✓ !high a priority, #lisbon a tag.▮ § sun 04 oct · 19 words · autosaved ⌃T task ⌃O open ⌃P ⌃N day Esc done F1 keys thc 0.9.65
Two of the same token on one line (!high … !low): the last one counts. The earlier one
stays as plain words, and the hint says 2 priorities · using !low.
The full grammar, with every date form, is in Capture syntax.
Links
Type [[ and a picker offers pages and days as you type. Enter or Tab
links the one you chose; a page is only made when you pick a new name. Case doesn’t matter:
[[lisbon]] links your Lisbon. A near miss ([[Lisbn]]) offers the page you probably meant,
and ⌃O takes it before any new page is made.
A click on a link goes there, and Esc comes back. To edit one, click its [[ or ]], ⌥-click it, or arrow into it. With the cursor in a link, ⌃O goes there. Under every page, linked from lists the
lines that mention it. Under a journal day, also today lists what’s due today elsewhere, and
ticking a box there completes it where it lives.
[•] personal Today Inbox 2 Tasks Pages Journal Search Log 1 Sat Oct 3 · 10:41 ─────────────────────────────────────────────────━━━━━━━━━────────────────────────────────────────── § Journal › Sat 03 Oct SAT 03 OCT 2026 · TODAY WED 30 THU 01 • FRI 02 • [SAT 03 •] SUN 04 MON 05 TUE 06 ───────────────────────────────────────────────────────────────────────────────────────────── · Morning: slept well, 30 min run #health [ ] Call dentist to reschedule #health due fri · !high · Dentist appointment [[Health]] tue 14:00 [ ] Pay rent tue 09:00 · ↻ monthly · Mom's birthday, call her oct 15 10:00 [ ] Summarize unread newsletters into [[Reading List]] due tomorrow Read back through [[Q▮ ┌──────────────────────────────────────┐ ───────────────────│¶ Q4 Planning │────────────────────────────────── [ ] Water plants └──────────────────────────────────────┘ ¶ Home · today · ↻ 3d [ ] Replace furnace filter ¶ Home · today · ↻ 3mo! [x] Renew passport #admin § fri oct 02 · done 10:41 § sat 03 oct · 31 words · autosaved ↑↓ choose Enter link Esc close thc 0.9.65
[•] personal Today Inbox 2 Tasks Pages Journal Search Log 1 Sat Oct 3 · 10:41 ─────────────────────────────────────────────────━━━━━━━━━────────────────────────────────────────── § Journal › Sat 03 Oct SAT 03 OCT 2026 · TODAY WED 30 THU 01 • FRI 02 • [SAT 03 •] SUN 04 MON 05 TUE 06 ───────────────────────────────────────────────────────────────────────────────────────────── · Morning: slept well, 30 min run #health [ ] Call dentist to reschedule #health due fri · !high · Dentist appointment [[Health]] tue 14:00 [ ] Pay rent tue 09:00 · ↻ monthly · Mom's birthday, call her oct 15 10:00 [ ] Summarize unread newsletters into [[Reading List]] due tomorrow Read back through [[Q▮ ┌──────────────────────────────────────┐ ───────────────────│¶ Q4 Planning │────────────────────────────────── [ ] Water plants └──────────────────────────────────────┘ ¶ Home · today · ↻ 3d [ ] Replace furnace filter ¶ Home · today · ↻ 3mo! [x] Renew passport #admin § fri oct 02 · done 10:41 § sat 03 oct · 31 words · autosaved ↑↓ choose Enter link Esc close thc 0.9.65
Tasks with notes become pages
A task with notes under it is an issue, and it opens as its own page: Enter on it in a list, or ⌃O on its line. The task line is the header (its box, who owns it, priority, when it was opened) and its notes are the body. Write there to add findings. Esc goes back where you came from.
The keys you need
| Key | Does |
|---|---|
| Just type | Write |
| Enter | A new line. Twice: a new note. In a list: the next item |
| Tab / ⇧Tab | Indent / outdent a note: any note nests under the one above, paragraphs too. Tab on a paragraph’s later line makes that line its child |
| ⌃T | Text → task → done → text, on the line you’re on (just that line, even inside a paragraph) or every selected line |
| ⌥↑ / ⌥↓ | Move the line, with its children |
| ⇧ + arrows | Select |
| ⌘← ⌘→ / ⌥← ⌥→ | Line start or end / by word (⌃A ⌃E work too) |
| ⌘⌫ / ⌥⌫ | Delete to the line start / a word |
| ⌘C / ⌘X (or ⌃C / ⌃X) | Copy / cut, as Markdown |
| ⌘A (or ⌥A) | Select all |
| ⌘V or ⌃V | Paste. Screenshots too |
| ⌥V | Make the next paste plain text |
| ⌘Z / ⇧⌘Z (or ⌃Z / ⌃Y) | Undo / redo |
| [[ | Link a page |
| ⌃O | Open the link under the cursor, or go to any page or day |
| ⌃P / ⌃N | Previous / next day |
| Esc | Save and go back: to the list or view you came from, else Today |
| ⌃Q | Quit. Everything is already saved |
| F1 | Every key, for right here |
The ⌘ keys need a terminal that sends them: kitty does, and WezTerm does after
thc setup wezterm --yes. Every one has a ⌃ or ⌥ twin that works
anywhere. More in Keys.
Paste Markdown from anywhere and it becomes notes: headings, lists, tasks, quotes and code, as one undo step. Copy gives clean Markdown back.
Screenshots and files
A note can carry an image or a file.
- Paste a screenshot: copy one (⌃⇧⌘4 on a Mac), then ⌘V or ⌃V while writing. It’s attached as its own line, and ⌃Z undoes it. Text pastes exactly as before.
- Drag a file onto the terminal and it’s attached at once. The bar says
attached shot.png · ⌃Z keep the path: ⌃Z turns it back into the path as text, and again removes that. Press ⌥V before dragging to paste the path instead. - From the command line:
thc attach <id> shot.png --caption "after the fix". - Find them later: every attachment is also an item of its own, so
thc q is:imagelists your images andthc show <id>says which notes use one.
An attachment shows as a chip, ▣ caption · 1280×720 · ⌃O open. Moving onto it never opens it:
a click puts the cursor there and Enter starts a new line after it. ⌃O or a
double-click opens it in your viewer. In WezTerm, iTerm2, kitty and Ghostty, an image
also draws under its chip, sized to the text column. Over SSH, or with images = "chips" under
[tui], you get the chip alone.
Underneath, the file is copied into the vault’s files/ folder and the note’s text is a
Markdown image line, so it syncs with the vault and the export reads it. Files over 20 MB are
refused (a vault setting, [attachments] max_mb).
Saving, undo and other devices
- Saving is automatic: when you leave a note, after a short pause, and when you leave or
quit. If a save is slow the footer says
◌ saving…, and if one fails,not saved · :retry. - Undo (⌃Z) works across saves. Each page and day remembers where your cursor was.
- A crash or a closed window never loses what you typed.
- If an agent or another device changes the note you’re in,
thctells you at once and applies it when you move off. It never rewrites the text under your cursor. If you both changed it, both versions are kept and marked≠: compare them and choose (1 keep yours, 2 keep theirs, b both).
Focus
⌥Z hides everything but your words and the date. thc j opens this way;
thc j --no-focus opens the full screen.
:focus lets you choose what stays: the keys footer, the day strip, a month calendar, the dates
column, today’s other tasks, links, a word count, a clock, dimming, typewriter scrolling. Three
starting points: bare (only your text), writer (the default: the date, the day strip, the
footer and a word count) and planner (adds dates, a month beside the text, today’s tasks and a
clock). Enter in the panel saves your choice. You can also type it:
:focus planner, :focus +month -footer.
SAT 03 OCT 2026 · TODAY WED 30 THU 01 • FRI 02 • [SAT 03 •] SUN 04 MON 05 TUE 06 ──────────────────────────────────────────────────────────────────────── · Morning: slept well, 30 min run #health [ ] Call dentist to reschedule #health · Dentist appointment [[Health]] [ ] Pay rent · Mom's birthday, call her [ ] Summarize unread newsletters into [[Reading List]] ▮ § sat 03 oct · 27 words · autosaved ⌃T task ⌃O open ⌃P ⌃N day Esc done F1 keys thc 0.9.65
SAT 03 OCT 2026 · TODAY WED 30 THU 01 • FRI 02 • [SAT 03 •] SUN 04 MON 05 TUE 06 ──────────────────────────────────────────────────────────────────────── · Morning: slept well, 30 min run #health [ ] Call dentist to reschedule #health · Dentist appointment [[Health]] [ ] Pay rent · Mom's birthday, call her [ ] Summarize unread newsletters into [[Reading List]] ▮ § sat 03 oct · 27 words · autosaved ⌃T task ⌃O open ⌃P ⌃N day Esc done F1 keys thc 0.9.65
Your $EDITOR
Prefer vim, Helix or Emacs for a long piece? From a list, e opens the selected note
in $EDITOR and E the whole page. From the shell, thc edit <id>. The note ids ride
along at the end of each line, so whatever you change maps back to the right notes when you save.