RTL Web Layout Auditor
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
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
dirandlangon<html>, incorrectdir="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-spacingon Arabic text (breaks cursive connection),px-based font sizing - Float & positioning —
float: left/right,text-align: left/right, hardcodedleft/rightpositioning 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
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | required | List of URLs to audit |
maxPagesPerSite | integer | 10 | Maximum pages to crawl per starting URL |
maxCrawlDepth | integer | 1 | How many links deep to follow (0 = starting URLs only) |
auditCssProperties | boolean | true | Check for physical CSS properties |
auditHtmlAttributes | boolean | true | Check dir/lang attributes |
auditBidirectionalText | boolean | true | Check for bidirectional text issues |
auditTypography | boolean | true | Check Arabic typography issues |
auditFloatAndPosition | boolean | true | Check 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-leftcount as one warning) - Score floors at 0
Usage
# Via Apify CLIapify call your-username/rtl-auditor -i '{"startUrls": [{"url": "https://example.com/ar"}],"maxPagesPerSite": 5,"maxCrawlDepth": 0}'
// Via API clientimport { 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: 0and audit each route URL individually