Skip to content
Twig docs Open Twig MenuClose

How Twig behaves

as of 0.152.0

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

WhereWhat 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 popupMatches, the matched letters in bold, and a “new page” row when no page has the name.
The popup, on a desktopUnder the block, or above it when the window runs out, with its keys in its head.
The popup, on a phoneAcross the column between the block and the keys, in 44px rows.
The editing barRides on a touch keyboard: outdent, indent, todo, @, # and / first.
The editing bar, scrolledAttach a file, move up, move down, today, undo and redo. Done stays at the end.
The editing bar, with a popup openThe key that opened it is lit.
Below the last blockA hollow bud, “Click to write” or “Tap to write”, that starts a block. It steps aside while you write.
A code blockThree 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 cardThe 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.

WriteGet
| Item | Cost |, then | --- | --- | under itA row of headers; every line under the rule with a | in it is a row
:---, :---: or ---: in the ruleThat column aligned left, centered or right
\| in a cell, or a | inside inline codeA | in the cell, not a new column
A line of words alone above the table, first in the blockThe table’s caption
A link, a tag, bold or code in a cellThe same as anywhere in a block
A row shorter than the headersEmpty cells to fill it; cells past the last header are not shown

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 SettingsA place’s address and the link under a map open
OpenStreetMap, the first choiceThe place on OpenStreetMap
Kagi MapsThe place in Kagi Maps
HERE WeGoThe place in HERE WeGo: a point as a point, an address as a search

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.

WhereWhat happens
The countToday’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 750The 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 wordsOn 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 midnightThe words go on to the day you sat down on. Left open overnight and come back to, it is the new day.
Two devicesA 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 pageThe 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 footThe 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 dayIts 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 runsCounted from the pages, not kept anywhere: the current one reaches today, or yesterday until today is done; a missed day ends it.
On a phoneThe 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.

WhereWhat it shows
The day in a sentenceThe 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 AboutThe 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.
MindsetFour 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 usedThe twelve words used most, twice or more, the commonest English words left out; the more used, the larger.
You wrote aboutThe pages and tags the day links to, each a way to its page.
The numbersWords, 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 daysWords 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 runsThe current run and the longest, the days with words and the words in the day’s month, and the average entry.
In another languageThe 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 deviceCounted 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

KeysWhereWhat they do
⌘K, Ctrl+K, /Anywhere; / outside a fieldOpen 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 fieldA 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+SAnywhereNothing 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 ⌘YAnywhereUndo, and redo either way.
⌘⇧LAnywhereSwitch between the dark and light schemes.
⌘⇧7Anywhere750 words, and back to Today from it; Esc leaves it too. On a past day, either goes back to today’s words.
⌘⇧EA page, a day or a zoomed blockOpen 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 ⌘5The installed appToday, 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.
EscAnywhereClose 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.
↑ ↓ Home EndA menu, the More sheetA 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.
TabThe top of the appSkip 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.
TabThe rail, on a desktopAn 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.
← → Home EndPages and Tasks, on a tabMove between the tabs, or to the first and the last.
↑ ↓ EnterAll, Files, Nothing links hereMove down the list, and open a row.
S ⌘A Backspace O TPagesS 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.
SpaceTasksCheck off the task in focus.
Space + - ⌘Enter EscFocusStart or pause the timer, five minutes more or less, Done, and leave the screen. With the keyboard on a button, Space presses that button.
← → ↑ ↓ Home End PageUp PageDown Enter SpaceCalendarThe 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 ↑ ↓ ← → Enter EscThe Graph’s MapEnter 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 ⇧Enter Tab ⇧Tab ⌥↑ ⌥↓Writing in a blockA 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 blockTodo, doing, done and plain again; fold and unfold what is under the block.
/ @ #Writing in a blockCommands, 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.
Enter EscA page’s titleRename 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.
↑ ↓ → ← EnterThe outline, outside the editorIt 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.
V N R O A P G BackspaceA whiteboardSelect, 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

TabWhat it holds
AllEvery 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 endsNothing 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.
PeopleEmail, 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.
PlacesThe 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.
BooksAuthor, status and rating, filtered by status.
WebsitesBy the host their url opens, in a new tab.
OrganizationsSite and address.
EventsDate, where and with whom, newest first.
ArtistsWhat 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).
AlbumsThe artist, when it came out and the label.
TracksThe artist, the album and the length.
MoviesThe year, the director, the runtime and the genres.
TV showsThe years, who made it, the seasons and the network.
TagsHow many blocks and pages carry each.
FilesEvery attached file, whatever its kind, with its type and size; a PDF opened once is listed as its page.

The Graph

ListWhat it holds
New this weekThe 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 linkedWritten pages, by how many pages and days link them, each counted once however often it names the page.
To writeThe 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.
GroupsPages 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.

Types and properties

WhatWhere it livesIn a Markdown file
A page’s type: person, location, book, website, organization, event, artist, album, track, movie or TV showOn the page, set from its menu, so nothing typed into the page changes ittype:: person, type:: tv-show
A type’s fieldsIn the head, ranked by what the page is for (below), each edited where it standsbirthday:: 1990-04-02, and a location’s kind:: Business
Aliases, other names links find a page byUnder the title; one that is already another page’s name is marked takenalias:: Ana
TagsUnder the titletags:: people
A block’s propertyIn the block, never on the page, the first block included; so is one a template writesmood:: calm, in a day’s block
A website’s kept copyUnder its fields: the picture, the day it was kept, Read and Take a new copysnapshot:: and snapshot-image:: (file ids), snapshot-at:: 2026-09-29, snapshot-url::

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.

TypeUnder the titleThenThe facts
PersonOccupation, read with a capital when typed all in lower caseEmail and phoneRoles, born, died, works at, lives in, knows, website, country
Bookby the authorTo read · Reading · Read, and the starsFirst published, publisher, pages, subjects, the ISBNs
WebsiteIts address, as it reads (hetzner.com/cloud), and OpenIts AboutSite name, language
LocationThe address, which opens on OpenStreetMapIts kind and countryCoordinates, population
OrganizationIts siteBased in, and when it was founded; then its peopleAddress, founded by
EventThe dateat the place, with the peopleEnds, URL
ArtistWhat they are (“English rock band”), read with a capital when typed all in lower caseFrom where they started, Active the years they played; then their albumsPerson or band, members, genres, website
Albumby the artistReleased, and the label; then its tracksGenres, tracks, length, catalogue number
Trackby the artiston the album, and its lengthTrack number, released, ISRC
MovieThe year · the directorRuntime and genresCast, writer, producer, country, language, your stars, where to watch
TV showThe years · who made itSeasons and episodes, and on the networkCast, seasons by year, genres, country, language, your stars, where to watch

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.

TypeWhat Enrich fillsFrom
BookAuthor, first published, publisher, pages, ISBN and ISBN-10, subjects, About, and the coverOpen Library: its search, the work and its editions (the ISBN, publisher and pages are one edition’s; first published is the work’s)
PersonBirthday, occupation, About, website, country, date of death, their roles in film and TV, and a photoWikidata (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
OrganizationFounded, headquarters, site, About, who founded it, and the logoWikidata and Wikipedia
EventDate, where, URL, About, when it ends, and a pictureWikidata and Wikipedia
LocationCoordinates, country, population, About, a picture, and the Kind City for a city, a town or a village while the Kind is emptyWikidata and Wikipedia; the coordinates from the map’s geocoder when Wikidata has none
WebsiteSite name (from the site’s own name for itself), language, About, and the site’s iconThe 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
ArtistWhat 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 photoMusicBrainz, and the Wikidata item it links (what they are, the photo, the Wikipedia opening)
AlbumArtist, released, label, catalogue number, tracks, length, genres, About, and the coverMusicBrainz (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
TrackArtist, album, length, track number, released, ISRC, and the album’s coverMusicBrainz and the Cover Art Archive
MovieYear, director, runtime, genres, cast, writer, producers, country, language, About, and a posterWikidata 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 showYears, who made it, seasons and episodes, each season and the years it aired, network, cast, genres, country, language, About, and a pictureWikidata 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

[[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

TabHolds
OverdueOpen tasks whose day has passed.
TodayOpen tasks for today: the same ones Today’s card and the app icon’s badge count.
LaterOpen tasks with a day still to come.
No dateOpen tasks with no day at all, grouped by page.

Views

ViewWhat it lays outWhere
BoardA page’s tasks as Open, Doing and Done; Doing wears the accent.Beside Outline, under the page’s title
KanbanA 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
CalendarA page’s dated blocks on a month; see Calendar, below.Beside Outline, under the title of a page with something dated

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.

ColorWhenBesides the color
Green, --okA task to do, or a note, dated after tomorrow.Its place on the month; read out as upcoming
Amber, --warnYesterday, 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, --lateA 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

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.

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.

TabWhat it holds
BacklinksThe 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.
ExportThe 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.

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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

  1. A block’s words changed on two devices before either heard of the other: neither overwrites the other.
  2. The block keeps this device’s words and shows the other’s beneath them, in a dashed amber box, with when each was written.
  3. 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.
  4. 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

FreeCloud Sync
PriceNothing$19 a year, or $79 once for life, paid through Stripe from Cloud backup
Your graphOn this device, whole: every page, board, query and plugin, and a copy you can exportThe same on every device, synced as you write
On the serverNothing10 GB for the graph, files and snapshots together
SnapshotsNoneOne a day, kept 7 days, 4 weeks, 12 months and 2 years
FilesKept on this deviceUploaded, and opened on any device
Shared links and a siteOne already up can be taken downShare read-only links, and publish a site
The daily digestNoYes
YouCloud 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 clearedA 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 leftKeep 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.
  1. 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.
  2. Renew within the 30 days and everything carries on.
  3. 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.
  4. 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

Files

  1. 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.
  2. The block keeps plain Markdown, ![name](/api/files/<id>) for a picture and [name](/api/files/<id>) for anything else, and draws each for what it is.
  3. 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.
  4. 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.
KindTypesShows asUp to
PicturePNG, JPEG, GIF, WebP, AVIFThe picture, in the block20 MB
VideoMP4, WebM, MOV, Ogg, M4VThe browser’s player, which can skip ahead before it has all arrived95 MB
SoundMP3, M4A, AAC, WAV, Ogg, Opus, FLAC, WebMThe browser’s player95 MB
PDFPDFA card; opening it opens its own page with the PDF beside it, where each highlight is a block50 MB
Anything elseMarkdown, text, a zip, …A row with its name and size that downloads it50 MB
RefusedWeb pages, SVG, scripts, XMLNothing: opened from Twig’s address they could run as Twig—

Notifications

The daily digest
WhatHow 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.
WhenOnce 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.
PushTo 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.
ntfyTo 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.

Updates

Sharing a page

  1. 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.
  2. 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.
  3. 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.
  4. 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.
ShownNever shown
The title and the outline: formatting, tasks, highlights, web links, and code blocks colored as in the appProperty 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 wordsA 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 downloadA file the page does not name, or another account’s
References and tags, as plain wordsEmbeds, macros, queries and block references

Publish

  1. 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.
  2. 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.
  3. 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.
PublicNever 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 oneOne 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
RuleWhat it means
SearchA 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 downEach 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.
FreshThe 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 enginesThe 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 previewsA 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 SettingsThe 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 pagesIn 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 downUnpublish 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 planPublishing 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 pageIts 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 writeDocs shows
A page named Guide/Getting startedGetting 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 propertiesIts 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 pagesLeft 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 blockA paragraph; a blank line inside the block starts another.
Blocks under a blockA 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 spaceA 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 firstA table. A | inside a cell is written \|.
A code block, a DividerThe 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.

ToolWhat it answers
searchBlocks 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_pagesPages, 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_pageOne 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_dayA 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_tasksTasks 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_blockAdds 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_pageMakes 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_taskSets 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_blockReplaces 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_propertySets 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_propertiesSets 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.
  1. 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.
  2. 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.
  3. 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.
Claude Code
claude mcp add --transport http twig \
  https://usetwig.app/api/mcp \
  --header "Authorization: Bearer twig_…"
.mcp.json
{
  "mcpServers": {
    "twig": {
      "type": "http",
      "url": "https://usetwig.app/api/mcp",
      "headers": { "Authorization": "Bearer ${TWIG_TOKEN}" }
    }
  }
}
RuleWhat it means
The addressPOST /api/mcp on the sync server, over MCP’s Streamable HTTP, with the token in the Authorization header as Bearer twig_….
How manyUp to 10 tokens to an account. Past that, Make asks you to revoke one first.
The listEach 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.
NeverNothing 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 inMCP’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 changesSettings 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.
WritesUp 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.
RevokeAsks 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 elseA 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 seesWhat it never sees
Every page, day, task and typed page the server holds for your account, as of the last syncWhat a device has not synced yet
Your words as Markdown, a file or a picture by its nameA file’s contents or its address, another account’s graph, your plan, your settings, your other tokens