RTL Web Layout Auditor avatar

RTL Web Layout Auditor

Pricing

Pay per usage

Go to Apify Store
RTL Web Layout Auditor

RTL Web Layout Auditor

Automatically audit any website for RTL layout issues. Detects missing dir/lang attributes, physical CSS properties that break in RTL, bidirectional text problems, Arabic typography issues, and hardcoded positioning. Get a scored report with actionable fixes per page.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ammar Alakkad

Ammar Alakkad

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Crawl websites and audit for RTL (right-to-left) layout issues. Built for Arabic, Hebrew, Persian, Urdu, and other RTL scripts.

Why this exists

Most web tooling assumes left-to-right. When you launch a site in Arabic, Hebrew, or Persian, layout bugs hide in plain sight — margin-left that doesn't flip, text-align: left that breaks reading order, missing dir attributes that confuse browsers. These issues ship to production because nobody has an automated way to catch them.

This Actor crawls your site and surfaces every RTL-specific issue, with a selector, a code snippet, and the exact fix.

Who it's for

  • Agencies launching Arabic versions of client sites
  • E-commerce teams with RTL storefronts (Noon, Jumia, local marketplaces)
  • Frontend engineers doing i18n audits before launch
  • QA teams who need automated RTL coverage in CI

What it checks

  • HTML attributes — Missing dir and lang on <html>, incorrect dir="auto" usage
  • CSS properties — Physical properties (margin-left, padding-right, border-left) that should use logical equivalents (margin-inline-start, etc.)
  • Bidirectional text — Mixed Arabic/English content without <bdi> isolation, directional spillover
  • Typography — Missing Arabic fonts, small font sizes, letter-spacing on Arabic text (breaks cursive connection), px-based font sizing
  • Float & positioningfloat: left/right, text-align: left/right, hardcoded left/right positioning in RTL layouts

Example output

{
"url": "https://example.com/ar",
"score": 72,
"summary": { "errors": 1, "warnings": 4, "info": 2 },
"issues": [
{
"id": "rtl-physical-css-inline",
"severity": "warning",
"title": "Physical CSS property \"margin-left\" in inline style",
"selector": "div.sidebar",
"snippet": "margin-left:20px;padding-right:10px",
"fix": "Replace margin-left with margin-inline-start."
},
{
"id": "rtl-letter-spacing",
"severity": "error",
"title": "Letter spacing applied to Arabic text",
"selector": "p.arabic-content",
"snippet": "letter-spacing: 2px",
"fix": "Remove letter-spacing from elements that contain Arabic text."
}
],
"pageInfo": {
"htmlDir": "rtl",
"htmlLang": "ar",
"detectedDirection": "rtl",
"detectedLanguage": "ar"
}
}

Input

FieldTypeDefaultDescription
startUrlsarrayrequiredList of URLs to audit
maxPagesPerSiteinteger10Maximum pages to crawl per starting URL
maxCrawlDepthinteger1How many links deep to follow (0 = starting URLs only)
auditCssPropertiesbooleantrueCheck for physical CSS properties
auditHtmlAttributesbooleantrueCheck dir/lang attributes
auditBidirectionalTextbooleantrueCheck for bidirectional text issues
auditTypographybooleantrueCheck Arabic typography issues
auditFloatAndPositionbooleantrueCheck float/position usage

Scoring

  • 100 = no unique issue types found
  • Per unique issue type: errors -10, warnings -3, info 0
  • Repeated findings of the same type don't stack (e.g. 20 instances of margin-left count as one warning)
  • Score floors at 0

Usage

# Via Apify CLI
apify call your-username/rtl-auditor -i '{
"startUrls": [{"url": "https://example.com/ar"}],
"maxPagesPerSite": 5,
"maxCrawlDepth": 0
}'
// Via API client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('your-username/rtl-auditor').call({
startUrls: [{ url: 'https://example.com/ar' }],
maxPagesPerSite: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Limitations

  • Cross-origin stylesheets cannot be fully analyzed (browser security restriction)
  • Dynamically injected styles after page load may be missed
  • Single-page apps (SPAs) — only the initial render is audited; set maxCrawlDepth: 0 and audit each route URL individually