Good UX writing cleans up after design. Great UX writing shapes it before production.
I build the frameworks, pattern libraries, and tooling that put it there — voice consistent and standards enforced, across iOS, Android, and web.
The product ships copy across three platforms from one Figma source that doubles as dev handoff. At ~1,600 strings, four things kept breaking:
rules.yaml — the copy canon as code, where adding a rule means one regex in a config file.Status = Active), tone-of-voice pillars, naming rules — then judges the screen against canon.Next: merge the deterministic and judgment halves into one LLM-in-the-loop linter.
pair + lint emit| Canon | iOS | Android | Web | Status |
|---|---|---|---|---|
| Not now | Not now | Not now | Not now | identical |
| See psychics | See psychic | See psychics | See psychics | drift |
| Chat longer and save | Chat longer & Save | Chat longer and save | Chat longer and save | style |
| Recommended for you | Recomended for You | Recomended for You | — missing | typo · gap |
| [Name] | [Name] | [ExpertName] | [Name] | token |
The payoff, in one number. One unverifiable claim — Voted most accurate — had quietly shipped across the product:
One claim, shipped to 81 screens. Plain text-similarity linting misses this class — it isn’t visible “drift,” it’s a canon issue. The system surfaced every instance; one ruling fixed them all.
A sample of the machine-checkable class the linter now clears on every run, so judgment goes to the calls that need it. Examples are illustrative.
People come to a psychic-chat product mid-breakup, in grief, or facing a hard decision. That’s the moment copy has to earn trust rather than spend it — and the frictionless version always pulls harder than it should. I held the line between resonance and pressure on every surface a user meets — the conversation, the promos, and the money flow — and encoded it into the system so the line holds without me.
The brief was “here’s the flow, fix the copy” — a ~220-string chatbot funnel steering new users toward a trial psychic chat. I reframed the problem before touching a word.
I ran two passes: a string-level pass, and a path-level pass — programmatically assembling seven end-to-end transcripts and reading them as real conversations for rhythm, repetition, and cumulative tone. The audit framework had no conversational lenses, so I built five and added them as a reusable pattern family:
After the PM signed off, the real question surfaced: how are these responses even formed? The whole corpus ran on one generator — mirror the user, weigh the feeling, bridge to the psychic — so it read like a catalog of captions. The assistant never responded — it evaluated. The fix wasn’t another polish pass. It was giving authors a palette of conversational jobs and a quota per path.
Being good at what you do and still not being seen — that chips away at you.
That’s an exhausting way to work. I’m glad you said it straight.
More people carry this one than ever say it out loud.
Noted — word for word. This goes to your psychic as is.
Outside the chat, pressure shows up as certainty: a result stated as fact, a card that “confirms” your path. Each rewrite below keeps the emotional pull — what goes is the guarantee.
There’s a high chance that you’ve already met your soulmate from a past life. Those intense feelings you have are real soul nudges, not just daydreams. Who is it: an old friend, a chance encounter, or someone close?
Some people describe feelings like this when they’ve crossed paths with someone important before. Who is it: an old friend, a chance encounter, or someone close?
The Star encourages you to open your heart and believe in the possibility of a better future. Let go of fear and cynicism, and reconnect with a sense of wonder and purpose. This card confirms that you are on the right path — keep moving forward with serenity and confidence. Your wishes have been heard.
Get the best guidance and advice! Whether you are looking for insight, guidance, or comfort, you can be sure to find it in your Tarot Reading.
The Star encourages you to open your heart and believe in the possibility of a better future. Let go of fear and cynicism, and reconnect with a sense of wonder and purpose. This card is an encouraging sign — keep moving forward with confidence.
Want to go deeper? Chat with a psychic for guidance tailored to you.
Money flows are where the canon has to be strictest — the stakes are highest, and every subscription product feels the pull to press harder there. Four patterns came out of the standards work; three are now encoded as lint rules, so every future instance gets flagged without me re-reading a single screen.
Your subscription renews on June 14. Cancel now and you keep access until then.
We can also add one free week to your plan — no charge, no commitment.
Your subscription renews on June 14. Cancel now and you keep access until then.
We can also add one free week to your plan — no charge, no commitment.
We’ll text you when your psychic replies, so you don’t have to keep the app open.
We’ll text you when your psychic replies, so you don’t have to keep the app open.
directive-modality rule flags all three across the product.Three of the four aren’t found by reading screens one at a time. confirmshaming, urgency-scarcity and directive-modality are rules I encoded in rules.yaml, so the linter flags every instance on every screen — including the ones written after me.
One line runs through all of it — the conversation, the promos, the paywall: a product built on hope can’t grow by spending users’ trust, and the honest choice should never be the harder one.
I’m after senior/lead content design where copy is owned as a system.