These rules are for anyone writing the words Datler shows or says about itself: labels and help in the app, the glossary, and these docs. Read them before writing UI copy. Each guards against a mistake that is easy to make and easy to miss on review.
Names come from the glossary
- A concept’s name is its glossary term, read through
termWord(id)andtermPlural(id)from@datler/core, in a label and in a sentence alike. Look the concept up inpackages/core/src/glossary.generated.tsbefore writing the word (Glossary). “Other ways to count it” for Units is the kind of made-up synonym this rules out. - If a term reads badly, rename the term, everywhere at once: its file in
docs-vault/content/terms/, the old spelling added to itsbannedlist, thenpnpm run docs:gen-glossary(UI Vocabulary and the Info Affordance). Never a friendlier word in one place. - No new noun for something that already has one. An entry with a start and an end is an entry, not a “sitting”; describe it by its fields.
- Retired words stay retired: Folder is Tag; Display and Analysis are Visualization; sitting is entry; Mood is Emotion and Pleasantness; Check-in is Rundown.
- What a module names (a trackable, a field’s label) is the person’s to rename, but it starts as the term: the Emotion field, the Subject field.
Labels
- A label is a noun or a short noun phrase: Start name, Entry date, Intensity, Source, Severity. Read each one alone and ask whether it names the thing. A participle is not a label: “Called” is Name, “Dated by” is Entry date, “Counted from” is First day.
- Never “Its …”, “Each …” or ”… is called”. “Its value”, “Its start is called” and “Its visualizations” are all wrong.
- An option reads as the thing: Waketime, not “Its waketime”.
- No heading that restates the page. A Weight page does not need “Weight — its own value” under its title.
- Every input has a visible label above it, the library’s
Field. A placeholder may give an example, never the name: once a value is filled in the placeholder is gone, and a bare box says nothing about what it is for. Where a row is tight (a food’s values, a routine row’s fields), the label may sit beside the box or small above it, but it is always there and always says what the box is; a unit beside a box is not its label. A search box is no exception. - A sentence explains fields; it never labels them. “Not until [5] days have a value” hides what the box is once it is read. The label goes above, and the sentence goes beneath as a plain reading of what the fields now say (the
Field’sdescription): “No record counts until 5 days have a value.” - A button is a verb (Save, Revert, Log, Exit); a link names where it goes (Issues page).
Sentences in the app
Help text, confirmations, empty states.
- Plain and short, saying what happens: “12 entries go with it. This cannot be undone.”
- Say whose, rather than opening with “Its”: “The values this has none of come from Chicken breast”, not “Its values fill the ones this has none of”.
- The glossary term inside a sentence too: “no stored entries” is
termPlural("entry"), and a count istermCount("entry", n), “12 entries”, never a word picked byn === 1;apps/renderer/src/ui-copy.test.tsfails on one. - No fixed “a” before a name someone typed: the article follows the name’s sound, and “Deleted a Energy entry” is what a fixed one gives. Phrase around it: “Energy entry deleted”, “Usually in Workout”.
- No caption explaining the obvious.
The docs
- A note says how a thing works and why, as information, without the record of who chose it or when: no quotes, no names, no “it was decided”. The reason a design is this way and not the obvious other way belongs in the note, stated plainly (Vault Curation).
The checks
pnpm testrunsapps/renderer/src/ui-copy.test.ts, which fails on app text that starts with “Its”; on alabel,title,aria-labelorplaceholderwith “its” in it, written as a string or as a string inside the expression that chooses it; on an option’s text with “its” in it; and on a fixed “a” or “an” before an interpolated name. It is narrow on purpose: a wide scan of the source for banned words finds far more false hits than real ones.pnpm run docs:check-vocabularylists the glossary’s banned spellings in this vault.- Look at the screen with values filled in, not only at the accessibility tree.
Related
Glossary · UI Vocabulary and the Info Affordance · Vault Curation