I create verbal identities that scale, whether humans write the content or AI does. The same story, the same tone of voice, the same quality, applied wherever your brand shows up.
Honed, nuanced writing with a true human voice.
Systems that scale human voice without losing it.
I still believe in craft. It’s the language only a human being can write. A distinct POV, a signature turn of phrase. Complex ideas made simple, compelling, even beautiful.
Launch copy, founder letters, campaigns, rebrands. Big spotlight moments that carry the most weight and the least room for error.
For brands selling more than a product: an experience, a world, a way of life. Written with a storyteller's instinct, not a marketer's.
Email, web, product, events. Whatever the format, the same question applies: does this need real craft, or just words? If it's the former, I'm in.
Craft in action:
Standard Chartered Bank — Head of Copy @ R/GA
Hong Kong's first virtual bank, built from 0 to 1. I defined the brand voice, the messaging framework, and the content guidelines across all surfaces. Then carried that voice through the manifesto, the app, and even the physical bank card, blending English and Cantonese the way the city itself does. See Mox.com
London Youth Games & NikePlus — Head of Copy @ R/GA
Two engagements: a new tone of voice and website for London Youth Games, built to partner Nike with LYG’s mission for young athletes. And a NikePlus pilot: I designed one motivational framework, rooted in behavioural psychology, then applied it consistently across 12 weeks of training content. See LYG.org
RIMOWA.com — Copy Director @ R/GA
A 120-year-old luxury luggage brand, rebuilt for e-comm. Exactly the kind of high-stakes rewrite where every word counts. I wrote the heritage story once. Then built a copy system that carried the voice across the product, from the patented wheels down to the TSA locks – all the way through to checkout. See rimowa.com
Rules make craft repeatable, a thousand times over. The same human judgement, made explicit enough for a machine to check, so it survives contact with scale.
Written for people, the way it's always been done. Or rewritten as rules for an agent. Both let you control your voice, across teams and touchpoints.
UX writing rules for your UI, from foundations to components. The rules let designers and AI tools keep your product consistent as it grows.
The terms you already use, made uniform. One glossary enforced everywhere, instead of terms drifting across product, marketing and support.
Voice rules go stale. Models change, new features ship, teams turn over. I offer ongoing maintenance to keep your AI content systems up to date.
Rules in action:
Senior Content Designer
I wrote the company's first content design guidelines. These included foundational rules for the whole product UI – and specific rules for every component in the design system. Then I built three tools on top, all shipped and in production:
An AI assistant built on Glean that writes, edits, and critiques copy in the house style. It means judgment scaled across an entire team rather than bottlenecking with one person. Read my Intercom blog post →
content-review — ValidationA Claude Code skill that checks whatever a designer gives it: code, a Figma file, a screenshot. The content is reviewed against the full design system, so any issues are caught while the work is in progress, not fixed after launch.
content-lint — EnforcementCode gets linted automatically, so I built this tool to ensure content does too. It checks every pull request for major errors like typos or US vs UK English. It found 5k errors live in-product, and now catches new ones before they ship.
To show what this means in practice, here's an illustrative example.
Written for humans in a style guide:
Buttons should use short, active verbs. Avoid vague labels like "Submit" or "OK". Say what the button actually does e.g. "Send message," "Save changes". Keep to 3 words or fewer where possible.
The same rule, restructured for a machine to follow:
rule: button_label_specificity applies_to: component.button checks: - max_words: 3 - banned_labels: ["Submit", "OK", "Click here"] - require: verb_first - require: describes_the_action # e.g. "Send message" not "Continue" fail_message: > Button labels should be short, active, and specific to the action (e.g. "Send message", not "Submit").
The human version relies on judgment: what counts as "vague" is left to taste.
The machine version can’t do this: every condition has to be explicit and checkable, with no room for interpretation. Writing that translation – deciding what can be made binary and what still needs a person’s judgment – was the core challenge behind all three tools I built above.