Four projects, one product surface: credit and lending, a brand-new marketplace, a loyalty program, and the design-system work now underway to keep all of it consistent. Each starts from a different constraint, but the throughline is the same. Write it once, get it right in both languages, and build it so the next person doesn't start from scratch. (K.ai, Klivvr's AI assistant, now has its own standalone case study →.)
Credit is Klivvr's most high-stakes feature. The copy has to guide someone through applying for a credit limit, understanding installments, and recovering from a rejection or a blocked state, all while staying accurate enough to survive legal and compliance review.
Financial terms don't translate cleanly into conversational Arabic, and every string touches regulation. The team needed copy a first-time borrower could understand instantly, in two languages, without softening it into something legally imprecise. That held true across application, activation, refund, and Family Credit sharing flows.
Locked one Arabic term as the only accepted phrase for "credit limit," never a looser alternative. It's enforced across every screen and every knowledge base entry, including K.ai's.
Every blocked or rejected state names the specific reason and the next step, instead of a generic "something went wrong."
And when a loan is approved, the confirmation states the same kind of facts: merchant, amount, repayment period, in plain language instead of banking-speak.
Designed copy for credit-holder-initiated sharing, distinguishing "pending verification" from "waiting on recipient," a distinction the original flow conflated.
Wrote the explainer and success/blocked copy for refund decisions in plain language, while keeping the legal specifics intact for compliance sign-off.
Credit copy is where clarity and compliance have to survive the same sentence. I learned to treat every financial term as a fixed asset, not a stylistic choice. One wrong synonym in Arabic can change what a user believes they agreed to.
K.Shop (originally named Marketplace) lets Klivvr users spend their credit limit and K.Points at partner merchants. I owned the copy from initial naming decisions through a full localization pass and a standalone knowledge base.
A brand-new feature meant no existing terminology to lean on. Every screen, state, and edge case needed copy decided from scratch, in two languages, across cart, checkout, order tracking, saved addresses, and out-of-stock states, while staying consistent through a mid-project rename (Marketplace → K.Shop).
When the feature was renamed to K.Shop, I audited every string and localization key so the change didn't leave stale references for developers.
Rather than write each empty state as it came up, I grouped them by cause and matched each group to its own copy pattern and CTA logic. That's the framework I later generalized company-wide in the Content Componentization case study below.
Cart, checkout, and order tracking copy always states what happened and what's next, never a bare status label.
Built a standalone K.ai knowledge base for K.Shop questions, correcting outdated canned responses using real Figma screenshots as ground truth.
K.Shop showed me that naming is content strategy, not marketing's job alone. A rename touches every string, every key, every knowledge base entry. Someone has to own that consistency end to end.
K.Points is Klivvr's rewards currency, earned through challenges and streaks. Left unattended, this kind of feature reads like a banking ledger. My job was to make it feel like a reward worth chasing, in a voice that stayed warm in both languages.
Five different challenge mechanics: cashback, multiplier, family, repeated, and total. Each needed its own description template, plus copy for streaks, Spin the Wheel, and Mystery Box rewards, all while avoiding language that felt transactional or clinical.
Replaced transactional phrasing like "One-time voucher" with warmer alternatives, cutting words like "transacting" that felt too formal for a rewards screen.
Renamed challenge availability labeling to read like a feature, not a system status.
Landed on "Join & Earn" after multiple rounds. It reads as an invitation, not an instruction.
Moved streak-related nudges off the reward confirmation screen, where they competed with the reward itself, to where they'd actually motivate a return visit.
Working on K.Points showed me that loyalty copy is really motivation design. Every label is either pulling someone back into the app or quietly pushing them out. There's no neutral option.
Klivvr's UI copy was being written screen by screen, meaning the same kind of decision, like how an empty state should read or how an error should apologize (or not), got made differently by whoever touched it last. This project documents those patterns once, bilingually, inside the design system itself.
Without a shared reference, UI copy patterns drift: two error messages that should feel the same read differently, empty states get invented from scratch each time, and Arabic conventions live only in individual designers' memory.
Empty states split into four types, each with its own copy logic and CTA pattern.
Each component entry states the rule behind the copy, like field-error thresholds, so the next person applies the logic correctly, not just the wording.
Every entry ships with EN and AR guidance together, flagged for native-speaker review before handoff.
Living inside the Figma design system next to the components themselves, instead of a separate doc that goes stale.
Empty, error, success, and loading states are being documented as one reusable bilingual library, with a target of 80% coverage across core in-app strings.
This is content strategy at the systems level, not the screen level. Instead of writing an empty state, I'm deciding how every empty state at Klivvr should be written, and building that decision into the tool where design actually happens.