Voice
LAW — locked, CI-gatedprinciple. interface copy is a compression problem: the shortest string that stays true. labels name the thing, not the sentence; the explanation, if any, lives one layer down.
rule (law).
- lowercase for all app-authored copy. user-created names are never rewritten: a name the user typed keeps its case exactly, everywhere it renders.
- cut the subject when it is the interface itself; the app does not narrate itself in third person.
- one fact per line. two facts are two lines, or a line and a tooltip.
- buttons are verbs, two words at most. places are nouns and live in menus, not on buttons.
- state copy is a word, not a report: a label plus at most one short clause; details live behind the tooltip or expander.
- do not repeat the container: inside a surface titled by context, do not restate the name the user is already looking at.
- names are one word where one word holds (“absorb”, not “save what is on screen into this”). safety copy earns its words: a warning that prevents harm is never compressed past clarity.
worked example — compression, before and after.
| before | after | rule |
|---|---|---|
| your changes have been saved successfully | saved | state is a word |
| are you sure you want to delete this item? | delete “morning setup”? its 2 automations go too | name the object and the blast radius |
| click here to open the full settings window | settings | places are nouns |
| an error occurred while applying your changes (code 87) | didn’t apply — the display went to sleep. wake it and try again | error voice: one clause, exact corrective action, no codes |
| no items have been created yet. get started by creating your first one! | nothing here yet — [create] | empty is a vessel: one line, one action, no cheerleading |
localisation, the cheap-now layer (proposal, pending ratification). all copy goes through string keys from the start; the copy table is the key catalogue. no concatenated sentence fragments; plurals by rule, never by appending “s”. layouts must survive +40% text expansion, checked by a pseudo-locale screenshot in the harness. number and unit formatting is locale-aware for data; timestamps pick one clock convention and keep it. full translation and full right-to-left support are chapter-level commitments for later; expansion tolerance and keyed strings are not deferrable, because both are cheap now and expensive forever after.
Canonical text: §5, voice, in the design language document.