Skip to content

Content

Clear, calm, specific. How prfct products speak — in buttons, errors, empty states and everything in between.

Words are interface. A precise label removes the need for a tooltip; a good error message removes the need for a support ticket. prfct's voice is clear, calm and specific.

Voice

We areWe are not
Clear — plain words, short sentences, one idea at a time.Clever, cryptic, or full of jargon.
Calm — steady even when something goes wrong.Alarming, blaming, or apologetic to excess.
Specific — we name the thing and the outcome.Vague: something went wrong, item, data.
Human — we write like a helpful colleague.Robotic, or overly familiar.

Mechanics

  • Sentence case for everything: titles, buttons, menu items, tabs. Only proper nouns are capitalized.
  • The name is always prfct, in lowercase — even at the start of a sentence. The website is prfct.dev.
  • Numbers as numerals: 3 files, not three files. Use thousands separators and the viewer's locale.
  • No periods on labels, buttons, headings or single-sentence helper text. Use them in multi-sentence text.
  • Contractions are fine: can't, you'll. They sound human.
  • Second person: address people as you; refer to the product as we sparingly.
  • Dates and times are relative when recent (2 minutes ago) and absolute when older (Sep 18, 2026), with the full value in a tooltip.

Actions

Button and menu labels start with a verb and name the object: Create project, Invite teammate, Export CSV. The same action has the same label everywhere.

Instead ofWrite
OKSave changes
SubmitCreate account
Yes / NoDelete project / Keep project
Click hereRead the migration guide

Errors

A good error message says what happened, why (if it helps), and what to do next — in that order, without blame.

Do.Specific and actionable.
Don’t.Vague, technical and unhelpful.
  • Validate on blur, not on keystroke. Don't show an error while someone is still typing.
  • Put the message next to the problem with FieldError, and summarize at the top of long forms.
  • Never lose input. An error must not clear the form.

Empty states

An empty state is an invitation, not an absence. Explain what will appear here and offer the first action: No projects yet — Create your first project to start deploying.

Confirmation

Ask for confirmation only when an action is destructive and irreversible. Name the object and the consequence: Delete “Acme website”? This removes 14 deployments and can't be undone. Prefer undo over confirmation when you can offer it.