The goal was to standardise UX writing: consistent tone and casing, grounded in the product and market, and aligned with Branch’s brand principles.
- Company
- Branch International
Visit Branch ↗ - Industry
- Fintech
- Role
- Product Designer, AI Systems
- Tools
- Claude Figma Google Sheets ChatGPT (early prototype)
- Team
- One product manager and one engineer from each market.
- Period
- 25 August 2025 to
5 March 2026
The final harness was Claude Chat with the skill enabled. Product, design, engineering, marketing and customer support teams could send text, attach a screenshot, share a Figma link, use voice or share their screen.
Impact TLDR:
- I packaged Branch’s brand principles, product context and design-system rules as an agent skill, so every team’s AI workflows produced consistent, on-brand UX writing by default.
- I took ownership of the project from discovery through implementation, with substantial help from colleagues.
- The product team implemented 1,778 copy changes across markets.
What CopyGPT included
Brand principles
The ten principles that defined how Branch should sound:
- Be Concise and Eliminate Unnecessary Words
- Use Clear, Simple, and Jargon-Free Language
- Maintain a Conversational, Human Tone
View more
- Provide Context and Helpful Guidance
- Use Specific and Predictable CTAs and an Action-Oriented Language
- Be Empathetic, Optimistic, Use Positive Wording to Create Good Feelings
- Optimize for Mobile-Specific Interactions
- Write Inclusive Microcopy
- Write Clear and Reassuring Success Messages
- Write Helpful Error Messages and Failure scenarios
Used by
- Teams: Product, design, engineering, marketing and customer support.
- Markets: India, Kenya and Nigeria.
Contextual framework
- Product, market, screen state and intended action.
- Component, text position, category and use case.
- Tone, character and word limits, sentence phrasing, casing and punctuation.
- Relevant brand principles and examples of good and bad copy.
Caters for
Error, confirmation, success, feature, empty-state and processing copy, as well as the labels and instructions within those experiences.
Why Branch needed CopyGPT
Reviewing a single line of UX writing could take 20 minutes of a design review. We would discuss what sounded right while also finding inconsistent casing for the same component across different screens in the app.
The goal was to standardise UX writing: consistent tone and casing, grounded in the product and market, and aligned with Branch’s brand principles. Teams needed to reach that standard without repeatedly spending review time deciding what worked and what did not.
I took ownership of the project from discovery through implementation, with substantial help from colleagues.
Discovery: how teams were creating copy
I started by looking at the workflows people already used. Colleagues turned to Gemini, ChatGPT, Claude, Perplexity and Google Search. Each approach produced an answer, but there was no shared knowledge base or set of component rules governing those answers.
At the start, the documented UX-writing guidance was the brand principles. The product and component context needed to apply them consistently had not been assembled into a common reference.
Copy for the same feature could differ in tone or casing between India and Nigeria, without consistently following Branch’s principles. I needed a common set of rules that also accounted for each market’s products and terminology.
Defining the product context and component guardrails
Other product designers helped me collect and clean documentation for the features in their markets. They wrote product overviews and the steps within each flow. This became the core product-context dataset supplied to the LLM: what a feature did, what the person was trying to achieve and what happened at each step.
We then agreed that the writing rules needed to be defined within the design-system components. A button, input label and error-message body serve different purposes. Each needed its own guardrails so the LLM could apply the relevant rules to that part of the interface.
Together, we documented each component’s category, use case, tone, character limit, word count, sentence phrasing, casing, punctuation, applicable principles, good and bad examples, and rationale. The final v7 reference defined 30 component types and 45 text positions.
For a Primary Button, for example, the documented guidance specified:
Primary Button exampleProperty guidance and v7 JSON
Documented property guidance
| Property | Guidance |
|---|---|
| Category | Actionable |
| Use cases | Loan application, repayment and wallet top-up |
| Tone | Clear and action-oriented |
| Character limit | Maximum 25 characters |
| Word count | 1–4 words |
| Sentence phrasing | Verb + object |
| Casing | Title Case |
| Punctuation | No ending punctuation |
| Principles | Clear language, predictable actions and mobile interactions |
| Good examples | Add to Wallet; Pay Now; Start Investment |
| Bad examples | Submit; Proceed; Click Here |
This gave the LLM a specific contract for the component. The product context determined the action; the component rules determined how to write it.
Explore the framework
Choose a component, market or brand principle to see the guidance supplied to the LLM.
Researching and prototyping the LLM workflow
This was new territory at Branch. I had to determine how an existing LLM could interpret a screen, find the applicable Branch guidance and follow the component rules in its response. I researched the major LLMs and reviewed literature on how they were built, then structured the operating guide and reference data around that workflow.
I developed an algorithm for the writing workflow: identify the context, select the relevant guidance, generate copy, check it and resolve any conflicts. The operating guide defined that sequence, while JSON reference files supplied the component, market, brand and validation rules.
The first harness was a ChatGPT Custom GPT. We moved to a Claude Project after the team found Claude stronger for the writing task. I continued refining the instructions and reference data through seven versions.
Refining the system through seven versions
The iterations progressively made the component definitions more complete, the constraints more explicit and the validation more thorough.
- V1
Assembled the initial brand, market and component references. Thirty component types were listed, with populated text-position rules for twelve.
- V2
Added rule precedence and seven lint checks.
- V3
Linked component rules to writing principles and consolidated the market structure.
- V4
Defined text positions across all components, structured character, word and line limits, and expanded component inference and mapping.
- V5
Reduced hard minimum constraints and added ordered alternatives when copy could not fit a component’s limits.
- V6
Expanded lint to fifteen checks, standardised naming and market-term validation, and introduced an operating guide.
- V7
Aligned conflicting List definitions, specified styling for all forty-five text positions, expanded lint to thirty checks, and added generation patterns and checks against copying examples verbatim.
How the version 7 algorithm works
Colleagues used CopyGPT through a chat harness. They sent a request with text or an app screenshot, supplied missing context when asked, and refined the proposed copy through follow-up messages.
I designed the v7 operating guide to instruct the LLM to identify the screen context, select the applicable Branch rules, generate copy and validate it before responding. The sequence below shows that algorithm.
UX copy
A colleague sends a request through the chat harness.
Component, text position, intended action and market.
Identify the component and context. heuristics-v7.json supplied component synonyms, screen-context clues and visual cues. The LLM identified the component, text position, intended action and market. If the market was missing or the component could not be identified, it asked for clarification.
Map other design-system terms to Branch’s vocabulary.
Map it to Branch’s design system. material-map-v7.json translated other component names into Branch’s vocabulary. A Snackbar mapped to a Toast. It also mapped terms such as headline to title and supporting text to body, so the model could find the appropriate rules.
Market → component → brand → inference fallback.
Apply product and market context. markets-v7.json supplied product information, local terminology, currency formats, identity-verification methods and market restrictions. For example, India used “mobile number,” while Kenya and Nigeria used “phone number.” Kenya’s product terminology used “savings”; Nigeria’s used “investments.” The available detailed flow model covered Nigeria.
Apply the component contract. components-v7.json supplied the required and optional text positions, length limits, casing, punctuation and phrasing patterns. A Primary Button needed a specific action within 25 characters. A multi-part component needed its title, body and action to work together.
Write in Branch’s voice. brand-v7.json supplied the ten principles and the voice attributes: trustworthy, professional, user-friendly, inclusive and optimistic. The LLM generated fresh copy using these principles and the component patterns. Guidance examples illustrated a pattern rather than serving as text to repeat.
Use the selected guidance and component patterns. Rephrase examples rather than copying them.
Thirty checks in a nine-step sequence.
Validate and revise. lint-rules-v7.json defined thirty checks in a nine-step sequence: encoding, market terminology, length, casing, punctuation, action verbs, date and currency formatting, standardised terminology, and verbatim-example detection. If the copy exceeded a limit or broke a rule, the instructions directed the model to revise it before responding.
Unless requested otherwise. Use a numbered list for single-line requests; group multi-part options by element.
Resolving conflicting rules
v7 followed market requirements → component rules → brand defaults → inference fallbacks. If necessary guidance cannot fit, shorten first, propose a supported alternative and revalidate; the team decides component changes and unresolved constraints. The following scenarios illustrate that policy.
Examples of how the LLM resolves conflicts
Nigeria’s investment product
Savings
A reused Kenyan label.
Savings
Kenya’s product uses “savings,” not “investments.” This market rule is not active in Nigeria.
markets-v7.json · KEInvestments
The market requires “investments” and prohibits “savings.”
markets-v7.json · NGReusing the Kenyan label would apply terminology from the wrong market.
Nigeria is the active market, so its source replaces the reused Kenyan label. Kenya’s rule applies only in Kenya.
Revised copyInvestments
Banner headline
Your Account Is Ready
Follows the brand’s Title Case default.
Title Case
The default for titles and headlines.
brand-v7.json · titles_headlinesSentence case
The Banner requires Sentence case.
components-v7.json · Banner.headlineThe same headline cannot use both Title Case and Sentence case.
The specific Banner headline constraint supersedes the general brand default.
Revised copyYour account is ready
Payment connection failure
No money left your account. Check your connection and try again.
The necessary recovery message is 64 characters; a Toast allows 50.
Product state confirms no money left the account.50-character maximum
At most 10 words, in Sentence case.
components-v7.json · Toast.textPreserve necessary recovery guidance
Give the next step and reassure about funds safety using the confirmed product state.
heuristics-v7.json · error_stateThis 64-character, 11-word message exceeds the Toast contract. Neither the limit nor the necessary guidance is waived.
Shorten first. If guidance still cannot fit, propose an Alert and revalidate.
- Shorten first
- Still too long? Propose Alert or Text Block
- Revalidate every slot
- Alternatives fail? Flag for human review
heuristics-v7.json · on_limit_failureNo money left your account. Check your connection and try again.
Retry Payment- Title
- 21 / 30 characters · 1 line maximum
- Message
- 64 / 100 characters · 2 lines maximum
- CTA
- 13 / 18 characters · 2 / 3 words
components-v7.jsonThe team decides the component change and checks the two-line layout.Packaging it as a Claude Skill
I packaged the workflow as a Claude Skill so every team could use the guidance within Claude Chat. The package contained a main SKILL.md instruction file and six Markdown references for components, markets, brand, lint, component recognition and flows.
The Skill instructions directed the model to identify the request and select the references it needed. This made the shared product context and component guardrails available within colleagues’ existing AI workflows, across projects and chats.
SKILL.md
Instructions and reference selection
components.mdSlots, limits and writing structuremarkets.mdProduct context and local terminologybrand.mdPrinciples and voicelint-rules.mdValidation rulesreference.mdComponent recognition and mappingflows.mdDetailed Nigeria flow context
Implementation across the app
I collaborated with one product manager and one engineer from each market to work through the app’s UX writing. We sent screenshot batches to CopyGPT, then recorded the original copy, proposed copy and rationale in a shared Google Sheet.
We reviewed the recommendations against the product context and agreed writing rules. The engineers implemented the changes that passed review, and we recorded the outcomes in the tracker before moving to the next batch.
- Screenshot batches
- CopyGPT proposals
- PM and design review
- Engineer implementation
- Tracker update
| Original copy | Proposed copy | Rationale |
|---|---|---|
| Send OTP | Get OTP | Describe the person’s outcome using the preferred authentication action. |
| Search for anything... | Search transactions | Name the content the field actually searches. |
Results
- 1,778
- Copy changes implemented
- 530
- Screen-flow appearances reviewed
- 4,390
- UI component instances audited
Kenya and Nigeria figures include directional estimates.
The product team implemented 1,778 copy changes. The cross-market summary also recorded 530 screen-flow appearances reviewed and 4,390 UI component instances audited. These totals cover India, Kenya and Nigeria; Kenya and Nigeria figures include directional estimates.
The detailed India tracker contains 617 implemented component entries whose text changed. Comparing the original and implemented text shows the scope of those changes:
Wording and punctuation overlap in 125 entries. These percentages are not additive.
Examples of implemented changes
Eight implemented India tracker entries. PAN rows show the empty and already-filled states. Reasons are paraphrased. Final v7 rules explain aligned guidance; the tracker does not identify which version generated each historical change.
What I learned
Richer context requires better documentation
The LLM needed more than writing rules. It needed to understand each market’s products, features and flows. Building that context meant collecting information and writing detailed documentation with other product designers. The richer and more specific that context became, the better the model could match its writing to the product and market. That documentation was a core part of building CopyGPT.
The model needed a consistent vocabulary
The first component rules we created as a team lived in Google Sheets. We used “header” and “body” for an Accordion, but “title” and “description” for a Text Block. My first attempt at the algorithm failed repeatedly because the LLM struggled to connect those equivalent labels to the right rules. I had to clean the data and standardise the names for equivalent text positions, so the algorithm and references used a consistent vocabulary.
Writing the algorithm and assembling the JSON references made the project clearer: I could see where the data and instructions needed attention.
Clarity came from doing the work
Before I started building, I spent too long researching and trying to resolve the uncertainty on paper. Writing the algorithm and assembling the JSON references made the project clearer: I could see where the data and instructions needed attention. I learned to approach ambiguity by building a first version, then using what it revealed to decide what to do next.
Try CopyGPT
Try the live CopyGPT demo, powered by Claude Sonnet 5.5 and the complete v7 operating guide and JSON references.
Paste one piece of UX writing or attach an app screenshot. CopyGPT identifies the component, asks for essential missing context and proposes one rewrite using Branch’s brand, market and component rules.