Communication
Communication
Nzinga asks people for their voice and pays them for it. Every word has to earn trust: say what happens, say what cannot be undone, and leave the decision with the member.
Voice
apps/mobile/CLAUDE.md (copy rules) apps/mobile/app/** (screen copy)
Nzinga sounds like a fair person who respects you: someone from your own circle who knows how the system works and tells you straight. The voice stays the same everywhere; the tone changes with the moment.
Short sentences, everyday words, one idea at a time.
"Your starting choice. You can change it on every recording."
Says what happens, including what cannot be undone and what it costs.
"Models already trained cannot forget it. You keep what you were paid."
The member decides. Copy says "you choose", "your recordings", never "we will use".
"You decide who can use it."
A greeting in your own language, then straight to the point. No exclamation marks, no hype.
"Habari, Amara" then "Record now".
Tone by Moment
app/(join)/welcome.tsx app/(setup)/consent-choose.tsx lib/recordings.ts lib/api.ts (errorMessage) lib/payouts.ts
| Moment | Tone | What the app says |
|---|---|---|
| Welcome | Confident, brief, proud of the language. | "Your language. Your voice. Your terms." · "Record voice notes in the languages you speak, on the phone you already have." |
| Consent | Calm and exact. No nudging; the suggested choice is marked, not pushed. | "You decide who can use it." · "Choose for every recording: only you, Nzinga, approved partners or everyone. Change it any time." |
| Recording | Quiet and encouraging. Out of the way. | "A recording is still running." · "The microphone stopped. Your recording so far is kept." |
| Rejection | Kind and specific, never blaming. Always a next step. | "Usually this means background noise, a very short recording, or speech in a different language from the one chosen." · Record it again |
| Payment | Precise. Amounts, dates and who does what. | "Requested on this phone; Nzinga confirms by SMS." · "Money is added to your balance the moment a recording is accepted." |
| Withdraw | Respectful and honest about limits. | "Your voice is removed from all future training and licensing. Models already trained cannot forget it. You keep what you were paid." |
| Errors | Say what happened and what to do, in one breath. | "No connection. Check your internet and try again." · "Something in the form is not right. Check it and try again." |
Usually this means background noise, a very short recording, or speech in a different language from the one chosen.
Rejection: what usually causes it, then the way forward.
Error: a plain title, the reason, and Try again.
Writing Rules
apps/mobile/CLAUDE.md §5 SCREENS.md (design rules) lib/consent-copy.ts lib/money.ts lib/recordings.ts
- Short, plain sentences. One idea each. If a sentence needs a comma to breathe, it may be two sentences.
- Title Case for screen and page titles. "Who Can Use Your Recordings", "Payout Method", "Consent and Privacy". Buttons start with a verb and say what happens: "Send for review", "Save method", "Record it again".
- The four choices use their exact names: "Only me", "Nzinga's models", "Nzinga and approved partners", "Everyone". Never shortened, reordered or renamed.
- No jurisdiction-specific content. Nothing that names one country's law, regulator, phone format or service as the rule. Country-specific parts (payouts, legal text) are modules.
- No placeholder text in anything a member can see, and no invented numbers or claims.
- The brand is Nzinga, the product line Nzinga Network.
- Example languages. When one example language is needed, use Swahili, then Hausa, then Yoruba. Do not single out any one language as the default member.
Words to Replace
| Never | Say instead | Why |
|---|---|---|
| tier, consent tier | who can use it | The code's word, not the member's. Members choose who can use a recording. |
| for now | what is true today: "kept on this phone", "not built yet" | Vague about the future; say the fact. |
| Nzinga Voice | Nzinga · Nzinga Network | The brand name. |
| user, contributor, data subject | member, you | People join Nzinga; they are members. |
| upload (when audio stays on the phone) | send the details · saved on this phone | Audio is not uploaded today. Never imply it is. |
| earn up to, free money | the rate, from the server: "$0.20 for each accepted minute" | Promises the ledger does not make. |
| anonymous, secret (of hashed numbers) | scrambled on your phone; Nzinga keeps none of them | A plain hash of a number can be reversed by trying every number. |
Numbers, Money and Dates
Always through formatMoney(minor, currency) with the server's currency: $0.42, signed in activity: +$0.42, −$5.00. Never rounded up.
Minutes and seconds as 3:12 on rows and players. In sentences, words: "Two to three minutes", "About a minute".
"Today", "Yesterday", a weekday within the week, else a short date: "28 Oct". Long form on headers: "Tuesday 3 November".
"The minimum payout is $5.00. You have $3.10 available."
Both numbers, from the ledger, in one breath.
"Almost there! Just a little more to go before you can cash out."
Hides the numbers the member needs.
Languages and Localisation
apps/mobile/lib/languages.ts packages/core/src/profile.ts packages/core/src/consent.ts SPEC.md
- Members choose from 42 languages: the most widely spoken languages of the continent plus shared languages many members also speak. Each is stored as an ISO 639-3 code (
swh,hau,yor) with its name and a short greeting. - No language has a special place. Pickers sort alphabetically and put the member's own languages first. Dialect is asked for, with its reason: "Speech models work better when they learn each variety of a language."
- The interface itself is in English today; translation of the interface is not built.
Scripts and Direction
Arabic is in the list, and its greeting is set right to left. When the interface is translated into a right-to-left language, mirror the layout: back arrows, chevrons and progress run the other way; numbers and the cowrie do not flip.
Amharic and Tigrinya greetings are written in Ge'ez (ሰላም). Test on real devices that the platform font renders every character, and never fall back to transliteration without the member's choice.
Consent Is Never Machine-Translated
Every consent records the exact text shown, by version and SHA-256 hash. A translated agreement is a new text: it gets its own version and hash, a review by a native speaker, and legal review in the market where it is used. Never show members a machine translation of the agreement or of the four choices.
Notifications and SMS
app/screens/notifications-settings.tsx apps/api/src/otp.ts lib/payouts.ts apps/mobile/CLAUDE.md
Four switches, kept on the phone: Recording reviewed, Payment, Invite accepted, New ideas to record. Sending notifications from a server is not built yet.
Sign-in codes are six digits, valid for 10 minutes, five tries. Nzinga confirms every payout by SMS before any money moves. The SMS provider is chosen per market.
- Lead with the fact, in one sentence. Name the recording by its title; never quote what was said.
- No urgency, no streaks, no "don't miss out". "New ideas to record" is occasional.
- An SMS never asks the member to reply with a code, a PIN or a payout number. Nzinga sends codes; it never asks for them.