The tagwerk file format

tagwerk keeps one Markdown file per day and nothing else. This page documents that format completely: the folder conventions, every line rule the parser applies, and what the app writes back into a file. It exists so your notes never depend on this app. Everything described here can be written and read with an editor, a script or grep.

Version 1 · 2026-08-21 · applies to tagwerk 1.0 for Android

1Scope and status

A tagwerk note is a plain CommonMark/GFM text file. Everything the format adds is written into the text of a line, in characters that stay readable when nothing knows what they mean. An editor that has never heard of tagwerk shows a note as ordinary Markdown with a handful of markers sitting in it as literal text.

The app is the reference implementation, and this page is written from its parser rather than from a plan for one. Where the two disagree, the app is wrong and we want to hear about it: please enable JavaScript to see the address.

You do not need permission or a library to write these files. The rules below are all there is. There is no index, no database and no hidden state that a note depends on.

2Files and folders

One file per day. The date lives in the file name and never in the content, so nothing inside a note can contradict the day it belongs to. The folder holding the notes is called the vault; it is a folder you choose.

Notes/                    ← the vault root
├─ templates/             ← what a new day starts with (§15)
│  ├─ template.md
│  └─ template-monday.md
├─ settings/              ← everything that is not a note (§21)
│  ├─ tagwerk.colors
│  └─ tagwerk.license
└─ 2026/
   └─ 08/
      ├─ 2026-08-08.md
      ├─ 2026-08-09.md
      └─ 2026-08-10.md

Names and paths

Files that are not day notes

NameMeaning
templates/ The day templates (§15): template.md, template-monday.md, template-day23.md. Their own folder, deliberately outside the day layout, so nothing that scans for days reads one as a day.
settings/ Everything in the vault that is not a note: the tag colours (tagwerk.colors, §21) and the licence (tagwerk.license). Its own folder for the same reason the templates have one, and visible rather than hidden — the licence is a file people are asked to find. A licence lying loose in the vault root is still read; that was where it used to go.
*.sync-conflict-tagwerk.md
*.sync-conflict-tagwerk-2.md
Written whenever a day ends up in two versions: the app's own sync found both sides changed, or another program wrote the file while tagwerk had that day open. It holds the version tagwerk did not write; the day file keeps the one it did. Numbered upwards and not overwritten.
*.sync-conflict-*.md
*(conflicted copy*.md
Conflict copies from Syncthing and the Nextcloud desktop client. Also recognized: left out of the day listing and offered for review instead of being read as days.
*.md.tmp Scratch file of an in-progress write (see below). Short-lived, and deleted when a write fails. Worth adding to a sync tool's ignore patterns.
Writes are atomic. A note is written to <file>.md.tmp and then moved over the original. A sync tool watching the folder never picks up a half-written file, and an interrupted process never leaves a truncated one behind.

Nothing else in the vault belongs to the app. History, sync bookkeeping and settings live in the app's own storage, not in your notes folder. A vault is notes, templates and whatever else you put there.

3Text conventions

4Line types and precedence

Each line is tested in this order, and the first rule that matches decides. Anything that matches none is ordinary Markdown and passes through untouched.

#LineRecognized as
1 ``` or ~~~, optionally indented — a run of backticks only when no backtick follows it on the line, so ```npm install``` is inline code, not a fence Code fence delimiter. It toggles fenced mode: the delimiter and every line up to the closing delimiter are verbatim text. No tasks, no appointments, and no tags or contacts are found in them.
2 - [ ] … Task line (§5)
3 13:00 … Appointment line (§8)
4 anything else Text line. Headings, dividers, prose, lists, tables: Markdown. Tags and contacts are still found in it (§11).

A fence that is never closed leaves the rest of the file verbatim, which is CommonMark's behaviour too. It means a note can hold a code sample containing - [ ] … without the app acting on it.

5Tasks

A task is a GFM task list item: optional indentation, a hyphen, one whitespace character, a bracketed state, then the text.

indent  bullet  state       text
        -       [ ]         Write the invoice @paul #office
MarkerStateMeaning
- [ ]openStill to do. Together with [/] the only state that counts as open anywhere in the app.
- [/]in progressBegun and not finished. Open in every sense the app asks about — it is in the task list, it goes overdue, it is ticked off and forwarded like an open task — and drawn as begun.
- [x]doneFinished. [X] is accepted as well.
- [>]forwardedMoved to another day. The copy lives there and the trail stays here (§7).
- [-]droppedGiven up on without doing it.

Exact shape

An empty checkbox is not a task. - [ ] with nothing written after it is a line somebody is in the middle of typing. It has no tap target, does not appear in the task list, and does not count towards a day's open tasks.

What the editor normalizes

While you type, the app rewrites a checkbox that is nearly right into the canonical form. The bullet may be missing or stuck to the bracket, and the box may be empty:

[ ] Water the plants   →  - [ ] Water the plants
[x] Call the landlord  →  - [x] Call the landlord
-[ ] Book the train    →  - [ ] Book the train
- []                   →  - [ ]

Never inside a code fence. And never when the text is stuck to the bracket and begins with (, which is what keeps a Markdown link like [](https://…) from being turned into a checkbox — nor when it begins with : or [, Markdown's reference links: [x]: https://… and [x][1] stay as they are. With a space between them the bracket is a checkbox again, so [ ] (later) call back normalizes like any other line.

A checkbox another app drew as a character

A task list exported as plain text writes its boxes as characters rather than as brackets, and those are rewritten the same way:

☐ Clean the dishwasher  →  - [ ] Clean the dishwasher
☑ Called the landlord   →  - [x] Called the landlord
☒ Gave up on it         →  - [x] Gave up on it

The three characters are U+2610 BALLOT BOX, U+2611 WITH CHECK and U+2612 WITH X. Both ticked boxes arrive as done: this format tells “done” from “given up on”, and no exporting app means that difference by the character it picked — what both certainly mean is that the task is no longer open.

The box has to open the line and be followed by whitespace, so Status: ☐ and a sentence mentioning the character stay what they are. This rule runs where the bracket rule runs — while the note is saved, and on a paste, so a list pasted in is a list on screen straight away rather than the next time the day is opened. It is a translation into this format and not part of it: nothing in tagwerk ever writes one of these characters.

In progress

- [/] is the spelling Obsidian themes, the Obsidian Tasks plugin, Logseq and Bike use for a task somebody has started, and a vault coming from one of them carries it. Ticking a begun task off makes it [x]; taking the tick back makes it [ ], not [/] — nothing in the file says it had been begun. A forwarded copy of a begun task arrives begun (§7); the next occurrence of a repeating one arrives open, with its sub-tasks open (§10), because it is a new task.

Settling a task with sub-tasks

Ticking a task off, or dropping it, applies the same state to the still-open tasks — open or in progress — indented under it. A parent marked done with an open child underneath says two contradictory things. Sub-tasks that already carry a state (done, dropped, forwarded) keep it, and re-opening a parent leaves its block alone, because nothing in the file records which of them had been ticked before.

6Sub-tasks and descriptions

Indentation is the only thing that says “this belongs to that”. The lines directly below a task that are indented deeper than it are its block, up to the first blank line or the first line at the same depth or shallower.

- [ ] Weekly shop #errands
  Cash only, the card reader is broken.   ← description
  - [x] Fruit                             ← sub-task
  - [ ] Bread                             ← sub-task

- [ ] Something else                      ← blank line ended the block

7Forwarding to another day

Moving a task writes two lines in two files. The source day keeps a readable trail, the target day gets an ordinary open task.

2026-08-10.md
- [>] Review the offer @paul >2026-08-12

2026-08-12.md
- [ ] Review the offer @paul

A date on its own

A date written without any marker — Rechnung vom 2026-01-01 prüfen — names that day and nothing more. It is not a forward marker: no task is moved, no copy is written, and nothing reads it into a model. An editor may offer it as a link to the day, and tagwerk’s does — except for the date the note itself is, which leads where the reader already is and stays plain. A reader that only parses the format ignores all of it, and both are correct.

8Appointments and “not before”

Appointments

A line that begins with a clock is an appointment. No sigil, no keyword, because a clock is what people write anyway.

09:30-11:00 Sprint review @team
13:00 Dentist
9:00 - 9:30 Standup           single spaces around the dash are allowed

“Not before” on a task

A single time directly after a task's checkbox says when the task starts being worth showing outside the note:

- [ ] 19:00 Omega 3 #health

9Priority

One character, standing alone: ! for important, ~ for “whenever”. Nothing between them means normal, which is what almost every task is.

- [ ] Finish the report !
- [ ] Watch the next episode ~

10Recurrence

How often something comes back is written into the line as an ISO 8601 repeating interval. The syntax is the standard's rather than one invented here, because a note is a text file other people read in other editors, and a syntax you can look up beats one only this app explains.

A task and an appointment both carry it, and it means two different things. A task is handed out: finishing with one writes the next copy into the day it is next due on, and the marker travels with that copy. An appointment is projected: the line stays on the day it was written on, and the rule says which other days it also falls on — the calendar draws those, including on days whose notes do not exist yet (§17). Nothing is written for them until somebody writes it.

19:00 Mastermind R/2026-09-04/P4W      every four weeks, from the 4th
09:30-11:00 Standup R/P1W              weekly, with an end time
- [ ] Take out the bins R/P1W          every week
- [ ] Water the plants R/P3D           every three days
- [ ] Meter reading R/P1M              every month
- [ ] Physio R5/P1W                    five more times, weekly
- [ ] Team lunch R/2026-08-12/P1W      every Wednesday

A length cannot say “every third Tuesday of the month”, so where a length will not do, a calendar rule stands in the same place — RFC 5545's RRULE, restricted to whole days. It is the other half of the same bargain: still a standard you can look up, still readable by a calendar application, and reached for only when the short form has nothing to offer.

- [ ] Jour fixe R/FREQ=MONTHLY;BYDAY=3TU                       every third Tuesday
- [ ] Invoices R/FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1 the last working day
- [ ] Standup R/FREQ=WEEKLY;BYDAY=MO,TH                        Mondays and Thursdays
- [ ] Course R/2026-09-15/FREQ=MONTHLY;BYDAY=3TU;UNTIL=20270630 and then it stops

Grammar

R [count] "/" [ anchor "/" ] ( "P" duration | rule )

count     digits; how many more occurrences the line is responsible for. Absent = forever.
anchor    YYYY-MM-DD; the interval's start date, and a rule's DTSTART.
duration  date-only ISO duration: nY nM nW nD, at least one number.
rule      RFC 5545 recurrence rule, date-only; FREQ first, parts separated by ";".

Calendar rules

The whole date-level vocabulary of RFC 5545 §3.3.10 is read: FREQ (DAILY, WEEKLY, MONTHLY, YEARLY), INTERVAL, UNTIL, WKST, BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY and BYSETPOS, with the standard's own restrictions on which may stand beside which frequency. The anchor is DTSTART; without one, the day the line sits on is. Where a part is left out that the frequency would otherwise expand over, its value comes from that start date, exactly as the standard says.

Two parts are deliberately refused, and a rule carrying either is plain text:

UNTIL is the one thing in the format that can end a rhythm by date: past it the task is settled and no copy is handed out at all, which is not the same as a count running out — there the last copy still arrives, it simply carries no marker.

Anchored or floating

Without an anchor, the next date is measured from the day the task is on — not from the day it is ticked off. A bin task on Wednesday that is ticked off on Thursday still comes back on a Wednesday; one that is moved to Thursday first comes back on a Thursday, and walks a day forward every week it is moved. With an anchor, the dates are the anchor plus whole intervals, wherever the task is moved and whenever you happen to tick it off, and that is what turns “every seven days” into “every Wednesday”. An anchored monthly rule starting on the 31st stays on the 31st in the months that have one, because each occurrence is counted from the anchor and not from the occurrence before it.

What happens when the task is settled

Finishing a repeating task appends the next occurrence to the day it is next due. Ticking it off and dropping it both settle it. The line you settled stays as it is, so the day keeps its record.

Why not every four weeks? Because it is not the same rhythm, and the difference grows. R/2026-09-15/P4W starts on the third Tuesday of September 2026 and is a week early by October, two weeks by January and four by July — thirteen dates a year where the calendar has twelve. That was the honest approximation while the format had only lengths in it; it is not one any more.

11Tags and contacts

Two inline tokens, valid anywhere in a line and on every kind of line: #tag and @name.

- [ ] Write the invoice @paul #office
09:30 Sprint review @team #project/api
Called @mira about the move. #family
TokenCharactersBoundary rule
#tag Unicode letters and digits, _, -. Nesting with /: #project/api/docs. A word character must follow the # immediately, and the # must not be preceded by a word character or another #.
@name Unicode letters and digits, _, -. No nesting: @paul/pm is the contact paul followed by text. The @ must not be preceded by a word character.

What the boundaries buy:

How tokens compare

A hyphen belongs to the token, not to the sentence. It is one of the characters a name is made of — that is what makes @anna-lena and #one-on-one possible — so it can never also end one. A compound whose first half happens to be a contact is therefore not a mention of that contact: @Trelleborg-Drillmodul is the contact Trelleborg-Drillmodul, written once and never again, and @Trelleborg is not in that line at all. Nothing about it reads as wrong — the whole compound is coloured as a token, the search finds it, the catalogue lists it — which is why it is only noticed weeks later, when the person's own lines are missing from their statistics.

Where the grammar wants the hyphen, the token has to do without it. Write @Trelleborg Drillmodul, or turn the phrase around and put the token last: Drillmodul von @Trelleborg. German is where this bites, because a compound there is one word by default and the hyphenated spelling is the correct one; in a note it names somebody who does not exist. The same holds for a tag — #Angebot-Trelleborg is one tag, not #Angebot with a word behind it.

12Readings on a tag

A tag can carry a value after a colon. The tag itself stays the tag, so filtering and the catalogue still see one #weight and not one tag per measurement.

Weighed myself #weight:81.4 #habits
Electricity meter #power:473574
- [ ] Evening walk #feeling:good
Two meters in one line: #power:8651 #power:8700

Numbers and words

A reading is a number when it parses as one with at most one separator and an optional leading sign, and nothing else. No exponents, no currency symbols. Both separators are accepted because both get typed: 12,5 and 12.5 are the same value. Two separators make it a word, because 1.234,56 is a thousands separator somewhere and a decimal point somewhere else depending on who wrote it, and guessing wrong turns twelve hundred into one point two.

Numbers get minimum, maximum, sum, average, median and standard deviation, plus a chart over time. The standard deviation is the population form, since these are all the readings there are and not a sample drawn from more. Anything that is not a number is a word and gets counted instead.

A reading does not travel. When a line is copied to another day, either as the next occurrence of a repeating task or as a task moved to next week, the copy carries the tag without the reading — but with its colon: #weight:81.4 arrives on the next day as #weight:. The tag says what the task is about; the number was an observation of the day it was written on. The line that stays keeps everything.

A tag waiting for a reading

A tag written with a colon and nothing behind it — - [ ] Cold shower #coldshower: — is a line waiting for a value. It parses as the tag alone: the colon is not part of the token, and the tag counts towards the same #coldshower as any other mention. What it says is that a reading is expected and has not been written yet, which is exactly the state the copy above arrives in.

The app asks for one when such a task is ticked off, and writes what is typed behind the colon. Dropping a task asks nothing — a task that did not happen has nothing to have measured — and a value left blank leaves the tag waiting. A tag with no colon is never asked about.

The colon only means this where a reading could stand behind it. In #weight:.5 the text .5 is not a reading (a separator may only stand inside one, see above), so that tag is not waiting for anything — writing a value in front of it would change what the line says.

13Headings and dividers

People group their days, and a task that moves to Friday should land under the same heading there. Three kinds of line separate a note:

LineKindStrength
# … ###### ATX heading, CommonMark's rule: up to three leading spaces, one to six hashes, a space, then text. 1–6 by hash count
--- Habits --- Named divider. Not CommonMark, but it is what people write for a labelled break, and it reads as one in any editor. Hyphens only, at least three a side, whitespace around the title. 2
--- *** ___ Thematic break. Ends a section without naming a new one. 2

A section runs from its heading to the next line that separates at least as strongly, or to the end of the file. A blank line does not end a section. Blank lines are how people breathe in a text, and treating one as an end would file tomorrow's task above the tasks it belongs with.

Where a travelling task lands

A task moved to another day, or handed out again by a repeat rule, keeps the section it sat in:

  1. The heading is matched against the target day's lines, trimmed and compared literally. Found: the task is appended after the section's last non-blank line.
  2. Not found: the heading itself is appended to the note, and the task under it, so the day it arrives on is as tidy as the one it left.
  3. The task sat under no heading: it is written before the target day's first heading (after the lines that stand above it, before the blank lines that set the first section apart), so it stands where the day begins, as it did on the day it came from. A day without headings gets it at the end. Appended to the end, a task would land inside the last section of any day that ends in a heading — and the next move would carry it along as one of that section's tasks.

A plain divider between a line and the heading above it means that line belongs to no section, because the divider ended whatever was above it.

A task written from the task list is filed by the same three rules. The difference is only where the heading comes from: it is chosen rather than inherited — from the headings the target day names, or from the ones its template names while the day is still empty. Choosing none is the one difference: a new task is a new line, and a new line without a heading goes to the end of the note.

15The day templates

The files in templates/ below the vault root hold what a new day starts with. A template is plain note text, so whatever the format allows is allowed in it, headings and recurring tasks included, and it is as readable and as syncable as the notes beside it.

Notes/templates/
├─ template.md            ← the default: any day
├─ template-monday.md     ← Mondays
└─ template-day23.md      ← the 23rd of each month
templates/template.md
## Morning
## Work
--- Habits ---
- [ ] 07:00 Run #sport
- [ ] Weigh myself #weight

Names

Which template a day takes

How it behaves

16A complete example

One file, using everything above.

Notes/2026/08/2026-08-10.md

# Work

07:00 Run #sport
09:30-11:00 Sprint review @team #project/api

- [ ] Finish the offer @paul ! #office
  - [x] Check the numbers
  - [ ] Have it proofread @mira
  Send as PDF, they cannot open .docx.
- [>] Verify the backups >2026-08-12
- [ ] Take out the bins R/2026-08-12/P1W
- [ ] 19:00 Omega 3 #health
- [-] Prepare the meeting

--- Private ---
- [ ] Get a gift for @mira #family ~
- [x] Weighed myself #weight:81.4 #habits

Everything else is **Markdown**: headings, lists, code.
Notes on the release: https://example.org/notes#changelog

What the app reads out of it:

17What the app derives from a note

Everything below is a view of the files. None of it is stored in them, and none of it is needed to read them.

Notes changed by a sync client or another editor are picked up by comparing file stamps, checked at most every couple of seconds. External writes appear without the app having to be restarted.

18Interoperability

The point of the format is that other tools can work on these files. What follows is what you can rely on.

Written asElsewhere
- [ ], - [x]Standard GFM. Renders as a checkbox in Obsidian, Markor, GitHub, VS Code.
- [>], - [-], - [/]Renders as a list item with the character in brackets. Harmless text. Several Obsidian themes draw [/] and [-] as states of their own.
>2026-08-12, R/P1W, !, ~Plain text. At the start of a line, >2026-08-12 renders as a block quote — which is why the app writes markers at the end of a line.
#tag, @namePlain text, or a real tag in editors that have the same convention (Obsidian tags, for one).
13:00 DentistAn ordinary paragraph.
--- Habits ---A paragraph. Reads as a labelled break either way.
---A thematic break, as CommonMark says.

From the command line

# every line mentioning the office
grep -rn "#office" Notes/

# everything still open, oldest first
grep -rn -- "- \[ \]" Notes/ | sort

# what was moved, and where to
grep -rn -- "- \[>\]" Notes/

# one tag's readings, one per line
grep -rho "#weight:[0-9.,]*" Notes/ | sed 's/#weight://'

# the notes as a git history
cd Notes && git init && git add . && git commit -m "notes"

Writing these files yourself

19Pattern reference

The patterns the parser actually uses, in .NET/PCRE notation. They are given here so an implementation can match tagwerk exactly rather than approximately. \p{L} is a Unicode letter, \p{M} a combining mark (the second half of a decomposed "ü") and \p{N} a Unicode digit. Three of them are wrapped over several lines to fit the page; they hold no line breaks and no whitespace at the wrap.

Task line
^\s*-\s\[(?<state>[ xX>/-])\]\s?(?<text>.*)$

Appointment line (whole line, from column 0)
^(?<sh>\d{1,2}):(?<sm>\d{2})(?: ?- ?(?<eh>\d{1,2}):(?<em>\d{2}))?\s+(?<text>\S.*)$
        plus: hours ≤ 23, minutes ≤ 59

"Not before" (against the task text, after the checkbox)
^(?<h>\d{1,2}):(?<m>\d{2})(?=\s|$)

Forward marker
>(?<date>\d{4}-\d{2}-\d{2})

A date on its own (§7; a link, not a marker — the editor's rule)
(?<![-\d])\d{4}-\d{2}-\d{2}(?![-\d])

Priority
(?<![^\s(\[])(?<marker>!|~)(?![^\s)\].,;:!?])

Recurrence (case-insensitive)
(?<![^\s(\[])R(?<count>\d*)/(?:(?<anchor>\d{4}-\d{2}-\d{2})/)?
(?:P(?=\d)(?:(?<y>\d+)Y)?(?:(?<m>\d+)M)?(?:(?<w>\d+)W)?(?:(?<d>\d+)D)?
|(?<rule>FREQ=[A-Z]+(?:;[A-Z]+=[A-Z0-9,+\-]*[A-Z0-9])*))(?![^\s)\].,;:!?])
        the rule branch finds the shape; §10 decides whether it is one

Reminder (§23, case-insensitive)
(?<![^\s(\[])C/(?<body>P(?=\d|T\d)(?:(?<d>\d+)D)?(?:T(?=\d)(?:(?<h>\d+)H)?(?:(?<m>\d+)M)?)?)?(?![^\s)\].,;:!?])

Contact
(?<![\p{L}\p{M}\p{N}_])@(?<value>[\p{L}\p{M}\p{N}_-]+)

Tag, with an optional reading
(?<![\p{L}\p{M}\p{N}_#])#(?<value>[\p{L}\p{M}\p{N}_-]+(?:/[\p{L}\p{M}\p{N}_-]+)*)
    (?::(?<reading>[\p{L}\p{M}\p{N}_%+-]+(?:[.,][\p{L}\p{M}\p{N}_%+-]+)*))?

ATX heading
^ {0,3}(?<hashes>#{1,6}) +\S

Named divider
^ {0,3}-{3,}[ \t]+(?:\S|\S.*\S)[ \t]+-{3,}$

Thematic break
^ {0,3}((-\s*){3,}|(\*\s*){3,}|(_\s*){3,})$

Code fence delimiter
^\s*(`{3,}(?!.*`)|~~~)

Day note file name
^(?<date>\d{4}-\d{2}-\d{2})\.md$        case-insensitive

Template file name (§15; reading is forgiving, writing is not)
^template(?:-(?<suffix>[a-z]+|day0?[1-9]|day[12]\d|day3[01]))?\.md$        case-insensitive

Web address (trailing punctuation trimmed afterwards, see §14)
https?://[^\s<>"'`\\]+        case-insensitive

Markdown link (§14; the closing bracket ends the address, so nothing is trimmed off it)
\[(?<title>[^\[\]\n]+)\]\((?<url>https?://[^\s()]*(?:\([^\s()]*\)[^\s()]*)*)\)        case-insensitive

Vault link (§22; the anchor is split off the target afterwards)
(?<!!)\[\[(?<target>[^\[\]|\n]+)(?:\|(?<label>[^\[\]|\n]*))?\]\]

Cancelled appointment (§8; matched against the text after the time, trimmed)
^~~(?<inner>(?:(?!~~)[^\n])+)~~$

Struck-through text anywhere in a line (§3; appearance only — the editor's rule)
~~(?![\s~])([^~\n]*[^\s~])~~
The tokens are found on the raw line, so their offsets include the task marker and the sigil. A tag's name excludes the # and its reading; the reading is read separately.

20Not part of the format

Listed so you know it is missing on purpose. None of the following is read, and all of it would sit in a note as ordinary text.

21The tag colours file

settings/tagwerk.colors gives tags a colour. The app draws them in the calendar, in the note and in the home-screen widgets; nothing about a note changes, and no note ever refers to this file. A vault without it is a vault whose tags have no colours, which is the ordinary state.

# tagwerk — colours for tags. One "#tag: colour" per line.
# Names: mint, green, cyan, blue, lavender, rose, amber, slate, or a hex value like #3b82f6.
#work: blue
#project/api: lavender
#sport: #3b82f6

Lines

What a colour applies to

The app writes it ordered by tag name. Not tidiness: the file is synced by comparing content, so two devices holding the same colours have to produce the same bytes — otherwise every save on one would look like an edit to the other.
It is read under a few other names too. tagwerk.colors is what the app writes and what another tool should write. Android's file providers do not always keep it: creating a document whose name does not carry the extension of its MIME type appends one (tagwerk.colors.txt), and a name already in use is numbered (tagwerk.colors (2).txt). Those are read as this file, newest first, and the next save writes the canonical name again and removes them. The same holds for tagwerk.license.

No pattern for this file appears in §19, and that is deliberate: it has none of its own. What counts as a tag here is decided by the tag pattern in §11, so the two cannot drift apart.

23Reminders

A line can ask to be reminded about. The marker is C — for cue, a signal that prompts you to act — a slash, and optionally how long before the line's own time:

19:00 Zahnarzt C/PT30M          thirty minutes before
19:00 Zahnarzt C/               at the time itself
- [ ] 09:00 Angebot raus C/     on a task, too

Why this is the one place minutes are allowed

§20 rules hours and minutes out of a recurrence, and that stands: a recurrence is an assertion about days, and a note is a day. A reminder is the opposite assertion — it is a moment, and minutes are the whole of it.

What the format does not say

Whether anything actually rings. A reminder is delivered by a device, so whether it is switched on, on which of your devices, and how far ahead it looks are settings of the app and not properties of the note. The marker on the line is the request; a file that is only ever read stays a file that is only ever read.

Nothing is written back either. A reminder that has been shown, dismissed or put off leaves no trace in the note — that is state about a device and a moment, and §20's rule against machine-owned fields in a line covers it.

← Back to the start page