Heuristic, best-effort analysis. Page rendering and forced light/dark mode match most sites, but some JS-themed apps don’t flip cleanly and HTML has endless variations. Something look off? Open an issue.
Rule-based scoring against WCAG, Material Design, and typography best practices. Checks computed styles — no AI, just evidence and math.
⚠ Unlimited removes all caps — a large or deep app may heavily tax this browser tab (SPA exploration runs entirely on your device).
Analysis settings
Heuristic, best-effort analysis. One run = one viewport + one color scheme — re-run to cover others. Something off? open an issue.
Viewport
Screen size to analyze at. Re-run at mobile (375) / tablet (768) / desktop (1280) to catch responsive issues (small touch targets, overflow).
Color scheme
Auto (page’s natural render), Force light, or Force dark. Re-run in both to check dark-mode contrast. Works on most sites; some JS-driven theming won’t flip.
Screenshots
Capture page images. Required for Pixel Verify and per-view thumbnails.
Pixel Verify
Sample the actual rendered pixels for true contrast (catches gradients/overlays). More accurate but slower; needs Screenshots.
Explore SPA views
For single-page apps: click nav/tabs to discover & analyze hidden views — one tab can pass while another fails. Safe controls only.
Collapsed/expanded states
For accordion/disclosure-heavy layouts: also analyze the page with every collapsible panel open at once (worst-case density & overflow) and all closed (clean baseline) — issues that only appear when several panels are open are easy to miss otherwise. Runs automatically only when the page has 6+ collapsible panels.
Exploration budget
When SPA explore or state capture is on, a single Low / Medium / High / Unlimited dropdown sets how deep exploration goes (view count, time budget, expand passes). Higher = deeper but slower. SPA exploration runs entirely on your device, so Unlimited removes all caps (with a warning) — handy for large apps, but it can tax the browser tab.
JavaScript (URL mode)
Render the page with its JS running — needed for React/Vue/Angular apps. On by default; storage, cookies and other sensitive APIs are sandboxed (blocked + logged) while it runs. Untick to render statically without executing any page scripts.
How the score is calculated
The overall score is a weighted average of up to 14 category scores, each 0–100. Categories that don’t apply to the page (marked N/A) are dropped and the remaining weights re-normalize, so a page is never penalized for a category it has no elements for.
Category weights (relative)
Design Polish
24
Color & Contrast
20
Touch & Interaction
15
Typography
15
Accessibility
15
Spacing & Layout
15
Responsive Design
10
Cognitive Load
5
Visual Consistency
5
Layout Quality
5
Performance
5
Readability
5
Visual Balance
3
Motion & Animation
3
Polish and Contrast carry the most weight because they best predict whether a page looks finished and is legible. Weights are tuned heuristics, not a published standard.
Grade bands
A 90–100 · B 80–89 · C 70–79 · D 60–69 · F <60
Audience profile
The profile selector tightens thresholds before scoring — e.g. WCAG AAA and Low Vision raise the contrast target to 7:1, Elderly requires 18px body text and 48px touch targets, Color Blind simulates CVD palettes, and Cognitive/Children add reading-grade and nav-item limits. The same page can grade differently across profiles.
Enter a URL to analyze — works on phone, no console needed.
How it works
The page is fetched via a CORS proxy and rendered in a sandboxed iframe with its CSS.
JavaScript runs on by default (most sites need it to render) — untick it below to render statically without executing any page scripts.
Storage, cookies, and other sensitive APIs are always isolated while JS runs.
Pages behind login, localhost, or sites that block proxies/framing need the Console Snippet tab instead.
Running locally? clone the repo,
cd into it and start node server.js — then analyze http://localhost pages.
The page's JavaScript runs in a sandboxed frame — storage, cookies, and other sensitive APIs are blocked and logged.
It's on by default because most sites need it to render. Untick “Run the page's JavaScript” above to render statically (no page scripts) for sites you don't recognize.
Prefer the Console Snippet (safer)
The console snippet runs in the page's own context with zero security concerns and full screenshot support.
Open DevTools → Console, paste the snippet from the Console Snippet tab above.
Discovering pages...
Skip elements from analysis (optional)
Elements you skip (and everything inside them) won't be scored. Useful for decorative UI mockups, screenshots, or third-party widgets.
Preparing...
1
Open the page you want to analyze in any browser (works with localhost, staging, pages behind login)
The snippet analyzes the page as it is in your browser — set the window size and light/dark theme there. (The Viewport and Color‑scheme selectors above apply to URL mode only.)
2
Press F12 to open DevTools → Console tab
Tip: undock DevTools (⋮ → undock into separate window) so the page viewport stays at its real size.
3
Copy the snippet below, paste into the console, press Enter. The extracted JSON is copied to your clipboard automatically.
With screenshots enabled, it captures the page and includes pixel data for contrast verification.
4
Come back here and paste (Ctrl+V) into the box below, then click Analyze.
Fallback: if auto-copy failed, type copy(window.__milgData_json) in the console.
Extraction Snippet
Crawl screenshots create large payloads: each crawled page is rendered and captured. If Explore SPA views is also enabled, each crawled page can add extra in-page states. Large results may download as JSON instead of copying to the clipboard.
Embedded library: the ~29 KB screenshot library is inlined directly into the snippet, so screenshots & pixel‑verify work even on sites with a strict CSP that blocks CDN scripts. The snippet gets larger to copy — only enable this when a site blocks the CDN (you’ll see a CSP warning in the console).
JavaScript
Loading...
Paste extracted JSON
Paste copied markup from DevTools Elements when URL mode and the console snippet are blocked. This is a partial fallback for pages behind login, strict CSP, or private environments.
What this can and cannot see
The analyzer renders the pasted HTML in an isolated iframe and scores whatever survives. Relative URLs, private assets, file URLs, app runtime state, CSS loaded behind authentication, and JavaScript-generated behavior may be missing. It should not fail hard: missing resources are expected and the report will include a warning. For a more faithful result, export a self-contained HTML file with inline CSS/assets, or run the analyzer locally against a page you can serve from localhost.
Load a saved analysis
Drop a .milg or .json file here or click to browse.
ⓘResults are temporary and will be lost when you close this page.
Audience Profiles — Evidence-Based Thresholds
Each profile adjusts scoring thresholds based on published accessibility research. Switching re-scores instantly.
Contrast
Font min
Touch
Key change
General
4.5:1
16px
24/44px
WCAG AA baseline
WCAG AAA
7:1
16px
24/44px
Enhanced contrast
Elderly
7:1
18px
48px
12px spacing, max 7 nav, no thin fonts, reduced motion
Capture page screenshots for visual verification and the screenshot viewer
Pixel Verify
Sample actual pixel colors from screenshots to verify CSS contrast ratios
Explore SPA views
Click nav/tabs to discover & analyze hidden views (safe controls only) — budget via the Low/Medium/High/Unlimited dropdown
Capture disclosure states
For disclosure-heavy pages: extra All-expanded / Collapsed passes (runs when 6+ collapsible panels are detected)
Viewport / Color scheme
Re-run the analysis at another viewport width or forced light/dark (URL mode only)
Crawl
Follow links and analyze multiple pages from the same site
Run page JavaScript
On by default — runs page JS in a sandbox (storage/cookies blocked). Untick to render statically. The Console Snippet is safer still.
Pixel Verification
P10 ratio
10th percentile of all FG/BG sample pairs — used for pass/fail (robust against anti-aliasing)
Left-click pixel box
Cycle worst, P10, median, P90, and best sample dots on main and hidden screenshots
Hidden failures
CSS says pass but pixels say fail — real background differs (gradient, image, overlay)
False positives
CSS says fail but pixels show the actual background provides enough contrast
Edge contrast
Checks if element backgrounds are distinct from their parent (buttons on same-color bg)
Data & Export
Export .milg
Compressed full dump — screenshots, masks, pixel data, debug overlays. Re-importable with all features intact.
Export .md
Full Markdown report with embedded screenshot images
Copy for LLM
Copies filtered findings to clipboard — no images, only actionable issues. Respects the severity filter.
Load Saved
Import tab — drop or browse for a .milg or .json file to restore a previous analysis
Tip: Results are not stored on any server. Export .milg to save your analysis. The Console Snippet gives the most accurate results since it runs inside the actual page.