What the app does with your pages, your files and your account: the screens, sync and backups, the plans, files, notifications, sharing and publishing, and assistants.
Writing
Where
What happens
@ and #
Reference a page, and tag one. [[ still makes a reference.
/
Blocks and commands: the built-in ones first, then a plugin’s, the closest rising as you type.
The popup
Matches, the matched letters in bold, and a “new page” row when no page has the name.
The popup, on a desktop
Under the block, or above it when the window runs out, with its keys in its head.
The popup, on a phone
Across the column between the block and the keys, in 44px rows.
The editing bar
Rides on a touch keyboard: outdent, indent, todo, @, # and / first.
The editing bar, scrolled
Attach a file, move up, move down, today, undo and redo. Done stays at the end.
The editing bar, with a popup open
The key that opened it is lit.
Below the last block
A hollow bud, “Click to write” or “Tap to write”, that starts a block. It steps aside while you write.
A code block
Three backticks and a language, on a line of their own, then the code, then three backticks: anywhere in a block, before or after its words. TypeScript, JavaScript, JSON, CSS, HTML and XML, shell, Python, SQL, YAML, Markdown, Rust and Go are colored, by their usual names (typescript, py, zsh, yml); any other is shown as typed. Copy, on the box, puts the code on the clipboard, and a line of it selected with the mouse copies as usual. Inside the fence Enter is a new line of code, not a new block.
Today’s card
The tasks due that day, from any page, that are still to do. One you check off stays a moment, struck through, with an Undo, and then leaves; a day with everything done says so.
Tables
A table is a block whose text is a Markdown pipe table: a row of headers, a rule of dashes under it, then a row per line. /table writes one with three columns and two rows, the first header selected to rename. The outline draws it as a table, and the block’s text stays the table, so Markdown, sync, a shared page, your site, Save as HTML and the API carry it as written.
Write
Get
| Item | Cost |, then | --- | --- | under it
A row of headers; every line under the rule with a | in it is a row
:---, :---: or ---: in the rule
That column aligned left, centered or right
\| in a cell, or a | inside inline code
A | in the cell, not a new column
A line of words alone above the table, first in the block
The table’s caption
A link, a tag, bold or code in a cell
The same as anywhere in a block
A row shorter than the headers
Empty cells to fill it; cells past the last header are not shown
Click or tap a table to edit it: the block opens as its text. While the caret is in the table a bar under it adds a row or a column, deletes the row or the column the caret is in, and steps the column through left, center, right and no alignment. Tab is still the outline’s, indenting the block; move between cells with the arrow keys.
A wide table scrolls sideways in its own box, its edges fading while there is more, and never widens the page. A long cell wraps.
On a shared page, your site, a docs layout and in Save as HTML a table is a table, named by the same first line. In a one-line row (a backlink, a task, a search hit) and to an assistant reading through the API it is its Markdown. A table inside a quote stays its Markdown on a shared page and a plain site, which show a quote as it is written.
A block from the Table plugin, {{table}} with its rows as the blocks under it, is drawn as a table too, the first row its headers, and the rows stay blocks under it. Editing it, the bar under it has Turn into a pipe table: the rows become the block’s own lines and the blocks under it go, one step for Undo. It is there when every row is one line with nothing under it, so nothing is lost.
A heading or a task above a table stays a heading or a task; only words become a caption.
Maps
/map writes {{map }} for an address or a point: {{map 1 Main St, Arlington, WA}}, {{map 47.6,-122.3}}, or {{map 47.6,-122.3,16}} to come closer. A place page shows the same map under its fields at its coordinates when it has them; with only an address, Show on map looks it up and draws it, and a place found once is drawn at once after that. A block from the Map plugin is already one of these.
Open places in, under Appearance in Settings
A place’s address and the link under a map open
OpenStreetMap, the first choice
The place on OpenStreetMap
Kagi Maps
The place in Kagi Maps
HERE WeGo
The place in HERE WeGo: a point as a point, an address as a search
Twig’s map is OpenStreetMap’s tiles, from tile.openstreetmap.org, with a dot in the accent. Drag to move it; the buttons zoom.
An address goes to Twig’s server, which asks the US Census geocoder and then nominatim.openstreetmap.org. On Cloud Sync it keeps the address and the answer for your account alone, for up to thirty days or until the block or page the map is in is deleted; otherwise it keeps nothing. Without a server your browser asks nominatim.openstreetmap.org itself. Coordinates are drawn as they are, with nothing asked.
A map is left out of a one-line row, and a shared page or your site shows none.
750 words
Three pages a day, after 750words.com: one plain surface for writing, in the rail below the places (first under More on a phone), at #/750, and on ⌘⇧7. Close, Escape or ⌘⇧7 again goes back to Today.
Where
What happens
The count
Today’s words over 750, counted as every page counts them: a key:: value line is not words. Under it, three segments of 250 fill in turn.
At 750
The segments light once, the mark comes up beside the count, and it says done for today. Back another day already there, it is simply done.
The words
On a page of their own, 750/2026-09-30: synced, searched and exported like any page, under the 750 page, which lists every day. Opening the surface and leaving without a word makes no page.
Past midnight
The words go on to the day you sat down on. Left open overnight and come back to, it is the new day.
Two devices
A day started on both before either heard of the other is one page again once they meet, every word kept, and the second start is 1 more on this page. The same words written two ways on two devices show both versions above them, to keep one or both, as in the outline.
More on the page
The count is the whole page’s. Blocks added in its outline, or kept from two versions, are a link over the words: 2 more on this page.
The foot
The month, a square a day: filled at 750, linked to the day before when it was too, half-lit with fewer words, the day on screen ringed, and today dotted under while another day is. A day with words is a link to it, and today one back to the surface; the arrow keys go along them. The arrows by the month’s name turn back through the months, as far as your first words. Under a finger each day is a square with its date in it, and the row scrolls. Under it the current run and the longest.
A past day
Its square in the foot, or ‹ beside the date for the day before with words, opens it on the same screen, at an address of its own, #/750/20260930. It opens to read: its words as you left them, its count, and After for that day. ‹ and › go to the days with words either side; Today, Escape or ⌘⇧7 go back to today’s surface. Open as a page takes it to its page in the outline, where it is edited like any page.
The runs
Counted from the pages, not kept anywhere: the current one reaches today, or yesterday until today is done; a missed day ends it.
On a phone
The keyboard up, the count stays at the top and the foot steps aside.
After you write
Once the day has words, the foot has After: the day read back, on a page over the words, until Words or Escape turns back to them. On a day with nothing yet it is Yesterday’s, when yesterday has words. It opens only when pressed, and on a phone the foot steps aside while the keyboard is up, so it is never there while you type.
Where
What it shows
The day in a sentence
The feelings and the subjects the words lean to, and how far: Mostly calm, some tiredness. About work and home. Under it, once the day has 50 words in English, brighter, level or darker than your usual: your own other days among the last 30, once 5 of them have 50 words or more.
Feelings and About
The largest three of eight feelings (joy, calm, affection, sadness, anger, fear, anxiety, tiredness) and of fourteen subjects (work, money, family, friends, health, body, food, home, travel, learning, making, nature, faith, time), each named once it is used twice and drawn as a bar with its share. Not happy is not joy; very happy counts half again; kind of tired is a hedge, and the kind of tired is neither a hedge nor kindness.
Mindset
Four pairs, each a line with the day as a dot and the middle half of your last 30 days as a band behind it: introvert or extrovert (I against we, you and they), negative or positive, uncertain or certain (maybe against sure), feeling or thinking.
Most used
The twelve words used most, twice or more, the commonest English words left out; the more used, the larger.
You wrote about
The pages and tags the day links to, each a way to its page.
The numbers
Words, sentences and reading time as every page counts them; paragraphs as you made them, a blank line between. Minutes writing come from the sittings this device saw: each edit to the day’s page goes on with the sitting before it, and a gap of over 5 minutes counted as away starts the next. Words a minute come from those minutes. A day this device did not see written counts from the page’s first edit to its last, and is labelled first word to last.
The last 30 days
Words a day as bars, the 750 line dotted and the day ringed; the mood a day as a line, brighter above. A day with words opens it, read back on the same screen.
The runs
The current run and the longest, the days with words and the words in the day’s month, and the average entry.
In another language
The word lists are English. When fewer than 2 in 5 of a day’s words are ones the lists know, it says Mood reads English for now and shows the numbers, the days and the pages it links to.
On this device
Counted on the device from word lists that come with the app: nothing is sent. The list for brighter and darker is adapted from AFINN-111, by Finn Årup Nielsen, under the Open Database License; the others were written for Twig.
Keyboard
Keys
Where
What they do
⌘K, Ctrl+K, /
Anywhere; / outside a field
Open the palette, one field for pages, blocks, tasks and files. It is also at the foot of the rail, and at the foot of a phone’s More. In a block, / is the command menu instead.
?
Anywhere outside a field
A sheet of the keys that matter on the screen you are on, then the ones that work everywhere; ? again or Esc closes it. It is also under More, as Keyboard shortcuts, wherever there is a mouse.
⌘S, Ctrl+S
Anywhere
Nothing to save: every change is written as you type. It says where your writing is — on this device, on its way to the server, or synced.
⌘Z⌘⇧Z⌘Y
Anywhere
Undo, and redo either way.
⌘⇧L
Anywhere
Switch between the dark and light schemes.
⌘⇧7
Anywhere
750 words, and back to Today from it; Esc leaves it too. On a past day, either goes back to today’s words.
⌘⇧E
A page, a day or a zoomed block
Open or close the page’s sidebar, Backlinks and Export, unless a menu, a dialog or the palette is open. Opened by the key it takes the keyboard, unless a panel lies over it; closed with Esc, or with the key while the keyboard is in it, it gives the keyboard back to the sidebar’s button, and a block you are writing in keeps it.
⌘1⌘2⌘3⌘4⌘5
The installed app
Today, Pages, Tasks, Calendar and Graph, the rail from the top. A browser tab keeps them for its own tabs, so the rail and the keys sheet name them only in the installed app.
Esc
Anywhere
Close the topmost thing — a popup, a menu, the palette, the More sheet, a confirmation, the keys, 750 words — and give focus back to what opened it.
↑↓HomeEnd
A menu, the More sheet
A menu opens with the keyboard on the row already chosen, or on the first; the arrows move and Enter picks. On a desktop Tab closes a menu and moves on from its button; the More sheet, and a menu that comes up as a sheet on a phone, keep Tab inside until they close.
Tab
The top of the app
Skip to content: it shows while the keyboard is on it, and Enter goes past the rail to the screen. On a phone the tab bar comes after the screen.
Tab
The rail, on a desktop
An icon the keyboard lands on says its name beside it, and its key where it has one: Search’s and 750 words’ always, the places’ in the installed app. Only the keyboard shows it; a hover does not.
←→HomeEnd
Pages and Tasks, on a tab
Move between the tabs, or to the first and the last.
↑↓Enter
All, Files, Nothing links here
Move down the list, and open a row.
S⌘ABackspaceOT
Pages
S starts and ends selecting; selecting, ⌘A takes every page and Backspace asks to delete them. O shows the sort, and in All T the tags; Esc ends selecting.
Space
Tasks
Check off the task in focus.
Space+-⌘EnterEsc
Focus
Start or pause the timer, five minutes more or less, Done, and leave the screen. With the keyboard on a button, Space presses that button.
←→↑↓HomeEndPageUpPageDownEnterSpace
Calendar
The month is one stop for Tab: the arrows move a day or a week, Home and End to the week’s first and last day, PageUp and PageDown a month before or after, and Enter or Space lists the day.
Tab↑↓←→EnterEsc
The Graph’s Map
Enter on Map opens it and Esc closes it from anywhere inside. The pages in the picture are one stop for Tab; the arrows, Home and End move between them, showing each one’s numbers, and Enter opens it. With a finger, a tap shows a page’s numbers and a second tap opens it.
Enter⇧EnterTab⇧Tab⌥↑⌥↓
Writing in a block
A new block, a new line in the same block, indent, outdent, and move the block itself (⌘⇧↑⌘⇧↓ too); the arrows go to the block above or below from the first or last line, and Esc leaves with focus on the block.
⌘Enter⌘↑⌘↓
Writing in a block
Todo, doing, done and plain again; fold and unfold what is under the block.
/@#
Writing in a block
Commands, a link and a tag, each in a popup with its keys in its head. It opens under the block, or above it when it would not fit under it and there is more room above, and it never reaches under the keyboard.
EnterEsc
A page’s title
Rename the page and go on to its first block, or put the name back as it was. A name another page has stays in the field, with what to do about it under it. A long name wraps over as many lines as it needs.
↑↓→←Enter
The outline, outside the editor
It is a tree: the arrows move, → opens a folded block and ← folds an open one, Enter starts writing. Tab reaches the first block, of a page or of a block zoomed into, and indents only in the editor.
VNROAPGBackspace
A whiteboard
Select, note, box, circle, arrow, pen and page card; Backspace or Delete removes the selected shape, and Esc deselects and goes back to Select.
A link, a search hit or a list row that opens another screen leaves the keyboard at the top of the new one, so the next Tab starts from its head.
Keycaps are set in the mono, and name the modifier the way the keyboard does: ⌘ on a Mac and Ctrl elsewhere, ⇧ for Shift, ⌥ for Alt.
Pages
Tab
What it holds
All
Every page and every image written into one, numbered, with its size (blocks for a page, megabytes for a PDF), to search, sort, select and delete. Its Show menu also has the days and the starred pages.
Loose ends
Nothing links here: the empty pages no link names, to select and delete. To write: the pages a link names that nobody has written, the most linked first, each with its count: how many pages and days link it, each once.
People
Email, phone and birthday; a click on the first two copies it. By name, or by whose birthday comes next. A person’s page also says where they work, where they live and whom they know, as pages. Once anyone has a role in film and TV, a filter by role: Actors, Directors, Producers, Writers, each with its count; a person in two roles is under both.
Places
The address, with a link that opens it on OpenStreetMap, or in Kagi Maps or HERE WeGo when Open places in, in Settings, says so. Once a place has a kind, a Kind column (the second line on a phone) and a filter by the kinds your places carry.
Books
Author, status and rating, filtered by status.
Websites
By the host their url opens, in a new tab.
Organizations
Site and address.
Events
Date, where and with whom, newest first.
Artists
What each is, where they are from and the years they played. Once one is a band, a filter: Bands, and People (the artists who are one person).
Albums
The artist, when it came out and the label.
Tracks
The artist, the album and the length.
Movies
The year, the director, the runtime and the genres.
TV shows
The years, who made it, the seasons and the network.
Tags
How many blocks and pages carry each.
Files
Every attached file, whatever its kind, with its type and size; a PDF opened once is listed as its page.
A tab shows only while it holds something, with its count in the mono. All counts pages, the same number as beside the title and in the sidebar; an image it lists is counted under Files.
The tabs take one row that never scrolls sideways: as many as fit, in order, the chosen one always among them, and More for the rest, with their counts. All and Loose ends stay in the row at any width, so on the narrowest phone, or at 200%, the row wraps rather than put them under More. The arrow keys move along the row; Tab reaches More.
The address keeps the tab, #/pages/books, so a link opens it whether it sits in the row or under More. A bare #/pages, or one naming a tab that holds nothing, opens on the tab last chosen on this device while that still holds something; otherwise on the first of People, Places, Books and Websites that does, and on All only when none does.
+ New makes the tab’s kind in one press: a person on People, a page on All. ▾ beside it offers every kind: a page, a whiteboard, then each type. What it makes is always a new page, never an Untitled one reopened, and it opens.
Removing a page’s last link deletes it by itself when it is empty, so Nothing links here holds pages from New, an import or another device. A search that leaves both Loose ends lists empty says so once.
Renaming a page is its title: type the new name and press Enter or leave the field, and every [[link]], #tag, @mention and tags:: line that named it is rewritten. A change of case alone is a rename like any other. A name another page already has, or answers to as an alias, stays in the field, and a note under it says which page holds it, what it is and how often it is mentioned, with Merge into it, Keep editing and Cancel (Esc), which puts the old name back.
Merge into it keeps the other page, its id with it, so its mentions keep finding it. This page’s blocks go to its end, or open it when it has nothing written; it takes this page’s type when this page has one and it is a tag or has none, and when both have a type, a plain Page included, the note asks which to keep; its empty fields fill from this page’s, the picture included; lists join (tags, aliases, a field that names pages); a field both pages hold, set differently, keeps the other page’s value, and this page’s is kept in one block at its end, Merged from “…”; links to this page’s name are rewritten to the other’s. Then this page is deleted and the other opens. This page’s name stays on the other as an alias, so a link written elsewhere before the merge, a bookmark or Back still opens it; not a name the app gives itself (Untitled, New artist, a day’s 750 words page, Recovered blocks) or one another page already answers to. One undo puts both back. A day, a board or a PDF is never merged.
On a phone + New floats above the tab bar with its ▾ beside it, More and the ▾ come up as sheets, and a row of a collection is two lines: the name, then what it holds.
Once a page has something written on it, the line under its title adds its words and minutes to read, and On this page, beside the page or the day, counts its sentences, paragraphs and characters too. A page or a day with nothing written shows no counts at all.
The counts leave out property lines, SCHEDULED and DEADLINE lines below a block’s first line, and empty blocks. A paragraph is a block with writing in it. A sentence ends at . ! ? or … before a space or the end of a line, and a line with no stop is one sentence, so a list of fragments counts one each; an abbreviation such as e.g. counts as an end too. Characters count spaces, as a word processor’s “characters with spaces” does; most emoji count once, and one built of several, such as a flag, counts as its parts. A code block counts as words and characters, but not as sentences or a paragraph, so a page of code shows no sentences rather than none of them.
The Graph
List
What it holds
New this week
The pages the last 7 days link, a journal’s or a day of 750 words, that no day in the 4 weeks before them did, by how many of the 7 days do; a journal and a 750 day on one date are one day. A page linked week in, week out is Most linked’s.
Most linked
Written pages, by how many pages and days link them, each counted once however often it names the page.
To write
The pages Pages › Loose ends lists under To write, with the same counts. Choosing one opens it on a blank first line to write on; past five, All in Pages opens Loose ends with To write first.
Groups
Pages linked mostly among themselves, three or more, the biggest first, each named for the page with most links inside it, in or out, and three of the others as links. A link joins two pages when one of them links nothing else, or when a third page links with both: a lone link between two pages with ties of their own joins nothing. A day never joins pages, and a tag or a page more than 20 pages link takes in only the pages that link nothing else.
Each list shows only when it has something in it, and its five first. A day is never in a list, and a whiteboard is in neither the lists nor the Map, though its notes count as links.
The Map draws up to 120 pages, the most linked first, once it is opened, and the same pages and links in the same places each time. The busiest pages are named, and the one chosen and its neighbours. The map as a list, under it, says the same in words: each page and what it links with, pages first and the days as a count.
The lists and the Map are worked out again half a second after the last change, and at midnight, so writing in the side pane with the Graph open never waits on them.
Types and properties
What
Where it lives
In a Markdown file
A page’s type: person, location, book, website, organization, event, artist, album, track, movie or TV show
On the page, set from its menu, so nothing typed into the page changes it
type:: person, type:: tv-show
A type’s fields
In the head, ranked by what the page is for (below), each edited where it stands
birthday:: 1990-04-02, and a location’s kind:: Business
Aliases, other names links find a page by
Under the title; one that is already another page’s name is marked taken
alias:: Ana
Tags
Under the title
tags:: people
A block’s property
In the block, never on the page, the first block included; so is one a template writes
mood:: calm, in a day’s block
A website’s kept copy
Under its fields: the picture, the day it was kept, Read and Take a new copy
snapshot:: and snapshot-image:: (file ids), snapshot-at:: 2026-09-29, snapshot-url::
A location’s kind is one of Business, Government, Non-profit, Residence, School, Medical, Park, City (a city, a town or a village) or Other.
Actor, Director, Producer and Writer are a person’s roles, not types of their own: one person who acts and directs is one page, a Person whose Roles say both (roles:: Actor, Director). The page’s menu, under Type…, has each after Person, on or off; picking one on another kind of page makes it a person first. The line under the title says the roles in place of Person, and People filters by them.
Band is an artist that is a band: an Artist’s Person or band says which (form:: Band), on its head as two buttons and in Type… as Band after Artist. An artist page that never said is a band when what it is names a group (“English rock band”, “Duo”) or it lists members, as it always was; nothing about it is rewritten. A band’s picture is a tile, a person’s a circle, and the line under the title says Band.
On Cloud Sync a website keeps a copy of what its url shows: the first device to open the page asks, and Twig’s server fetches it once, so the site sees the server and not you. Its words (as Markdown) and its picture are kept as your files and counted in your room; its description fills About while About is empty. Take a new copy keeps another, and the old one’s files go thirty days after nothing names them. The card over a link to a website shows the kept picture and, on Cloud Sync, what the site says about itself now: its title and description, asked by Twig’s server once a day at most.
Add an alias and Add tags, in the page’s menu, start the first of each. Commas part aliases; a name with a comma of its own goes in double quotes, alias:: "Washington, D.C.", DC.
In a file a page’s properties are the lines before the first bullet; a page with none whose first block opens with a property gets title:: with its own name.
A code block in a file stays one block with its indentation, and a line in it that reads like a bullet or a property (- item, key:: value) stays code.
Pages from before 0.43 moved theirs onto the page once: at launch on a device not signed in, after the next sync on one that is.
A typed page’s head
The head of a typed page says first what the page is for. Under the title, set biggest, is the one fact that says it; then two that matter next; then its About as a paragraph; then the line that counts the page; then the rest of its facts, each a quiet label beside its value (in two columns, read down each, once a desktop has six or more). The picture stands on the right (a face in a circle, a cover, a site’s icon or a logo on a white tile, a place’s photo, an event’s or a film’s picture shown whole, an album’s sleeve as a square), and a page without one has its type’s tile there instead: a person’s or an organization’s initials, a book’s title on its cover, a website’s first letter, an event’s day on a calendar leaf, a place’s ⌖, an artist’s initials, an album’s title on a square, a film’s or a show’s title on a card, a track’s ♪. A track with no picture of its own shows its album’s.
Type
Under the title
Then
The facts
Person
Occupation, read with a capital when typed all in lower case
Email and phone
Roles, born, died, works at, lives in, knows, website, country
Book
by the author
To read · Reading · Read, and the stars
First published, publisher, pages, subjects, the ISBNs
Website
Its address, as it reads (hetzner.com/cloud), and Open
Its About
Site name, language
Location
The address, which opens on OpenStreetMap
Its kind and country
Coordinates, population
Organization
Its site
Based in, and when it was founded; then its people
Address, founded by
Event
The date
at the place, with the people
Ends, URL
Artist
What they are (“English rock band”), read with a capital when typed all in lower case
From where they started, Active the years they played; then their albums
Person or band, members, genres, website
Album
by the artist
Released, and the label; then its tracks
Genres, tracks, length, catalogue number
Track
by the artist
on the album, and its length
Track number, released, ISRC
Movie
The year · the director
Runtime and genres
Cast, writer, producer, country, language, your stars, where to watch
TV show
The years · who made it
Seasons and episodes, and on the network
Cast, seasons by year, genres, country, language, your stars, where to watch
An email, a phone, an address or a date with its own word (“Born Oct 21, 1929”, “by”, “at”) shows no label; a screen reader still hears it. On a phone the two after the title are rows of their own, with no labels either, and so are a film’s year and its director (a show’s years and its maker), which a desktop sets on one line with a dot between.
An organization’s people are the people whose Works at names it, by its name or an alias: three by name, and how many more, which opens the page sidebar on its Backlinks, where each is listed. They are read off their pages, so they are changed there; the card over a link to it says how many. An artist’s albums (the albums whose Artist names it, oldest first) and an album’s tracks (the tracks whose Album names it, in their numbers’ order) are read the same way; an album’s card says its own Tracks when that is a number (12 tracks), and the track pages only when it is not.
A field with nothing in it is not a row but an invitation at the head’s foot: “+ Email” opens the email where it belongs, for typing, the fact under the title and the two after it first. Enrich leads them, and Add a field… (also in the page’s menu) has the rest of the fields Enrich brings. A book’s status and rating, a place’s kind and a film’s or a show’s stars are always there: unset, they are their own invitation.
With a mouse, ✎ shows when its row is pointed at or reached with Tab; under a finger it is always at the row’s end. A press on any value that is not a link edits it in place, and Return or Esc gives the keyboard back to it.
The page’s ••• sits at the end of the trail back, the page sidebar’s toggle after it, at every width, and they come after the trail with Tab.
Enrich
On Cloud Sync a typed page has Enrich at the foot of its head, and nothing is fetched until you press it. It looks up the page’s name (a website’s url; an album’s or a track’s with its artist, when the page names one, as a song’s title alone is a hundred songs) and lists what that could be, each with a line and, where the source has one, a small picture (a website’s one row has none). Use fills the fields the page has empty, or every one with Replace what’s filled ticked, all in one step: the notice’s Undo takes it all back, and closing the picker before an answer comes drops it. Twig’s server does the asking, so the source sees the server and not you, and it keeps the picture (a cover, a photo, a logo, a site’s icon) as one of your files, counted in your room and shown beside the title and on the card over a link to the page. What a source says is kept on the server for your account alone, for thirty days or until the page is deleted, so the same thing asked again is read from there; a read missing a part (the article’s opening, the geocoder’s answer) is kept an hour, and a website’s head a day, as its card’s is.
Type
What Enrich fills
From
Book
Author, first published, publisher, pages, ISBN and ISBN-10, subjects, About, and the cover
Open Library: its search, the work and its editions (the ISBN, publisher and pages are one edition’s; first published is the work’s)
Person
Birthday, occupation, About, website, country, date of death, their roles in film and TV, and a photo
Wikidata (the roles from every occupation it lists: an actor of any kind, a film or TV director, a screenwriter, a producer), and the opening of the Wikipedia article it links to
Organization
Founded, headquarters, site, About, who founded it, and the logo
Wikidata and Wikipedia
Event
Date, where, URL, About, when it ends, and a picture
Wikidata and Wikipedia
Location
Coordinates, country, population, About, a picture, and the Kind City for a city, a town or a village while the Kind is empty
Wikidata and Wikipedia; the coordinates from the map’s geocoder when Wikidata has none
Website
Site name (from the site’s own name for itself), language, About, and the site’s icon
The site itself, read as the card over a link to it reads it. The icon is the largest the site offers: the ones its page names (never an SVG), its web app manifest’s when those are small, then /apple-touch-icon.png and /favicon.ico, the files sites keep by custom; an .ico is kept as the largest picture in it
Artist
What they are, Person or band (while it says neither), where from, the years they played (a band’s from MusicBrainz, a musician’s from Wikidata), genres, members, website, About, and a photo
MusicBrainz, and the Wikidata item it links (what they are, the photo, the Wikipedia opening)
Album
Artist, released, label, catalogue number, tracks, length, genres, About, and the cover
MusicBrainz (the label, number, tracks and length are one release’s: the first official one in Europe, the UK or the US), the Cover Art Archive, and the Wikidata item it links
Track
Artist, album, length, track number, released, ISRC, and the album’s cover
MusicBrainz and the Cover Art Archive
Movie
Year, director, runtime, genres, cast, writer, producers, country, language, About, and a poster
Wikidata and Wikipedia; the poster is a free one on Commons when there is one, else the picture the film’s Wikipedia article leads with (its theatrical poster), else the title’s logo, and a photo last. A poster Wikipedia keeps for itself is not free: it shows on your own pages, and a shared or published page, and the card it sends along, leave it out
TV show
Years, who made it, seasons and episodes, each season and the years it aired, network, cast, genres, country, language, About, and a picture
Wikidata and Wikipedia; the picture as a film’s (a show’s article most often leads with its title card); the seasons from the season items Wikidata lists, written only when every one says when it aired
A field that names pages, an event’s At, an organization’s Founded by, a band’s members, an album’s artist or a film’s cast, links them as typing the names would, and makes any that do not exist yet; a cast or a band names six at most.
A page Enrich makes is the kind its field names: a film’s or a show’s cast are people with the Actor role, its director a Director, its writers and a show’s makers Writers, its producers Producers (one person in two of those is one page with both); a band’s members are artists who are people; an album’s artist is an artist, a place an event is at a location. A page you already have on this device, found by its name in any case or by an alias, is never retyped or changed. One of yours still coming over from another device folds into the page Enrich made when it arrives: yours is the page kept, and keeps its type and fields when it has a type, or takes the type and role Enrich gave when it has none. It is all one step: Undo takes back the fields and the pages made with them, and never a page of yours.
Status and rating (a film’s and a show’s stars included: a source’s score is never written), a place’s Kind once it has one, the page’s type, its aliases and its tags stay as you set them, Replace or not.
A field Enrich added shows on the head once it holds something; while empty, it is in Add a field…, at the head’s foot and in the page’s menu, on any plan, unless it is the fact under the title or one of the two after it (a person’s occupation, an organization’s base and founding, a place’s country), which are a “+” of their own. A type’s own fields (a person’s email, phone, birthday, work, home and people; a location’s address; a book’s author; a website’s URL and About; an organization’s site and address; an event’s date, place, people and URL) are each a “+” invitation there too. The card over a link shows the head in miniature: the picture, the fact under the title and the two after it, nothing from the facts.
A date shows with its year, on the head and on the card. A date field takes a whole day: a birthday or an event’s date the source knows only to the year or the month is left empty (and an event’s end with it), while a date of death, a founding or an end is written as far as it is known (1976, 1976-04).
MusicBrainz is asked once a second for everyone, as it asks; a search it cannot answer in time is asked of Wikidata instead, by the title alone, and what is picked from there is read from Wikidata. A track found by its title alone lists the song before its covers: of the ones that match as well, the one most releases carry.
A track’s or an album’s length reads m:ss, or h:mm:ss from an hour (6:24, 1:12:05); a film’s runtime is said in words, 2 h 27 min or 48 min (its shortest cut). A year a film came out is its first, wherever that was.
What a search lists comes in the source’s order, but for one named exactly what was asked, which comes first: in any case, with its punctuation (B.o.B is not Bob); an album’s or a track’s by its title, not the artist after the dash.
The picture is image:: with its file id, as a website’s copy is; a page that has one, or an image:: of its own, keeps it unless Replace what’s filled is ticked. When the picture does not come, the fields are filled all the same and a notice of its own says so, with Try again. The page keeps where it would come from, picture-missed:: (the id Use read), and its stand-in on the head is a button until it comes, Add the picture: it asks for the picture alone, and never writes over one set since. Changing the page’s type ends the wait; an id the source will never take (one written by hand, say) ends it too, and Enrich opens to pick again.
Typed links
[[type:: Name, key:: value, +action]] in a block makes the page it names a typed one. It is read when the block is left (a blur, Enter, going elsewhere), never while you type, and all it does is one undo step, which its notice offers back.
The first word
A type’s key or another word for it, in any case: movie, tvshow (tv-show, tv), album, track, artist, band (an artist that is a band), person, actor, director, producer and writer (a person in that role), book, website, organization (org), event, location (place). Any other word, and a tag, leave the link a plain one.
A page that is there
Found as a link finds it, by its name or an alias, in any case. A page with a type keeps it; one without takes the link’s, and keeps what is written on it. A day, a board or a PDF takes no type. A link whose whole inside is a page’s name already is a link to that page.
Fields
Each key is a field of the type by its key or label (rating, Works at), in any case; an event’s At is also location, place or venue, its With participants or people. A field takes the value only where the page has none: a value it has stays, and the notice says what was not written. A role adds to a person’s roles, and band sets Person or band only while the artist says neither. A key that is no field is kept as a property of the page; type, image, pdf and the like are Twig’s own, and left out.
Values
As typing them into the field would keep them. A field that names pages links each name, and a page it makes is the kind its field says (an album’s artist an artist, an event’s place a location, a film’s director a director), marked as Enrich marks the pages it makes; a page you have is never changed. A rating is 1 to 5 (4, 4 of 5), a date a day written 2026-09-30; one that is not is left out, with a note. A choice takes its option’s spelling.
Commas
Commas part the pieces, and a piece that is not key:: value or +action belongs to the value before it, so address:: 1 Main St, Springfield is one address and participants:: Hayley Williams, Paramore two people. A name with a comma, where a field names pages, goes in double quotes or a link, location:: "Portland, OR" or location:: [[Portland, OR]], as an alias does; a quote inside the quotes is doubled. The curly quotes a phone types, “…” and ‘…’, count as quotes, and a long dash a phone makes of a hyphen is a hyphen in a key, a type’s word or a date.
The rewrite
Each link applied reads [[Name]], the name as you typed it, so it reads and finds the page as any link does; a # or @ before it stays. A link that could not be applied yet (its page still coming over from an older version) keeps its words, and is applied when the block is left again. One taken back with Undo keeps its words too, and on this device stays as typed, +enrich and all, in any block, until something inside it is changed (for 90 days); another device applies it when its block is left there. To keep a link as plain text everywhere, take out its ::.
+enrich
Runs Enrich on the page once the link is applied, on Cloud Sync. It looks the page up as Enrich does; when the first answer has the page’s name (a website’s, the site its url names), it is used as Use uses it, filling only what is empty, in a step of its own that its notice’s Undo takes back; the link’s own notice’s Undo takes back both. Any other answer is yours to pick: the notice’s Open Enrich opens the page’s picker. Any other +word is left out, with a note.
Typing one
After [[, a type’s word, :: and a name, the list under the block offers the type’s fields not given yet (an event’s At as location), each with what it takes, then +enrich; after a comma it narrows to what you type. ↑↓ choose, Enter or Tab puts the key in, Esc closes it. A [[, @ or # typed in a value opens its own list.
Where it works
Any block and the 750 words, typed or pasted. An imported file keeps its words as they are, and makes no page of such a link’s inside; editing the block applies it. An assistant’s or a script’s write that holds one is refused, with the way to make that page (create_page), so every change it makes is one Settings lists and can put back.
Tasks
Tab
Holds
Overdue
Open tasks whose day has passed.
Today
Open tasks for today: the same ones Today’s card and the app icon’s badge count.
Later
Open tasks with a day still to come.
No date
Open tasks with no day at all, grouped by page.
A task’s day is its DEADLINE:, else its SCHEDULED:, else the first day it links to, and the row says which: due, starts or linked.
A row names the page it is written on under its words, and a journal day short, in the page line (@Sep 23) and in the words alike, with the year only when it is another. On a phone the words take the row’s width, and the page and the day share the line under them.
A tab shows only while it holds a task, with its open count. Tasks opens on the tab last chosen, or on the most urgent there is. The tabs are Pages’ row: whatever does not fit is under More, and the arrow keys move along the row.
Checked off there, a task stays a moment, about two seconds, struck through, with an Undo that gives back the marker it had; with the keyboard on the row it stays until the keyboard moves on. Then it leaves, and its tab with it if it was the last. A finished task is not listed with the tasks to do on Tasks, Today, the Calendar, a page’s Backlinks or a tag’s Mentions: it stays, struck through, on the page it was written on, and on Done for the week it was finished in.
Done, the last tab, shows while a task was finished this week, the week starting as Settings › Appearance › Week starts on says. For today and for the week it says how many tasks are done, what their estimate:: planned and what their spent:: says was spent, in whole minutes, and the three that ran furthest over their plan, from a minute over, each a link to its task. The week’s finished tasks follow, the one finished last first. A done task counts on the day it was last changed, in Settings’ time zone: renaming a page it links to changes it, and so do moving and indenting it; restoring a backup or importing files changes every task they bring in. Only its spent:: counts. The Calendar’s day list ends with the same line for the tasks finished that day.
Views
View
What it lays out
Where
Board
A page’s tasks as Open, Doing and Done; Doing wears the accent.
Beside Outline, under the page’s title
Kanban
A tag family, #status/open, #status/doing: a column for each value. On a page, its own tasks, nested ones too, by the family most of them carry, with the page’s other families beside it to switch to.
Under More, and beside Outline under the page’s title
Calendar
A page’s dated blocks on a month; see Calendar, below.
Beside Outline, under the title of a page with something dated
A column is its name and a count over a hairline; an empty one is a dashed box that says what to do. A card sits on the panel: the words, then the date, the page it lives on and a Move menu. The date reads today, tomorrow, 3d over in amber, or Sep 24; a done card is struck through.
On a phone a board’s columns are 280px and snap one at a time. Dragging works with a mouse; the Move menu works everywhere.
Calendar
Every dated block on a month: a SCHEDULED: or DEADLINE: date, or, for a task with neither, the first day it links to, as on Tasks. It is at #/calendar (#/calendar/202610 for another month), and /calendar in a block opens it. A page with something dated has its own beside Outline, with only that page’s blocks, nested ones too, and month arrows that stay on the page. An address of the old Calendar view plugin opens the same month here.
Color
When
Besides the color
Green, --ok
A task to do, or a note, dated after tomorrow.
Its place on the month; read out as upcoming
Amber, --warn
Yesterday, today or tomorrow.
Today is ringed; read out as due soon on a deadline, soon on a start or a note, or as overdue for a task from yesterday. In Clear, ! and bold words
Red, --late
A task two days late or more.
over on the line and overdue in the list, both in red; a dash for a dot on a phone; read out as overdue. In Clear, !! and bold words
The three colors are each theme’s own, and --ok and --late are the Calendar’s alone. The color is on the dot before a line’s words (over in its place when late), a phone’s dot, and the list’s due or starts, which reads overdue when late.
Only a task still to do is ever late. The whole calendar holds no done or canceled task; a page’s own calendar keeps that page’s, in the plain color and struck through, and a canceled one has no checkbox. A note is never late: green ahead, amber about now, plain once it is past. A day a task only links to stays plain, as on Tasks, and a task scheduled and due takes its due day’s color on both its lines.
Each line is the block’s own words as the outline shows them, less a link to the day it sits on and the tags in front of the words or after them (a tag inside the sentence stays, and a link to the day in front is passed over with them); its priority is a small box before them, A filled in amber. The words wrap to as many lines as the cell has for them, two at least, and are never cut short for a screen reader. What is still to do comes first, and on a page’s own calendar what is finished comes last, quieter and struck through; a day with two or more than its cell holds ends with +N more, which opens the day’s list. A day with something on it is a tile, today is ringed, and a day whose journal has something written in it has a small hollow ring under its number. A day’s name, read out, says what the colors and the ring say: how many are dated, overdue, soon and upcoming, and the entry; a screen reader names today on its own. A line is read with its color first (overdue, due soon, soon, upcoming), or done or canceled.
Choosing a day lists it beside the month where the calendar is wide enough to keep its days about 140px across (a desktop window of 1440 or so), and under it elsewhere; where that list is out of sight, choosing a day (a tap, Enter or Today) brings it into view with the keyboard on the day’s name. It is like a list on Tasks, by the same rules as the lines: a checkbox, the words, due, starts or linked, the page as @Sep 29, and Move… to give it another date. A task checked off there stays a moment, struck through, with an Undo in the place of its due or starts, and then leaves. The day’s name over the list opens that day.
Drag a line or a row onto a day to move it. A task dated only by a link gets a SCHEDULED: line. A move you can see says nothing; one that takes a block off the month on screen says where it went.
The month is one stop for Tab: the arrows move a day or a week, Home and End go to the week’s first and last day, PageUp and PageDown a month, and Enter or Space lists the day.
Where the calendar is under 840px wide (a phone, or an iPad held upright) the month is a grid of numbers with up to three dots a day, the late ones first, its list underneath.
Sketch
/sketch in a block makes a drawing. With Cloud Sync it opens Excalidraw over the page: a card on a desktop, the whole screen on a phone. Draw, then Save. Cancel, or Escape, leaves the block as it was, and asks first when something is unsaved; a tap outside the editor does nothing.
A drawing is kept as a picture in its block, with the drawing itself inside the picture: {{sketch}}, the picture on the line after it, and sketch-scene:: naming it. The outline, a shared page, your site, Export and print all show the picture without loading the editor; in the dark theme the outline darkens it, as Excalidraw does.
Edit drawing, above the picture, opens it again. Each save is a new picture, at most 2048 pixels on its longest side and 20 MB, the cap on any image; the one it replaces is let go as a removed attachment is. A save waits 15 seconds for the server; past that, or offline, the picture is kept on this device and goes up with the next sync. Cancel while it saves stops the save and leaves the drawing open.
A drawing whose picture never reached the server (the device that drew it has not synced it) says so when you open it, with Start over: the editor opens empty on that block, the drawing you save takes the old picture’s place, and Cancel leaves the block as it was.
The editor is fetched the first time a sketch is opened, never with the app, and kept for offline from then until the next update. Its faces come from Twig’s own address; Chinese and Japanese text in a drawing is set in the system’s face.
Signed out or on Free, a sketch is freehand: a surface in the block for a finger, a pen or a mouse, its strokes kept in the block as sketch:: path data. Undo, Clear and a field that takes a stroke as a path (M10 10 L50 50) work from the keyboard.
Sketch with Excalidraw, under Appearance in Settings, is on by default; off, new sketches on this device are freehand. Open in Excalidraw on a freehand sketch turns its strokes into a drawing when you save it, and never on its own.
When the editor cannot be had: after an update, a tab left open offers Restart, once (if it still cannot open after that, it says so and the sketch stays as it was); offline before it was ever fetched, a new sketch is freehand and a drawing opens once you are back online. If the editor stops while you draw, the sketch stays as it was. Escape or Cancel closes any of these.
The Sketch block plugin is part of Twig now: what it drew keeps its strokes and stays editable, and it is no longer on the Plugins screen.
Sidebar
Every page, a day’s included, has a sidebar with two tabs, Backlinks and Export. It opens from the button at the end of the row with the page’s title (on a day, after its arrows; on a zoomed block, at the end of its trail; on a phone, beside the page’s actions at the top), with ⌘⇧E (Ctrl+Shift+E) anywhere on a page, or with /sidebar in a block, which on a desktop or an iPad leaves you writing (on a phone the sheet takes the keyboard, as it always does). Beside the page it stays open or closed as you left it on this device, from page to page and after a restart; a phone always starts with it closed.
Tab
What it holds
Backlinks
The pages that link here, a group each: days first, newest first, then pages by name, each block one line in the words the outline shows. The number on the tab counts those blocks and the pages whose properties name this one. A row opens its block, and a group’s name its page. Under them, Unlinked mentions: Show lists the blocks elsewhere that name the page without linking it, each with a Link that makes the name a link, and a way into the block. A name inside a longer word, in a web or email address, in a link, or in code is not a mention, in any alphabet; a block that links the page under one of its aliases is a backlink.
Export
The page as Markdown, as Settings › Data writes it under a front matter of its id, title, tags and dates, its first lines shown: Copy, or Save as a file. Save as HTML: the page as a document of its own, in the words the outline shows, its pictures and files inside it, so it opens anywhere with them. When it points at files, Save with its files, with what they weigh: a zip of the Markdown, the page’s records and its files, which Import restores as it restores a backup, a file this device no longer keeps fetched from the server. A zip holds up to 200 MB of files. Print or save as PDF. And, when it has them, its shared link and its address on your site, to copy.
From 1100px wide it is a column of its own, 320 to 360px, in the place of On this page, Sync and Storage, and the page keeps its width; narrower, it lies over the page’s right side, and a tap anywhere outside it puts it away. A panel opened from a link lies over it until that is closed.
On a phone it is a sheet from the right edge over the dimmed page, with rows a finger can hit and a close at the top; the page behind is out of reach and Tab stays inside until it closes. Going anywhere closes it: a link or a row in it, or Back.
It is a landmark named Page sidebar, its tabs a tab list that the arrows move along. Opened by its key, or as a phone’s sheet, it takes the keyboard; Esc or its close gives it back to the button.
It took the place of the Backlinks widget and Export page plugins, and of Linked from under the page. Their old addresses, #/x/backlinks/<page> and #/x/export-page/<page>, open the page with the sidebar on the tab that does what the plugin did.
Sync
Local onlyBacked up 2 minutes agoBacking up · 3Offline · 12 pendingBackup failed · retryNot on the listLocal only · Cloud Sync needed
The word, as the side panel shows it: the same at the foot of the More sheet and on Cloud backup. Settings says the word alone, and its Last pull says when.
Local only: not signed in. Everything works, and nothing leaves the device.
Backed up 2 minutes ago: how long since this device last caught up, kept current by the minute. A hover, a tap or a screen reader gives the exact time.
Backing up · 3 · last 2 minutes ago: what was written here is going up, with how much is still waiting and when the last backup was. A count, never a progress bar. The minute’s check for news, with nothing waiting here, is not a backup: the word stays Backed up.
Offline · 12 pending: the changes wait here and go up when the network does.
Backup failed · retry, in amber: the word is the retry. The app also tries after 5, 10, 20 and 40 seconds, then with the minute’s check. The first failure in a session, while syncing and online, gets one notice.
Not on the list: signed in, but this server does not take this account. Writing still works.
Local only · Cloud Sync needed: signed in on Free, or after Cloud Sync ended. A state, not a failure: nothing to retry, and the word opens the plans.
Otherwise the word opens Cloud backup. An edit made while a push is under way waits in the change log for the next one.
Sync installed plugins is a switch under Sync in Settings, off until you turn it on on that device, and it needs Cloud Sync: the list lives on the server. Signed out, the row says it needs sign-in; on Free, that it needs Cloud Sync; not yet connected, that it is waiting for the connection.
The device syncs its list when you change a plugin, at launch, when the switch goes on and when the connection comes back: it reads the server’s copy, merges, installs what it lacks, removes what went elsewhere, matches on and off, and writes the result back, merging again if another device wrote in between.
It merges plugin by plugin: each install, removal and switch carries when it happened, and the later wins. A plugin installed before the switch existed carries no time, so any recorded change wins over it.
A removal is remembered for 30 days, the newest 50 of them; a device offline for longer can bring a removed plugin back. The server keeps up to 100 plugins, and past that a device says so and stops writing.
Another account signing in on the device turns the switch off and starts its list over, and so does Delete local data, so its plugins being off does not reach the others.
Written on two devices
A block’s words changed on two devices before either heard of the other: neither overwrites the other.
The block keeps this device’s words and shows the other’s beneath them, in a dashed amber box, with when each was written.
Keep this, Keep the other, or Keep both, which makes the other version the next block. Each keeps the block where it is on this device: Keep the other only swaps the words. Nothing goes up, and nothing of the other version comes down, until one is picked; the one kept is written fresh, so it wins everywhere.
The sidebar counts these blocks and Cloud backup lists them. A block not in conflict takes the newer write whole, order and indentation included; only words are ever kept apart.
Plans
Free
Cloud Sync
Price
Nothing
$19 a year, or $79 once for life, paid through Stripe from Cloud backup
Your graph
On this device, whole: every page, board, query and plugin, and a copy you can export
The same on every device, synced as you write
On the server
Nothing
10 GB for the graph, files and snapshots together
Snapshots
None
One a day, kept 7 days, 4 weeks, 12 months and 2 years
Files
Kept on this device
Uploaded, and opened on any device
Shared links and a site
One already up can be taken down
Share read-only links, and publish a site
The daily digest
No
Yes
You
Cloud backup says
Paid, and the server has not heard yet
“Payment is processing. Cloud Sync turns on as soon as it clears.” A bank debit can take a few days.
Paid, and it cleared
A notice, “Cloud Sync is on”, and the screen shows the plan.
Pay by the year
“Renews Oct 3, 2027”. Manage or cancel opens Stripe’s page for the card and the invoices.
Cancelled the year in Stripe’s page
“Ends Oct 3, 2027”. Resume it there, from Manage or cancel.
No yearly plan open, and time left
Keep it going buys a new year and adds what is left of the old: “Renews … · paid through …”.
Bought lifetime
“Lifetime”. Bought over a yearly plan, it stops the yearly one.
Everything written while Free waits on the device in the change log, and goes up the day Cloud Sync is on.
An account on the server’s own list is Cloud Sync for life, unless the office has set its plan by hand.
When Cloud Sync ends the account is Free, with 30 days of grace: the server keeps the graph read-only. A device can still bring it down, each snapshot up to 16 MB unpacked can be downloaded from Cloud backup as a copy Restore from a copy reads back, nothing new goes up, and shared links and a published site stay up.
Renew within the 30 days and everything carries on.
After them the server no longer syncs or serves the graph, and shared links and the site go down. On Cloud Sync again they stay paused until you put them back up, from the page’s menu or from Your site in Settings; words written since go up with them.
A lifetime refunded in full, or disputed, ends the same way; a partial refund leaves it. A link or a site can be taken down at any time, on any plan.
Cloud backup
A snapshot is the whole graph as it stood. With Cloud Sync the server takes one a day on its own, and one whenever you choose Back up now.
The daily ones are kept grandfather-father-son: the newest of each of the last 7 days, 4 weeks, 12 months and 2 years that have one. A day with none takes no place, and one snapshot can stand for its day, its week, its month and its year. Back up now, and the snapshot kept before a restore, stay 30 days.
The screen shows the plan, with its renewal date or Lifetime, and how much of the 10 GB is used by the graph, the files and the snapshots together. Past 10 GB a new snapshot or file is refused and “Backups paused: storage full” says so; syncing never is.
A graph over 16 MB unpacked is too large for a snapshot: none is taken, and “Backups paused: too large for a snapshot” says so. Syncing and Export a copy carry on.
Choosing a snapshot asks in place. Restore puts the graph back as it was and deletes anything newer, first keeping what is there as a snapshot of its own, so a restore can be undone the same way. It needs the server, and refuses while this device has changes the server has not taken or a block written on two devices waits for a choice.
The copy you keep yourself is Export a copy and Restore from a copy, on the same screen, and Import a zip or a folder, under Data in Settings.
Files
Drop or paste a file onto a block, type /Upload (or /Image for the photo library), or press Attach a file on the phone’s editing bar. A file dropped on the outline lands on the block under it; below the blocks, on the last one when it is empty, or else a new one.
The block keeps plain Markdown,  for a picture and [name](/api/files/<id>) for anything else, and draws each for what it is.
While a block is written, each file on a line of its own is one piece between its words, with Rename and Remove, so its link stays whole. Backspace beside it picks it, and a second removes it whole as an undo step of its own; Rename changes the name the block shows, as a step of its own, keeping the extension and never the address. A link typed in the middle of words stays words, and a file’s link the editing damaged is written whole again as the block is left.
With Cloud Sync the file goes to the server and counts toward the 10 GB. Signed out, on Free (the notice says uploading needs Cloud Sync), or while the server cannot take it, it is kept on this device and shows the same.
Kind
Types
Shows as
Up to
Picture
PNG, JPEG, GIF, WebP, AVIF
The picture, in the block
20 MB
Video
MP4, WebM, MOV, Ogg, M4V
The browser’s player, which can skip ahead before it has all arrived
95 MB
Sound
MP3, M4A, AAC, WAV, Ogg, Opus, FLAC, WebM
The browser’s player
95 MB
PDF
PDF
A card; opening it opens its own page with the PDF beside it, where each highlight is a block
50 MB
Anything else
Markdown, text, a zip, …
A row with its name and size that downloads it
50 MB
Refused
Web pages, SVG, scripts, XML
Nothing: opened from Twig’s address they could run as Twig
—
A file that did not go up is tried again after 1, 5 and 15 minutes, then every hour; a reload starts again at a minute. One that arrives when the storage is full is kept here too, and the notice says so.
Files reach other devices only through Cloud Sync. Until the device it was attached on uploads it, another shows its name and “On another device: waiting for it to sync”, and Delete local data loses any that have not gone up.
Offline, a file opens from this device when it is kept here: every file this device uploaded, and every one it opened whole. Up to 500 MB is kept, the oldest going first. A video or a sound only played here is not kept, nor a file seen on someone’s shared page; without the network such a file shows its name and “Not on this device: opens when you’re online”. Signing out, or Delete local data, clears them.
Notifications
The daily digest
What
How many tasks are overdue or due today (the ones on Tasks’ Overdue and Today tabs), and the first three in plain words, overdue first, with “and 2 more” for the rest. Opening it opens Tasks. Nothing due, nothing sent.
When
Once a day at the digest time, 08:00 unless you pick another, in the time zone of the device that last changed the settings: the one Settings › Appearance › Time zone picks, else the device’s own. A zone picked while signed in goes up at once, and again with each sync until the server has it; one picked while signed out stays on that device. The server looks every minute and sends each day’s once.
Push
To every device where Push to this device is on. The browser asks first; on iPhone and iPad only once Twig is on the Home Screen and opened from there. Each message is encrypted for its device, so the push service sees only its size and when it went.
ntfy
To a topic on ntfy.unfuck.cloud, ntfy.sh, or a server the operator adds with TWIG_NTFY_HOSTS; any other is refused. The topic starts as a random name; the ntfy server gets the words as they are, so keep it private or give it an access token.
It is the one thing Twig sends: no reminders, mentions or sync alerts. It needs Cloud Sync, because the server sends it from the graph it holds.
Send a test sends one now to every place turned on, and says where it went.
A change made after the digest time counts today as done. At 10:00, moving a noon digest to 09:00 skips today: the first comes tomorrow at 09:00.
Flying west to where it is still the day before, after the day’s digest went out, the next morning there brings one as usual.
To stop, turn off Push to this device on each device, and Send to ntfy. Signing out turns push off on that device; ntfy goes on until it is turned off.
Updates
A new version downloaded brings up the update bar: a card on the raised surface, above the tab bar on a phone and at the bottom right on a desktop, and a polite live region that announces its first line.
It lists what changed, newest first: “What’s new in 0.39.0”, or, when several versions have come out, “Twig 0.39.0 is ready · what’s new since 0.37.0”, with each version under its number. About five lines show, fewer on a short screen, and the rest scroll.
Restart now loads the new version, and Later hides the bar until Twig next opens. Offline, or for a version without notes, it says only “Twig 0.39.0 is ready”, and the button is Restart. The version stamp at the foot of Settings opens the notes for the one running.
A tab left open across an update keeps its screen. When a part it had not opened yet (After, the drawing editor, a PDF, a map) can no longer be fetched, that part offers Restart in its place, and the update bar comes up, after a Later too: “Twig was updated” until it knows the new version’s number. Twig never restarts on its own.
Every Restart, and Try again on a screen that broke, saves what you typed first, saying Saving… meanwhile; words typed while it saves are saved too. If they cannot be saved, nothing reloads: the bar says your changes are not being saved, and the screen stays as it is.
Print and export
A printed page is in the light scheme whatever the screen shows, in the writing face at 11pt on a 46rem measure, without the rail, the sidebar, the toolbars or the grain. A block is kept whole across a page break; an empty row does not print, and one holding only properties or a date is not empty. The page sidebar, its backlinks with it, does not print; a tag page’s mentions do.
Printed from the app, the title runs along the top of every sheet, and the address, the date and the sheet number (3 / 5) along the foot, in the mono at 8pt, in Chrome and Edge; a browser without page margin boxes prints its own. Each block’s number stands in the margin, counted in reading order, so a printout can be talked about by number. Print or save as PDF, in the sidebar’s Export tab, is this same print.
The sidebar’s Export tab writes a page’s Markdown as the backup does (its properties as key:: value lines at the top, then a - bullet per block with its children tabbed in), under YAML front matter: id, title, tags (the page’s own and every one on its blocks), created and edited, written so a colon or a quote cannot break them. Import passes front matter over, so a page saved this way and picked on its own comes back as that page, named by its file. Save as HTML is one file with its own plain styles: the title, a typed page’s head as the app shows it (every field it holds, a person’s email, phone, birthday and home and a place’s address included, which a shared page keeps back; and its picture, a track’s album’s sleeve too), the page’s other properties but a file’s id, and the outline as nested lists in the words the app shows, code in its own box, and a link that goes to the web kept as a link. Its files are inside it as data URLs, up to 25 MB of them in the order the page names them: a picture shown, a recording with its player, any other file a link that saves it. A file past that, or one neither this device nor the server could give, is named and marked as not in the file, and the Export tab says how many. Save with its files, on a page that points at files, is a zip in the backup’s layout holding that one page, pages/<name>.md (journals/ for a day) beside twig/ with the page’s records and its files, so Import restores it as it restores a backup. In a zip, here or from Settings › Data, the Markdown links each file the zip holds at its copy in twig/assets/, so the Markdown opens in another editor with its pictures; Import restores from twig/ and never reads those links.
The backup zip keeps a folder of pages/ and journals/ Markdown files, bullets and a page’s key:: value lines as its properties, so a copy restores into Twig and any editor opens it as it is.
Sharing a page
Share a read-only link, in a page’s menu (with Cloud Sync), sends what is on this device first, then copies an address under /p/ that anyone with it can open, without an account.
The page shows as the server has it when the link is opened. It is listed nowhere, asks search engines neither to list it nor to follow its links, and is never cached.
Posted in a chat, the link shows a card this device drew when the address was copied: the title, up to three of its tags, how many blocks, the first three, and the address, dark whatever the scheme. Copy the shared link draws it again when what it shows has changed. A typed page with nothing in its outline shows its picture instead; with no picture, its card says its type, its lead and its About.
Stop sharing takes the link down at once; deleting the page does once the deletion has synced. The address then says the page is not shared, and its files and its card are yours alone again. A whiteboard has no link.
Shown
Never shown
The title and the outline: formatting, tasks, highlights, web links, and code blocks colored as in the app
Property lines in blocks, a page’s properties other than its type’s fields, and the dates under a block’s first line
A typed page’s head, under its title: its type, the fields that hold something in the order the app shows them (a rating as stars), and its picture in its shape. A field that names a page is its name, as plain words
A person’s email, phone, birthday and Lives in; a place’s address and coordinates when its Kind is Residence, Other, empty or typed by hand, and a City’s address (a City shows its coordinates, never its address); its empty fields, its aliases and tags, any property its type does not have, and where a missed picture would come from
The files its owner attached to it: pictures in place, video and sound in the player, anything else as a download
A file the page does not name, or another account’s
References and tags, as plain words
Embeds, macros, queries and block references
Publish
Publish to your site, in a page’s menu (with Cloud Sync), sends what is on this device first, puts the page on your site at /p/@name/ on the sync server, and copies its address. It refuses while a block on the page, written on two devices, waits for a choice.
The first time, it sets the site up: a name of 3 to 32 lowercase letters, digits and hyphens that no one else has, a title of up to 100 characters at the top of every page, and a home page, one page or the list of published pages.
Readers get the home page, each published page with Linked from under it (the published pages that link there, each with the block that does), the list of pages, by name and then the journals newest first, and a search box.
Public
Never public
The title and outline of each published page, as a shared page shows them, and the files its owner attached to it. A typed page’s fields and picture are published with it, as its head, all but what a shared page keeps back: a person’s email, phone, birthday and Lives in, a place’s address and coordinates when its Kind is Residence, Other, empty or typed by hand, and a City’s address (a City publishes its coordinates, never its address)
A page you have not published: its name appears only as the plain words of a published block, or a field, that mentions it; a track shows its album’s sleeve only when the album is published too
A reference, a tag or an @mention to another published page, as a link, and a field that names one
One to a page not published, which is plain words
Search over the titles and the outlines a reader can see (a typed page’s fields are not searched)
Property lines, dates, embeds, macros, queries, block references, and any file the page does not name
Rule
What it means
Search
A block matches when it holds every word typed, as a reader sees it; a page matches too when its title does. Up to 50 blocks show. The query is cut at 300 characters, and results are never indexed.
Slow down
Each reader’s address may search 30 times a minute, and open 240 pages a minute across every site, searches included; past that it is told to slow down.
Fresh
The site is drawn from the synced graph each time it is opened and never cached, so an edit shows once it has synced and an unpublished page is gone on the next open.
Search engines
The site is public and search engines can list it: each page gives its title, its first words and its one address, and /p/@name/sitemap.xml lists every published page with the day it last changed. A page whose language:: is a language code, like fr or pt-BR, says it is written in that language; any other page says English, a Website’s too, since Enrich writes its language as a name. Ask search engines not to index this site, in Settings, asks them to leave it out and takes the sitemap down; it hides it from no one with the address.
Link previews
A link to a page, posted in a chat, shows its title and the site’s, its first words and Twig’s own card. A typed page with a picture shows the picture in place of the card, and one with nothing in its outline says its lead and its About for its first words.
Your site, in Settings
The name (changing it moves the site, and the old address stops working), the title, the home page (typed to find it among the published pages, the one it is now listed first), the layout (Pages or Docs, below), the switch for search engines, the published pages (newest first or A to Z, a search over their names and addresses, 25 at a time, “with” and a page’s name under one that came up with another, Unpublish on each and Undo after it, which puts the page back at its address), and View site.
Publish with linked pages
In a page’s menu once the site is set up. It lists the pages this one links to, in its properties and its outline, each with its type and how many files it shows, a page already on the site saying published. And the pages they link to adds the pages those link to, read only through a page that is going up, and goes no deeper. Every box starts ticked but those of journal days, 750 words pages, tags and pages tagged #private, and of a page this device had as published that was taken down on another device since, which goes back up only if you tick it again. Under the list, in view beside the button, it names every page and file the press makes public. The server checks the list against the page’s links as it has them: a link taken out on another device since the list was drawn stops the press, nothing goes up, and the list is drawn again. Otherwise the press puts them all up, or none if one cannot go, at most 200 pages, this one included.
Unpublish with…
On a page published that way, Unpublish with the pages published with it first lists what it takes down: the page and the pages its press put up, each with any page that stays up and links to it. A page that was already up stays, and so does a page you published yourself after it came up with the set, the site’s home page and a page that has put up linked pages of its own. A page another set also links to comes down with the set that put it up, and the list says so. A page unpublished by itself leaves its set; unpublishing or deleting the page a set came from leaves its pages up as pages of their own.
Taking it down
Unpublish takes one page off at once: from the page’s menu on any plan, and from Settings while on Cloud Sync. A deleted page comes off once the deletion has synced, and a journal written again later does not come back. Delete the site, in Settings on any plan, asks in place, then takes every page off and frees the name; your pages stay in your graph.
The plan
Publishing and changing the site need Cloud Sync. In grace the site stays up until 30 days after the plan ended; on Free it is down. On Cloud Sync again it stays paused, its address saying there is nothing there, until Put the site back up.
Page addresses
A page
Its address
Ärger
/ärger: lowercase, in the title’s own script
日本
/日本
🎉
/page: a title with no letters or digits
Search
/search-2: /search is the site’s own search
A second Garden
/garden-2
The journal for Sep 23, 2026
/2026-09-23
A page with slug:: api among its properties
/api, by the same rule as a title, whatever the page is called
An address is at most 80 characters, and renaming the page keeps it. Not in this version: custom domains, password protection and analytics.
Docs layout
Layout, under Your site in Settings, is Pages or Docs. Docs reads the same published pages as documentation: the pages in a tree beside each one, its sections under On this page (to its right on a wide screen, folded under its title on a narrow one), and the pages before and after it at the bottom. On a phone the tree folds into Pages at the top. The rest of the site is as it was: the search box, the escaping, and no script. Each page reads by these rules.
You write
Docs shows
A page named Guide/Getting started
Getting started under Guide in the tree, with Guide above its title. Guide is a link when it is published too, and a label when it is not, or when it is left out of the tree (below). A namespace every published page is under is the site itself, so the tree starts inside it.
order:: 2 among a page’s properties
Its place among the pages beside it, lowest first; pages without one follow, by name. A label sits where its first page does. Previous and next follow that order, pages left out of the tree (below) among them.
A page that came up with Publish with linked pages
Left out of the tree and the Pages menu, and still on the site: at its own address, from the page that links it, between its neighbours in Previous and next, and in search. The page you published the set from is listed, and so is a page you publish yourself, one that came up with a set included.
A top-level block
A paragraph; a blank line inside the block starts another.
Blocks under a block
A bulleted list under it, and numbered when they are (Numbered list, under /). A heading’s blocks are a list too.
A block that starts with one to six # and a space
A heading. The biggest on the page is a section and the next size a subsection, both under On this page; smaller ones are headings in the text alone.
A block that starts with >
A callout. [!WARNING] or [!CAUTION] alone on its first line makes it a warning, in amber; [!NOTE], [!TIP] or [!IMPORTANT] names it.
Rows of | a | b | with | --- | --- | under the first
A table. A | inside a cell is written \|.
A code block, a Divider
The code colored as in the app; a rule.
On this site, /docs can be one published site in the docs layout, whatever its own layout says: the app’s server names it with TWIG_DOCS_SITE, and until it does, /docs is these pages. They are also a Markdown folder Settings → Import takes, one Twig page each under Twig docs: pnpm docs:twig writes it to docs/twig-docs.zip.
Assistants
Twig is an MCP server: an assistant such as Claude Code, Claude Desktop or any other MCP client can read your graph, the pages, days, tasks and typed pages with their fields, as Cloud Sync keeps it on the server. It connects with a token made in Settings. A token made to read has the five tools that read; one made to read and write has six more, which add and change but never delete, move or rename, and every change they make is listed in Settings to revert. A script takes the same token to Twig’s API, which reads the same things as JSON and, with a token made to read and write, makes the same six writes: one write path on the server, one list of changes, one pair of limits. Its page is the last in these docs.
Tool
What it answers
search
Blocks whose words match, up to 50 at a time: each with its page, its id, its plain text, and the day when the page is a journal day.
list_pages
Pages, of one type or all (person, location, book, website, organization, event, artist, album, track, movie, TV show, a journal day, a tag), up to 500 at a time: each with its type, when it was last edited, its type’s key field, such as a person’s email or a website’s url, and its aliases and tags.
read_page
One page, by its name or an alias, or a day as YYYY-MM-DD, as Markdown: the title, the type, the days it was made and last edited, how much is written (words, sentences, paragraphs and characters, once there is any), its fields (a relation as [[Name]]), the aliases that find it and its tags, the outline with its tasks, their SCHEDULED and DEADLINE dates and each block’s id, then up to 20 places that link to it: pages whose fields name it, then blocks. A page too long for one answer comes in parts, each ending with the offset that reads on.
read_day
A day’s journal page, the same way: a date, today or yesterday. Today is in the time zone of the device that made the token, else the one the digest settings keep, else UTC, and the answer says which.
list_tasks
Tasks with their marker, priority, text, page, dates and block id, up to 200 at a time: the open ones (TODO, DOING, NOW, LATER, WAITING) unless done or all are asked for, and only those due by a day when one is given.
A list that stops short says which ones it showed and the offset that asks for the next, so search, list_pages and list_tasks reach every one, a stretch at a time; read_page and read_day read a long page the same way, whole blocks at a time.
Tool (read and write)
What it does
add_block
Adds a block to a page, to a day (today, yesterday or tomorrow in the token’s time zone, or a date; a day nobody has written on is started), or under a block by its id, on the page named when there is one, last or first; always as a new block. The text is written as you would type it: [[Name]] links a page and makes it if there is none, TODO starts a task, SCHEDULED: 2026-10-01 dates it.
create_page
Makes a page with a name, a type if asked, up to 30 properties, and up to 100 blocks. A field is named by its key or its label, its value as the page shows it: a name or [[Name]] for a relation, a rating from 1 to 5, a birthday or an event’s date as YYYY-MM-DD, a date of death, a founding or an end as far as it is known. A name that is already a page’s, or an alias, makes nothing, and the answer gives that page and its id.
set_task
Sets a block’s task state to any the app has, todo, doing, done, later, now, waiting or canceled, as the app’s own marker change does.
update_block
Replaces a block’s words; it keeps its id, its place and the blocks under it, and whatever its old text carried that the new does not say: its task marker, priority, quote, heading, SCHEDULED and DEADLINE lines, and each key:: value property. New text that is only properties and dates changes those and keeps the words. It changes a marker, a priority, a date or a property, and never removes one. A block holding a file or a picture keeps its words.
set_property
Sets one property of a page, or clears it with null; type sets what the page is. A field takes its key or label and a value as create_page does; a type the page already has changes nothing. A picture Twig keeps in image:: is left as it is.
set_properties
Sets several of a page’s properties at once, each as set_property does, or clears any with null: one change in Settings, put back with one Revert. type among them goes first, so an untyped page can become a person and get its email in the same call. A key that is no field of the type is kept as a property of its own, as the app keeps one. Every key is checked first: a value a field cannot take, a key given twice, a type that is not one, or a picture Twig keeps among them, writes none.
In Settings, under Assistants (with Cloud Sync), choose what a new token can do, Read or Read and write, name it for where it goes, 1 to 60 characters, and choose Make. A token keeps what it was made with: for the other, make another. It also keeps the time zone this device tells time in (Settings › Appearance › Time zone, else the device’s own), so an assistant’s today is yours.
The token is shown once, with Copy, the command for Claude Code, and the JSON for a client that reads a config file. The server keeps only its SHA-256, so it cannot be shown again: a lost token is revoked and made again.
For Claude Code, run the command in a terminal, or put the JSON in a project’s .mcp.json, Claude Code’s project file: it reads the token from an environment variable, TWIG_TOKEN, so the file can be committed without it. Another client takes the same address and header, in its own config’s form.
POST /api/mcp on the sync server, over MCP’s Streamable HTTP, with the token in the Authorization header as Bearer twig_….
How many
Up to 10 tokens to an account. Past that, Make asks you to revoke one first.
The list
Each token’s name, its last four characters (…abcd) to tell it apart, whether it reads or reads and writes, the day it was made, and when it was last used, which is noted at most once a minute.
Never
Nothing here deletes, moves or renames anything, and nothing writes a file’s address or a file’s id: no pdf::, file::, snapshot:: or sketch-scene:: line, and no image:: holding a file’s id (an image:: link of your own is words), and nothing changes or clears a picture Twig keeps. A write is the same edit the app makes, sent up as a device sends one, so every device pulls it.
One way in
MCP’s writes and the API’s are the same six, through one write path on the server: the same rules, the same limits, the same list of changes.
Recent changes
Settings lists what assistants and scripts changed in the last 30 days, newest first: what, where, by which token, over MCP or over the API, and when. Revert puts one back on every device: an added block or page goes as the app deletes one, changed words or a property get what they were. Something you have changed since is left as it is, and says so. The list keeps up to 500 changes: a change already put back, or one that only added, makes room first; while 500 changes can still be reverted, an assistant’s next write is refused, so none of them is pushed out, and Settings says the list is full.
Writes
Up to 30 a minute from one token, apart from reads, and 45 from one address over all its tokens, MCP’s and the API’s counted together; every write over MCP is also one of the 60 MCP requests a minute an address may make, and one over the API one of its 120. Up to 20,000 characters a block, with no control characters but line breaks and tabs; never a file’s address or a file’s id, which only the app writes.
Revoke
Asks in place, on the token’s row. Once it is revoked, an assistant using it is turned away from its next request. A token can be seen and revoked on any plan; making one needs Cloud Sync.
Anywhere else
A token opens /api/mcp and Twig’s API under /api/v1, and nothing more: the rest of the sync server turns it away, and never passes it on to the sign-in service.
What an assistant sees
What it never sees
Every page, day, task and typed page the server holds for your account, as of the last sync
What a device has not synced yet
Your words as Markdown, a file or a picture by its name
A file’s contents or its address, another account’s graph, your plan, your settings, your other tokens