GitHub

Voice and content

Every user-facing string follows one voice. Engineers writing for engineers — direct, technical, honest, economical.

§1

Voice attributes

Constant across every product and surface.

AttributeHow it shows up
DirectFirst sentence is the point. No preamble.
TechnicalAssume a competent user. Use precise terms.
HonestTruth without euphemism — “Failed to save”, not “Oops!”
EconomicalCut until you can’t cut more — “Deleted”, not “Successfully deleted!”
Active“We couldn’t load”, not “It couldn’t be loaded”.

§2

Writing principles

The rules that turn the voice into concrete strings.

Brief, not truncated — cut “please”, “simply”, “just”, “easily”, “very”, “really”.

Specific, not generic — “Task #142 deleted”, not “Item deleted”.

Active voice, present tense.

Imperative for actions (“Save”); declarative for state (“Saved”).

Sentence case — not Title Case, except proper nouns.

Oxford comma — “team, clients, and partners”.

No anthropomorphization — no “I”, “I’m sorry”, “Let me…”.

No fake enthusiasm — no confetti, no “Awesome!”.


§3

Canonical vocabulary

One word per concept, held consistent across the library and every consumer.

ConceptUseDon’t use
Permanently removeDeleteDestroy, Erase, Wipe, Kill
Reversible remove from viewArchiveHide, Bin, Trash
Remove from membershipRemoveKick, Boot, Eject
Persist draftSaveStore, Keep
Persist finalPublishRelease, Go live, Broadcast
Send form dataSubmitSend, Post
Apply pending changesApplyConfirm, Activate
Close without savingDiscardThrow away, Forget
Navigate backBackPrevious, Return
Abandon flowCancelAbort, Nevermind, Skip
Close modalCloseDismiss, Hide
Copy a resourceDuplicateCopy, Clone
Sign-in actionSign inLogin, Log in
Sign-up actionSign upRegister

§4

Component copy patterns

How the voice resolves into button labels, errors, empty states, and toasts.

Button labels

verb + object

Do Create project

Do Save changes

Do Delete account

Don’t OK

Don’t Done

Don’t Click here

Don’t Learn more

Error messages

what’s wrong + how to fix

Do Email must contain an @ symbol.

Do Email already in use. Sign in or use a different email.

Don’t Invalid input.

Don’t Error: see below.

Empty states

“No {things} yet” + value proposition + next step

Do No projects yet

Do Create your first project to track tasks and collaborate.

Don’t Nothing to show here

Don’t Click the button below to get started!

Toast messages

past-tense factual — {noun} {verb}.

Do Project created.

Do Email sent.

Don’t Success!

Don’t Your project has been successfully created.

Confirmation titles

question form with a specific noun — {Verb} {noun}?

Do Delete workspace?

Do Discard changes?

Don’t Are you sure?

Don’t Confirm action

Loading (>3s only)

present participle + specific object

Do Generating PDF…

Do Uploading 2 of 8 files…

Don’t Loading…

Don’t Please wait…


Where strings live
Library strings ship as default English via @idinstudio/ui/copy. Consumers override them through LanguageProvider with ICU message format — counts, dates, and numbers always go through Intl, never hardcoded.