Arabic QA for websites and products41 checks

You translated your product.
Now prove it's ready.

Ritla crawls your site, runs 41 deterministic Arabic and RTL checks across breakpoints, and returns a scored report with evidence and developer-ready fixes, before your users find the problems for you.

Free · one page · no signup · 3 scans a day

ritla.app/report/voyage-app.com
Sample report
61/ 100
Needs work

14 issues. Weakest page /checkout

Categories
Document & metadata80
Untranslated content66
Direction & bidi54
Physical vs logical CSS62
Layout & overflow43
Typography & fonts58
Dates, numbers, currency78
Forms88
Accessibility90
Top issues
critical
<html> has no dir attribute on a page detected as Arabic.R001 · html · all breakpoints
high
The page scrolls horizontally on mobile: 428px of content in a 390px viewport.R040 · .nav-rail · 390×844
high
letter-spacing is applied to Arabic text, which disconnects a connected script.R051 · .hero h1 · all breakpointsاحجز رحلتك القادمة
Get the full report

Deterministic by design. Measured, not asserted.

41
deterministic checks
3
breakpoints per full scan
<60s
typical free scan, end to end
9
quality categories, weighted

“Ritla scores 99/100 on Ritla. The missing point is the tracked-Arabic specimen printed on our own page, which really is a defect.”

Our Arabic page, scanned by our own engineritla.app/ar · measured 2026-08-12
01 · Scan

The engine that never guesses

Deterministic analysis of the DOM and computed styles. Fast, reproducible, and conservative by design: no AI judgment calls at scan time.

voyage-app.com/ar/checkout · 390×844
scanned
إتمام الطلب
الاسم الكامل|الاسم كما في الهوية
الإجمالي$249.00
  1. 1
    R001 · critical
    No dir="rtl" on the root: the whole page reads left to right.
  2. 2
    R051 · high
    letter-spacing on Arabic tears the connected script apart.
  3. 3
    R070 · medium
    Name field forced LTR: Arabic enters against the caret.
  4. 4
    R062 · medium
    "$" price on a SAR/AED market page.
  5. 5
    R040 · high
    Buttons overflow the 390px viewport: horizontal scroll.
Deterministic analysis of the DOM and computed styles. Same page, same score, every time.5 of 41 checks fired
41 checks across 9 categoriesA–I
A · 6Document
B · 3Untranslated
C · 6Direction & bidi
D · 4Physical CSS
E · 4Layout
F · 6Typography
G · 5Formats
H · 4Forms
I · 3Accessibility
Every breakpoint

Layouts break differently at every width. Ritla renders all 3.

1440
834
390R040
Polite, same-origin crawlUp to 25 pages per scan, robots.txt respected, tracking parameters deduped.
/200 · 0 issues
/pricing200 · 0 issues
/checkout200 · 5 issues
/account200 · 2 issues
/help200 · 1 issue
/blog?utm=…deduped
robots.txtrespected
What the engine looks for
document direction missing, contradicted, or declared only in CSShreflang alternate set lacks any Arabic entry on an Arabic pageOpenGraph/Twitter metadata untranslated or og:locale missing/invalidVisible Latin-script body text above thresholds on an Arabic pageUntranslated attribute text (placeholder, alt, title, aria-label, button value)Unisolated bidi hazards: phones, emails, Latin tokens inside Arabic textText inputs rendered LTR where Arabic input is expectedDirectional icon pointing against the sequence its control advancesfloat: left/right on content elements in RTL context without overridetranslateX moves the element off-screen in RTLVisible text-bearing elements overlappingFixed-pixel-width container whose Arabic text exceeds the spaceletter-spacing applied to Arabic text (breaks the connected script)Arabic body text below 14pxLatin display styling (uppercase + tracking) applied to ArabicArabic-Indic and Western digits mixed in the same contextPercent/unit ordering inconsistencies (%50 vs 50%)tel/email/url inputs rendered RTL (these must stay LTR)<select> rendered LTR with Arabic optionsIntentional foreign-language runs missing a lang attributeUI text referencing physical arrow directions
html[lang] missing, non-Arabic, or contradicting detected content<title> or meta description majority-Latin on an Arabic pageCanonical URL points at a different-locale variantUntranslated interactive labels (buttons, nav/footer links, menu items, tabs)Forced-LTR container, or a bidi override, over Arabic contenttext-align: left explicitly set on majority-Arabic textPunctuation rendering at the wrong visual end of Arabic textDirection-sensitive physical properties without an RTL overrideDirection-sensitive shadow x-offsets without an RTL counterpartDocument-level horizontal overflowClipped text: content wider than its box with overflow hidden and no ellipsisArabic text falling back past the declared font family (measured, declared, or a webfont that failed to load)line-height below 1.5 on Arabic body textItalic/oblique applied to Arabic textEnglish month/day names or MM/DD/YYYY dates in Arabic textForeign currency formatting in a SAR/AED market contextLatin punctuation, or wrong-script letterforms, inside Arabic textUntranslated form labels / validation / help textIdentity fields missing autocomplete tokensflex row-reverse faking RTL instead of dir (tab order fights visual order)
02 · Fix

Evidence, not opinions

Every issue carries a screenshot, a selector, a severity, a confidence level, and a concrete fix. Exportable as tickets your team can act on today.

The before and the after, rendered

Live text in this page's own CSS, not a screenshot: tracking tears Arabic letterforms apart, and you can see it without reading a word of Arabic. Every issue carries the same pair.

R051letter-spacing on Arabic.hero h1 · 390
As shippedletter-spacing: 0.3em
تتبّع شحنتك في أي وقت
After fixletter-spacing: 0
تتبّع شحنتك في أي وقت
:lang(ar) { letter-spacing: 0; }
03 · Prevent

Catch regressions the deploy they ship

Signature diffing is live in the dashboard today: every re-scan reports what is new, what is fixed, and what regressed. Scheduled re-scans. Email when a scan finds regression.

in buildSlack, webhooks and CI · deploy triggers

“3 new Arabic issues since your last scan”

Every re-scan diffs the lastvoyage · Arabic readiness
91+1 new · regression
Scan #17today+3 new · 2 fixed · score 58
Scan #163 days ago0 new · 5 fixed · score 61
Scan #156 days ago+1 new · 0 fixed · score 55

A gate in your CI

Ritla runs as one step in the workflow you already have, and fails the build on critical Arabic defects — so a regression stops at the pull request rather than at a customer.

in build
git push
any branch, any commit
ritla scan --fail-on critical
one step in the workflow you already have
41 checks · 3 breakpoints · 4 pages
deterministic: the same commit scores the same twice
2 critical · build failed
the gate holds, and nothing ships
.github/workflows/ci.ymlqueued
$ git push origin feat/checkout-ar
a3f9c2e fix(checkout): Arabic totals row
▸ run: ritla scan --fail-on critical
scanning 4 pages × 3 breakpoints … 41 checks
score 61 · deterministic (matches a3f9c2e)
✕ 2 critical · mirrored caret · Latin digits in price
Error: Process completed with exit code 1.
Checks0 / 41
Waiting for status to be reportedRequired check: ritla

Alerts today · Scheduled re-scans · Email when a scan finds regression

Prove your
Arabic is ready

Free · one page · no signup · 3 scans a day

Anyone shipping Arabic
with their name on it

Built first for product teams entering Saudi Arabia and the UAE with no Arabic QA on staff. Nobody on your team needs to read Arabic to know whether the Arabic build broke.

Product teams

Launching in the GCC

You localized for Saudi and the UAE, but nobody on the team reads Arabic. Score every release and know before your market does.

Team plan · score every release
E-commerce

Where checkout is revenue

A misdirected input or a "$" price on an Arabic checkout costs real orders. Every report names your weakest page, so checkout cannot hide.

Starter or Team · scan on demand
Agencies

Proving localization work

Attach a before and after Ritla score to every delivery. White-label reports are in build; early partners get them from us, manually and first.

Agency plan · partner programme

Arabic changes how
an interface behaves

Four behaviors, rendered live in this page's own HTML and CSS. No screenshots, no mockups. You do not need to read Arabic to see which side is wrong.

As shippedArabic-ready
رحلةالرحلاتالفنادقحسابي

طلبك رقم 48213

تم شحن طلبك
قيد التجهيز
اتصل بفريق الدعم على +966 55 123 4567
التقييم 4.8 من 5 · بناءً على 1,245 مراجعة
الإجمالي249.00 ر.سشامل الضريبة
تأكيد الطلب
1R020 · high

Mirroring is layout, not translation

Both rows are the same markup. The shipped one hardcodes its direction, so translated Arabic sits in an English skeleton: reading order, status and action all on the wrong side.

<html dir="rtl">
2R021 · medium

Phone numbers scramble without isolation

The digits are in the correct order in the markup, both times. Spaces between digit groups are direction-neutral, so the groups reorder and the plus sign detaches. One attribute holds the number together.

<span dir="ltr">+966 …</span>
3R070 · medium

Inputs inherit direction, except where they must not

Type in them. The shipped name field is locked LTR, so Arabic enters against the caret. The fix is not forcing everything rightward: the email field stays LTR on purpose, because identifiers read left to right. Knowing the exception is the competence.

input[type=email] { direction: ltr }
4R061 · medium

One numeral system at a time

Both rows carry the same numbers. The shipped one drifts between Arabic-Indic and Western digits mid-sentence, which real localization pipelines do constantly; the ready one commits to a system.

Intl.NumberFormat("ar-SA-u-nu-latn")
04 · Accuracy

Built to never cry wolf

Latin text on an Arabic page is often correct. Ritla is engineered to prefer a missed flag over a false alarm.

NikeISO 8601<code>
Allowlists first
Brand names, URLs, code, ISO tokens and translate="no" content are never flagged.
high ×1.0medium ×0.6low ×0.3
Confidence tiers
Heuristic checks are labeled and weighted down. Uncertainty is shown, not hidden.
4001finding
Issue caps
A report with 400 issues is a failure of the tool. Repeated patterns collapse into one finding.
✕ must firebroken✓ must notclean Arabic
Tested both ways
Every rule ships with fixtures that must trigger it, and clean Arabic pages that must not.

Start free. Pay when it's part of your process.

Checkout is in build, so paid plans are switched on by hand — usually the same day. Ask below, or write to hello@ritla.app.

RTL conversion · $5K–$30K+ / project →
Free$01 project, 2 scans a month, 5-page crawls. full reports with screenshot evidence kept 30 days.Start free
Starter$39/mo1 project, 3 scans a month, 5-page crawls. full reports with screenshot evidence kept 90 days.Request access
TeamPopular$119/mo5 projects, 15 scans a month, 25-page crawls. full reports with screenshot evidence kept 180 days. scheduled re-scans. email when a scan finds regression.in build · slack, webhooks and ciRequest access

Ask for a workspace

Checkout is still being built. Tell us which plan and we will set the workspace up by hand, usually the same day.

If your first full report surfaces nothing you think is worth fixing, email hello@ritla.app and we refund you. No form, no argument, no questions about what you tried.

Level up your Arabic build

View all guides

Fair questions

What is Ritla?

Automated QA for Arabic and RTL quality. You give it a URL; it crawls the site, runs 41 deterministic checks across breakpoints, and returns a scored report with screenshot evidence, affected selectors, and suggested fixes.

How is Ritla different from Lighthouse or a localization platform?

They measure different things. Localization platforms QA your translation strings and workflows; browser suites test whether pages render across devices. Ritla renders the Arabic product your customer actually sees and checks the result itself: direction, bidi, mirrored layout, Arabic typography, numerals, forms. Translated strings are the input. Ritla measures the output.

My site already has dir="rtl". Am I done?

No, and that is exactly the point. A page can be technically compliant and still be wrong for an Arabic user: torn letterforms, unmirrored components, misdirected inputs, Western number formats. Ritla measures Arabic readiness, not attribute presence.

What about false positives?

They are the product risk, so the engine is conservative by design: allowlists for brands, URLs and code; confidence tiers on heuristic checks; per-rule issue caps; and every rule is tested against both broken fixtures and clean Arabic pages that must not trigger it.

Does Ritla use AI to judge my site?

Not at scan time. Every check is deterministic and reproducible: the same page always gets the same score. A vision-based judgment layer for things like layout mirroring is on the roadmap, clearly flagged and separate.

Can it run in CI?

That is the plan for team accounts: scan on every deploy, diff against the last release by signature, and fail the build on new critical issues. Alerts go to Slack, email, or a webhook. Today the scan runs from the dashboard and the public page.

Can you fix what you find?

Yes. Beyond the exportable tickets, we take on full LTR to RTL conversion as a project engagement, delivered by the team behind the rule engine and certified by a clean final scan.

What if the report tells me nothing I did not already know?

Then you should not pay for it. Email hello@ritla.app and we refund you, with no form and no questions about what you tried. The engine is deterministic, so if it found nothing worth fixing on your site, that is a fact about your site rather than a negotiation.

Your users already know.
Now you can too

See pricing ›