# Thymer Docs

Learn how to organize your work and build your own tools with Thymer.

> Shortcuts are written for the Mac. On Windows and Linux, use Ctrl where it says Cmd, unless the text names another key.

---

# Welcome

Thymer is an editor for notes, tasks and planning. It's designed from scratch to blend the structure of an outliner, the flow of a writing tool and the richness of a page builder in a single document, with a focus on speed. 

Create a page for anything you need to keep track of. Group pages in Collections to create visual galleries, searchable databases or project boards. Make it your own with plugins. Have some fun with Vibes and themes. Work solo, with your team, or with your agents. It's real-time multiplayer on web, desktop and mobile, and end-to-end encrypted.


Thymer is in beta. The docs are in beta too, so some information might be one version behind or ahead. If you find some rough edges, please tell us about it at: [team@thymer.com](mailto:team@thymer.com). Thanks!

## Start here

- [What is Thymer](start-here/what-is-thymer.md): what's different about the editor, offline use with encrypted sync, and collections.
- [Create an account](start-here/create-an-account.md): sign up with your beta invite, sign in everywhere, and decide between one account or two.
- [Getting started](start-here/getting-started.md): small first steps, from your first page and tasks to a collection of your own and inviting your team.
- [How Thymer is organized](start-here/how-thymer-is-organized.md): what an account, a workspace, a collection and a page are.
- [Keyboard shortcuts](start-here/keyboard-shortcuts.md): all the defaults, and how to change them.
- [Glossary](start-here/glossary.md): What things are called in Thymer, A to Z.

Begin with a few notes and some tasks, and add collections and properties once you notice the same kind of page coming back.

## Explore more

- [Writing and formatting](writing/writing-and-formatting.md), [Tasks](tasks-and-journal/tasks.md), [The Journal](tasks-and-journal/the-journal.md) and [Setting up a collection](collections/setting-up-a-collection.md).
- [Markdown Mirror](markdown-mirror.md) turns your workspace into a folder of Markdown files, synced both ways.
- [AI agents and CLI](ai-agents-and-cli.md) connect your own tools through MCP and the terminal.
- [Plugins](plugins.md) add commands, properties and views in JavaScript.

## Where to use it

Thymer runs in the browser, as a [desktop app](apps-and-settings/desktop-app.md) for macOS, Windows and Linux, and as [mobile apps](apps-and-settings/mobile-apps.md) for iOS and Android. Sign in on any of them to reach the same workspaces.

## Finding things in the app

Press Cmd+P (Ctrl+P on Windows and Linux) for the command palette. Every action in Thymer is in there, with its shortcut next to it. Press Cmd+K (Ctrl+K on Windows and Linux) to jump to a page, date or team member.


If you get stuck, see [Troubleshooting](help/troubleshooting.md).

---

# What is Thymer

Thymer is a new take on notes, tasks, planning, and organizing information. For work or personal projects. This page shows what's different.

## A new kind of editor

Built from the ground up, the editor combines the power of outliners with WYSIWYG flexibility and the speed of plain text.

- Designed for long-form documents, structured thinking, and task management. Fast whether you're brainstorming, journaling, building a knowledge base, or planning projects.
- Edit like plain text. Add rich content. Collapse or zoom into sections. Mention dates and people, reference other pages, track tasks and progress.
- IDE-level power, but for writing and planning: split views, command palettes, keyboard shortcuts for everything, queries, and more.
- Serious tools, with a bit of fun.

[Writing and formatting](writing/writing-and-formatting.md) shows what the editor can do.

## Offline-first speed, encryption, real-time multiplayer, and web access

No trade-off between privacy and convenience. Thymer combines the speed and privacy of offline apps with real-time collaboration and access from anywhere, including the web, using end-to-end encrypted background sync when you're online.

- Workspace data is downloaded to your device, so interactions are instant.
- Fully functional offline. Feels just like a local editor.
- Seamless background sync when online.
- Work solo or with your team. Control access with admin permissions.
- End-to-end encryption means no one else, not even us, can read your data.
- Your data is yours. [Eject](https://thymer.com/ejectable) at any time: export all of it, or keep a live copy as Markdown files. A self-hosted server is coming soon.

See [Offline and sync](apps-and-settings/offline-and-sync.md), [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md) and [Export and backups](your-data/export-and-backups.md).

## A flexible way to organize any information

Everyone works differently. Thymer is *hackable* to fit your workflow. Organize anything in work or life into clean, structured databases called *collections*. Project boards, artwork tables, wiki lists: whether it's visual or data-heavy, just add properties to shape and structure your notes.

- View your data in multiple ways, like a kanban board, a spreadsheet-style table or a visual gallery.
- Add properties to define, structure and filter your data.
- Power user? Customize and automate with JavaScript [plugins](plugins.md).
- Complete out of the box. Simple by default. Extend when you need more.

See [Setting up a collection](collections/setting-up-a-collection.md).

## Try it in your workspace

A new account's first workspace starts with this page in an **Examples** collection, together with a [Getting Started](start-here/getting-started.md) checklist. Change them, add to them, or delete them when you're done.

---

# Create an account

Thymer is in beta, and accounts are created with an invite. When yours arrives, sign up at [register.thymer.com](https://register.thymer.com) with the code in it. From then on you sign in at [thymer.com](https://thymer.com), or in the desktop and mobile apps.

## Your account's address

Every account has its own address, such as `acme.thymer.com`. Your workspaces are at that address, and you type it to reach them in a browser. The account owner can change the name and the address later in **Settings → Account Name/URL**. Tell the team before you do, because bookmarks and links use it.

## The first workspace

Signing up creates the account and its first workspace and makes you the account owner. Invite people from **Settings → Invite Users** and approve them in **Manage Users**; see [Inviting people](teams/inviting-people.md). Owners can add workspaces with **Settings → Create Workspace**.

## Your password and your key

Your password protects the key that encrypts your workspaces, and Thymer never sees it. Save your Recovery Key the first time you sign in, from **Settings → Recovery Key**, into your password manager. It is the only way back in if you forget the password. See [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md).

## One account or two

Everyone in a workspace sees everything in it, and the workspaces of one account share an owner. For notes you want to keep entirely apart from work, make a second account. You can be signed in to several at once.

## Your other devices

Sign in with the same email and password on your other computers and phones. The first sign-in on a device downloads your workspaces, and from then on they stay in sync. See [Desktop app](apps-and-settings/desktop-app.md) and [Mobile apps](apps-and-settings/mobile-apps.md).

---

# Getting started

A new workspace comes with some example pages to explore. You can get started creating your first note right away, or click around to explore. Here are some things to try to get familiar with the basics.

## Create and edit

Just start typing. Your changes are synced (saved) automatically in the background.

- [Create an account](start-here/create-an-account.md), if you haven't yet.
- Pick a banner: click the **...** at the top right of the page and choose **Change Banner...**. Some of them move.
- Type `@` to format, link, mention or insert rich content like blocks or pictures.
- Click the handle in front of a line for its options.
- Create a page for anything you need, from a short note to a long doc. Click the **+** next to a collection in the sidebar, or press Ctrl+N (macOS) or Alt+N (Windows/Linux).

## Structure

- Use outlining for structure: press Tab to indent a line under the one above it, and Shift+Tab to move it back out.
- Zoom into a line with Alt+Down, and back out with Alt+Up. Cmd+/ (macOS) or Ctrl+/ (Windows/Linux) collapses the lines under it and opens them again. See [Outlines and folding](writing/outlines-and-folding.md).
- Type `## Next steps` on a new line to make a heading, or type `@heading`. Headings own the lines beneath them, so you can fold, move or zoom into a whole section at once.
- Grab the handle in front of a line to drag it somewhere else. Hold Shift as you drop it to copy, link or transclude (embed) it there instead of moving it.

## Tasks and the Journal

- Type `* ` at the start of a line to make a task, like `* Draft the announcement`. Or type Cmd+L (macOS) or Ctrl+L (Windows/Linux) to turn a line into a task or mark it completed.
- Add some notes to your [Journal](tasks-and-journal/the-journal.md) for today. Cmd+J (macOS) or Ctrl+J (Windows/Linux) opens it.
- Plan a task for today: drag it onto your Journal, or put the cursor on it and press Cmd+Shift+J (macOS) or Ctrl+Shift+J (Windows/Linux). It stays on its page and shows on your Journal too, and ticking it off in one place ticks it off in both.
- Give a task a due date when there's a real deadline: use the task's menu, or type `@` and pick a date. [Tasks](tasks-and-journal/tasks.md) explains how that differs from planning it.

## Look and feel

- Change the theme: press Cmd+P (macOS) or Ctrl+P (Windows/Linux), type *theme* and pick **Set Theme**.
- Try Focus Mode with your favorite *vibe*: open **Panel Options** at the top right of a panel and pick one under **Focus with Vibe Shift**. Cmd+Shift+Enter (macOS) or Ctrl+Shift+Enter (Windows/Linux) turns Focus Mode on and off.

## Explore an example collection

Organize pages into [collections](collections/setting-up-a-collection.md) with shared properties, and view them as a table, board, calendar or gallery. Like a folder with database powers, where every item is a page.

- Open the **Examples** collection in the sidebar.
- The example pages have a **Status** property. Open the board and drag a page to another column to change its Status.
- Switch to the table, or create another view. See [Views](collections/views.md).

## Make your own collection

- Click the **+** next to **Collections** in the sidebar and call the new collection **Projects**.
- Open **Collection Settings...** and add three properties: a Choice called Status with Planned, In progress and Done, a User called Owner, and a Date & Time called Due date. See [Properties](collections/properties.md).
- Add a Board view grouped by Status.
- Create a few pages in the collection (click the + in the sidebar next to the collection). Each page becomes a card on the board.
- Set the card's Status, drag it between columns, and open it to keep writing.

The [Roadmap example](collections/roadmap-example.md) goes through these steps in more detail.

*A collection as a board, grouped by Status.*

## Work with others

Working in a team? Collaborate in real time.

- Invite others with the **Invite People** button at the bottom right of the window, or with **Invite users** in the command palette. Inviting is up to the workspace's admins. See [Inviting people](teams/inviting-people.md).
- Everyone in a workspace can view and edit all of its content. Make others admins so they can invite and manage people and change the workspace's settings. For a different group of people, add another workspace. See [Roles and access](teams/roles-and-access.md).
- Assign a task by @-mentioning someone in it. To leave a note or a task on someone's Journal, open their Journal (press Cmd+K (macOS) or Ctrl+K (Windows/Linux) and type their name) and write it there.

## Go further

Explore more, if you like.

- Press Cmd+K (macOS) or Ctrl+K (Windows/Linux) for **Jump To**, and jump to any page, date or team member. Try *3 days from now* or *wednesday*, or pick a team member to open their Journal.
- Press Cmd+P (macOS) or Ctrl+P (Windows/Linux) for the command palette, with every command in Thymer.
- Press Cmd+Shift+F (macOS) or Ctrl+Shift+F (Windows/Linux) to search everything, including inside pages. Try `@todo @me` for your open tasks.
- Open pages side by side: Cmd-click (macOS) or Ctrl-click (Windows/Linux) a link, or choose **Split this panel** under **Panel Options**. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).
- See every page and line that links to a page in its **Backlinks** section. See [Links and backlinks](writing/links-and-backlinks.md).
- Learn the [keyboard shortcuts](start-here/keyboard-shortcuts.md), and change them in **Settings → Keyboard Shortcuts**.
- Keep your workspace as a folder of Markdown files with [Markdown Mirror](markdown-mirror.md).
- Take Thymer with you on the [mobile apps](apps-and-settings/mobile-apps.md).
- Set up [AI agents](ai-agents-and-cli.md) to work with your notes.
- Add custom code to your collections, or build your own [plugins](plugins.md).

## More resources

- Website: [thymer.com](https://thymer.com)
- Desktop apps: [thymer.com/desktop](https://thymer.com/desktop)
- Mobile apps: [thymer.com/mobile](https://thymer.com/mobile)
- Support: [thymer.com/support](https://thymer.com/support/)
- Plugins: [thymer.com/plugins](https://thymer.com/plugins/)

Questions or feedback? Click the Thymer logo at the bottom right of the window and choose **Send us feedback**, or email [team@thymer.com](mailto:team@thymer.com).

Next: [How Thymer is organized](start-here/how-thymer-is-organized.md).

---

# How Thymer is organized

Thymer has four levels.

| Level | What it is | Example |
| --- | --- | --- |
| Account | Your company or your own account, with its own URL | acme.thymer.com |
| Workspace | A set of people who share everything in it | Product team |
| Collection | Pages that share properties and views | Projects |
| Page | A document with text, tasks, images and links | Website launch |

## Workspaces decide who sees what

Everyone in a workspace can read and edit everything in it. Workspaces are the only access boundary in Thymer; collections and sub-pages organize the content within one. When two groups need different access, give them separate workspaces. An account can have as many as you like, and you can switch between them from the sidebar.

Each workspace is encrypted with its own key, which only its members hold. See [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md).

## Collections give pages structure

A Projects collection might have Status, Owner and Due date properties. Each project is still a full page: write the brief, add tasks, drop in files. The collection's views show the same pages as a table, a board grouped by status, or a calendar by due date. See [Setting up a collection](collections/setting-up-a-collection.md).

## Pages

A page can be a quick note or a long document. A page consists of lines, and a line can contain all kinds of content types, like a heading, list item, quote, task or image. Any line can be linked to from elsewhere, and a page can have sub-pages. See [Pages](writing/pages.md) and [Writing and formatting](writing/writing-and-formatting.md).

## The Journal

Every member has a Journal: one page per day, for notes and for the tasks you plan to work on that day. It lives in the workspace, so your teammates can see it too. See [The Journal](tasks-and-journal/the-journal.md).

---

# Keyboard shortcuts

These are the defaults. The command palette (Cmd+P on macOS, Ctrl+P on Windows/Linux) shows the shortcut next to each action, and **Help: Keyboard Shortcuts** in the palette opens this list inside the app. The tables list the Mac keys first, and the column for your computer stands out. Elsewhere in these docs, shortcuts show the keys for your computer; the ⌘/Ctrl button at the top of the page switches between Mac and Windows and Linux.

## Getting around

| Action | Mac | Windows and Linux |
| --- | --- | --- |
| Command palette | Cmd+P | Ctrl+P |
| Jump to a page, date or person | Cmd+K | Ctrl+K |
| Search | Cmd+Shift+F | Ctrl+Shift+F |
| Today's Journal | Cmd+J | Ctrl+J |
| Go to panel 1 to 6 | Cmd+1 to Cmd+6 | Ctrl+1 to Ctrl+6 |
| Go to sidebar | Cmd+0 | Ctrl+0 |
| Toggle sidebar | Cmd+\ | Alt+B |
| Split panel | Cmd+Shift+\ | Ctrl+\ |
| Panel switcher | Cmd+. | Ctrl+. |
| Back and forward | Cmd+[ and Cmd+] | Alt+[ and Alt+] |
| Zoom into a line, zoom out | Alt+Down, Alt+Up | Alt+Down, Alt+Up |
| Focus mode | Cmd+Shift+Enter | Ctrl+Shift+Enter |
| Open aside | Cmd-click or middle-click | Ctrl-click or middle-click |
| New menu | Ctrl+Shift+N | Alt+Shift+N |
| Options menu | Ctrl+O | Ctrl+O |
| New page, or link the selection to a new page | Ctrl+N | Alt+N in the browser, Ctrl+N in the desktop app |
| Next and previous panel, desktop app | Ctrl+Tab, Ctrl+Shift+Tab | Ctrl+Tab, Ctrl+Shift+Tab |
| Close panel, desktop app | Cmd+W | Ctrl+W |

In the command palette, type `>` to see only commands, `@` to go to a page, date or person, and `+` to create a page in a collection.

## Editing

| Action | Mac | Windows and Linux |
| --- | --- | --- |
| Bold, italic, inline code | Cmd+B, Cmd+I, Cmd+E | Ctrl+B, Ctrl+I, Ctrl+E |
| Insert link | Cmd+Shift+K | Ctrl+Shift+K |
| Task done | Cmd+L | Ctrl+L |
| Cycle task, done, text | Cmd+Shift+L | Ctrl+Shift+L |
| Schedule on today's Journal | Cmd+Shift+J | Ctrl+Shift+J |
| Indent, dedent | Tab, Shift+Tab | Tab, Shift+Tab |
| Indent, dedent with everything beneath | Cmd+; and Cmd+Shift+; | Ctrl+; and Ctrl+Shift+; |
| Move line up or down | Cmd+Shift+Up, Cmd+Shift+Down | Ctrl+Shift+Up, Ctrl+Shift+Down |
| Fold or unfold | Cmd+/ | Ctrl+/ |
| Fold all children, unfold all | Cmd+, and Cmd+. | Ctrl+, and Ctrl+. |
| Fold or unfold with everything beneath | Cmd+Shift+? | Ctrl+Shift+? |
| Fold cascade, unfold cascade | Cmd+Shift+< and Cmd+Shift+> | Ctrl+Shift+< and Ctrl+Shift+> |
| Expand selection | Cmd+A, repeat to grow | Ctrl+A |
| Line break inside a line | Cmd+Enter | Ctrl+Enter |
| Autocomplete | Ctrl+Space | Ctrl+Space |
| Undo, redo | Cmd+Z, Cmd+Shift+Z | Ctrl+Z, Ctrl+Shift+Z |
| Copy as, Paste as: Markdown, HTML, text and more | Cmd+Shift+C, Cmd+Shift+V | Ctrl+Shift+C, Ctrl+Shift+V |
| Paste as Markdown | Cmd+Alt+V | Ctrl+Alt+V |

Type these at the start of a line (followed by a space) to change its type: `#` for a heading, `*` for a task, `-` for a list, `1.` for a numbered list, `>` for a quote and `=` for plain text.

## In views

| Action | Key |
| --- | --- |
| Open the selected item | Enter |
| Open aside | Cmd+Enter |
| Preview (Peek) | Space |
| Edit a table cell | Enter |
| Trash the selected row or card | Cmd+Backspace, Ctrl+Delete on Windows and Linux |

Some actions have no key until you give them one in Settings: duplicate line, delete line, insert a line above, switch to the next or previous workspace, show or hide teammates' cursors, and **Toggle pause/resume syncing**, Thymer's airplane mode. All of them are in the command palette.

## Change a shortcut

Open **Settings → Keyboard Shortcuts**. Your bindings are a short text, one line per action, such as `"editor.bold": "Ctrl+B"`, with a help page beside it that names every action. Change the key, add a second line to give an action two keys, or set an action to `""` to switch it off. Save, and it works right away. Mac and Windows, and the desktop app and the browser, can each have their own bindings, and your shortcuts sync to your other devices.

---

# Glossary

The words Thymer uses. Some of these might have different names on other platforms or apps, so we tried to list those as well in case you're looking for something specific.

## A

**@-menu**: the menu that opens when you type `@`. It links pages and lines, mentions people, adds dates, tags and heading icons, inserts images, blocks and live queries, and turns a line into another type. See [Writing and formatting](writing/writing-and-formatting.md).

**Account**: your company's or your own home in Thymer, with its own address such as `acme.thymer.com`. An account holds one or more workspaces. See [How Thymer is organized](start-here/how-thymer-is-organized.md).

**Account owner**: the person who runs an account. They can do everything an **admin** can, in every workspace of the account, and also create workspaces and rename or close the account. See [Roles and access](teams/roles-and-access.md).

**Admin**: a workspace admin invites, approves and removes people and manages the workspace's settings, plugins and exports. Someone can be an admin in one workspace and a member in another. See [Roles and access](teams/roles-and-access.md).

**Agenda**: in Thymer, **Upcoming** on each Journal page, and the **Tasks overview**.

**Attachment**: a file on a page. Drop or paste it in, or pick **Attachment** from the @-menu. Images show inline, PDFs open in a preview panel, and other files open or download. See [Images and files](writing/images-and-files.md).

## B

**Backlinks**: the list at the bottom of a page of the pages and lines that link to it. A line that is linked from elsewhere shows a count at its end. Also called linked references or incoming links. See [Links and backlinks](writing/links-and-backlinks.md).

**Banner**: a picture across the top of a page or collection. See [Pages](writing/pages.md).

**Block**: what many apps call a block, any paragraph or bullet you can move around on its own, is a **line** in Thymer. Thymer's blocks are frames around a group of lines that fold as one, in the Plain, Note, Warning, Quote or Columns style. The tinted ones are what other apps call callouts. See [Writing and formatting](writing/writing-and-formatting.md).

**Block reference**: in Thymer, a **line reference**.

**Board**: a view that shows a collection's pages as cards in columns, grouped by a property such as Status. Drag a card to another column and the property changes. Also called a kanban board. See [Views](collections/views.md).

**Bullet**: in Thymer, a **line**. Type `-` and a space at the start of a line to make it a bulleted list item.

## C

**Calculation**: arithmetic in inline code. End an expression with `=` and Thymer shows the result, so `12 * 3 =` shows 36. A page can also name values and reuse them. Also called inline math. See [Calculations](writing/calculations.md).

**Calendar**: a view that places a collection's pages on a calendar by a Date & Time property. See [Views](collections/views.md).

**Callout**: in Thymer, a **block** in the Note or Warning style.

**Choice**: a property with a fixed list of options, each with a label and a color, such as Status or Priority. Boards can group by it. Also called a select, a status field or a dropdown. See [Properties](collections/properties.md).

**CLI**: `thymercli`, Thymer's command-line companion. It runs commands from a terminal or a script, and serves MCP for the browser. See [The CLI](ai-agents-and-cli/the-cli.md).

**Collapse**: in Thymer, **fold**.

**Collection**: like a folder with database powers, where every item is a page. A Projects or Meeting notes collection, for example, gives its pages shared properties and views. Also called a database. See [Setting up a collection](collections/setting-up-a-collection.md).

**Columns**: a **block** style that puts lines side by side. Each column holds any lines, other blocks included. See [Writing and formatting](writing/writing-and-formatting.md).

**Command palette**: Cmd+P. Every command in one list you can search, with its shortcut; type `>` to see only commands. Also called a command bar. See [Keyboard shortcuts](start-here/keyboard-shortcuts.md).

**Copy as**: Cmd+Shift+C copies the selection, or the line the cursor is on, as Markdown, HTML or plain text, or as a reference or a transclusion. See [Writing and formatting](writing/writing-and-formatting.md).

**Cover image**: in Thymer, a **banner**.

## D

**Daily notes**: in Thymer, the **Journal**.

**Database**: in Thymer, a **Collection**.

**Document**: in Thymer, a **Page**.

**Due date**: a task's deadline. Type `@` and a date in the task, or use **Set date**; `@due` and `@overdue` find them in search. Planning when you will do a task is **scheduling** it, a different thing. See [Tasks](tasks-and-journal/tasks.md).

**Dynamic collection**: views over pages from several collections, each picking its pages with its own sources and filter. The pages stay where they are, and editing them there edits the originals. See [Dynamic collections](collections/dynamic-collections.md).

## E

**Embed**: paste a link to a video or other media and choose **Media** to show a player. To show Thymer content in a second place, use a **transclusion**. See [Images and files](writing/images-and-files.md).

**Encryption**: pages are encrypted on your devices before they are sent anywhere, and each workspace has its own key that only its members hold. Also called end-to-end encryption. See [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md).

**Export**: a copy of a workspace from **Settings → Export**: a Markdown Export, a ZIP of Markdown files, or a Full Data Export, an encrypted backup with history. See [Export and backups](your-data/export-and-backups.md).

## F

**Favorites**: in Thymer, **pins**.

**Field**: in Thymer, a **property**.

**Filter**: in Thymer, a **query**. Views, search and live queries share one query language.

**Flag**: a marker on a task's checkbox that says what kind of attention it needs, such as In progress, Blocked or Important/Urgent. Each flag has its own color and its own search filter. See [Tasks](tasks-and-journal/tasks.md).

**Focus Mode**: Cmd+Shift+Enter. The current panel fills the window and everything else is out of the way until you press it again. Also called zen mode or distraction-free mode. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).

**Fold**: hide what is under a line or a heading, and show it again. Cmd+/ folds and unfolds, and each panel folds a page its own way. Also called collapse, expand or toggle. See [Outlines and folding](writing/outlines-and-folding.md).

**Folder**: in Thymer, a **collection** groups pages and **sub-pages** nest them. Pages that need their own access go in their own **workspace**.

**Formula**: a property computed from the page's other properties with a few lines of JavaScript. A formula over a Page Link property can count the linked pages or add up their values, which is how you build what other apps call a rollup. See [Formulas](collections/formulas.md).

**Frontmatter**: the block at the top of a Markdown file that holds the page's properties, in Markdown Mirror and in exports. See [Files and frontmatter](markdown-mirror/files-and-frontmatter.md).

## G

**Gallery**: a view that shows pages as cards with a page preview or a cover image. See [Views](collections/views.md).

## H

**Hashtag**: in Thymer, a **tag**.

**Heading**: a line that starts a section, made with `#` to `######` and a space, for six levels. A heading owns the lines below it until the next heading of the same or a higher level, so folding or moving it takes the whole section along. See [Outlines and folding](writing/outlines-and-folding.md).

**Hoist**: in Thymer, **zoom**.

## J

**Journal**: every member's page per day, for the day's notes and the tasks you plan to work on. Cmd+J opens today. Also called daily notes. See [The Journal](tasks-and-journal/the-journal.md).

**Jump to**: Cmd+K. Go to a page, date or person by typing part of its name, or type `+` and a title to create a page. Also called a quick switcher. See [Keyboard shortcuts](start-here/keyboard-shortcuts.md).

## K

**Kanban**: in Thymer, a **board** view.

## L

**Line**: everything you write is made of lines. A line is text, a heading, a list item, a task, a quote, code, a divider, a banner or a block, and you can change its type at any time. Indent a line with Tab and it belongs to the line above: it moves, folds and copies along with it. Any line can be linked to, zoomed into or pinned. Also called a block, a node or a bullet. See [Writing and formatting](writing/writing-and-formatting.md).

**Line reference**: a link to one line, made with `@@`. It shows the line's text and keeps working when the line moves to another page. Also called a block reference. See [Links and backlinks](writing/links-and-backlinks.md).

**Link**: type `@` and part of a page's title to link to it; if the page doesn't exist yet, the same menu creates it. A link keeps working when the page is renamed or moved. Also called a wiki link or an internal link. See [Links and backlinks](writing/links-and-backlinks.md).

**Linked database**: in Thymer, a **dynamic collection**.

**Linked references**: in Thymer, **backlinks**.

**Live query**: a search inside a page whose results stay current. Drag a query from the search panel onto a page to make one. Also called a saved search or a query block. See [Live queries](search-and-navigation/live-queries.md).

**Local-first**: Thymer keeps a copy of each workspace on every device you sign in on, so it works **offline**. See [Offline and sync](apps-and-settings/offline-and-sync.md).

## M

**Markdown Mirror**: keeps a folder of Markdown files on your computer in sync with a workspace, both ways, so your editor, scripts and agents can work on plain files. It runs in the desktop app. See [Markdown Mirror](markdown-mirror.md).

**MCP**: the Model Context Protocol, which AI agents use to search, read and edit a workspace. The desktop app has an MCP server built in, and `thymercli` runs one next to the browser. See [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md).

**Mention**: `@` and a person's name in a line. On a task it says who is responsible, and `@me` in search finds everything that mentions you. Also called an at-mention or assigning. See [Tasks](tasks-and-journal/tasks.md).

**Mirror**: in Thymer, **Markdown Mirror** keeps a folder of files in sync with a workspace. The same lines shown in two places are a **transclusion**.

## N

**Nested page**: in Thymer, a **sub-page**.

**Node**: in Thymer, a **line**.

**Note**: in Thymer, a **page**, or a **block** in the Note style.

## O

**Offline**: every device keeps a copy of the workspace, so reading, writing and search work without a connection. Changes sync when you are back online. See [Offline and sync](apps-and-settings/offline-and-sync.md).

## P

**Page**: a document with text, tasks, images and links. Every page lives in a collection, which gives it its properties. Also called a document or a note. See [Pages](writing/pages.md).

**Page Link**: a property that links a page to another page, such as each meeting to its project. The linked page lists the connection in its backlinks. Also called a relation. See [Properties](collections/properties.md).

**Panel**: pages open in panels, side by side, each with its own history. Cmd-click opens a page in a panel next to the current one. Also called a pane or a split view. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).

**Paste as**: Cmd+Shift+V pastes as Markdown, HTML or plain text, or pastes copied lines as a reference or a transclusion. Cmd+Alt+V pastes as Markdown straight away. Also called paste special. See [Writing and formatting](writing/writing-and-formatting.md).

**Paste special**: in Thymer, **Paste as**.

**Peek**: press Space on a row or card in a view, and a side panel shows the page and follows as you move with the arrow keys. Also called a preview or quick look. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).

**Pin**: a shortcut in the sidebar to a page, collection, view, file, line or block. Pins are shared with everyone in the workspace. Removing a pin changes nothing about what it points to. Also called a favorite or a bookmark. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).

**Plugin**: JavaScript that runs inside Thymer and is shared with the workspace. An app plugin extends the workspace; a collection plugin extends one collection with formulas, custom views or buttons on cards. Also called an extension or an add-on. See [Plugins](plugins.md).

**Property**: a field that a collection's pages share, such as Status, Owner or Due date. The collection defines it, and each page has its own value. Also called a field or an attribute. See [Properties](collections/properties.md).

**Property set**: a named group of properties to show on a page, for collections whose pages are not all alike. A Media collection can have a Books set with Author and Pages, and a Films set with Director and Runtime. See [Properties](collections/properties.md).

## Q

**Query**: a search with filters, such as `@todo @overdue` or `@Projects.Status="Done"`. The same language filters views and runs live queries. Also called advanced search or search operators. See [Query language reference](search-and-navigation/query-language-reference.md).

**Quick switcher**: in Thymer, **Jump to**, Cmd+K.

## R

**Record**: what the plugin API and the query language call a **page**.

**Recovery Key**: a key that unlocks your account if you forget your password. Thymer can't reset passwords, because it never has your key, so keep this one in your password manager. See [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md).

**Related**: a query a collection shows at the top of each of its pages, with the page itself as the context, such as every task that links to it. Set it in **Collection Settings... → Related**. See [Live queries](search-and-navigation/live-queries.md).

**Relation**: in Thymer, a **Page Link** property.

**Rewind**: an account owner's last resort: undo every change made in a workspace during the last so many minutes, for everyone. It starts from the diagnostics page. See [Rewinding a workspace](help/troubleshooting.md#rewinding-a-workspace).

**Rollup**: a value worked out from linked pages, such as how many projects a customer has or what their budgets add up to. The Page Link property only makes the connection; in Thymer, a **formula** that reads it does the counting or adding. See [Formulas](collections/formulas.md).

## S

**Safe Mode**: Thymer without plugin code, custom keyboard shortcuts or themes, for when one of them makes the app hard to use. Markdown Mirror pauses until you leave it. See [Safe Mode](help/troubleshooting.md#safe-mode).

**Schedule**: put a task on a day of your Journal to plan when you will work on it. Drag it onto the day, or press Cmd+Shift+J for today. The task stays in its page, and ticking it off in either place ticks it off everywhere. Different from a **due date**. Also called a do date. See [The Journal](tasks-and-journal/the-journal.md).

**Select**: in Thymer, a **Choice** property. Turn on **Allow multiple values** for a multi-select.

**Sidebar**: the column on the left with the account button, Search, Jump To and Tasks, the pins, and the collections with their pages. Cmd+\ (Alt+B on Windows and Linux) folds it into a strip of icons. Also called the navigation pane. See [The sidebar](search-and-navigation/the-sidebar.md).

**Slash command**: in Thymer, the **@-menu**. Type `@` where you would type `/`.

**Split view**: in Thymer, **panels**.

**Status**: for a page, usually a **Choice** property named Status. For a task, its checkbox and its **flag**.

**Sub-page**: a page under another page. Choose **Create sub-page** on the parent, or set the page's **Sub-page of** property. A sub-page is an ordinary page with the properties of its collection. Also called a nested page or a child page. See [Pages](writing/pages.md).

**Synced block**: in Thymer, a **transclusion**.

## T

**Table**: a view with one page per row and the properties as columns, where each cell is an editor for its type. See [Views](collections/views.md).

**Tag**: a `#tag` in the text, which search finds. The **Tags** section of the sidebar lists every tag in the workspace, and a property of the type Tag holds tags on the page itself. Also called a hashtag or a label. See [Search](search-and-navigation/search.md) and [Properties](collections/properties.md).

**Task**: a line with a checkbox. Type `*` and a space at the start of a line, and press Cmd+L to mark it done. Also called a to-do, an action item or a checklist item. See [Tasks](tasks-and-journal/tasks.md).

**Tasks overview**: **Tasks** in the sidebar: the tasks of the whole workspace, for you or for anyone, grouped by date, page or person. See [Tasks](tasks-and-journal/tasks.md).

**Teamspace**: in Thymer, a **workspace**.

**Theme**: Thymer's look: light or dark, serif or sans, and a few with more personality. Each member picks, installs or creates their own. See [Themes](apps-and-settings/themes.md).

**To-do**: in Thymer, a **task**.

**Toggle**: in Thymer, any line with lines under it **folds**.

**Transclusion**: the same lines or page shown in a second place. There is one copy, so editing either place updates both. Also called a mirror, a synced block or a live embed. See [Links and backlinks](writing/links-and-backlinks.md).

**Trash**: where trashed pages and collections wait until someone restores them. See [Version history and Trash](your-data/version-history-and-trash.md).

## U

**Upcoming**: the section at the top of each Journal page with the open tasks that need you that day: due that day, overdue, or Important or Alert without a due date. See [The Journal](tasks-and-journal/the-journal.md).

## V

**Version history**: earlier versions of a page, from **Version History...** in the page menu. Also called page history or revisions. See [Version history and Trash](your-data/version-history-and-trash.md).

**Vibe Shift**: a command that changes the look of a Focus Mode session until you leave it. See [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).

**View**: a way to show a collection's pages, as a list, table, board, gallery or calendar, with its own filter, sort and grouping. Every view shows the same pages, so a change in one shows in all. See [Views](collections/views.md).

## W

**Wiki link**: in Thymer, a **link**. Type `@` and part of the page's title.

**Workspace**: a group of people who share everything in it. It is the only access boundary in Thymer, and it has its own encryption key. Also called a teamspace. See [How Thymer is organized](start-here/how-thymer-is-organized.md).

## Z

**Zen mode**: in Thymer, **Focus Mode**.

**Zoom**: Alt+Down makes the current line the top of the panel, with only what is under it; Alt+Up zooms back out. Also called hoisting. See [Outlines and folding](writing/outlines-and-folding.md).

---

# Pages

You can create pages for anything you need to keep track of. A meeting note, a project outline, recipe, knowledge base article, trip report, contact, or just a random note or idea.

Every page lives in a collection, a folder and a database in one. The collection decides which properties the page has and in which views it shows up. A plain notes collection is fine for most pages; see [Setting up a collection](collections/setting-up-a-collection.md) for when you want more.

*A page: headings, text, tasks and links, with the sidebar beside it.*

## Create a page

Press Ctrl+N (macOS) or Alt+N (Windows/Linux). The new page goes to the workspace's default collection; admins choose which one that is with **Set Default Collection**. To create a page in a particular collection, click the **+** next to it in the sidebar.

You can also press Cmd+K and type the title of the new page. When no page has that title yet, the list offers to create it, in the default collection or in another one.

While you write, type `@` and part of a title to link to an existing page. Type the title of a page that doesn't exist yet, and the same menu creates it: pick a collection under **Create "…" in**, and the new page is made and linked in one step.

Text you already wrote can become a page too. Select it and type `@`: the menu offers to create a page with the selected text as its title, in a collection or as a sub-page of the current page, and the text turns into the link to it.

## Title, icon and banner

Pick **Set Title & Icon** from the page menu to rename a page or give it an icon. A page without an icon of its own shows the icon of its collection, unless that is the folder icon. **Change Banner...** adds a picture across the top, a cover image. Collections can have icons and banners too. Use icons consistently, for example one for projects and another for processes, so people recognize a kind of page at once.

## Sub-pages

A page can sit under another page, the nested pages of other tools. Choose **Create sub-page** on the parent, or set the page's **Sub-page of** property. Use it for a handbook with chapters, or a project with its own notes. A sub-page is an ordinary page: it has the same properties as the rest of its collection and can be linked from anywhere.

## Move a page

**Move...** in the page menu moves it to another collection. Links keep working, because they point to the page itself, wherever it is. If the new collection lacks some of the page's properties, their values stay on the page as carried-over properties, so nothing is lost. Right-click one for **Add to collection** or **Clear carried-over value**; see [Files and frontmatter](markdown-mirror/files-and-frontmatter.md#frontmatter).

## Trash

**Move to Trash** removes a page from all views. Open **Trash** to bring it back with **Restore from Trash**. See [Version history and Trash](your-data/version-history-and-trash.md).

---

# Writing and formatting

Click into a page and type. Thymer's editor keeps your text in lines, and every line has a type: text, heading, list item, task, quote, code, divider, banner, block. You can select across lines and format, change a line's type at any time, and fold or move any line with everything under it.

Hover in front of a line to see its handle. Click the handle for the line's menu, or drag it to move the line. Ctrl+O opens the same menu for the line the cursor is on.

## Formatting text

| Format | How |
| --- | --- |
| Bold | Cmd+B |
| Italic | Cmd+I |
| Inline code | Cmd+E |
| Link to a web address | Cmd+Shift+K, or paste a URL over the selected text |
| Link to a page | Select the text and press `@` |
| Mention, date, tag | Type `@` and pick them from the @-menu |
| Icon in front of a heading | Type `@` in the heading and pick an icon |

While text is selected, the status bar at the bottom of the window shows the same options; click one to apply it. The status bar also counts the words and characters you selected. Inline code can calculate: `12 * 3 =` shows 36. See [Calculations](writing/calculations.md).

The text cursor shows the active formatting: it leans for italic, thickens for bold and becomes a small box for code. Press Cmd+B, Cmd+I or Cmd+E with nothing selected and what you type next gets that style.

## Selecting

Cmd+A expands the selection one step at a time: the text of a task or list item, then the whole line, then the line with its children, then the lines around it, up to the whole page. Double-click selects a word, triple-click the line, and quad-click the line with its children.

Copy and paste keep outlines and nested lines as they are.

## The @-menu

Type `@` anywhere and the @-menu opens. It has everything beyond plain typing:

- **Links** to a page, to a line, or to a page it creates for you on the spot. See [Links and backlinks](writing/links-and-backlinks.md).
- **People**, to mention or assign. **Dates and times**, in plain words like `next friday 3pm`. **Tags**. **Icons**, in front of a heading.
- **Insert**: an image, video or attachment, a code block, a divider, a block, a banner, a live query.
- **Turn into**: a heading, a list, a task, a quote, a code block, an ASCII art banner, a link button.
- **Tasks**: set a flag, a due date, schedule it, assign it.

If you meant a literal `@`, press Escape: the menu closes and the `@` stays. On a phone, pick **Keep @ as text**.

## Line types

Type a prefix at the start of a line, followed by a space, or pick **Turn into** from the @-menu or the line's menu.

| Type | Prefix |
| --- | --- |
| Heading 1 to 6 | `#` to `######` |
| Bulleted list | `-` |
| Numbered list | `1.` |
| Task | `*` |
| Quote | `>` |
| Plain text | `=` |
| Code block, divider, banner | From the @-menu |

Headings own what comes under them until the next heading of the same or a higher level, so folding, moving, zooming and copying a heading takes its whole section. See [Outlines and folding](writing/outlines-and-folding.md). The line's menu also duplicates or deletes a line.

## Blocks

A block groups lines in a frame that folds as one. Pick **Plain Block** from the @-menu, or **Info Block**, **Warning Block** or **Quote Block** for a styled one, or select lines and turn them into a block. **Change block style** switches between:

- **Plain**, a frame without a tint.
- **Note**, tinted, for the thing a reader should see first.
- **Warning**, for the thing they must not miss.
- **Quote**, for something someone said.
- **Columns**, side by side; see below.

**Zoom in on block** makes the block the whole panel; **Select block** selects it with everything in it.

The cursor can sit before, inside or after a block, and blocks nest and indent like lines, so a block can hold another block.

## Columns

Columns are a special block with the Columns style. Each column holds any lines, including other blocks, and Thymer lays the columns out side by side. **Insert Column** adds one, **Move Column Left** and **Move Column Right** reorder them. Use columns for pages with a visual layout, such as a dashboard, a comparison or a team page.

## Code

**Code Block** from the @-menu, with a language for syntax highlighting; **Set syntax highlighting** changes it later. The lines in a code block are ordinary lines, so you can format, mention or add a task inside code. Code in a page is text; to run JavaScript in Thymer, write a [plugin](plugins.md).

## Banners

A banner turns a line into big ASCII art lettering. Three styles: **Flames**, animated, **Neon**, in rainbow colors, and **Console**, animated in one color. Pick one from the @-menu or turn an existing line into a banner.

## Images, files and media

Drop or paste an image or a file, or pick **Media** or **Attachment** from the @-menu. Paste a link to YouTube, X, Instagram and other services, then right-click it to show it as an embedded player or post; see [Embeds](writing/images-and-files.md#embeds). For more, see [Images and files](writing/images-and-files.md).

## Live queries and transclusions

A **Live Query** block shows search results inside the page and keeps them current. A **transclusion** shows lines or a page from elsewhere, editable in both places. See [Live queries](search-and-navigation/live-queries.md) and [Links and backlinks](writing/links-and-backlinks.md).

## Link buttons

A line of links can show as buttons: **Link Icon / Button** turns a link into one, **Link as Buttons** and **Link with Icons** style a whole line, and **Turn button into regular link** undoes it. Good for a row of destinations at the top of a page.

## Copy and paste as Markdown, HTML or text

Cmd+V pastes whatever the clipboard holds, so formatted text from other apps arrives with its formatting. To choose the format yourself, use the paste and copy menus. They work in any page, wherever the cursor is.

**Paste as.** Cmd+Shift+V opens the paste menu at the cursor:

| Option | Result |
| --- | --- |
| Paste (Default) | The same as Cmd+V |
| Paste Markdown | Markdown text becomes real headings, lists, tasks and code blocks |
| Paste HTML | Formatted text keeps its formatting |
| Paste Text | Plain text, formatting dropped |
| Paste Reference | A link to the lines you copied in Thymer |
| Paste Transclusion | The lines you copied, shown in place |

Cmd+Alt+V pastes as Markdown straight away, without the menu.

**Copy as.** Cmd+Shift+C opens the copy menu: **Copy Markdown**, **Copy HTML**, **Copy Text**, **Copy Reference** and **Copy Transclusion**. It copies the selection, or the line the cursor is on when nothing is selected. To copy a whole page as Markdown, press Cmd+A until the page is selected, then Cmd+Shift+C and **Copy Markdown**. Use it to put a page into an email, an issue or a chat with an AI assistant.

The menu of a line or a selection has the same choices, worded **Copy as Markdown**, **Paste as Markdown** and so on. Copy as Markdown, HTML or Text and Paste as HTML or Text have no key of their own. To give one a key, bind its action in **Settings → Keyboard Shortcuts**: `global.copyMarkdown`, `global.copyHTML`, `global.copyText`, `global.pasteHTML` or `global.pasteText`. See [Keyboard shortcuts](start-here/keyboard-shortcuts.md#change-a-shortcut).

Cut and paste moves lines rather than copying them when it can. For whole folders of Markdown, see [Importing content](your-data/importing-content.md). To work in files all the time, see [Markdown Mirror](markdown-mirror.md).

---

# Outlines and folding

Indented lines belong to the line above them, and the lines under a heading belong to that heading. Folding, zooming, moving and copying all follow that structure.

## Indent

Tab indents the current line or selection under the line above it. Shift+Tab moves it back out. Only the selected lines move, and the lines around them keep their indentation, so a line's children stay where they are when you indent it.

To take the children along, press Cmd+; (macOS) or Ctrl+; (Windows/Linux): it indents a line together with everything beneath it. Cmd+Shift+; (macOS) or Ctrl+Shift+; (Windows/Linux) moves the whole tree back out. A folded line always takes its hidden lines along.

A line's children come along when you move, fold or copy it.

The editor supports _overindentation_: you can press Tab multiple times to add more indentation.

## Headings own their section

The lines below a heading belong to it until the next heading of the same or a higher level, with no indentation needed. Move or fold a heading and the whole section comes with it. Zoom into a heading and you see just that section.

## Fold

Folding is what outliners call collapsing. Cmd+/ folds or unfolds the current line and its children. Cmd+, folds all children, Cmd+. unfolds them, and the line menu has the fold options too. Folding is per panel, so you can fold a page one way on the left and another way on the right.

Blocks, live queries and transclusions fold too.

## Zoom

Zooming is what some outliners call hoisting or focusing in. Alt+Down zooms into the current line: that line becomes the top of the page, and the rest is hidden. Alt+Up zooms back out. The zoomed-in line stays visible and editable, so you can rename a heading while working inside it.

## Move lines around

Cmd+Shift+Up and Cmd+Shift+Down move a line past its siblings, children included. Drag a line by its handle to put it anywhere, in the same page or in another panel. To select a line with its children, press Cmd+A until they are selected; see [Selecting](writing/writing-and-formatting.md#selecting).

Cmd+Z undoes any of it.

---

# Links and backlinks

A link to a page keeps working when the page is renamed or moved, and a link to a line keeps working when the line moves to another page.

## Link to a page

Type `@` and start typing a title. Pick a page to insert a reference to it. If the page doesn't exist yet, the same menu creates it. Select some text first and press `@` to turn that text into the link.

A link's menu can show it with an icon or as a button, which makes a tidy row of links at the top of a page. The @-menu also inserts people and dates, which is how you mention someone or set a date on a task.

## Link to a line

Type `@@` or choose **Link to Line** to search for a specific line, such as a task in a meeting note or a decision in a project page. A line reference, called a block reference in other apps, shows the line's text and keeps working when the line moves.

## Backlinks

Every page shows the pages and lines that link to it, its linked references, in a **Backlinks** section at the bottom. A line that is referenced elsewhere shows a small count at its end; click it to see where. With backlinks, a project page gathers the meeting notes, Journal entries and tasks that mention it, so nobody has to keep that list by hand.

## Transclusions

A transclusion shows content from one place inside another: a line with its children, a heading with its whole section, or a whole page. There is only one copy. Edit it in either place and both update, tick a transcluded task and it is done at the source, and the source's backlinks show where it is transcluded.

Four ways to make one:

- Type `@`, find the page in the @-menu, and press Shift+Enter instead of Enter.
- Drag a line by its handle, hold Shift as you drop it, and choose **Transclude here...**.
- Select lines, choose **Copy Transclusion** from the copy menu (Cmd+Shift+C), and paste where you want them.
- Copy lines the normal way and choose **Paste Transclusion** from the paste menu (Cmd+Shift+V).

**Go to source** in the transclusion's menu takes you to the original. A transclusion folds like any section, so a long shared page can sit collapsed inside a short one.

Transclude a shared checklist into each project, or this week's priorities into your Journal. Make a plain copy instead when the two should drift apart.

## Share a link

**Copy Page Link** copies a URL you can send to a teammate. Only members of the workspace can open it.

---

# Images and files

Drop an image or file onto a page, paste an image from the clipboard, or pick **Media** for an image or **Attachment** for any file from the @-menu. Images show inline and resize by dragging, with Shift for free proportions. Click an image to view it large. Other files show as attachments to open or download; PDFs open in a preview panel inside Thymer.

Files are encrypted like everything else and sync to your other devices when you open them. A file you have never opened on a device is downloaded when you first click it, so open the ones you will need before going offline.

## Embeds

Paste a link to YouTube, Vimeo, Twitch, SoundCloud, TikTok, Instagram, Facebook or X, then right-click the link and choose its widget, such as **YouTube widget**, or pick **Insert YouTube widget** from the line's menu. The player appears on a new line below the link. Embeds load from the service that hosts them, so they need a connection and are not part of your encrypted data.

## Files as properties

When many pages need the same kind of attachment, such as a contract per customer, add a File or Image property to the collection instead. Gallery views can use an Image property as the card's cover. See [Properties](collections/properties.md).

## Files in Markdown

Exports and Markdown Mirror put files in a `files/` folder next to your Markdown and link to them relatively. Keep the folder with the text when you copy an export elsewhere. See [Files and frontmatter](markdown-mirror/files-and-frontmatter.md).

---

# Calculations

Inline code can do arithmetic. Put an expression in backticks and end it with `=`, and Thymer shows the result right after it:

```text
`12 * 3 =`          shows 36
`(4 + 5) / 2 =`     shows 4.50
```

Name a value and use it anywhere on the page:

```text
`hours = 6`
`rate = 80`
`total = hours * rate`     shows 480
`total * 1.21 =`           shows 580.80
```

## What an expression can contain

- Numbers: `12`, `12.5`, `.5`, and negative numbers like `-3`.
- Names: letters, digits and underscores, starting with a letter or an underscore, such as `rate` or `q3_target`.
- The operators `+`, `-`, `*` and `/`, with the usual precedence: multiplication and division first.
- Parentheses to group.

Whole numbers show as they are; anything else shows with two decimals.

## How values are shared

A page is one calculation space: every name defined in inline code on the page is available to every expression on it, in any order. Change `hours` at the top and `total` further down updates. A transcluded section or a live query block keeps its own space.

A plain `` `hours = 6` `` shows no result, only defines the name. `` `total = hours * rate` `` defines a name and shows its value. An expression that ends with `=` only shows a value.

## When nothing shows

If an expression refers to a name that is not defined, divides by zero, or two names depend on each other, the result is `NaN`. If a page has no definitions at all, Thymer shows nothing for an undefined name, so a stray `` `x + y =` `` in ordinary notes stays quiet. A typo like `5 + * 3 =` shows nothing either.

Calculations work in the text of a page. To compute a property from a page's other properties, use a [Formula](collections/formulas.md).

---

# Tasks

Tasks are built into Thymer, so there is no separate to-do app or task list to set up. A task is a line in a page, with a checkbox. You write tasks where they come up: in meeting notes, project briefs and Journal pages. Search and the Tasks overview collect them from every page.

Type `* ` or `[ ] ` at the start of a line and it becomes a task. Cmd+L marks it done, Cmd+Shift+L cycles between task, done and plain text. Indent notes and smaller steps under a task; fold them away when you only want to see the task.

*Tasks on a Journal page, some with flags.*

## Task flags

A task's checkbox can carry a flag that says what kind of attention it needs. Pick one under **Set task status** in the task's menu or the @-menu, or Shift-click the checkbox to step through them. You can also type a flag's marker and a space at the start of a line, such as `[!]` for an important task. Each flag has its own color, so flagged tasks stand out on a page.

| Flag | Use it for | Type | Find it with |
| --- | --- | --- | --- |
| In progress | Started and still open | `[>]` | `@inprogress` |
| Blocked | Waiting on someone or something | `[\|]` | `@waiting` |
| Cost/Money related | Expenses, invoices, anything billable | `[$]` | `@billing` |
| Important/Urgent | What has to happen first | `[!]` | `@important` |
| Question/Discuss | Needs a decision or a conversation | `[?]` | `@discuss` |
| Alert | Something is wrong | `[^]` | `@alert` |
| Starred | Your own marker | `[*]` | `@starred` |
| Done | Finished | `[x]` | `@done` |
| Canceled | Dropped, kept for the record | `[c]` | `@canceled` |

## Due dates

Type `@` in the task and choose a date, or use **Set date** from the task's menu. The date picker understands "tomorrow", "next monday" or "aug 13", and specific times. A date can also be a range: type "aug 13 to aug 15", "next week", "september", "Q1" or "week 30", or click **+ End date** in the date picker. A task with a range becomes overdue only after its last day. Search finds them with `@due`, `@overdue`, `@today`, `@thisweek` and so on.

A due date is a deadline. When you plan to work on it is a separate choice, made in the Journal: a report can be due Friday and scheduled for Tuesday. See [The Journal](tasks-and-journal/the-journal.md).

## Assigning people

Mention someone with `@` and their name, or use **Assign people** from the task's menu. `@me` in search finds everything that mentions you, `@assigned` and `@unassigned` sort the rest. For pages, such as a project, add a property of the User type instead, and call it something like Responsible or Owner; see [Properties](collections/properties.md).

## The Tasks overview

**Tasks** in the sidebar lists tasks across the whole workspace, each with a link back to the page it lives in. Switch between **Today**, **All** and **Done**, filter to **Me**, **Me or Unassigned**, **Unassigned** or **Anyone**, and group by date, page or person. From here you can assign, set a due date, schedule a task for a day, or mark it done. Save a combination you come back to as a view of its own. The query box takes the same query language as search; see the [Query language reference](search-and-navigation/query-language-reference.md).

Section headings fold in the Tasks overview too, so a long list stays scannable.

## Search and live queries

Tasks are lines like any other, so search finds them too. The task filters combine with words, tags, people and properties: `@todo #invoice`, `@todo @me @overdue`, or `@Projects.Status="In progress" @todo` for the open tasks in active projects. See [Search](search-and-navigation/search.md) and the [Query language reference](search-and-navigation/query-language-reference.md).

Put such a query in a **Live Query** block and any page gets a task list of its own that stays current, such as "Overdue" above `@todo @overdue` on a team page. Tick a task off in the block and it's done on the page where it lives. See [Live queries](search-and-navigation/live-queries.md).

## Tasks or projects?

Tasks work best for small, concrete steps: something one person does and ticks off, like "Send the invoice" or "Book the venue". Bigger pieces of work, each with many steps, work better as pages in a collection. Make a Projects collection with properties such as Status, Owner and Due date, and plan on a board: every card is a project, and you move it from Planned to Done. Inside each project page, the tasks are its steps.

That gives you two levels. The board shows where each project stands, and the tasks in the project pages, collected in the Tasks overview, show what to do next. A project's Status and its tasks' flags are independent: a project can be In progress while most of its tasks are still open. The [Roadmap example](collections/roadmap-example.md) sets up such a collection step by step and shows how to run it.

---

# The Journal

The Journal contains a page for each day. Perfect as a scratchpad for quick entries, daily thoughts, future notes to self, and keeping track of what to do and when. When you work in a team, each member in your workspace has their own daily page, and you can leave notes on each other's journal pages.

Cmd+J opens today. Use it for the day's notes and to plan which tasks you will work on, today and this week.

*A day in the Journal: the day's tasks, with flags, and notes underneath.*

## Schedule a task

Drag any task onto a Journal day, or put the cursor on it and press Cmd+Shift+J for today. The task stays in its page and also shows on the Journal, and ticking it off in either place ticks it off everywhere.

A task can be on more than one person's Journal. Mentioning someone says who is responsible; scheduling says when they plan to do it. Both are visible to the team.

## Teammates' Journals

Everyone's Journal is in the workspace. Cmd+J always goes to your own Journal for today first; press it again while you are there and it steps through your teammates' Journals, if the workspace has any. Or click a person's name anywhere and choose **Go to Journal**.

## Upcoming

At the top of each Journal page, Upcoming lists the open tasks that need you that day. It looks at tasks that mention you or are on your Journal, and at unassigned tasks that are Important or Alert, or that have a due date and are on nobody's Journal. It shows the ones due that day, the overdue ones, and Important or Alert tasks without a due date, leaving out tasks already on the page.

The query behind it is in the Journal's **Collection Settings... → Related**, so you can change what counts. The [Query language reference](search-and-navigation/query-language-reference.md) has the default query and the variables for writing your own.

## Reviewing

Your Journal pages show your plan day by day, and the Tasks overview groups your tasks by date. In search, `@scheduled=@me @todo` lists every open task on your Journal, and `@todo and not @scheduled` what still needs a day. Unfinished tasks don't move by themselves. At the end of a day, drag what's left to tomorrow or let it go.

The Journal is part of the workspace, like every other page. For private notes, use a workspace of your own.

## Add a Journal to another workspace

The Journal is a special collection added to the first workspace in an account by default. To add one to another workspace, create a collection, for example named Journal, and open **Collection Settings... → Edit Code**. On the **Custom Code** tab, replace the code with:

```js
class Plugin extends JournalCorePlugin {}
```

Save, and the collection works as a Journal: a page per day for every member, with Upcoming at the top. A workspace can have only one Journal.

---

# Setting up a collection

A collection is a group of pages. Use it like a folder to keep pages together, or like a database, with properties, views and filters. For more advanced uses, extend it with custom code, as a plugin, to add your own views, buttons and integrations.

A simple list of docs, projects with a status and an owner, a visual board with renovation ideas, meeting notes with a date, customers with a stage and contact details: each is a collection. Every entry stays a full page where you write, add tasks and drop files.

Views are different ways of looking at the same pages. For example, you can show a collection as a table and as a board, or make several boards, such as one by Status and another by Quarter. More about the available view types below.

Click the **+** next to **Collections** in the sidebar, give the new collection a name and an icon, and you have a collection with a list of pages. Add properties and views as you need them. The [Roadmap example](collections/roadmap-example.md) walks through the whole setup, click by click.

*A collection with three views of the same pages: Itinerary, By flight and By day.*

## One or more collections

You can create as many or as few collections as you like. Your first workspace starts with a [Journal](tasks-and-journal/the-journal.md) and a Notes collection, and new pages go into Notes. Add more collections over time, or add new views to an existing one.

## Default collection

A workspace has a default collection. New pages you create with Ctrl+N (macOS) or Alt+N (Windows/Linux) go there, and Cmd+K offers it first. Admins choose it with **Set Default Collection**. To move a page to another collection later, use **Move...**; see [Pages](writing/pages.md#move-a-page).

## Collection Settings

**Collection Settings...**, in the collection's menu or the command palette, has all of a collection's settings:

- **Properties**: the fields every page in this collection has. See [Properties](collections/properties.md).
- **Views**: how the pages are shown. Add a view with **Add View**, pick its type, and choose its columns, sort order, grouping and filter. See [Views](collections/views.md).
- **Pages**: how the sidebar lists the collection's pages under **Display in Sidebar**, as a list, as sub-pages, by date, or grouped or nested by a property, which property sorts them, and whether they appear in the command palette. See [The sidebar](search-and-navigation/the-sidebar.md).
- **Related**: a query shown at the top of every page in the collection, such as all tasks that link to the page. See [Live queries](search-and-navigation/live-queries.md).
- **Edit Code**: the collection's configuration as JSON, plus optional JavaScript for formulas and custom views. See [Collection plugins](plugins/collection-plugins.md).

Changes apply to everyone in the workspace, so rename a property rather than deleting and recreating it: the values stay attached.

## Trash a collection

**Move to Trash** on a collection trashes it with its pages. **Restore Collection from Trash** in its settings brings it back.

---

# Views

A view shows the pages of a collection in a particular way. Add as many as you like in **Collection Settings... → Views**; they all show the same pages, so changing a value in one view changes it everywhere.

## The view types

**List** shows each page with its title and the first lines of its text, so you can skim a collection without opening its pages. Add a few properties or group the pages if you like. A new collection starts with a list, grouped by when pages were last edited. Good for notes, meeting notes or a handbook. To show titles only, turn off **Show Previews** in the view's settings.



**Table** shows one page per row and properties as columns. Each cell is an editor for its type: click a Choice cell for its options, a date cell for the picker. Enter edits the selected cell, Space previews the row.



**Board**, a kanban board, groups pages into columns by a property: a Choice like Status, a User like Owner, a tag, a date or a page link. Drag a card to another column and the property changes. Each card is a page; open it to keep writing.



**Gallery** shows pages as cards with a page preview or a cover image. For covers, point the view at an Image or File property.



With **Gallery Style** set to **Page Previews**, each card shows the page's banner, its title and the first lines of its text. **Page Previews (Featured First)** gives the first page a wide card across the top, like the lead story of a blog. Sort the view by date, newest first, and the latest article leads.



**Calendar** places pages by a Date & Time property, such as a due date or a publication date. Open an entry to change the date, and it moves.



**Page Shortcut** makes one page a tab of the collection's view list, next to other views like a table and board. Use it when one of the collection's pages is a home page or overview page for your collection that you want to quickly access with the other views.

## Filter, sort and group

Every view has a filter, a sort order and, where it makes sense, a grouping. Filters use the same query language as search, with the collection's name in front of its properties: `@Projects.Status="In progress"` shows only active projects, `@Projects.Owner=@me` only yours. Besides its own properties, every collection has Title, Created and Modified: `@Projects.Modified >= "last week"`. The [Query language reference](search-and-navigation/query-language-reference.md) has every operator.

Sort by any property, or choose **Custom Order** to drag pages into the order you want. A view sorted by a property keeps that order, so switch to Custom Order before arranging cards by hand.

A filter only changes what the view shows: everyone in the workspace can still find the pages it leaves out.

## Open without leaving

Enter opens the selected page, Cmd+Enter opens it aside, and Space peeks: a side panel follows along as you move through the rows with the arrow keys.

## Dynamic collections

A dynamic collection has views over pages from several collections at once. Each of its views picks its own source collections and filter: a delivery board can combine Projects and Issues, a calendar can combine blog posts and newsletters. The pages stay where they are, and editing them there edits the originals. See [Dynamic collections](collections/dynamic-collections.md).

---

# Dynamic collections

A dynamic collection shows pages from different collections in one place, as a table, a board or any other view. Each of its views is a live query: it shows every page that matches its filter, from the collections you pick, and keeps up as pages change. The pages themselves stay in their own collections. Nothing is moved or copied, and editing a page here edits the original. Other tools call this a linked database or a view across databases.

*A dynamic collection's board, with projects and issues grouped by Status.*

## What they're good for

- **One board for related work.** Projects and Issues are separate collections with their own properties, but triage happens on one board grouped by Status.
- **Everything that's yours.** A table of the projects you own and the issues assigned to you, from both collections. With `@me` in the filter, each person sees their own.
- **Follow-ups.** Customers whose next contact is due next to projects past their due date, in one list to work through.
- **A calendar across collections.** Blog posts and newsletters in one calendar, when both have a Date & Time property with the same name.
- **What changed.** The pages you edited this week, or everything created this month, wherever they live.

Within one collection, an ordinary [view](collections/views.md) is enough. A dynamic collection is for when the pages live in more than one.

## Create one

1. In the sidebar, click the **...** next to the **Collections** heading and choose **New Dynamic Collection**. The command palette's **New collection...** and the New menu (Ctrl+Shift+N on a Mac, Alt+Shift+N on Windows and Linux) have it too.
2. Thymer makes a dynamic collection with one view, **All Pages**: a table of every page in the workspace, with its title, collection and modification date, the most recently changed first. Its settings open.
3. On the **Dynamic Collection** tab, give it a name, an icon and a description.
4. On the **Views** tab, click a view to choose its **Source Collections** and its **Filter**, or add views.
5. Click **Save**. Cancel removes the new dynamic collection again.

## Which pages show up

Two settings of a view decide which pages it shows. Its **Source Collections** say which collections to look in, and its **Filter** picks pages from those. Each view has its own, so one dynamic collection can hold a board of open work and a table of recent changes.

Both are in the view's settings. Right-click the view's name at the top of the dynamic collection and choose **Table Settings...** (or **Board Settings...**, and so on), or open **Collection Settings...** and click the view on the **Views** tab.

## Sources

**Source Collections** lists the collections a view looks in. A new view starts with **All Collections**: every page in every collection of the workspace, including everyone's Journal pages. Click it and pick the collections you want, such as Projects and Issues. Remove them all to go back to All Collections.

- Only regular collections count: a dynamic collection never shows the pages of another dynamic collection.
- Pages in the trash never show.
- The sources also decide which properties the view offers; see Properties below.

## Filters

The **Filter**, further down in the same settings, narrows the pages from the sources down to the ones you want. Leave it empty to show every page from the sources.

The filter takes the [query language](search-and-navigation/query-language-reference.md). Property filters need the collection's name in front: `@Projects.Status="In progress"` matches pages in Projects only, and `@Status="In progress"` without a name is an error. To cover several collections, join their filters with OR:

| Filter | Shows |
| --- | --- |
| `@Projects.Status!="Done" OR @Issues.Status!="Done"` | Projects and issues that aren't done |
| `@Projects.Owner=@me OR @Issues.Assignee=@me` | The projects and issues of whoever is looking |
| `@Customers."Next contact" <= today OR @Projects."Due date" < today` | Customers to contact and projects past their due date |
| `@modified_by=@me @modified_at = thisweek` | Pages you changed this week |
| `@created_at = thismonth` | Pages created this month |
| `launch` | Pages with "launch" in the title or in a text property |

Use `!=` rather than `not`: `@Projects.Status!="Done"` keeps to Projects, while `not @Projects.Status="Done"` also lets in every page outside Projects. `@me` means whoever is looking, so one view can show each person their own pages. The search box above a view narrows it further.

## Properties

A dynamic collection has the properties of its source collections. Properties from different collections count as one when their name and type both match: Status as a Choice in Projects and in Issues is one Status column, with the choices of both. Each view offers the properties of its own sources.

Besides Title, Icon, Created and Modified, every dynamic collection has two more:

- **Collection**: the collection a page lives in. Changing it, in a cell or by dragging a card between columns grouped by Collection, moves the page to that collection.
- **Modified By**: who changed the page last.

Editing a value changes the page itself, in its own collection, with that collection's choices. A page whose collection lacks the property can't get a value for it: its cell can't be edited, and dragging its card to such a column says "Not available for this page".

A dynamic collection can't have properties of its own, apart from formulas: **Add Formula Property** in a view's settings, computed by the collection's code. See [Formulas](collections/formulas.md).

## Views

List, table, board, gallery, calendar and Page Shortcut all work, with sorting and grouping as in any [view](collections/views.md). Boards group by a Choice, User, Tag, Date & Time or Page Link property, or by Collection or Modified By. A board's columns come from the choices of its sources, so you can't add or rename columns on the board itself, and properties with several values can't group a board.

## The pages

- The pages are the originals. Opening one opens the page in its own collection, with its own backlinks and history.
- You can't create a page inside a dynamic collection. Create it in its own collection, and it shows up here when it matches.
- **Move to Trash** on a page trashes the page itself, everywhere.
- A page you change so it no longer matches the filter leaves the view right away.
- The sidebar lists the dynamic collection under Collections, without pages under it.

## Change or remove one

Open its settings with **Collection Settings...** in its menu in the sidebar, or the gear next to **Dynamic Collection** at the top of its panel. Change a view's sources and filter on the **Views** tab, and the name and icon on the **Dynamic Collection** tab or with **Set Title & Icon** in the sidebar.

**Move to trash** in the settings removes the dynamic collection, not the pages: they stay in their own collections. **Restore Collection from Trash** brings it back.

## Good to know

- Anyone in the workspace can create and change a dynamic collection, and the result is the same for everyone. Its code, under **Edit as Code**, is for admins.
- The [Markdown Mirror](markdown-mirror.md) gives a dynamic collection a folder with only its settings files. Its pages stay in the folders of their own collections.
- Plugins can extend a dynamic collection with a `DynCollectionPlugin`. See [Plugin API reference](plugins/plugin-api-reference.md).

---

# Properties

Properties are the fields a collection's pages share. The definition belongs to the collection; the values belong to each page. Use properties for what you want to filter, sort or group by, and the page body for everything else.

## Add a property

Open **Collection Settings...**, add a property, give it a name and pick a type. Fill in values on the page itself, above the text, or in a Table view.

*Properties sit above the text of the page.*

## Types

| Type | Holds | For example |
| --- | --- | --- |
| Text | A short text | Reference number |
| Number | A number | Hours, amount, rating |
| Choice | One of a fixed set of options | Status, priority |
| Date & Time | A date, with or without a time | Due date, meeting date |
| User | A workspace member | Owner, reviewer |
| Page Link | A link to another page | Project, customer |
| Tag | One or more tags | Topics |
| URL | A web address | Website |
| File | An attachment | Contract |
| Image | A picture | Cover image |
| Formula | A computed value | Hours times rate |

Pages also have built-in properties: title, collection, **Sub-page of**, icon, banner, and created and modified times.

## Choices

A Choice property has a list of options, each with a label and a color. Boards group by them, filters select by them, and you can add an option from the dropdown while filling in a page. Write down what each status means where the team will see it.

## Multiple values

Turn on **Allow multiple values** when a property needs more than one value: several reviewers, several related projects, several tags. Tag properties allow it by default. In formulas and plugins, read all the values with `record.users("Reviewers")` or `record.linkedRecords("Projects")`; the singular `record.linkedRecord()` returns only the first.

## Page links

A Page Link property (sometimes called a relation in database apps) connects a page to another page: each meeting to its project, each project to its customer. The linked page shows the connection in its backlinks, and a Related query can list everything that points at it. Use a page link when the relation is the same for every page in the collection, and an inline `@` link for the one-off mention in the text.

To limit a Page Link property to one kind of page, click the property in **Collection Settings... → Properties** and pick a collection under **Filter by Collection**. The property then only offers pages from that collection, and a title you type that doesn't exist yet becomes a new page there. A board grouped by the property can also group by a property of the linked page, such as meetings by the Status of their project. **Show all pages** removes the limit.

## What shows on the page

The property menu on a page switches between showing the filled-in properties, all of them, or a saved set. Property sets are defined in Collection Settings and chosen from the property menu on a page. Say you keep books and films in one Media collection, with Author, Pages, Director, Runtime and Rating as properties. A Books set shows Author, Pages and Rating; a Films set shows Director, Runtime and Rating. Open a book, pick Books, and the film properties are hidden.

Three more settings live next to the sets. **Pages open with** chooses what a page shows when it opens: filled-in properties, all of them, or a set. **Show when empty** keeps the properties you name visible even when they are blank, so Owner and Due date stay easy to fill in. **Compact display** puts properties on one row instead of a table. Which properties a view shows is separate and set per view.

---

# Formulas

A Formula property computes its value from the page's other properties. The formula is a small JavaScript function in the collection's code. You don't need the rest of the plugin API to write one.

## Add a formula

1. In **Collection Settings...**, add a property of type **Formula**. Call it Total.
2. Add the inputs it needs, say Number properties Hours and Rate.
3. Choose **Edit formula in Code Editor** on the Formula property.
4. Register the calculation in `onLoad()`:

```javascript
class Plugin extends CollectionPlugin {
    onLoad() {
        this.properties.formula("Total", ({record}) => {
            const hours = record.number("Hours");
            const rate = record.number("Rate");
            if (hours == null || rate == null) return null;
            return hours * rate;
        });
    }
}
```

Preview, check a page with values, one without, and one with zero, then save. If the collection already has code, add the `formula` call to its existing `onLoad()` instead of replacing the class.

## Writing them

Return `null` when there is no sensible answer, so an empty input stays empty instead of becoming zero. Formulas run every time a row is drawn, so keep them quick: read the properties you need and return a value, without network requests or writes.

Readers: `record.number()`, `record.text()`, `record.choice()`, `record.users()`, `record.linkedRecord()` and `record.linkedRecords()`. A choice comes back as its id; `PluginProperty.choiceLabel()` gives the label.

## Two more examples

A progress percentage from two numbers:

```javascript
this.properties.formula("Progress", ({record}) => {
    const done = record.number("Completed");
    const planned = record.number("Planned");
    if (done == null || planned == null || planned <= 0) return null;
    return Math.round(100 * done / planned);
});
```

The number of linked projects, from a multi-value Page Link, which is how you build a rollup:

```javascript
this.properties.formula("Project count", ({record}) => {
    return record.linkedRecords("Projects").length;
});
```

For custom rendering, sorting and views, continue with [Collection plugins](plugins/collection-plugins.md).

---

# Roadmap example

This example builds a roadmap: a collection where each page is a project. Every project gets a Status, the Quarter it's planned for, a Responsible person and an Effort. At the end you have three views of the same projects: a table, a board by status and a board by quarter. It takes about fifteen minutes on a computer, and every step works the same for any collection you build later.

*The finished roadmap as a table.*

## 1. Create the collection

1. Hover the **Collections** heading in the sidebar and click the **+** next to it.
2. The new collection opens with its title ready for typing. Type **Roadmap** and press Enter.

Escape at this point removes the new collection again.

## 2. Name its pages

1. Click the gear next to **Collection** at the top of the panel, or choose **Collection Settings...** in the collection's menu in the sidebar. The settings open next to the collection.
2. On the **General** tab, pick an icon with the button in front of the name.
3. Under **What do you call a page in this collection?**, type **Project**.

From now on the buttons say **New Project**, and new pages start as "Untitled Project".

## 3. Add the properties

On the **Properties** tab, click **Add Property** once for each property below. Type its name first, then pick its type from the list, for example `Create "Status" as Choice`.

| Name | Type | Settings |
| --- | --- | --- |
| Status | Choice | The choices Planned, Doing, Completed and Maybe |
| Quarter | Date & Time | None |
| Responsible | User | None |
| Effort | Choice | The choices High, Medium and Low |

For a Choice, type each option in **Add a choice...** and press Enter. The order of the choices is the order of the board's columns later; drag the grip in front of a choice to move it. Thymer gives each choice a color, and the square in front of it changes the color. Click **Done** when a property is complete.

## 4. Set up the views

A new collection has one view, **List**. Turn it into the table, then add the two boards. Views are on the **Views** tab: click one to edit it.

**The table**

1. Click **List**. Change the **View name** to **All projects** and set **View as** to **Table**.
2. Under **Properties**, turn on Status, Quarter, Responsible and Effort with the switch in each row. A view you make after adding properties shows only the title until you do.
3. Set **Sort by** to **Quarter**, and pick **Ascending** in the direction menu beside it, so the earliest quarter comes first.

**The board by status**

1. Click **Add View** and pick **Board**. Name it **By status**.
2. Check that **Board columns** is set to **Status**.
3. Under **Properties**, turn on Quarter and Responsible, so each card shows them.

**The board by quarter**

1. Click **Add View** and pick **Board** again. Name it **By quarter**.
2. Set **Board columns** to **Quarter**. A setting called **One column per** appears below it: choose **Quarter**.
3. Under **Properties**, turn on Status and Responsible.

Click **Save**. To change the order of the view buttons, drag the views in the list on the **Views** tab before saving.

## 5. Add the projects

1. Open **By status** and click **New Project** at the bottom of the **Planned** column. A card appears with its Status already set to Planned. Type the name of the project.
2. Add a few more, in whichever column fits.
3. Fill in the other values in **All projects**. Click a cell and click it again, or press Enter, to change it:
   - **Quarter**: type `Q3 2026` and press Enter. The table shows it as Q3 2026.
   - **Responsible**: pick a person from the list.
   - **Effort**: pick High, Medium or Low.

You can also set them on a project's own page, where the properties sit at the top. On a new page they start hidden: click **Add property...** to fill one in.

*The board by status: a column for each choice, in the order of the choices.*

## 6. Use it

- On **By status**, drag a card to another column to change its status.
- **By quarter** has a column for each quarter that has projects, in date order, and a **None** column for projects without a quarter. Drag a card to another quarter to plan it there: its Quarter becomes that whole quarter.
- Open a card to write the project's brief, notes and tasks. Every card is a full page. Cmd-click it to open it next to the board.
- In the table, click a column header and choose **Sort ascending** or **Sort descending**. Such a sort is temporary: choose **Update view defaults** in the view's menu to make it the view's order for everyone.

*The board by quarter: one column per quarter that has projects.*

## 7. Run it every week

Write each project's brief in its page: what done looks like, the relevant links, decisions as they are made, and the next steps as tasks, mentioning the person who does each. The Status tracks the project as a whole, and the tasks its steps.

Once a week, open **By status** together. Move cards, look at what is stuck and on whom, and update Responsible and Quarter. Open a card aside when a question needs the brief. Afterwards, everyone drags their next tasks onto their Journal, which shows when they plan to do them.

## Good to know

- A quarter gets a column once a project is planned in it. Empty quarters don't show.
- A board shows its **None** column only while some project has no value for its property.
- Board columns follow the order of the choices. To reorder them, drag the choices in the property's settings. Click a column's header on the board to rename that choice, or the **+** after the last column to add one.
- Cards in a column are sorted by when they were last changed. To drag cards into your own order, set the board's **Sort by** to **Custom Order**.
- There are quicker ways to the same result: the **+** at the end of a table's header adds a property, and the **+** next to the view buttons adds a view.

## Where to go from here

- Give a view a filter, such as `@Roadmap.Status!="Completed"` to hide finished projects, or `@Roadmap.Responsible=@me` to show each person their own. See [Views](collections/views.md).
- Add a **Calendar** view on Quarter, or a **Page Link** property to connect projects to customers or issues. See [Properties](collections/properties.md).
- Keep issues in their own collection, with a Page Link from each issue to its project, and show both on one board with a [dynamic collection](collections/dynamic-collections.md).
- Link meeting notes and design documents to the project they concern; its backlinks then collect the discussion.

---

# The sidebar

The sidebar on the left is the map of a workspace: the workspace you're in, Search, Jump To and Tasks, the pins, and every collection with its pages. Cmd+\ (Alt+B on Windows and Linux) folds it into a strip of icons and opens it again.

*Projects grouped by Status, with the collection's menu open.*

## What's in it

From top to bottom:

- **The account button**, with your picture and the workspace's name. Click it to switch workspaces with **Switch Workspace**, open **Settings...**, reload the workspace or log out.
- **Search**, **Jump To** and **Tasks**. See [Search](search-and-navigation/search.md) and [Tasks](tasks-and-journal/tasks.md).
- **Pinned**: shortcuts to pages, collections, views, files, lines and blocks. It shows up once something is pinned.
- **Collections**: every collection in the workspace, each with its pages under it. The Journal is one of them; clicking it opens today's page.
- **Tags**: every tag in the workspace. Click one to search for it.
- **Trash**: switches the sidebar to what's in the trash, to open or restore it.

Click a heading to fold it. Each device remembers which headings are open. Plugins can add their own rows near the top; see [Plugins](plugins.md).

## Collections

- Click a collection to open it. Click the arrow in front of it, or double-click the row, to show or hide its pages.
- Hover a collection for two buttons: **+** makes a new page in it, and **...** opens its menu. Right-click opens the same menu: **Open**, **Set Title & Icon**, **Collection Settings...**, **New Page**, **Pin**, and the **Display As** choices below. Admins also see **Default for new pages**.
- Drag collections up and down to change their order. The order is the same for everyone in the workspace. New collections start at the top.
- The **+** next to the **Collections** heading makes a new collection. The heading's **...** has **New Collection** and **New Dynamic Collection**; see [Dynamic collections](collections/dynamic-collections.md).

## How a collection lists its pages

How a collection shows its pages in the sidebar is part of the collection, so it's the same for everyone in the workspace, and anyone can change it. Pick a choice under **Display As** in the collection's menu, or under **Display in Sidebar** on the **Pages** tab of **Collection Settings...**:

| Choice | What the sidebar shows |
| --- | --- |
| Don't show pages | Only the collection |
| List | All pages in one list |
| Sub-pages | Pages under the page they belong to, as a tree. Turn on **Enable Sub-Pages** on the same tab first |
| By date created | Pages under Today, Yesterday, Previous 7 days, Previous 30 days, Earlier this year and Older, by when they were made |
| By date modified | The same, by when they last changed |
| Group by Property... | Pages under a heading for each value of a Choice or a Date & Time property |
| Nest by Property... | Pages in folders by a Choice property, in year and month folders by a Date & Time property, or under the page a Page Link property points to |
| Custom | A layout written in the collection's code; see [Collection plugins](plugins/collection-plugins.md) |
| Hide completely | Nothing. The collection moves behind **Show more...** at the end of Collections |

Groups of a Choice property follow the order of its choices, with a group at the end for pages that have none. Groups of a date use the same headings as the date modes, plus Upcoming for dates still to come. Sub-pages show as a tree only in the Sub-pages mode, and as a plain list in the others.

**Sort in Sidebar**, on the same tab, sets the order of the pages: pick a property and **Descending** or **Ascending**. Sort by Modified, descending, to see the page you changed last at the top, or by Title, ascending, for alphabetical order. New collections show their sub-pages, sorted by Modified with the newest first.

To bring back a collection you hid completely, click **Show more...** at the end of Collections and pick another choice in its menu. Another switch on the **Pages** tab leaves the collection's pages out of the command palette.

## Pins

- Pin a page, collection, view, file, line or block with **Pin** in its menu, or with **Pin Page**, **Pin View** or **Pin Collection** in the command palette.
- Pins are shared: everyone in the workspace sees the same pins, in the same order. Drag them to reorder them.
- **Unpin** in a pin's menu removes the pin. What it points to stays as it is.
- With more than 50 pins, **Show more...** shows the rest.

## Opening and moving pages

- Click a page to open it in the current panel. Cmd-click or middle-click opens it in a panel next to the current one. While one panel is open, the row's menu also has **Open Aside**.
- Drag a page, collection or pin onto a panel to open it there, or near the left or right edge of a panel to open it in a new panel on that side.
- Hover a page for its **...** menu: **Set Title & Icon**, **Version History...**, **Change Banner...**, **Move...**, **Move to Trash**, **Create sub-page** and **Pin**. In a collection with sub-pages, the page's **+** makes a sub-page.
- In the Sub-pages mode, drag a page onto another page to put it under that page, or onto the collection to move it back to the top level. To move a page to another collection, use **Move...**.

## Folding, resizing and the keyboard

- Cmd+\ (Alt+B on Windows and Linux), **Toggle Sidebar** in the command palette, or the round button on the sidebar's edge folds the sidebar into a strip of icons and opens it again. Once you have pins, right-click the strip to choose whether it shows your collections, your pins or both. Focus Mode hides the sidebar completely; see [Panels and Focus Mode](search-and-navigation/panels-and-focus-mode.md).
- Drag the sidebar's right edge to make it wider or narrower. Dragging it very narrow folds it. Each device remembers the width.
- Cmd+0 (Ctrl+0 on Windows and Linux), or **Go to Sidebar** in the command palette, moves the keyboard to the sidebar. The arrow keys move up and down and open each page as you reach it. Right and Left show and hide a collection's pages. Cmd+Enter opens a row aside, F2 renames it, Ctrl+O opens its menu, and Esc goes back to the page.

## On phones and tablets

- On a phone, the sidebar slides in from the menu button at the top of the page, and closes when you open a page. At the top are Search, Tasks and Today. Long-press the menu button to go straight to today's Journal page.
- **Settings → Mobile Navigation** chooses between **Top Menu**, the default, and **Icon Strip**, which keeps a strip of icons on screen. See [Mobile apps](apps-and-settings/mobile-apps.md).
- The floating pencil button makes a new page in the default collection.
- On a phone, there's no dragging, no hover buttons and no Collection Settings. Tablets have the full sidebar, but without dragging to reorder or hover buttons.

---

# Search

Press Cmd+Shift+F or open **Search** in the sidebar. Type words to find them anywhere in the workspace. Results are lines, grouped by the page they belong to, up to 100 at a time, with the best text matches first. Open one in place, or aside with Cmd+Enter so the search stays where it is. Add `@page` to get pages instead of lines.

A search can be a few words, like `release notes`, or a precise query, like `@todo @overdue @Projects.Owner=@me`. Words, `#tags`, `@` filters for tasks, dates, people and properties, and `AND`, `OR` and `NOT` combine freely. The [Query language reference](search-and-navigation/query-language-reference.md) lists every filter and operator, with dozens of examples.

## Starter queries

```text
@todo @me                              my open tasks
@overdue                               past their due date
@scheduled=@me @todo                   open tasks on my Journal
@todo and not @scheduled               not planned yet
#research @thismonth                   tagged lines with a date this month
@Projects.Status="In progress" @page   active projects
```

## The same language everywhere

- View filters in a collection take a query; see [Views](collections/views.md).
- A query dragged onto a page becomes a [live query](search-and-navigation/live-queries.md) block.
- A collection's Related section runs a query for each page, with `$currentpage` as the context.
- The Tasks overview, the CLI's `search` command and MCP's search tool use it too.

**Search Help** in the command palette opens a summary of the syntax inside the app.

---

# Query language reference

Thymer has one query language. It works in the search panel, in live query blocks, in collection view filters and dynamic collections, in a collection's Related section, in the Journal's Upcoming section, in the Backlinks filter, in the Tasks overview, and in the CLI and MCP search commands. This page lists all of it.

A query finds lines: paragraphs, headings, tasks and every other kind of line in your pages. Add `@page` to find pages instead. Matching ignores case and accents. The query box suggests filters as you type and explains what is wrong when a query can't run. **Search Help** in the command palette has a short summary inside the app.

## Words and phrases

| Query | Matches |
| --- | --- |
| `budget` | Lines that contain "budget" anywhere, also inside a longer word such as "budgets" |
| `release notes` | Lines that contain both words, in any order |
| `"release notes"` | Lines that contain the exact phrase |

For pages, words also match the title, the values of Text, Number and URL properties, and the names of attached files. A quote you haven't closed yet counts as closed, so results stay put while you type.

## Combining terms

| Syntax | Meaning |
| --- | --- |
| `a b` | Both; a space works like AND |
| `a AND b`, `a && b` | Both |
| `a OR b`, `a \|\| b` | Either |
| `NOT a`, `!a` | Not a |
| `(a OR b) AND c` | Parentheses group terms |

AND binds more strongly than OR, so `a OR b c` means `a OR (b AND c)`. Use parentheses for anything else: `(a OR b) c`. A missing closing parenthesis is added for you.

NOT applies to the word, filter or comparison right after it: `not @done`, `not #draft`, `@todo and not @scheduled`, `not @Projects.Status="Done"`. Put parentheses around several terms: `not (#draft or #archived)`.

## Tasks

| Filter | Matches |
| --- | --- |
| `@task` | Every task |
| `@todo` | Tasks that are not done |
| `@done` | Tasks that are done |
| `@due` | Open tasks that have a date |
| `@overdue` | Open tasks whose last date is before today |
| `@assigned` | Tasks that mention someone |
| `@unassigned` | Tasks that mention nobody |
| `@scheduled` | Tasks on anyone's Journal |
| `@scheduled=@me`, `@scheduled=ada` | Tasks on a particular person's Journal |

Canceled tasks are not done, so `@todo`, `@due` and `@overdue` include them; add `not @canceled` to leave them out.

Each task flag has a filter of its own:

| Flag | Filter |
| --- | --- |
| In progress | `@inprogress` or `@wip` |
| Blocked | `@waiting` |
| Cost/Money related | `@billing` |
| Important/Urgent | `@important` |
| Question/Discuss | `@discuss` |
| Alert | `@alert` |
| Starred | `@starred` |
| Done | `@done` |
| Canceled | `@canceled` |

A due date is a date on the task itself. Scheduling puts the task on someone's Journal for a day. A task can have either, both or neither, so `@due` and `@scheduled` find different tasks.

`@scheduled` tells whether a task is on a Journal, not on which day. Date filters look at the dates written in a task, not at the Journal day it is planned for, so `@scheduled=@me @thisweek` finds tasks on your Journal that also have a date this week written in them. To see tasks by the day they are planned for, open the Journal. See [Tasks](tasks-and-journal/tasks.md) and [The Journal](tasks-and-journal/the-journal.md).

## People

| Filter | Matches |
| --- | --- |
| `@me` | Lines that mention you |
| `@ada`, `@"Ada Lovelace"` | Lines that mention a member, by handle, full name or email |
| `@mention` | Lines that mention anyone |
| `@mention=ada`, `@mention=@me` | The same as `@ada` and `@me` |
| `@created_by=ada`, `@modified_by=@me` | Lines and pages someone created, or changed last |

A name has to match in full; case doesn't matter. If the word after `@` can be read as a date, it is one: `@june` is the month of June. Write `@mention=june` to find a member called June.

## Pages, line types and links

| Filter | Matches |
| --- | --- |
| `@page` | Pages instead of lines; `@document` and `@record` work too |
| `@heading`, `@text`, `@quote`, `@list`, `@task`, `@image`, `@file` | Lines of that type; `@list` covers bulleted and numbered lists |
| `@type=heading` | The same by type name: `text`, `heading`, `task`, `quote`, `ulist`, `olist`, `image`, `file`, `document` |
| `@link` | Lines with a web link |
| `@link="github"` | Lines with a web link whose address contains the text |
| `@linkto="Website launch"` | Lines that link to that page |
| `@Projects`, `@"Meeting notes"` | Everything in that collection |
| `@collection=Projects` | The same |

`@page budget` finds pages with "budget" in the title or in a property. Quote a name that contains a space.

## Dates

A line's dates are the dates written in it. A page's dates are the values of its Date & Time properties. A date filter matches when any of them falls in the range. Quote an expression that contains a space or a colon.

| Kind | Examples |
| --- | --- |
| Days | `@today`, `@tomorrow`, `@yesterday`, or `@tod`, `@tom`, `@yes` |
| Weekdays | `@monday`, `@tue`, `@"next monday"`, `@"last friday"`, `@-tuesday` for last Tuesday |
| Weeks | `@thisweek`, `@nextweek`, `@lastweek`, `@"week 10"`, `@"week 1 of 2025"` |
| Months and years | `@thismonth`, `@"next month"`, `@march`, `@"June 2026"`, `@thisyear`, `@"last year"` |
| Days of a month | `@"aug 13"`, `@"13 aug"`, `@jan1st`, `@9th`, `@"aug 13 2026"`, `@"2nd of May 2025"` |
| Quarters | `@q1`, `@"2024 q4"` |
| Relative | `@"in 3 days"`, `@"5 days"`, `@"3 days ago"`, `@"2 weeks from now"`, `@"last 3 months"`, `@"next 4 weeks"` |
| Ranges | `@"monday to friday"`, `@"9th to 12th"`, `@"2026-10-01 to 2026-10-31"`, `@2026-10-01..2026-10-31` |
| Times | `@3pm`, `@430pm`, `@15:21`, `@morning` (6am to 12pm), `@afternoon` (12 to 5pm), `@evening` (5 to 10pm) |
| Day and time | `@"tomorrow 3pm"`, `@"3pm wed"`, `@"monday at 9am"`, `@"friday noon"`, `@"friday 2pm to 4pm"` |
| Exact | `@2026-10-09`, `@"2026-10-09 15:00"`, `@"15/04/2023"`, `@"Oct 9 2026 3:21 PM"` |

A weekday, month or day of the month without a year means the next one to come, and the current month counts as passed. In October, `@march` is next March and `@9th` is the 9th of November; in June, `@june` is next June, so use `@thismonth` for this one. Add the year to look back: `@"march 2026"`, `@"june 5 2026"`.

`@"5 days"`, `@"in 3 days"` and `@"30 days ago"` are single days. `@"2 weeks from now"` and `@"2 weeks ago"` are whole weeks, and `@"3 months ago"` and `@"1 year ago"` whole months: in October, `@"3 months ago"` is July. `@"next 2 weeks"` and `@"last 3 months"` are the weeks or months right after or before the current one. A time without a day, such as `@3pm` or `@"3pm to 5pm"`, matches lines that have a time but no date, such as "call Ada at 3pm". To search a time on a particular day, add the day: `@"friday 2pm to 4pm"`. A day with a time also matches lines with that date and no time.

Weeks start on the day set in **Settings → Date & Time**, and dates are read in your own time zone.

## Comparing dates

Put a date filter on the left, then an operator, then a date. The `@` in front of the date is optional, so `@due <= today` and `@due <= @today` are the same:

```text
@due <= today
@due < 2026-11-01
@date = "this week"
@modified_at >= yesterday
@created_at < "2026-01-01"
@time = "3pm to 5pm"
```

| Left side | Looks at |
| --- | --- |
| `@due` | Dates on open tasks |
| `@date` | Dates in any line, and the Date & Time properties of pages |
| `@created_at`, `@modified_at` | When a line or page was created or last changed; an edit anywhere in a page changes the page |
| `@time` | Times of day without a date, with `=` and `!=` only |

The date on the right is usually a range, such as `today` or `"this week"`. Then `=` means within it, `!=` outside it, `<` before it starts, `<=` before it ends, `>` after it ends, and `>=` from its start on. So `@due <= today` is everything due today or earlier. A line with several dates matches `=`, `<=` and `>=` when one of its dates does, and `<` and `>` only when all of them do.

## Tags

| Query | Matches |
| --- | --- |
| `#research` | Lines with exactly that tag |
| `#projects/` | Tags under `#projects`, such as `#projects/alpha` |
| `#client-` | Tags that start with `client-`, such as `#client-acme` |
| `@hashtag=research` | The same as `#research` |

## Collection properties

Write the collection's name, a dot, the property's name, an operator and a value. Quote a name or a value that contains a space.

```text
@Projects.Status="In progress"
@Projects.Owner=@me
@Handbook."Review date" < today
@Projects.Owner=""
```

A property filter matches the page and every line on it. Add `@page` to list only the pages, or `@task` for the tasks on them: `@Projects.Owner=@me @page` lists your projects, and `@Projects.Status="In progress" @overdue` the overdue tasks in active projects.

Every collection also has **Title**, **Created** and **Modified**: `@Projects.Title=launch`, `@Projects.Created >= "this month"`.

| Type | Operators |
| --- | --- |
| Text, URL | `=` contains, `===` is exactly, `!=` doesn't contain, `!==` isn't exactly; `<`, `<=`, `>`, `>=` compare alphabetically |
| Number | `=`, `!=`, `<`, `<=`, `>`, `>=` |
| Date & Time | All of them, with a date on the right as in Comparing dates above; a time without a day doesn't work here |
| Choice | `=` and `!=`, with the full label of an option in any case |
| User | `=` and `!=`, with a handle, a name, an email or `@me` |
| Page Link | `=` when a linked page's title contains the text, `!=` when none does |
| Tag | `=` and `!=`; the `#` is optional, and `#client/` matches every tag under `#client` |
| File, Image | `=` when the file name contains the text, `===` is exactly, `!=`, `!==` |

An empty value finds pages where the property is empty, `=""`, or filled in, `!=""`. `:` works the same as `=`. For Choice, User, Tag, Page Link and Date & Time, `===` and `!==` work the same as `=` and `!=`. Formula properties are computed when they are shown, so they can't be queried.

When a name doesn't match, the error lists what you can use: the collections, the properties of that collection, the options of a Choice property, or the members.

## Built-in properties

These work on any line or page, written as `@name`, an operator and a value.

| Property | Matches |
| --- | --- |
| `@text="budget"`, `@text==="send the invoice"` | The text of a line, or a page's title: `=` contains, `===` is exactly, and `!=`, `!==` |
| `@type=task` | The line type; see Pages, line types and links above |
| `@date`, `@due`, `@time` | Dates and times; see Comparing dates above |
| `@created_at`, `@modified_at` | When it was created or last changed |
| `@created_by`, `@modified_by` | Who created it or changed it last |
| `@mention=ada` | Who it mentions |
| `@scheduled=ada` | Whose Journal the task is on |
| `@collection=Projects` | The collection it belongs to |
| `@link="github"` | A web link whose address contains the value |
| `@linkto="Website launch"` | A link to that page, by title or guid |
| `@hashtag=research` | A tag |
| `@guid=…`, `@pguid=…`, `@rguid=…`, `@backref=…` | A line by its guid, its parent's guid or its page's guid, or the lines that a guid refers to; for scripts and plugins |

## Where queries work

### Search

The search panel, Cmd+Shift+F, takes any query. See [Search](search-and-navigation/search.md).

### Live query blocks

A live query block runs its query inside a page and keeps the results current. See [Live queries](search-and-navigation/live-queries.md).

### Collection views and dynamic collections

A view's filter, set in **Collection Settings... → Views**, decides which of the collection's pages the view shows. Use the collection's properties with its name in front, built-in filters such as `@created_at` or `@modified_by`, and words for the titles: `@Projects.Status!="Done"`, `@Projects.Owner=@me`, `@Projects.Modified >= "last week"`, `@modified_by=@me`. Relative dates move along by themselves, so a view filtered on `@Projects."Due date" < today` stays current. `@me` in a view filter means whoever is looking, so one shared view of `@Projects.Owner=@me` shows each person their own projects. A view without a filter shows all of the collection's pages. See [Views](collections/views.md).

In a dynamic collection, each view has its own filter, which picks pages from that view's source collections with the whole language. Put the collection's name in front of each property, and join several collections with OR: `@Projects.Status!="Done" OR @Issues.Status!="Done"`. See [Dynamic collections](collections/dynamic-collections.md).

### Related

**Collection Settings... → Related** runs a query at the top of every page in the collection, with `$currentpage` for the page being viewed and `$currentcollection` for its collection. These two variables work only there. See [Related content on every page](search-and-navigation/live-queries.md#related-content-on-every-page) for examples.

### The Journal's Upcoming section

Upcoming, at the top of each Journal page, is the Journal collection's Related query. By default it shows open tasks that are yours, because they mention you or are on your Journal, and unassigned tasks that are Important or Alert, or that have a due date and are on nobody's Journal. Of those it lists the tasks due that day, the overdue ones, and Important or Alert tasks without a due date, leaving out tasks already on the page. The default query:

```text
@todo && (@mention=$journaluser || @scheduled=$journaluser || (((@important || @alert) && @unassigned) || (@due && @unassigned && !@scheduled))) && ((!@due && (@important || @alert)) || (@due >= $journaldate && @due <= $journaldate) || @overdue) && @backref!=$journalpage
```

To change it, open **Collection Settings... → Related** on the Journal. Three variables are filled in for each Journal page: `$journaldate` for its day, `$journaluser` for the person whose Journal it is, and `$journalpage` for the page itself. An empty query brings back the default.

### Backlinks

**Filter backlinks**, at the top of the Backlinks section, takes a query and shows only the backlinks that match. The section's sort menu orders backlinks by **Recent**, by **Journal date** or by **Page title**.

### The CLI and MCP

`thymercli search "@todo @me" --limit 50` runs a query from the terminal, and the MCP search tool takes the same syntax. See [The CLI](ai-agents-and-cli/the-cli.md) and [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md).

## When a query doesn't work

The query box shows what it couldn't understand. The messages you are most likely to see:

| Message | What to check |
| --- | --- |
| Unknown magic tag | A misspelled filter, or a word after `@` that is no date, member or collection. Quote names that contain a space. |
| No collection, No property | The collection or property name isn't right. The message lists the ones there are. |
| You can only filter on fields in the current collection | A view filter names another collection. Use the view's own collection. |
| Invalid property | The value isn't an option of that Choice property. Use an option's full label; the message lists them. |
| No such user | No member has that handle, name or email. The message lists the members. |
| Cannot parse date | The date isn't one Thymer understands. Quote a date that contains spaces, such as `@"next monday"`. |
| Filtering time range w/o date is not supported | A Date & Time property needs a date, not only a time. |
| Invalid matching operator | That type doesn't take that operator, such as `>` on a Choice. See Collection properties above. |
| Unsupported field type "formula" | Formula properties can't be queried. |

When a query runs but finds less than you expected:

- A date without a year means the next one. Add the year for dates in the past: `@created_at < "june 5 2026"`.
- `@due` and `@overdue` skip done tasks, and `@todo` includes canceled ones.
- Date filters look at the dates written in lines and at Date & Time properties, not at the Journal day a task is planned for.
- A view that shows nothing has a filter that matches nothing, or one that can't run. Start from a single property filter in **Collection Settings... → Views** and add terms back one at a time.
- Search and live query blocks stop at 100 results. Narrow the query to see the rest.

## Examples

The collection examples use a few typical collections: Projects with Status, Owner, Due date and Priority; Meetings with Date, Participants and Project; Customers with Stage, Next contact and Estimated value; and a Handbook with Owner and Review date. Put in your own collection and property names.

### Your tasks

| Query | Finds |
| --- | --- |
| `@todo @me` | Your open tasks |
| `@todo and (@me or @scheduled=@me)` | Your open tasks, mentioned or on your Journal |
| `@scheduled=@me @todo` | Open tasks on your Journal, on any day |
| `@todo @me not @scheduled` | Your open tasks that aren't planned for a day yet |
| `@todo @me not @due` | Your open tasks without a due date |
| `@important @me` | Your tasks flagged Important |
| `@inprogress @me` | What you have in progress |
| `@todo @me @"Meeting notes"` | Your open tasks from meeting notes |
| `@done @me @modified_at = thisweek` | Your done tasks that were last changed this week |

### Due dates

| Query | Finds |
| --- | --- |
| `@due = today` | Tasks due today |
| `@due = tomorrow` | Tasks due tomorrow |
| `@due = thisweek` | Tasks due this week |
| `@due = nextweek` | Tasks due next week |
| `@due <= today not @canceled` | Tasks due today or earlier |
| `@overdue` | Overdue tasks |
| `@overdue @me` | Your overdue tasks |
| `@due >= today @due <= "in 14 days"` | Tasks due in the next two weeks |
| `@due < "dec 1 2026"` | Tasks due before December 1, 2026 |
| `@due = "june 2026"` | Tasks due in June 2026 |
| `@todo not @due @important` | Important tasks without a deadline |

### Created and changed

| Query | Finds |
| --- | --- |
| `@task @created_at < "june 5 2026"` | Tasks created before June 5, 2026 |
| `@task @created_at = "june 2026"` | Tasks created in June 2026 |
| `@task @created_at = "q3 2026"` | Tasks created in the third quarter of 2026 |
| `@page @created_at = thisweek` | Pages created this week |
| `@page @created_at >= "30 days ago"` | Pages created in the last 30 days |
| `@page @modified_at >= yesterday` | Pages changed since yesterday |
| `@page @modified_at < "2026-01-01"` | Pages nobody has changed since 2025 |
| `@modified_by=@me @modified_at = today` | Lines you changed today |
| `@created_by=ada @created_at = lastweek` | What Ada wrote last week |
| `@done @modified_at = thisweek` | Done tasks that were last changed this week |
| `@todo @created_at < "3 months ago"` | Open tasks older than about three months |

### Team and people

| Query | Finds |
| --- | --- |
| `@todo @mention=ada` | Ada's open tasks |
| `@scheduled=ada @todo` | Open tasks on Ada's Journal |
| `@overdue @unassigned` | Overdue tasks nobody owns |
| `@todo @unassigned @Meetings` | Open actions from meetings that nobody owns |
| `@assigned @todo not @me` | Open tasks assigned to someone other than you |
| `@me not @task` | Lines that mention you and aren't tasks |
| `@waiting` | Blocked tasks |
| `@discuss` | Tasks marked Question/Discuss |
| `@alert or @important` | Tasks flagged Alert or Important |

### Projects and other collections

| Query | Finds |
| --- | --- |
| `@Projects @page` | Every project page |
| `@Projects.Owner=@me @page` | Your projects |
| `@Projects.Status="In progress" @page` | Active projects |
| `@Projects.Status!="Done" @Projects."Due date" < today @page` | Projects past their due date |
| `@Projects.Owner="" @page` | Projects without an owner |
| `@Projects.Owner=@me @todo` | Open tasks in your projects |
| `@Projects.Status="In progress" @overdue` | Overdue tasks in active projects |
| `@Projects.Priority="High" @todo` | Open tasks in high-priority projects |
| `@Meetings.Date = lastweek @page` | Last week's meetings |
| `@Meetings.Date = lastweek @todo` | Open actions from last week's meetings |
| `@Meetings.Participants=@me @page` | Meetings you took part in |
| `@Meetings.Project="Website launch" @todo` | Open actions from meetings about one project |
| `@Customers.Stage="Trial" @page` | Customers in their trial |
| `@Customers."Next contact" <= today @page` | Customers to contact today or earlier |
| `@Customers."Estimated value" >= 10000 @page` | Customers worth 10,000 or more |
| `@Handbook."Review date" < today @page` | Handbook pages due for a review |
| `@Handbook.Owner="" @page` | Handbook pages nobody owns |

### Content, tags and links

| Query | Finds |
| --- | --- |
| `@heading launch` | Headings that contain "launch" |
| `"launch plan" @page` | Pages with "launch plan" in the title or a property |
| `@quote budget` | Quotes that mention the budget |
| `#research` | Lines tagged #research |
| `#projects/` | Lines with any tag under #projects |
| `#idea not @task` | Ideas that aren't tasks yet |
| `#research @thismonth` | Tagged lines with a date this month |
| `not (#draft or #archived)` | Lines tagged neither #draft nor #archived |
| `@linkto="Website launch"` | Everything that links to a page |
| `@task @linkto="Website launch" @todo` | Open tasks that link to a page |
| `@link="figma"` | Lines with a Figma link |
| `@image @Projects` | Images on project pages |
| `@file @created_at >= "last month"` | Files added since the start of last month |

### Dates written in lines

| Query | Finds |
| --- | --- |
| `@today` | Lines with today's date in them |
| `@thisweek @task` | Tasks with a date this week |
| `@"next monday"` | Lines with next Monday's date |
| `@"monday to friday" @task` | Tasks with a date from Monday to Friday |
| `@3pm` | Lines with the time 3pm and no date |
| `@"tomorrow 3pm"` | Lines for tomorrow at 3pm, and lines dated tomorrow without a time |
| `@"q3 2026" @page` | Pages with a Date & Time property in the third quarter of 2026 |

### View filters

These go in **Collection Settings... → Views**, in a view of the Projects collection.

| Filter | Shows |
| --- | --- |
| `@Projects.Status!="Done"` | Projects that aren't done |
| `@Projects.Owner=@me` | Each viewer's own projects |
| `@Projects.Owner=""` | Projects without an owner |
| `@Projects.Status="Planned" OR @Projects.Status="In progress"` | Planned and active projects |
| `@Projects.Priority="High" @Projects.Status!="Done"` | Open high-priority projects |
| `@Projects."Due date" = thisweek` | Projects due this week |
| `@Projects."Due date" < today @Projects.Status!="Done"` | Late projects |
| `@Projects.Created >= "this month"` | Projects created this month |
| `@Projects.Modified < "2026-01-01"` | Projects nobody has changed since 2025 |
| `launch` | Projects with "launch" in the title |

### Related queries

These go in **Collection Settings... → Related**.

| Query | Shows at the top of each page |
| --- | --- |
| `@task @linkto=$currentpage` | Tasks that link to the page |
| `@todo @linkto=$currentpage` | Open tasks that link to the page |
| `@linkto=$currentpage @page` | Pages that link to the page |
| `@task @linkto=$currentcollection` | Tasks that link to the collection |

---

# Live queries

A live query is a search inside a page. It shows the matching lines and keeps up as the workspace changes. Use it for a dashboard, a project review, or the list of things waiting on you.

## Make one

Run a search and drag the query from the search panel onto a page. Or pick **Live Query** from the @-menu and type the query. **Change query** in the block's menu edits it later. Give the block a heading that says what it shows, such as "Overdue" above `@todo @overdue`. A block without a query shows `@today`.

## What it shows

- The results are the real lines, not copies. Edit one or tick a task off, and the change is made in the page it lives on.
- Up to 100 results: pages first, then lines, not sorted further. Lines that start matching are added at the end.
- A line that stops matching, such as a task you just ticked off, stays in the block until it loads again, for example when you open the page again.
- With nothing to show, the block says "No results". A query that can't run shows its error in the block.
- The block folds like any other section.

## Pages instead of lines

A query matches lines anywhere in the workspace, so one block can show a task from one page next to a paragraph from another. Add `@page` to get only pages: each result is a page, matched on its title and properties, not on the lines inside it. That makes a box of related pages, such as on a customer's page:

```text
@page @linkto="Acme"                   pages with Acme in a Page Link property
@page @Projects.Status="In progress"   active projects
@page @created_at = thisweek           pages created this week
```

## A dashboard page

A team page works well with three or four narrow queries:

```text
@todo @overdue                 overdue work
@due = thisweek                due this week
@todo @waiting                 waiting on others
@discuss                       open questions
```

Add links to the project board and the handbook, and pin the page. For a table or board of pages from several collections, use a [dynamic collection](collections/dynamic-collections.md) instead.

## Related content on every page

A collection can show a query at the top of each of its pages, with the page itself as the context. Set it in **Collection Settings... → Related**. Two variables make it work: `$currentpage` for the page being viewed, `$currentcollection` for its collection. They are filled in only here, not in live query blocks.

```text
@task @linkto=$currentpage        tasks that link to this page
@linkto=$currentpage              anything that links to it
@task @linkto=$currentcollection  tasks that link to the collection
```

With this, a project page lists every action that mentions it, wherever those actions were written. The Journal's Upcoming section is the same mechanism with a date-aware query.

The [Query language reference](search-and-navigation/query-language-reference.md) lists every filter, has dozens of examples, and explains the variables that Related and Upcoming fill in.

---

# Panels and Focus Mode

Thymer shows pages in panels, side by side. Plan things on your journal while you work through notes, keep the brief open while you write the meeting notes, or a search next to the page you are cleaning up.

*Two panels: a page and the Journal.*

## Open aside

Cmd-click a link, a sidebar item or a search result to open it in a panel next to the current one. **Open Aside** is in the menus too, and Cmd+Enter opens the selected item aside in lists and boards. Cmd+Shift+\ (Ctrl+\ on Windows and Linux) splits the current panel; Cmd+1 to Cmd+6 jump between panels; Cmd+. opens the panel switcher.

Each panel has its own history. Cmd+[ (Alt+[ on Windows and Linux) and Cmd+] (Alt+] on Windows and Linux) go back and forward in the active panel.

On a phone, panels stack: you see one at a time and switch between them.

## Panel Options

The two-column icon at the top right of a panel opens **Panel Options**:

- **Split this panel** opens a second panel next to it.
- **Focus Mode** gives the panel the whole window; see below.
- **Swap with next panel** trades places with the panel next to it.
- **Focus with Vibe Shift** goes into Focus Mode with a vibe of your choice; see below.
- **Panel Switcher**, and a list of all open panels, appear when more panels are open than fit on the screen.

## Peek

Press Space on a row or card in a collection view and a side panel shows the page. Move with the arrow keys and the panel follows. Keep the page open when you want to work on it, or exit Peek and the panel shows what it showed before.

## Focus Mode

Cmd+Shift+Enter, or **Focus Mode** in Panel Options, gives the current panel the whole window and hides the sidebar and the other panels. Press it again, or click **Exit Focus Mode** at the top right, to come back.

## Vibe Shift

Vibe Shift is a virtual change of scenery! 

Pick a fitting vibe under **Focus with Vibe Shift** in Panel Options, or under **Vibe Shift** in the command palette while in Focus Mode. To try them out, click the **Vibe Shift** button at the top right in Focus Mode and move through the list with the arrow keys: each vibe shows on the spot, and Escape goes back to how it was.

A vibe lasts until you leave Focus Mode or choose **Turn off Vibe Shift**. Your own theme stays as it is. Plugins can add vibes of their own.

---

# Desktop app

Download the desktop app from [thymer.com/desktop](https://thymer.com/desktop), install it, and sign in.

Two extra features the desktop app enables:

- [Markdown Mirror](markdown-mirror.md) keeps a folder of Markdown files in sync with the workspace, both ways. Set it up in **Settings → Markdown Mirror**.
- The MCP server lets other AI apps read and edit your workspace using tool calls. Turn it on in **Settings → MCP (AI Agents)**. In the browser, the same is done with the `thymercli` companion. See [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md).

The mirror runs while the app is open with that workspace selected. Both integrations work on the computer they run on; sign in on a second machine and set them up there separately.

## Updates

The app checks for updates by itself, downloads them in the background, and asks to restart with **Install Now** when one is ready. **Settings → Check for Updates**, or **Help → Check for Updates...** in the menu bar, checks right away.

## Menus

**View → Reload** reloads the window, and **Force Reload** reloads it without the cache. **Help → Documentation** opens these docs, and **Help → Web Inspector** opens the developer tools for plugin work. The accounts window, which lists your accounts, has **Troubleshoot...** in each account's menu: it opens the diagnostics page; see [The diagnostics page](help/troubleshooting.md#the-diagnostics-page).

---

# Mobile apps

The mobile apps give you your whole workspace on a phone or tablet: every page, collection, task and your Journal, with offline access to everything you have synced. They are in beta. Get them from [thymer.com/mobile](https://thymer.com/mobile), which has the TestFlight and Play Store links.

Sign in, pick a workspace, and let the first sync finish. From then on the app works offline and syncs when it is back online.

*The Journal on iOS and Android.*

## Quick Capture

The **+** button at the bottom of the screen is Quick Capture. Tap it, and Thymer opens your capture page with a new line at the end, the current time in front, and the keyboard ready. Type the thought or the task, and that's it. Capture into the same page all day, and every entry shows when it came in.

Your capture page is today's Journal page, or a new page in the default collection when the workspace has no Journal.

To capture somewhere else, long-press **+**. A sheet lists the Journal pages for today, tomorrow and next Monday, **New Page** for a new page in the default collection, your pinned pages and the pages you opened recently. **Find a page...** searches the rest, and the current capture page is marked **Default**. Pick one and the entry goes there, this once. To keep it, tap **Set as default** in the message that follows. Each workspace has its own capture page, the same on all your devices.

## iOS Shortcuts and Siri

On iOS, Siri and the Shortcuts app can add text to Thymer. Set it up once per workspace, in the app:

1. Open **Settings → iOS Shortcuts / Capture**.
2. Turn on **Enable Shortcuts Target**.
3. Under **Name in Shortcuts**, give it the name Siri and Shortcuts will use, such as "Personal Inbox".
4. Choose the **Destination**: today's or tomorrow's Journal, an existing page, or a new page in the default collection or another one.
5. Tap **Save**.

In the Shortcuts app, the **Capture in Thymer** action takes the text and the destination, so you can build it into your own shortcuts and put one on the Home Screen or the Lock Screen.

Thymer opens and adds the text as a new line with the time in front, like Quick Capture. With a new page as the destination, the page is named after the first line of the text. Shortcuts lists the targets of every workspace you set up, with the account and workspace under each name.

## Navigation

**Settings → Mobile Navigation** switches between the top menu and a compact icon strip in place of the sidebar. Panels stack on a phone; you see one at a time.

---

# Offline and sync

Thymer keeps a copy of each workspace on every device you sign in on. Reading, writing, searching and rearranging all work without a connection. When you are back online, changes sync to the server (end-to-end encrypted) in the background and on to your team, and incoming changes merge with what you did while offline.

## Before you go offline

A new device needs a connection to sign in and download the workspace the first time. While you're online, let it finish syncing, so everything you might want offline is on the device. When the connection drops, Thymer carries on offline by itself. Attachments (files and images) download in the background while you're online, but larger ones only download when you first open them, so open those at least once on the device if you need them offline.

## What needs a connection

You can keep using Thymer while you're offline, and your changes sync when you reconnect. A few things need a connection: signing in on a new device, inviting or removing people, changing your password, changing account settings such as the workspace name or your display name, viewing version history, and downloading a full export (including version history).

---

# Themes

**Settings → Theme**, or **Set Theme** in the command palette, lists Thymer's themes. A couple of fun light and dark themes are included by default. Pick an automatic appearance to follow your system between a light theme by day and a dark one at night, choosing which theme to use for each. **Toggle Day/Night Theme** switches by hand.

Each member picks their own theme. To change the look for one session, see [Vibe Shift](search-and-navigation/panels-and-focus-mode.md#vibe-shift).

## Install a theme

Themes made by others install from a link:

1. In **Settings → Theme**, click **Add theme** and choose **Install from URL...**.
2. Paste the link to the theme's GitHub repository, or a direct link to its `thymer-theme.json`, and click **Load Theme**.
3. Pick a variant to preview it, then click **Install and Use**. **Cancel** puts your theme back and installs nothing.

A theme is only CSS, so no code runs. Any member can install themes for themselves; they sync with your account in that workspace and work offline. Your themes are under **My themes** in Settings → Theme, and in **Set Theme**. **Check for updates** looks for newer versions; a theme that has one shows **Update**, which lets you preview it before **Update Theme**.

To share a theme with the workspace, open its **...** menu under **My themes** and choose **List for everyone**. The option shows once the workspace has other members. Others find the theme under **From workspace** and in Set Theme. They use your copy: when you update the theme, they get the update, and if you remove it, they go back to a built-in theme.

Some community themes are plugins that add a theme. Install those like any other plugin; see [Plugins](plugins.md#install-a-plugin). If a theme makes Thymer hard to read, [Safe Mode](help/troubleshooting.md#safe-mode) starts it without themes.

## Create a theme

You can also make a theme in Thymer itself, without publishing anything. Any member can:

1. In **Settings → Theme**, click **Add theme** and choose **Create a theme**.
2. Give the theme a name, choose **Light** or **Dark** under **Appearance**, and write its CSS.
3. Click **Preview** to try it, then **Save and Use**. **Cancel** puts your theme back and saves nothing.

The CSS only applies while the theme is selected, so it needs no theme selector: put the variables under `html:root`. The theme starts from Thymer's own light or dark theme, so you only set the colors you want to change:

```css
html:root {
  --color-bg-50: #cbd5e1;
  --color-bg-100: #b4c1d2;
  --color-bg-150: #9aabc1;
  --color-bg-200: #8295b0;
  --color-bg-300: #5d7391;
  --color-bg-400: #405570;
  --color-bg-500: #2c3d54;
  --color-bg-600: #223148;
  --color-bg-700: #1b293d;
  --color-bg-800: #162235;
  --color-bg-900: #111c2d;
  --color-bg-950: #0d1726;
  --color-primary-50: #eff8ff;
  --color-primary-100: #dcefff;
  --color-primary-200: #bbdffc;
  --color-primary-300: #93c8ef;
  --color-primary-400: #79b6e4;
  --color-primary-500: #609ed1;
  --color-primary-600: #4a7da9;
  --color-primary-700: #375f83;
  --color-primary-800: #284761;
  --color-primary-900: #1c3145;
  --color-primary-950: #122132;
}
```

The colors come in three scales: `--color-bg-` for backgrounds, `--color-text-` for text and `--color-primary-` for the accent. In each scale, 50 stands out most against the background and 950 is closest to it, in light and dark themes alike. Set a whole scale for an even result, or leave a scale out to keep Thymer's.

A theme you create is either light or dark. For both, create two, and choose one for day and one for night with the automatic appearance.

Your theme is under **My themes** in Settings → Theme, and in **Set Theme**. Its **...** menu has **Edit CSS**, **Export**, **List for everyone**, as with an installed theme, and **Remove theme...**. Members using your theme get your changes when you save. If you remove it, anyone using it goes back to a built-in theme, so export the CSS first if you want to keep it.

A theme can change more than colors, such as the font, with `--font-sans: "Comic Sans MS", sans-serif;`. A font you name must be installed on each member's device, unless the theme loads it with `@font-face`. Images and fonts need a full `https://` link or a `data:` URL, and `@import` doesn't work. Prefer variables over selectors on Thymer's own elements, which change between versions.

## Publish a theme

To share a theme beyond your workspace, publish it. A published theme is a `thymer-theme.json` and one or more CSS files, in a public GitHub repository or on an HTTPS host that allows cross-origin requests:

```json
{
  "manifestVersion": 1,
  "id": "yourname.midnight",
  "name": "Midnight",
  "author": "Your name",
  "version": "1.0.0",
  "description": "A quiet dark theme.",
  "variants": [
    {
      "id": "midnight-dark",
      "name": "Midnight",
      "appearance": "dark",
      "css": "midnight.css"
    }
  ]
}
```

```css
html:root {
  color-scheme: dark;
  --color-bg-700: #1b293d;
  --color-text-200: #d5e1ef;
  --color-primary-400: #79b6e4;
}
```

The manifest has two kinds of id:

- The theme's own `id` stands for the whole theme. Thymer recognizes the theme by it when it checks for updates, and treats two themes with the same id as the same theme, so start it with your name, as in `yourname.midnight`.
- Each variant's `id` stands for one look within the theme, such as a light and a dark version. It only has to differ from the other variants in the same theme: Thymer gives every installed variant a selector of its own, so it can't clash with another theme or with Thymer's own.

Both kinds of id use lowercase letters, numbers, dots, hyphens and underscores, start with a letter or a number, and are at most 128 characters long.

Besides its id, each variant has a name, a `light` or `dark` appearance, and a CSS file. A theme has one to eight variants. With a CSS file per variant, `html:root` is all the selector you need, as above. Variants can also share one file, each with its own id as the selector, as in `html[data-theme="midnight-dark"]`. Each variant starts from Thymer's own light or dark theme, so you only set what you change; add `"base": "none"` to a variant to define everything yourself. A CSS file may be 256 KB, and all of a theme's CSS 512 KB together.

The install window shows the `description`, and a `homepage` link and a `screenshot` image if the manifest has them.

With `thymer-theme.json` at the top of the repository, people paste the repository link. To publish a new version, raise `version` (three numbers, such as `1.0.1`) and keep the ids and the manifest's link the same. If a variant's id changes, members who use it go back to a built-in theme.

To publish a theme you created in Thymer, choose **Export** in its **...** menu. It gives you a `thymer-theme.json` and the CSS, ready to save together in a public GitHub repository; check the author and the other details first. The theme in Thymer stays a separate copy with an id of its own, so you can install the published one next to it.

## Custom CSS

A theme only changes the look for the member who picks it. To add CSS for everyone in the workspace, on top of whatever theme each member uses, put it in a plugin. Workspace admins can:

1. In **Settings → Plugins**, on the **Global Plugins** tab, open **Add plugin** and choose **Create a plugin**.
2. Under **Configuration**, give the plugin a name, such as "Workspace CSS".
3. Under **Custom Code**, add the CSS with `this.ui.injectCSS` in `onLoad`, as in the example below.
4. Click **Preview** to try it, then **Save**.

This plugin changes the font for everyone:

```js
class Plugin extends AppPlugin {
  onLoad() {
    this.ui.injectCSS(`
      html:root[data-theme] {
        --font-sans: "Comic Sans MS", sans-serif;
      }
    `);
  }
}
```

Themes set their variables on `html[data-theme="…"]`. A selector that weighs more, such as `html:root[data-theme]`, wins in every theme. To change only dark or only light themes, use `html.is-dark:root` or `html.is-light:root`. As with a theme, prefer variables over selectors on Thymer's own elements.

The CSS applies for every member, on every device, until you turn the plugin off or delete it. The plugin's **Custom CSS** tab works the same way, without code. If a change makes Thymer hard to use, [Safe Mode](help/troubleshooting.md#safe-mode) starts it without plugins. For more about plugins, see [Plugins](plugins.md).

## Omarchy Linux

In the [desktop app](apps-and-settings/desktop-app.md) on [Omarchy](https://omarchy.org) Linux, the theme list has one more built-in theme: **Omarchy Auto**. With it selected, Thymer follows when you switch themes in Omarchy, light or dark included, within a few seconds and without a restart. It is the default on Omarchy until you pick another theme; pick **Omarchy Auto** in **Settings → Theme** or **Set Theme** to bring it back. Thymer also leaves out its own title bar there, like the other apps on the desktop.

---

# Settings

Open **Settings** from the sidebar (click on the Account Menu at the top of the Sidebar, then select Settings...) or the command palette. It has three parts.

*The account menu at the top of the sidebar, with Settings... at the bottom.*

## Preferences

Yours alone, synced to your devices: **Display Name**, **Profile Picture**, **Password & Email**, **Recovery Key**, **Date & Time**, **Theme**, **Keyboard Shortcuts**, **Check for Updates**, and on the desktop app **Markdown Mirror** and **MCP (AI Agents)**. On a phone, **Mobile Navigation**.

Save your Recovery Key somewhere safe outside Thymer. It is the only way back into your account if you forget your password; see [Encryption and recovery keys](your-data/encryption-and-recovery-keys.md).

## Changing keyboard shortcuts

**Settings → Keyboard Shortcuts** holds your own key bindings. See [Change a shortcut](start-here/keyboard-shortcuts.md#change-a-shortcut).

## Workspace

For admins of the workspace you have open: **Invite Users**, **Manage Users**, **Workspace Name**, **Default Collection**, **Plugins**, **Export**, and **Delete/Leave**. On iOS, also **iOS Shortcuts / Capture**.

The default collection is where **New Page** puts pages when you don't choose one. A Notes or Inbox collection works well.

## Account

For account owners: **Account Name/URL**, **Create Workspace** and **Close Account**. Changing the URL changes how everyone reaches the account, so tell the team first.

Which actions each role can take is in [Roles and access](teams/roles-and-access.md).

---

# Inviting people

Workspace admins invite people from **Settings → Invite Users**. Copy the invitation link and send it. The invitee opens it, creates an account or signs in, and verifies their email. Then they show up under **Pending Approval** in **Settings → Manage Users**, and an admin approves them.

Approval is where the workspace key is handed over: the admin's device encrypts a copy of the key for the new member, so only then can their devices read the content. The technical details around end-to-end-encryption are in the [security white paper](https://thymer.com/whitepaper).

## Joining a team

Use the link your team sent you. Signing up on your own instead creates a separate account of your own, outside the team's. If you are still pending after signing up, ask an admin to approve you.

## People outside the company

Contractors and clients join the same way. Since everyone in a workspace sees everything in it, give an outside collaborator a workspace made for that collaboration, keeping other company information in other workspaces in the company account.

---

# Working together

A workspace is one shared place, edited live. Open a page a teammate has open and you see their cursor and selection move as they type, with their name on it, and the status bar shows who is in the workspace right now. Thymer is real-time collaborative: multiple users can edit at the same time with changes reaching everyone within a moment.

*A teammate writing in the page on the left while you plan on the right.*

## Pointing someone at a page

Everything in the workspace is already shared, so to point someone at a page, send its link with **Copy Page Link** from the page menu. For attention, mention the person in a line; `@me` in search and the Tasks overview collect what has their name on it.

## Leaving a note in someone's Journal

Every member has their own Journal in the workspace, so you can also leave a note on a teammate's Journal page for a day. Press Cmd+J again on your own Journal to step through your teammates' Journals, or click a person's name and choose **Go to Journal**. See [The Journal](tasks-and-journal/the-journal.md#teammates-journals).

## Working offline together

People can keep editing offline, on a plane for example. When they reconnect, their changes merge with what happened in the meantime, line by line. Version history on the page keeps every step. See [Offline and sync](apps-and-settings/offline-and-sync.md).

## Cursors on or off

**Toggle multiplayer cursors** in the command palette hides teammates' cursors when they get in the way of your reading, and brings them back.

## Agents join in the same way

An agent editing through Markdown Mirror or MCP is one more editor in the workspace, acting as you. Its changes merge like everyone else's. See [AI agents and CLI](ai-agents-and-cli.md).

---

# Roles and access

Everyone in a workspace can read and edit all of it, and workspace membership is the only thing that decides access. Views, filters, hidden properties and sidebar settings only change what is shown.

## Roles

| Role | Can |
| --- | --- |
| Member | View and edit all content in the workspace |
| Workspace admin | Invite, approve and remove users, make other users admins, change workspace settings, plugins, exports and other workspace-level options |
| Account owner | The account name and URL, creating workspaces, and closing the account. An owner is an admin in every workspace they belong to, but joins a workspace like anyone else: an admin there has to invite or approve them |

Someone can be an admin in one workspace and a plain member in another. Keep at least two admins per workspace so nobody is locked out when one leaves.

## A workspace per audience

The company handbook, a founders' workspace, a client project: each is a workspace with its own members. Inside a workspace, use collections to organize pages; access is the same for all of them. Your Journal is in the workspace too, so personal notes belong in a workspace of your own.

## Removing someone

In **Settings → Manage Users**, remove the person from each workspace they are in. Their devices are signed out of the workspace the next time they connect. Before that, reassign their tasks and owned pages, and update the start page if it points to them.

Removal takes away access from now on. It cannot take back what someone already copied or downloaded, and the workspace key is not rotated automatically. If a key must be replaced, move the content into a new workspace. See the [security white paper](https://thymer.com/whitepaper).

---

# Markdown Mirror

Markdown Mirror keeps a folder on your computer in sync with your workspace. Every page is a plain Markdown file. Search it with grep, process it with scripts, open it in your editor or hand it to an AI agent. Changes sync both ways, usually within a few seconds, while everyone else keeps working in Thymer.

For an overview, see [thymer.com/markdown-mirror](https://thymer.com/markdown-mirror).

## Turn it on

Markdown Mirror runs in the [desktop app](apps-and-settings/desktop-app.md):

1. Open the workspace you want to mirror.
2. Open **Settings → Markdown Mirror**. Or press Cmd+P for the command palette and search for **Markdown Mirror**.
3. Choose an **Output Directory**: an empty folder on your computer. A folder that Dropbox, iCloud or a similar service syncs is experimental: Thymer already syncs your devices, so a plain local folder is the safer choice.
4. Switch on **Enable Markdown Mirror** and **Enable two-way sync**.

The first export writes the whole workspace. From then on the mirror runs while the desktop app is open with that workspace selected. Edit a file, and the change is in Thymer a moment later; edit in Thymer, and the file updates.

Without two-way sync the folder is an always-current export that you can read but whose edits don't flow back. The CLI's `mdmirror` command makes the same kind of one-way copy from the terminal; see [The CLI](ai-agents-and-cli/the-cli.md).

## How files map to pages

One folder per collection, one `.md` file per page: `Projects/Launch plan.md` is the page "Launch plan" in the Projects collection. Rename the file and the page is renamed, and the other way around; the same goes for a folder and its collection. Move a file into another folder and the page moves to that collection. Create a folder and you have a new collection; create a `.md` file and you have a new page. The layout is flat: a sub-page is an ordinary file in its collection's folder, with a **Sub-page of** property.

Properties sit in a frontmatter block at the top of each file. See [Files and frontmatter](markdown-mirror/files-and-frontmatter.md).

A collection's folder can also show up inside one of your own project folders, for you and your agents to work on there. See [Link a collection into a project folder](markdown-mirror/link-a-collection-into-a-project-folder.md).

## Simultaneous edits

If a page changes in Thymer and on disk at the same time, both sets of changes are merged. Only when the exact same line changed on both sides does Thymer's version win, and the disk version is kept in `.thymer/conflicts.json`.

## Deleting

Delete a file and the page goes to Thymer's Trash. Trash a page in Thymer and its file moves to the `trashed/` folder. If a whole folder disappears at once, nothing is trashed until you check the folder and confirm, which protects you from a disconnected disk. Re-creating a deleted file does not restore the page; restore it from Trash instead.

## Status and recovery

**Settings → Markdown Mirror** shows what the mirror is doing: running, stopped after an error, waiting for you to confirm a large deletion, taken over by another window, or paused because Thymer was reloaded in Safe Mode.

If it stopped, read the reason there first. A missing folder, a permissions problem, or a workspace that was rewound to an earlier state each need a look before you restart the mirror. After a rewind, compare the files with the workspace before turning two-way sync back on.

Don't delete `.thymer/` to get a mirror going again. It holds the state the mirror uses to tell your changes from Thymer's, and without it the next sync starts from scratch.

**Help: Markdown Mirror** in the command palette has this summary inside the app.

---

# Files and frontmatter

A mirror folder looks like this:

```text
My workspace/
  Projects/
    Launch plan.md
    _plugin.json
  Journal/
    2026-10-10.md
  files/
  trashed/
  .thymer/
```

| Path | What it is |
| --- | --- |
| `Projects/` | One folder per collection, with one `.md` file per page |
| `_plugin.json` | That collection's property definitions and configuration |
| `files/` | Images and attachments |
| `trashed/` | Files of pages that were moved to Trash |
| `.thymer/` | Sync state, logs and conflict records. Don't edit or delete it |

Markdown files in the mirror's root, or in a sub-folder inside a collection, are ignored. Dotfiles and dot folders are ignored too, and a new folder whose name starts with `_` does not become a collection. Only `.md` files directly in a collection folder are pages.

## Frontmatter

Each file starts with a block between `---` lines:

```markdown
---
guid: 9f1c...
Status: In progress
Owner: Ada
Sub-page of: "[Handbook](Handbook.md)"
---

The page text starts here.
```

`guid` is the page's identity. Leave it alone when you edit, and don't copy it into another file. A new file needs no guid; Thymer assigns one when it imports the page.

The other keys are the collection's properties. Change a value and the page updates. Define properties and their choices in Thymer first, then set them from files. To see how a user, a date, a page link or a multi-value property is written, set one in Thymer and look at the file.

A key the collection doesn't have is kept on the page as a carried-over property. It shows with the page's other properties, but it isn't a property of the collection, so it adds no column. Right-click it on the page for two choices:

- **Add to collection** makes it a real property of the collection, and every page in the collection with the same key gets its value there. The values decide the type: all numbers make a Number property, all dates a Date & Time, all web addresses a URL, and anything else Text. Dynamic collections don't have this option.
- **Clear carried-over value** removes it from this page.

Formula properties are computed, so editing their exported value does nothing.

## Journal pages

Journal pages are date-named files in the Journal folder. They can't be deleted from disk; the mirror restores the file.

## Images and files

Put an image next to the page and reference it the Markdown way:

```markdown
![Launch diagram](launch-diagram.png)
[Project brief](project-brief.pdf)
```

On import the mirror uploads the file to Thymer and rewrites the link through `files/`. Thymer ignores files in the folder that no page references.

## What the Markdown looks like

Headings, lists, tasks, quotes, code and links are ordinary Markdown. Thymer adds a little to keep round trips exact, such as line identities and task states, which other Markdown tools show as plain text or ignore. Editors that reflow whitespace or strip what they don't understand can lose that information, so turn such features off for the mirror folder.

Thymer also supports some features which aren't part of ordinary Markdown, like arbitrary nesting and blocks. A block is written between two lines of three colons, with its style after the opening ones:

```markdown
::: warning
Budget deadline is **June 30th**.
- [ ] Get sign-off from finance
:::
```

The styles are `note` for an Info Block, `warning`, `quote` and `row` for columns, which holds one plain block per column. Blocks can hold other blocks, so these lines nest. A code block is an ordinary code fence with three backticks.

Mirrored files are plain text on your disk. Thymer's end-to-end encryption protects what travels and what is stored on the server; the folder is as protected as the rest of your computer.

---

# Editing with agents and other tools

Anything that edits files can edit your workspace through the mirror: your editor, a shell script, a cron job, a static site generator, or an AI coding agent. Save the file, and the change is in Thymer a moment later.

## Agents

Point the agent at the collection folder and say what you want, the same way you would in a code repository:

> Edit the onboarding pages in the Handbook folder. Adjust the checklists to mention the new office locations (find them in this collection as well)

Coding agents already work this way in code repositories: they search and edit. Ask for a plan or a diff before letting an agent loose on larger changes, and read the result in Thymer. Edits to pages work just like if you would edit them yourself: other team members will see the edits live as they are saved, and you can use Version History to view older versions of the page.

Other people can keep editing the same pages in Thymer meanwhile. Changes to different lines merge; [Simultaneous edits](markdown-mirror.md#simultaneous-edits) explains what happens when both sides change the same line.

To give an agent one collection inside a project it already works in, see [Link a collection into a project folder](markdown-mirror/link-a-collection-into-a-project-folder.md).


## Files move pages

| On disk | In Thymer |
| --- | --- |
| Rename `Launch plan.md` | The page is renamed |
| Move it to another collection folder | The page moves to that collection |
| Create a `.md` file in a collection folder | A new page |
| Create a folder | A new collection |
| Rename a folder | The collection is renamed |
| Delete a file | The page goes to Trash |

Keep the `guid` line when you rename or move a file. Moving a page to a collection with different properties keeps values the new collection has no property for as carried-over properties.

## Several computers

Thymer syncs the workspace between your devices. Each computer that needs a mirror sets one up in its own desktop app, in its own folder. Don't copy a `.thymer/` folder from one machine to another; it holds that machine's sync state. If two windows have the same workspace open, one of them runs the mirror and the status dialog says which.

---

# Link a collection into a project folder

Your projects have their own folders on your computer, and that's where you and your agents work. The mirror has a folder of its own. A link brings them together: the project's documentation lives in a Thymer collection, and the same files show up as a folder inside the project.

Say the mirror is in `/Users/me/Documents/Thymer Markdown Mirror`, and the workspace has a collection called ProjectA Docs. Link its folder into the project:

```sh
ln -s "/Users/me/Documents/Thymer Markdown Mirror/ProjectA Docs" \
  /Users/me/ProjectA/Documentation
```

`/Users/me/ProjectA/Documentation` now holds the collection's pages as Markdown files. An agent working on ProjectA reads and edits them like any other file in the project, without knowing anything about Thymer. While the mirror runs, what you or your team change in Thymer shows up in the project's folder, and what the agent changes shows up in Thymer.

## Make the link

On macOS and Linux, run `ln -s` in a terminal, as above: the collection's folder first, then the new folder in the project. A Finder alias won't do, because agents and command-line tools don't follow it.

On Windows, make a junction in Command Prompt. It needs no administrator rights, and the new folder comes first:

```
mklink /J "C:\Users\me\ProjectA\Documentation" ^
  "C:\Users\me\Documents\Thymer Markdown Mirror\ProjectA Docs"
```

Link from the project into the mirror, not the other way around. The mirror doesn't follow links inside its own folder, and its folder can't be a link itself.

## Good to know

- Many search tools skip a linked folder when they search a whole project. Tell the agent where the documentation is, for example in the project's instructions for agents: "The documentation is in Documentation/."
- Renaming the collection renames its folder, and the link then points nowhere. Make it again with the new name.
- In a Git repository, Git stores the link instead of the pages, and on other computers it points nowhere. Add `/Documentation` to `.gitignore`, and let each teammate link their own mirror.

## What the agent can see

An agent that stays in the project sees this one collection, not the whole workspace. That keeps it focused, but a link isn't a lock: the agent can see where it points, and on macOS and Linux, `..` from inside the linked folder leads to the mirror folder and the other collections. To keep an agent out of the rest of the workspace, use its own sandbox or permission settings and allow only the collection's folder. Some sandboxes check where a link really points, and block the folder as outside the project until you allow it.

---

# AI agents and CLI

Thymer works with any agent you bring: your favorite, a local model that runs for free, the one you use at work, this month's most popular one, or all of them together. It also gives agents a place to work together: a workspace they read from and write to, like a shared memory, or a project board where several agents pick up tasks and check them off.

There are three ways for your own tools to work with your workspace. All three run on your own computer, and Thymer passes your data to the agent there directly, with no Thymer server in between.

| Route | Good for | Needs |
| --- | --- | --- |
| [Markdown Mirror](markdown-mirror.md) | Agents and tools that work directly on plain files, bulk edits, diffs | The desktop app |
| [MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md) | AI agents that read, search and edit the workspace as structured data | The desktop app's MCP server, or `thymercli` next to the browser |
| [The CLI](ai-agents-and-cli/the-cli.md) | Scripts and one-off commands from the terminal | `thymercli` |

Files are best for many use cases: agents already know how to grep, edit and diff files, fast. MCP is best when an agent needs structured information which flat files just don't provide: run queries and follow references, change properties, build a database or execute commands in the app. The CLI is the same access from a shell script. You can also use all of them together.

- [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md): setup in the desktop app or the browser, permissions, and troubleshooting.
- [The CLI](ai-agents-and-cli/the-cli.md): every command.

---

# Connect an AI agent with MCP

Thymer speaks MCP, the protocol AI clients use to work with tools. The server runs on your computer, and an agent connected to it reads and edits your workspace as you, within the access you give it.

## In the desktop app

1. Open **Settings → MCP (AI Agents)**.
2. Under **Workspace Access**, set the workspace you want to make accessible. Everything else stays **Off**.
3. Click **Connect**. The dialog shows **MCP server active** and the port.

The server listens on `http://127.0.0.1:13100/mcp`.

## In the browser

The browser can't open a port, so a small companion does it. Download `thymercli` from [thymer.com/mcp](https://thymer.com/mcp) and run it:

```bash
thymercli
```

Then open **Settings → MCP (AI Agents)** in Thymer, set the workspace access, and click **Connect**. The CLI bridges requests to your signed-in browser tab, so keep both running. `thymercli mcp --no-repl` starts the server without the interactive prompt.

Run one server at a time: the desktop app and `thymercli` both default to port 13100.

## Add it to your client

Clients that speak HTTP take the address directly. Choose Streamable HTTP if asked:

```text
http://127.0.0.1:13100/mcp
```

Clients that launch a process use the CLI as a proxy. Configure them to run the installed executable with `stdio` as the argument; use the full path if the client doesn't see your shell's PATH.

```bash
thymercli stdio
```

Then ask the agent to list the workspaces and read a page you know. If it sees the right workspace and the right text, you are connected.

## Tool Mode and Script Mode

In **Tool Mode** the agent gets one tool per operation: list, read, search, write. In **Script Mode** it gets a bash-style shell over a virtual filesystem of your workspace, which is usually more efficient for agents that are good with the command line. Switch in the MCP settings and refresh the client's tool list afterwards. The paths in Script Mode exist only inside that shell. To give an agent real files on your disk, use [Markdown Mirror](markdown-mirror.md).

## Access

Access is per workspace and per connection: **Off**, **Read Only** or **Read & Write**. Start with Read Only for anything that only needs to read or summarize. Writes land in the shared workspace like your own edits do, with your name on them.

The agent runs on your machine, but most AI clients send what they read to their model provider. Choose the client and the workspace accordingly.

## When it doesn't connect

- No server: check for **MCP server active** in the desktop app, or that `thymercli` is still running, and that the client uses the same port.
- Port in use: stop the other server, or start one of them on another port with `-p`.
- Reads work but writes fail: the workspace is on **Read Only**.
- The agent sees no workspaces: the workspace is **Off**, or in the browser you haven't clicked **Connect** since starting the CLI. `thymercli status` and `thymercli workspace list` show what the server sees.
- A remote agent can't reach it: inside a container or on a remote host, `127.0.0.1` points at that machine itself.

---

# The CLI

`thymercli` is Thymer's command-line tool. The same executable runs the MCP server for the browser; see [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md). Download it from [thymer.com/mcp](https://thymer.com/mcp). Its `--help` output calls it `thymer`.

The CLI talks to a running server connected to Thymer: either the desktop app's MCP server or `thymercli` itself with the browser connected. Workspace commands need the workspace set to **Read Only** or **Read & Write** in **Settings → MCP (AI Agents)**.

## First steps

```bash
thymercli status
thymercli workspace list
thymercli collection list -w "Docs"
thymercli page list -w "Docs" -c "Docs"
thymercli search "onboarding" -w "Docs"
thymercli page show PAGE_GUID -w "Docs"
```

Create a page and append to it:

```bash
thymercli page create "CLI test" -w "Docs" -c "Docs"
thymercli page add PAGE_GUID "A note from the terminal." -w "Docs"
```

`page add` appends Markdown and also reads it from standard input, so `cat notes.md | thymercli page add PAGE_GUID` works.

## Options

| Option | Meaning |
| --- | --- |
| `-w`, `--workspace` | Workspace name or guid |
| `-c`, `--collection` | Collection name or guid |
| `-p`, `--port` | Server port, default 13100 |
| `--json` | JSON output, for scripts |
| `-q`, `--quiet`, `--no-color`, `-v` | Less decoration, no color, more detail |

`use workspace NAME` and `use collection NAME` remember a default for the interactive session; `context` shows it and `context clear` forgets it. In scripts, pass `-w` and `-c` every time.

## Commands

| Command | Does |
| --- | --- |
| `thymercli` | Start the MCP server and an interactive prompt |
| `mcp --no-repl` | Start the server only |
| `stdio` | Proxy a stdio MCP client to the running server |
| `status`, `version` | Server status, CLI version |
| `workspace list`, `workspace show NAME` | Workspaces, with their users |
| `collection list`, `collection show NAME` | Collections, with views and properties |
| `collection create NAME`, `collection trash NAME` | Make or trash a collection |
| `collection navigate NAME --view VIEW` | Open it in the app |
| `search QUERY --limit 50` | Search, with the full [query syntax](search-and-navigation/search.md) |
| `page list`, `page show GUID` | Pages in a collection, one page as Markdown |
| `page create TITLE` | New page |
| `page add GUID [markdown]` | Append Markdown, also from stdin |
| `page insert GUID --type task --content "Follow up"` | Insert one line; `--after` and `--parent` place it |
| `page move GUID... --to COLLECTION` | Move pages |
| `page navigate GUID` | Open it in the app |
| `page trash GUID`, `page untrash GUID` | Trash and restore |
| `line edit GUID --content "New text"` | Change a line |
| `line move GUID --after GUID` | Move a line; `--parent` changes its parent |
| `line flag GUID FLAG`, `line done GUID`, `line delete GUID` | Flag, complete or delete a task or line |
| `property list` | A collection's properties |
| `property get GUID [name]` | A page's values |
| `property set GUID Status=Done Owner=Ada` | Set values |
| `journal [date]` | Show a Journal page |
| `journal add [date] MARKDOWN` | Append to it |
| `journal navigate [date]` | Open it in the app |
| `plugin list`, `plugin show NAME` | Plugins, with code, CSS and configuration |
| `plugin update code NAME --file plugin.js` | Replace a plugin's code; also `config` and `css` |
| `theme list`, `theme get`, `theme set NAME` | Themes |
| `mdmirror PATH` | One-way Markdown export to a folder; `--markdown-mirror-interval 60` repeats it |
| `run 'ls /thymer'` | Run a shell command on the workspace's virtual filesystem |
| `export decrypt --in backup.zip --out plain.zip` | Decrypt a full export; `export encrypt` does the reverse |

Journal dates are `YYYY-MM-DD`. Lines are addressed by guid; `page show` and `search` print them. Every command has `--help`.

---

# Plugins

Plugins are JavaScript that runs inside Thymer. A few lines add a command to the palette, a computed property to a collection, or a whole custom view. The [Plugin SDK](https://github.com/thymerapp/thymer-plugin-sdk) has typed declarations, examples and a hot-reload development loop, and [awesome-thymer-plugins](https://github.com/ed-nico/awesome-thymer) lists plugins the community has shared. For more about plugins, see [thymer.com/plugins](https://thymer.com/plugins/).

## Two kinds

An **app plugin** extends the workspace: command palette commands, status bar items, sidebar widgets, notifications, custom panels. Its class extends `AppPlugin`.

A **collection plugin** extends one collection: formulas, custom property rendering and sorting, custom views, buttons on board cards. Its class extends `CollectionPlugin`, and it has `this.collection`, `this.properties` and `this.views` on top of the shared APIs. Every collection has a plugin behind it; **Edit Code** in Collection Settings opens it. Dynamic collections use `DynCollectionPlugin`.

## Install a plugin

Workspace admins add plugins in the **Plugins** panel: **Plugins** in the command palette, or **Settings → Plugins**. The panel has two tabs, **Global Plugins** for app plugins and **Collections** for collection plugins.

### From a link

Most shared plugins live on GitHub, and Thymer installs them from their link:

1. Copy the link to the plugin's repository, such as `https://github.com/author/plugin`.
2. In the Plugins panel, open **Add plugin** and choose **Install from URL**.
3. Paste the link and click **Load Plugin**. Thymer downloads the plugin and shows its name, type, version, author and description. Nothing runs yet.
4. Click **Open Draft**. The plugin opens in the code editor as a draft: a new global plugin, or a new collection for a collection plugin.
5. Click **Preview** to run it, then **Save** to keep it. **Discard** removes the draft.

A repository link works when the plugin's files are at the top of a public repository: a `thymer-plugin.json`, or a `plugin.json` with a ready-to-run `plugin.js`. For a plugin somewhere else in a repository, open its `thymer-plugin.json` on GitHub and paste the link from the address bar; the **Raw** link works too. If a plugin has to be built first, follow its author's instructions.

**More about plugins** in the same menu opens [thymer.com/plugins](https://thymer.com/plugins/).

### Updates

**Check for updates** in the Plugins panel asks each plugin you installed from a link whether there is a newer version. Thymer never updates a plugin by itself. A plugin with a newer version shows **Update**, which opens the same review: **Open Draft**, **Preview**, **Save**, or **Discard** to keep the version you have.

Your settings in the plugin's configuration are kept, and new ones are added. If you changed the plugin's code yourself, Thymer warns you before replacing it. Plugins you pasted in by hand aren't checked, and neither are plugins whose author gives no version number.

### By hand

**Add plugin → Create a plugin** opens the code editor with three parts: **Configuration**, a small JSON with the name, icon and description; **Custom Code**, the JavaScript; and **Custom CSS** for styling. Paste what the plugin's author gave you, **Preview**, and save when it works. A switch on each plugin turns it off without deleting it.

Code pasted into the app starts with `class Plugin extends AppPlugin` or `CollectionPlugin`; an `export` in front is fine. Code with `import` lines comes from the SDK and has to be bundled first: paste the bundled `dist/plugin.js`.

## What to know before installing

Plugins run in your signed-in app with the same access you have, and their code and configuration are stored in the workspace, where every member can read them. Read a plugin before installing it, especially anything that makes network requests, and keep API keys out of shared plugin code. The CLI can read and update plugins too; see [The CLI](ai-agents-and-cli/the-cli.md).

**Preview** runs the plugin's code. **Discard** removes a draft or puts the previous version back, but doesn't undo what the plugin did while it ran. If a plugin makes Thymer hard to use, [Safe Mode](help/troubleshooting.md#safe-mode) starts Thymer without plugin code.

- [Your first plugin](plugins/your-first-plugin.md): a palette command in ten lines.
- [Collection plugins](plugins/collection-plugins.md): configuration, fields, views and the hooks for custom views and properties.
- [Developing with the SDK](plugins/developing-with-the-sdk.md): hot reload from your editor, bundling, examples and troubleshooting.
- [Plugin API reference](plugins/plugin-api-reference.md): the main objects and methods.

---

# Your first plugin

Open **Settings → Plugins**, choose **Create Plugin**, and open its code editor.

Configuration:

```json
{
  "ver": 1,
  "name": "Hello Thymer",
  "icon": "puzzle",
  "description": "A first command palette plugin"
}
```

Custom Code:

```js
class Plugin extends AppPlugin {
  onLoad() {
    this.ui.addCommandPaletteCommand({
      label: "Say hello",
      icon: "ti-hand-wave",
      onSelected: () => {
        this.ui.addToaster({
          title: "Hello from your plugin",
          message: "Your command is working.",
          dismissible: true,
          autoDestroyTime: 3000
        });
      }
    });
  }
}
```

Click **Preview**, press Cmd+P, and run **Say hello**. A notification appears. Save, and the command is there for everyone in the workspace.

## Make it do something

`this.data.searchByQuery("@task @overdue", 50)` returns matching records and lines; `this.ui.getActivePanel()` tells you which page the user is looking at. From here the shape of most plugins is the same: a command, a bit of data access, and a toaster or a panel to show the result. The [Plugin API reference](plugins/plugin-api-reference.md) lists what is available, and the [SDK examples](https://github.com/thymerapp/thymer-plugin-sdk/tree/main/examples) show working plugins to copy from.

Icons are Tabler icon names, `ti-` followed by the icon.

---

# Collection plugins

Every collection is defined by a JSON configuration plus optional JavaScript. **Collection Settings... → Edit Code** opens both. The settings dialog edits the same configuration with forms, so you can mix: define fields and views in the dialog, add behavior in code.

## Configuration

A field has a stable `id`, a `label`, a `type` and a few options:

```json
{
  "id": "hours",
  "label": "Hours",
  "type": "number",
  "icon": "ti-clock",
  "many": false,
  "read_only": false,
  "active": true
}
```

Views have an `id`, a `label`, a `type`, the `field_ids` they show, and their sort, grouping and query. Keep ids stable when you rename things: values and views refer to fields by id. A `managed` section can mark fields, views or sidebar settings as controlled by the plugin, which disables them in the settings dialog.

## Formulas and property behavior

`this.properties.formula(name, fn)` computes a property; see [Formulas](collections/formulas.md). `render()` draws a property your own way, `customSort()` sorts it your own way, and the choice hooks fill a Choice property's options from code.

## Custom views

Add a view with `"type": "custom"` to the configuration, then register its behavior:

```js
class Plugin extends CollectionPlugin {
  onLoad() {
    this.views.register("Timeline", (ctx) => {
      let nodes = new Map();
      return {
        onLoad() { /* build the view in ctx.element */ },
        onRefresh({records, invalidatedGuids}) { /* update changed records */ },
        onDestroy() { nodes.clear(); },
      };
    });
  }
}
```

`ctx` gives you the view's element, the visible properties, the records and navigation helpers. Keep the view's state inside the registration function: two panels can show the same view at once. `onRefresh` tells you which records changed; `null` means all of them, an empty set none. Update what changed instead of rebuilding everything.

Built-in views have hooks too, such as `afterRenderBoardCard()` for adding buttons to board cards.

## Commands and interface

| Extension | API |
| --- | --- |
| Command palette command | `this.ui.addCommandPaletteCommand()` |
| Status bar item | `this.ui.addStatusBarItem()` |
| Notification | `this.ui.addToaster()` |
| Custom panel | `this.ui.registerCustomPanelType()` |
| Sidebar widget | `this.ui.addSidebarWidget()` |
| Button on this collection | `this.addCollectionNavigationButton()` |

Use the UI API's buttons, icons and panels so your plugin looks like Thymer in every theme. Release timers and listeners in `onUnload()`; with hot reload, a plugin is unloaded and loaded many times.

---

# Developing with the SDK

For anything beyond a few lines, use the [Plugin SDK](https://github.com/thymerapp/thymer-plugin-sdk): you write in your own editor with type checking, and every save is pushed into a running Thymer.

## The loop

1. Clone the SDK and run `npm install`. `plugin.js` and `plugin.json` are your plugin; `types.d.ts` documents the API.
2. Start Chrome with a debugging port and a separate profile, and open your account in it:

```bash
chrome --remote-debugging-port=9222 --user-data-dir=/tmp/thymer-dev --no-first-run https://myaccount.thymer.com
```

3. In that browser, open the plugin's code editor, select the **Developer Tools** tab, and click **Enable Plugin Hot Reload**.
4. Run `npm run dev`. The SDK bundles your code and pushes it to the browser on every save. `npm run dev:verbose` prints the bundle as well.

Hot reload is a preview. When you are done, `npm run build` writes `dist/plugin.js`, without the source maps the dev loop adds. Paste it into **Custom Code** and `plugin.json` into **Configuration**, then **Preview** and save.

## Share a plugin

To let others install your plugin from its link, publish it in a public GitHub repository with a `thymer-plugin.json` next to its files. This file describes the package; `plugin.json` stays the plugin's configuration.

```json
{
  "manifestVersion": 1,
  "id": "yourname.task-timer",
  "name": "Task Timer",
  "author": "Your name",
  "version": "1.0.0",
  "type": "global",
  "description": "Track time on tasks",
  "files": {
    "config": "plugin.json",
    "js": "dist/plugin.js"
  }
}
```

- `manifestVersion`, `id`, `name`, `author`, `version`, `type` and `files.config` are required. `description`, `homepage`, `screenshot`, `files.js` and `files.css` are optional.
- `type` is `global` for an app plugin or `collection` for a collection plugin.
- `id` stays the same for the life of the plugin. Start it with your name, and use lowercase letters, numbers, dots, hyphens and underscores.
- `version` is three numbers, such as `1.2.0`. It is your release number, not the configuration's `ver`.
- `files.js` points to code that runs as it is. Thymer doesn't build anything, so publish `dist/plugin.js` from `npm run build`, even if your repository ignores `dist/`.
- `files.config` holds defaults only: no personal settings or API keys. `custom` is an object, such as `{}`.
- Paths are relative to `thymer-plugin.json`. Images and other files that your CSS or code loads need full HTTPS links or embedded data.

With `thymer-plugin.json` at the top of the repository, people paste the repository link into **Install from URL**. Anywhere else, they paste the file's link on GitHub, or its **Raw** link. Any HTTPS host works too, if it allows cross-origin requests. The code, CSS and configuration may take 5 MB together, CSS and configuration 1 MB each.

### New versions

1. Publish the new files first, or together with the manifest.
2. Raise `version` in `thymer-plugin.json`, also for a change to the CSS or the configuration only.
3. Keep the manifest's link, the `id` and the `type` the same, and keep field and view ids stable, so people's settings carry over.

Installed copies see the new version when their admins click **Check for updates**. A link to a fixed commit or tag stays on that release.

## Examples

The SDK's `examples/` folder has app plugins and collection plugins to start from: a simple list view, buttons on kanban cards, a work-in-progress limit, kanban dependencies, custom choice dropdowns, an organization chart. Most examples come with a `thymer-plugin.json`: paste that file's link on GitHub into **Install from URL**. The SDK repository link alone won't work, because it holds many plugins. The examples guide in the folder lists them, with what to try after installing. To build on one, copy it into the SDK project, change the field and view ids to yours, and try it on a few real pages.

## When something is off

- Nothing happens: check that the plugin is enabled, then look for errors in the editor and in the browser console.
- Pasted code fails: in-app code uses `class Plugin`, without `import` lines. Bundle SDK code first.
- A field or view is missing: it needs both a configuration entry, with `"type": "custom"` for views, and a matching registration in the code.
- Hot reload stops: check that `npm run dev` is running, the browser was started with the debugging port, and hot reload is enabled on this plugin.
- Thymer gets slow: look for timers and listeners that survive `onUnload()`, scans of the whole workspace, and views that rebuild the DOM on every refresh.

Disable the plugin while you investigate. If you need help, send a small plugin that reproduces the problem along with your description; see [Reporting a bug](help/troubleshooting.md#reporting-a-bug).

---

# Plugin API reference

The SDK's [types.d.ts](https://github.com/thymerapp/thymer-plugin-sdk/blob/main/types.d.ts) is the full reference, with every signature and comment. This page lists the main objects and methods. The API is still changing during the beta; check the declarations that match your app version.

## Plugin classes

`AppPlugin` for the workspace, `CollectionPlugin` for one collection, `DynCollectionPlugin` for a dynamic collection. `onLoad()` is where you register things; `onUnload()` is where you clean up. All of them have `ui`, `data`, `events`, `ws` and `window`; collection plugins also have `collection`, `properties` and `views`.

## Data

| Method | Returns |
| --- | --- |
| `this.data.getRecord(guid)` | A record, or `null` |
| `this.data.getAllRecords()` | Every record in the workspace |
| `await this.data.getAllCollections()` | The collections |
| `this.data.getActiveUsers()` | The workspace's users |
| `await this.data.searchByQuery(query, max)` | Matching records and lines |
| `this.data.getPluginByGuid(guid)` | A plugin or collection object |

```js
const results = await this.data.searchByQuery("@task @overdue", 50);
for (const record of results.records) console.log(record.getName());
```

In a collection plugin, `await this.collection.getAllRecords()` loads its records and `this.collection.createRecord(title)` makes a new one, returning its guid.

## Records

A record is a page. `guid`, `getName()`, `getCreatedAt()`, `getUpdatedAt()`, `getAsMarkdown()`, `getSubPageOf()` and `setSubPageOf(guid)`, and `await record.getLineItems()` for its lines.

| Reader | Returns |
| --- | --- |
| `record.number(name)`, `record.text(name)` | A number or text, or `null` |
| `record.choice(name)` | The choice id, or `null` |
| `record.numbers(name)`, `record.texts(name)` | All values of a multi-value property |
| `record.users(name)` | User objects |
| `record.linkedRecord(name)`, `record.linkedRecords(name)` | One linked record, or all of them |

Choices have an id and a label: `PluginProperty.choiceLabel()` gives the label, `setChoice()` takes the label. Setters are asynchronous and return whether they succeeded.

## Lines

A `PluginLineItem` knows its parent and children, its text segments and its task status. `setSegments()` replaces the content, `setTaskStatus()` changes the checkbox. A line's text is made of segments, including references; replace only the segments you mean to change.

## Properties and views

`this.properties.formula(name, fn)`, `render()`, `customSort()` and the choice hooks are described in [Collection plugins](plugins/collection-plugins.md), together with `this.views.register(name, fn)` and the view hooks `onLoad`, `onRefresh` and `onDestroy`. `await this.views.getAllRecordsInView(name)` returns a view's records with its filter and sort applied.

## Interface

`this.ui.addCommandPaletteCommand()`, `addStatusBarItem()`, `addToaster()`, `addSidebarWidget()`, `registerCustomPanelType()`, plus buttons, icons and tooltips that follow the theme. `this.ui.getActivePanel()` returns the active panel, or `null`, and a panel may have no record. Use the text APIs for anything a user typed; only pass HTML you built yourself to the HTML APIs.

Desktop window APIs only exist in the desktop app; check before calling them.

---

# Importing content

There are four ways to bring content into Thymer. Which one fits depends on how much there is and where it is now.

## Paste as Markdown

For a page or a handful of pages, copy the text and paste it with Cmd+Shift+V (Ctrl+Shift+V on Windows and Linux), then choose **Paste Markdown**. Headings, lists, tasks, quotes, code blocks and links become Thymer's own. Cmd+Alt+V does the same in one step. Formatted text from other apps also arrives formatted with a plain Cmd+V.

## A folder of Markdown through Markdown Mirror

For a whole collection, export it as Markdown and let the mirror import the files:

1. Create the collection in Thymer and define the properties and choices your files use.
2. Turn on [Markdown Mirror](markdown-mirror.md) with two-way sync, into an empty folder.
3. Copy a few `.md` files into the collection's folder. Each becomes a page, and frontmatter keys that match a property set its value.
4. Check the pages in Thymer: headings, nested lists, tasks, images, links between files, property values.
5. Copy the rest.

The mirror is flat, one folder per collection. If your export has nested folders, flatten them and use a **Sub-page of** property for the hierarchy. Images next to the files are uploaded and linked when the page is imported. New files need no `guid`.

## A plugin

When the source is not Markdown, or you want the connection to stay, a [plugin](plugins.md) can read a file or an API and create pages, set properties and link them. Check the community list for one that fits, or write your own with the SDK; the collection API creates records, and the record API fills them in.

## An agent with both tools

If the other tool speaks MCP, connect an agent to it and to Thymer, and ask it to read from one and write to the other. Give Thymer **Read & Write** access for the target workspace and review the result in Thymer afterwards. See [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md).

---

# Export and backups

Workspace admins open **Settings → Export**. There are three ways to get a copy.

| Option | What you get | Use it for |
| --- | --- | --- |
| Markdown Export | A ZIP with every page as Markdown, plus attachments | Reading elsewhere, moving to another tool, a snapshot |
| Full Data Export | An encrypted ZIP of the workspace in Thymer's own JSON format, including version history | A complete backup |
| Markdown Mirror | A folder on your disk that stays current | A live file-based copy, working in files, builds, agents |

For one page or a few lines, copying is quicker: select them, press Cmd+Shift+C and choose **Copy Markdown**. See [Writing and formatting](writing/writing-and-formatting.md).

## Markdown Export

Choose **Markdown Export** and **Download ZIP**. The ZIP is built on your device from the data it has, so it works offline; sync first for a complete copy. **Include metadata** adds the line ids and type hints that agents and the CLI use for exact round trips; turn it off for cleaner files to read. Attachments are in a `files/` folder with relative links from the pages.

## Full Data Export

The server packs the whole workspace, history included, into an encrypted ZIP. It needs a connection. Keep the export password somewhere safe; without it the archive can't be opened. `thymercli export decrypt` turns it into plain JSON files; see [The CLI](ai-agents-and-cli/the-cli.md). Importing a full export into a new workspace is coming soon.

## Keep a backup

A live mirror follows the workspace, deletions included, so it is not a backup by itself. Copy the mirror folder or a Markdown Export somewhere else now and then, dated. Treat the plaintext copies like the workspace itself.

For a page that was trashed, text that was changed, or a file edit that collided, you don't need a backup: see [Version history and Trash](your-data/version-history-and-trash.md).

## Self-hosting

A self-hosted Thymer server is coming soon, for companies and individuals that want to run it on their own hardware and switch between our cloud and their own at will. That move is what the Full Data Export is for: it holds the whole workspace, history included, to take to your own server. See [Ejectable apps](https://thymer.com/ejectable) for the idea behind it. Until then, use the exports above to keep your own copy of your data.

## Leaving

Export every workspace you want to keep, each as an admin, and check a few pages and attachments in the result. Then **Delete/Leave** in the workspace settings, and **Close Account** in the account settings.

---

# Version history and Trash

## Version history

**Version History...** in the page menu lists earlier versions of a page. Pick one to read it, with a label showing which version you are looking at. Copy the text you want back and paste it into the current page: that way you keep the good changes made since.

Collections have version history too. Open a collection and choose **Version History...** in the same menu, and the view you are on shows the collection as it was at each version. Step through the versions on a board and watch the cards fly back and forth between columns as their status changed! It works in every view of every collection except the Journal.

History comes from the server, so it needs a connection. For something you just did, Cmd+Z to Undo is quicker.

## Trash

**Move to Trash** removes a page from every view. Open **Trash** to find it and **Restore from Trash** to bring it back. A trashed collection is restored with **Restore Collection from Trash** in its settings, and **Settings → Plugins** shows trashed plugins.

In a Markdown Mirror, a trashed page's file moves to `trashed/`, and deleting a file trashes its page. Restore the page in Thymer; re-creating the file doesn't bring the original back.

## When it isn't in Trash

A missing page is usually filtered, folded or in another workspace. Search for its title or a phrase from it, check the view's filter, and check which workspace you are in. A pinned item that was unpinned is still a page.

## Rewinding a workspace

When the entire workspace needs to be completely restored to a previous point in time for some reason, an account owner can rewind the whole workspace by a number of minutes. It affects everyone in the workspace, so read [Rewinding a workspace](help/troubleshooting.md#rewinding-a-workspace) first.

---

# Encryption and recovery keys

::: warning
Thymer is end-to-end encrypted, so we cannot do a password reset. If you forget both your password and your Recovery Key, there is no way back into your account. If you use [Markdown Mirror](markdown-mirror.md), your pages are still in its folder, and if others work in the account, an admin can invite you again or export the workspace.
:::

Your pages are encrypted on your devices before they are synced with the server. The server stores ciphertext (the encrypted version of your data) and never holds a workspace key, meaning we cannot view your notes and files. The [security white paper](https://thymer.com/whitepaper) has the full design, including [Encrypted data and visible metadata](https://thymer.com/whitepaper#visibility).

## Your Recovery Key

You create a Recovery Key when you sign up, and Thymer asks you to type it back to make sure you saved it. Keep it in your password manager, outside Thymer.

If you forget your password, click **Log in with Recovery Key** on the sign-in screen. Enter your email, the Recovery Key and a new password.

**Settings → Recovery Key** makes a new key. It asks for your current password, and the old key stops working.

If you've lost both, other members keep their access, and an admin can invite you again so you can start over. If a device is still signed in, stay signed in until you've saved what you need from it.

## On your devices

A signed-in device keeps the workspace decrypted locally so that search and offline work are instant, and a Markdown Mirror writes plain files. Device security is up to you: screen lock, disk encryption, care with backups and with who can read a mirror folder.

## How the keys work

Each workspace has one key, shared with its members. When an admin approves a new member, the admin's device encrypts a copy of the workspace key for the new member's public key; the server only passes it along. Your own private key is protected by your password (and by your Recovery Key, as a second way in if you forget your password).

## Removing people

Removing a member stops their access from then on. It cannot take back what they already had, and the workspace key is not rotated automatically. If a key must be replaced, move the content into a new workspace.

---

# Troubleshooting

Thymer is in beta, and we want to hear what breaks. Write to [team@thymer.com](mailto:team@thymer.com), use **Help: Send Feedback** in the command palette or **Send us feedback** in the menu of the Thymer logo at the bottom right, or join the [community](https://discord.gg/zBSUWK2dvy) to talk about workflows and plugins.

## Where to look first

- A page is missing: it is usually filtered, in another workspace, or in Trash. See [Version history and Trash](your-data/version-history-and-trash.md).
- Changes don't reach your other devices: look at the sync status, below. Thymer syncs in the background, so a large batch of changes can take a while to reach every device.
- Markdown Mirror is quiet: check its status in **Settings → Markdown Mirror**. See [Status and recovery](markdown-mirror.md#status-and-recovery).
- An agent can't connect: check the server, the port and the workspace access. See [Connect an AI agent with MCP](ai-agents-and-cli/connect-an-ai-agent-with-mcp.md).
- A plugin misbehaves: turn it off, or start in Safe Mode, below. See [Developing with the SDK](plugins/developing-with-the-sdk.md).
- A shortcut does nothing: the browser or system may own it. Change it in **Settings → Keyboard Shortcuts**.
- Something needs a newer version: **Settings → Check for Updates**.

## The sync status

The icon at the bottom right of the window shows whether your changes have reached the server. On a phone it sits at the top of the sidebar.

*On a computer: the sync status at the far right of the status bar. Hover it for the details.*

*On a phone: open the sidebar, and the sync status is next to the account button.*

| Icon | Means |
| --- | --- |
| Check mark | Everything is synced |
| Spinner | Syncing |
| Circle | Changes are waiting to sync, for example while you're offline |
| Airplane | Syncing is paused |
| Triangle | Something went wrong |
| Download arrow | Synced, and attachments are still downloading |

Hover the icon for the details, such as "Everything synced. (Online, Real-Time)" or "Waiting to sync changes... (Offline)". Click it for its menu:

- **Pause syncing** keeps your changes on this device for a while, and **Resume syncing** sends them. A reload resumes syncing. **Toggle pause/resume syncing** in the command palette does the same.
- **Download all attachments** fetches every file, for working offline.
- **Toggle Sync Stats** shows technical details per workspace: revisions, pending changes, and the members with their email addresses.

## Version, reload and updates

- **Version** in the menu of the Thymer logo, at the bottom right, shows the version of the app, its sync worker, the server and the platform. Include it in a bug report.
- **Reload workspace** in the account menu, at the top of the sidebar, rebuilds the window from the data on your device without downloading anything. **Reload Panel** in the command palette reloads the page in the current panel.
- **Settings → Check for Updates** tells you whether a newer version is available, on every platform. The desktop app also checks by itself and asks to restart with **Install Now** when an update is ready. See [Desktop app](apps-and-settings/desktop-app.md).
- In the desktop app, **View → Reload** reloads the window, and **Help → Web Inspector** opens the developer tools, which plugin developers use. See [Developing with the SDK](plugins/developing-with-the-sdk.md).

## The diagnostics page

Every account has a diagnostics page with the recovery tools. It works on the data that one device keeps for the account, in the browser or the desktop app.

- In the browser, open `your-account.thymer.com/diag.html`.
- In the desktop app, open the accounts window, the one that lists your accounts when the app starts or when you switch accounts. Open the menu next to an account and choose **Troubleshoot...**. The page opens in its own window.
- The dialog Thymer shows when syncing crashes links to it too.

The iOS and Android apps keep their data in a different way, so the page's local-data tools don't apply there. An account owner can still rewind a workspace from any browser.

The page has:

- **Delete IndexedDB data and Logout**: wipes all of Thymer's local data for the account on this device and signs you out. Everything unsynced is lost with it, so try everything else first. If it times out, close all other Thymer tabs and windows, use **Delete Service Worker**, and try again.
- **Delete Service Worker**: removes the part of Thymer that caches the app in the browser, without touching your data. Use it when the browser keeps loading an old version of Thymer. It comes back on the next load.
- **Rewind...**: rewinds a workspace; see below.
- **Show Thymer version** and **Reload Thymer in Safe Mode**.

## Safe Mode

Safe Mode starts Thymer without plugin code, custom keyboard shortcuts or your theme, and pauses Markdown Mirror. Pages don't show their properties while it's on. Use it when a plugin or a theme has made the app hard to use.

There are three ways to turn it on:

- Add `?safe_mode=yes` to the address in the browser.
- Click the Safe Mode link in the notice Thymer shows when a plugin fails to load. The notice also has **Reload page**.
- Choose **Reload Thymer in Safe Mode** on the diagnostics page.

A dialog says so when Thymer starts in Safe Mode, and a **Safe Mode** tag stays in the status bar. You can open a plugin's code editor, fix the code and save it: that plugin runs again so you can test it, while the others stay off. **Exit Safe Mode** in the dialog, or any reload, brings everything back, the mirror included.

## Rewinding a workspace

A rewind restores the entire workspace to an earlier point in time. It is for a bad bulk edit, a script, import or agent session gone wrong, or anything else you want to undo completely. It logs everyone in the workspace out, turns off every active Markdown Mirror, and drops changes that haven't synced yet, from every member. So only use it when you really need to, at a time when it doesn't disrupt ongoing work.

Only account owners can rewind.

1. Open the diagnostics page and choose **Rewind...**.
2. If the device has local data for the account, the page deletes it first: choose **Delete Local Data & Continue**. Changes this device hasn't synced yet are lost, so let it sync first. Because this happens before the page checks who you are, leave rewinds to owners.
3. Pick the workspace under **Select Workspace** and enter how many minutes to go back under **Rewind by (minutes)**. The page shows the exact time it will rewind to.
4. Click **Rewind**. It runs at once, without asking again.

Then:

- Every change in that window is removed from the workspace, whoever made it.
- Everyone signed in to the workspace, on every device, is logged out of it with a notice. Their other workspaces stay online. The notice lets them keep looking at their local copy offline, and when they log in again their device downloads the rewound workspace.
- Changes a device had not synced yet are dropped when it logs in again, so anyone with unsynced work copies it out first. The notice says so too.
- Markdown Mirror is switched off for the workspace on every computer. Turn it on again after checking the files against the rewound state.

To undo a rewind, sign in to the workspace again, open **Rewind...** and pick the workspace: a ⟲ marks one that was rewound, and the page shows when and how far. Choose **Undo Last Rewind**. If people made changes since the rewind, you choose: **Merge** keeps them on top of the restored changes, **Discard** throws them away. Undoing logs everyone out of the workspace once more, the same way.

## Reporting a bug

Tell us what you were doing, what you expected, what happened, and the version from **Version** in the logo menu. The exact error text helps, and so does a minimal example: one page, one query or one small plugin. Leave passwords, Recovery Keys and private content out of it.

## What's new

**Help: See What's New** in the command palette, or **What's new** in the logo menu, opens the release notes inside the app. Desktop and mobile updates come through their own channels; see [Desktop app](apps-and-settings/desktop-app.md) and [Mobile apps](apps-and-settings/mobile-apps.md).
