RTL is not a feature, it's a posture
How to actually build Arabic-first interfaces — beyond just flipping the layout. A craft essay.
Most 'RTL support' I see in production is a CSS direction: rtl rule and a prayer. The layout flips, the icons move, and the team checks the box. Then Arabic users show up, and the experience is subtly wrong: numbers read backwards, time formats ignore the locale, animations slide the wrong way, and the typography — even with the right font — feels like a translation rather than a native voice.
Real RTL support starts with typography. Arabic has its own rhythm — it's a connected script, not a sequence of letters. Most Latin fonts are designed for vertical rhythm; Arabic needs horizontal flow. The default line-height that works for Latin is too tight for Arabic. The default letter-spacing that's invisible in Latin breaks Arabic ligatures. If you're using the same typography rules for both, your Arabic is harder to read than it should be.
Then there are numbers. Arabic speakers use Western Arabic numerals (1, 2, 3) in most contexts, Eastern Arabic numerals (١, ٢, ٣) in others. The right choice depends on the dialect, the formality, and the audience. Hardcoding either is wrong. Use Intl.NumberFormat with the right locale and let the platform decide.
Dates and times are worse. Most apps default to US formats (MM/DD/YYYY, 12-hour clock) regardless of locale. Arabic-speaking users in Egypt expect DD/MM/YYYY and 24-hour clock. Users in Saudi Arabia might expect Hijri dates alongside Gregorian. The Intl API handles all of this — use it.
But the deepest issue is posture. If you're treating Arabic as an afterthought — added at the end, translated from English, designed by someone who doesn't read Arabic — your Arabic users will feel it. The interactions will feel Latin-first. The copy will feel translated. The whole experience will feel like a courtesy rather than a native home. RTL isn't a feature you ship. It's a posture you take — that Arabic users are first-class users, not an afterthought.
Boring tech scales better than yours
Why I keep choosing Postgres and queues over the latest shiny thing — and how it's saved every team I've been on.
Eval-driven AI development
Stop vibe-checking your LLM. A practical workflow for shipping AI features you can actually defend in production.
Edge-first: an architecture diary
Six months running a 240-POP edge deployment. What worked, what broke, and what I'd never do again.