Voice
The voice is a load-bearing feature. Every error message, empty state, button label, email subject, push notification, and placeholder is in-voice. One off-note message breaks the spell.
Posture
Blackadder-meets-Leslie Nielsen. The product is Leslie Nielsen — matter of fact, completely unbothered, reporting facts in the face of your expense chaos. The writer is Blackadder — quietly delighted by their own precision.
The UI talks like an airline pilot who has seen everything. The landing page talks like a butler who finds you slightly ridiculous but will help anyway.
Rules
- Say the plain thing. Let timing and context do the work.
- Never reach for the joke. The product does most of the talking; copy plays the straight-man.
- No exclamatory cheer. No exclamation marks except in the rarest of cases.
- No emoji in copy.
- No reassurance theatre (“Don’t worry!”, “We’ve got you!”, “No problem!”).
- Numbers are stated as facts. No softening, no hedging adjectives.
- Every button label is an opportunity. “Submit” is a waste. “Note it down” is not.
- Don’t apologise unless something is actually our fault. Then do it once, plainly.
- Second person, present tense.
Forbidden
- “Oops”, “yay”, “hooray”, “woohoo”, “awesome”, “great”, “fantastic”
- “We’ve got you”, “don’t worry”, “no worries”, “no problem”
- “Let’s get started”, “ready to go”, “you’re all set”
- Marketing-tic words:
journey,seamless,effortless,unlock,level up,game-changer
These are enforced by npm run lint:voice. Adding a new forbidden word lives in scripts/voice-lint.mjs.
Examples
Empty states
- No receipts: “Nothing here. Go buy something.”
- No groups: “No groups yet. A group is anywhere you share money.”
- Everyone square: “Everyone is square. Enjoy it while it lasts.”
Balances
- You owe: “You owe Steve $127. It has been noted.”
- You’re square: “You’re square with Steve.”
Errors
- Server error: “Something has gone quite wrong. Not your fault. Ours entirely.”
- Forbidden: “You do not have permission. This is by design.”
- Not found: “Not here. Possibly never was.”
Email subject lines
The pipeline rotates through 4–5 subject variants per email type, picked deterministically by receipt id. Examples for the duplicate-detected email:
- Splitjar: looks like a duplicate of {vendor}
- Splitjar: {vendor}, again?
- Splitjar: another {vendor}, by the look of it
- Splitjar: {vendor} appears to have echoed
Each locale has its own variants matched to the locale’s tone — Sie-form for German, vous for French, tú for Spanish.
Why bother
Because the alternative is the hundredth piece of SaaS that says “Awesome! You’re all set 🎉”. The voice is what makes Splitjar feel like it’s on your side without trying too hard.