www.duolingo.com
Scored by v3 · source-of-truth hashes: score db860d6ac94e · thresholds e94f8b33e500 — verifiable against the canonical scorer.
The 28-day score is the p75 of nightly runs — the stable number to cite. Deterministic metrics (CRR/SSD/TC) show their latest value (they move only when the site changes); timing (TTFUT) and answer-fidelity (AF) are smoothed by 28-day p75 — the same lab-vs-field split Core Web Vitals uses. Synthetic daily measurement, not real-user field data.
An agent is likely to fabricate missing details rather than say “I don’t know”. 0/3 applicable facts come from machine-readable structured data.
Metrics
Token Cost breakdown
Where the page's tokens go (≈4,232 across regions). 83% is non-content — chrome and boilerplate an agent pays for. Add landmark roles (main/nav/header/footer) so agents can skip it.
Final screenshot
Diagnostics
pre-JS raw HTML
Fix: Server-render or statically generate the main content so a non-JS agent still receives it; make client rendering a progressive enhancement, not the source of truth.
agent representation — token decomposition
Fix: Strip repeated nav/header/footer/cookie chrome from the agent-visible output; wrap content in <main>/<article> so the extractor keeps signal and drops boilerplate.
Rendered profile: headless
Metrics
Token Cost breakdown
Where the page's tokens go (≈4,203 across regions). 84% is non-content — chrome and boilerplate an agent pays for. Add landmark roles (main/nav/header/footer) so agents can skip it.
Final screenshot
Diagnostics
pre-JS raw HTML
Fix: Server-render or statically generate the main content so a non-JS agent still receives it; make client rendering a progressive enhancement, not the source of truth.
agent representation — token decomposition
Fix: Strip repeated nav/header/footer/cookie chrome from the agent-visible output; wrap content in <main>/<article> so the extractor keeps signal and drops boilerplate.
Rendered profile: headless
Access & discovery checks — separate from the gated CAV metrics above. Click an issue for business impact, what we measured, and how to fix. · Take the Agent Readiness course →
Agent files & endpoints
Issues (4)
~ No content-blocking cookie wall medium impact Consent platform: optanon (verify it doesn't block content)
Business impact A consent wall that hides content until a click is invisible to agents — they cannot click 'Accept'.
What we measured We fingerprint OneTrust, Cookiebot, Usercentrics and similar managers and flag content-blocking ones.
How to fix Use an overlay banner that leaves content in the DOM, not a blocking interstitial.
Spec: https://gdpr.eu/cookies/
~ llms.txt present + valid high impact Found at /llms.txt but missing H1/blockquote
Business impact llms.txt is the robots.txt for AI: it tells agents what your site is, what matters, and where to find it. Without it AI guesses — and guessing means inaccurate recommendations and lost visibility.
What we measured We fetch /llms.txt and /.well-known/llms.txt and validate the spec (H1 title + a one-line blockquote summary). We also note /llms-full.txt (your full content as Markdown).
How to fix Create /llms.txt with a short summary + key pages; optionally /llms-full.txt with full content in Markdown.
# Your Site
> One-line description for AI agents.
## Key pages
- /products — catalog
- /pricing — plans
- /docs — documentationSpec: https://llmstxt.org
✗ Structured data (JSON-LD) medium impact No JSON-LD found
Business impact Schema.org JSON-LD tells agents what a page IS (product, article, business) with typed fields (price, rating, hours). Without it agents extract less reliably.
What we measured We parse <script type=application/ld+json>, validate it, and check for populated @type fields.
How to fix Add JSON-LD: Organization/LocalBusiness on the homepage, Product on product pages, Article on posts.
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Your Co","url":"https://example.com"}</script>Spec: https://schema.org/
~ XML sitemap present medium impact Sitemap found but no <url>/<loc> entries
Business impact A sitemap is your table of contents for AI crawlers. Without it agents follow homepage links and miss deep pages (products, docs, pricing) — shrinking what they can recommend.
What we measured We fetch /sitemap.xml (and /sitemap_index.xml), confirm valid XML with <loc> entries, and check <lastmod> freshness.
How to fix Generate an XML sitemap of all public pages with current lastmod dates and reference it in robots.txt.
# robots.txt
Sitemap: https://example.com/sitemap.xml
Passed audits (7)
Transport & Trust (SEC 1.0.0)
HTTPS, HSTS, CSP, sniffing, referrer and CORS posture. Diagnostic only — this does not affect the CAV score. A security header does not make a page more legible to an agent, so scoring it would reward a CDN toggle that changes nothing an agent can recover. We measure it and say so.
Per-header findings (6)
| Header | Evidence |
|---|---|
| ✅ HTTPS | served over HTTPS |
| ❌ HSTS | no strict-transport-security header |
| ❌ Content-Security-Policy | no content-security-policy header |
| ❌ X-Content-Type-Options | missing nosniff |
| ⚠️ Referrer-Policy | no referrer-policy header (browser default applies) |
| ➖ CORS exposure | no CORS headers on the document (normal for an HTML page) |
How to improve
whole profile
Third-party impact
132 third-party requests · 3424 KiB (99.4% of transfer) · 2633 ms main-thread — code an agent must also fetch/run before your content settles. Fewer, lazier third-parties = faster, cheaper agent reads.
| Third-party domain | Reqs | Transfer | Main-thread |
|---|---|---|---|
| cloudfront.net | 98 | 1959 KiB | 1316 ms |
| googletagmanager.com | 4 | 653 KiB | 623 ms |
| gstatic.com | 1 | 374 KiB | 254 ms |
| facebook.net | 2 | 158 KiB | 245 ms |
| cookielaw.org | 5 | 152 KiB | 110 ms |
| google.com | 6 | 97 KiB | 35 ms |
| google-analytics.com | 2 | 21 KiB | 50 ms |
| doubleclick.net | 4 | 3 KiB | — |
| tupsrv.com | 3 | 3 KiB | — |
| recaptcha.net | 2 | 2 KiB | — |
| googleadservices.com | 1 | 1 KiB | — |
| onetrust.com | 1 | 0 KiB | — |
Wasted JavaScript (by bundle)
Transfer-accurate — each bundle's transfer size × its unused %, ranked by wasted bytes (the biggest code-splitting wins). Unused JS also inflates Token Cost (TC).
| Bundle | Transfer | Unused | Wasted |
|---|---|---|---|
| https://www.gstatic.com/recaptcha/releases/A7KpaEASfhDcK0nXxgQEyyYv/recaptcha__en.js 3P | 374 KiB | 62.9% | 235 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/app-b99c4894.js 3P | 307 KiB | 62.1% | 191 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/9951-96351ecb.js 3P | 238 KiB | 67% | 159 KiB |
| https://www.googletagmanager.com/gtm.js?id=GTM-TX6Z97C 3P | 175 KiB | 54.1% | 94 KiB |
| https://www.googletagmanager.com/gtag/js?id=G-CSFDVCPQ4F&cx=c>m=4e67m0 3P | 183 KiB | 47.8% | 88 KiB |
| https://accounts.google.com/gsi/client 3P | 97 KiB | 82.4% | 80 KiB |
| https://www.googletagmanager.com/gtag/destination?id=AW-397119219&cx=c>m=4e67m0 3P | 144 KiB | 54.9% | 79 KiB |
| https://cdn.cookielaw.org/scripttemplates/202404.1.0/otBannerSdk.js 3P | 109 KiB | 70.3% | 77 KiB |
| https://www.googletagmanager.com/gtag/js?id=AW-728842606&cx=c>m=4e67m0 3P | 151 KiB | 49.4% | 75 KiB |
| https://connect.facebook.net/en_US/fbevents.js 3P | 103 KiB | 46% | 47 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/5314-33cb86aa.js 3P | 46 KiB | 59% | 27 KiB |
| https://connect.facebook.net/signals/config/1735692093320310?v=2.9.361&r=stable&domain=www.duolingo.com&hme=eec000113e1e9f56e9fc6cdeb39d59ad805f76a48c77cf3d5c028dcf3b38ee7c&ex_m=108%2C209%2C159%2C22%2C73%2C74%2C150%2C69%2C68%2C11%2C168%2C93%2C16%2C142%2C131%2C39%2C76%2C81%2C138%2C164%2C170%2C26%2C27%2C28%2C30%2C48%2C151%2C78%2C116%2C18%2C20%2C44%2C40%2C42%2C41%2C86%2C95%2C99%2C114%2C149%2C152%2C46%2C115%2C24%2C21%2C123%2C70%2C36%2C154%2C153%2C155%2C146%2C144%2C25%2C35%2C59%2C113%2C166%2C71%2C17%2C157%2C118%2C84%2C67%2C19%2C88%2C89%2C120%2C87%2C140%2C139%2C143%2C100%2C165%2C34%2C49%2C117%2C47%2C8%2C4%2C5%2C7%2C6%2C3%2C94%2C105%2C171%2C176%2C223%2C75%2C236%2C235%2C234%2C23%2C33%2C55%2C107%2C61%2C10%2C64%2C101%2C102%2C103%2C109%2C134%2C31%2C29%2C136%2C137%2C133%2C132%2C160%2C77%2C163%2C161%2C162%2C50%2C60%2C127%2C15%2C167%2C45%2C281%2C282%2C280%2C295%2C311%2C216%2C205%2C62%2C206%2C204%2C314%2C305%2C52%2C217%2C111%2C135%2C83%2C125%2C54%2C124%2C130%2C129%2C58%2C65%2C63%2C156%2C79%2C80%2C119%2C37%2C32%2C53%2C56%2C104%2C169%2C1%2C128%2C14%2C126%2C12%2C2%2C57%2C96%2C66%2C122%2C92%2C91%2C172%2C173%2C97%2C98%2C9%2C106%2C51%2C147%2C90%2C82%2C72%2C121%2C110%2C43%2C148%2C0%2C85%2C141%2C145%2C158%2C38%2C112%2C13%2C174 3P | 55 KiB | 47.9% | 26 KiB |
| https://www.google-analytics.com/analytics.js 3P | 21 KiB | 54.7% | 11 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/9078-363c7813.js 3P | 9 KiB | 74.3% | 7 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/7459-9ef3350b.js 3P | 7 KiB | 72.1% | 5 KiB |
Network
Heaviest requests (30)
| URL | Type | Status | Transfer |
|---|---|---|---|
| https://www.gstatic.com/recaptcha/releases/A7KpaEASfhDcK0nXxgQEyyYv/recaptcha__en.js | Script | 200 | 374 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/app-b99c4894.js | Script | 200 | 307 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/9951-96351ecb.js | Script | 200 | 238 KiB |
| https://www.googletagmanager.com/gtag/js?id=G-CSFDVCPQ4F&cx=c>m=4e67m0 | Script | 200 | 183 KiB |
| https://www.googletagmanager.com/gtm.js?id=GTM-TX6Z97C | Script | 200 | 175 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/82f26795696242931a7b905b4918eb1e.json | Fetch | 200 | 169 KiB |
| https://www.googletagmanager.com/gtag/js?id=AW-728842606&cx=c>m=4e67m0 | Script | 200 | 151 KiB |
| https://www.googletagmanager.com/gtag/destination?id=AW-397119219&cx=c>m=4e67m0 | Script | 200 | 144 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/e97b1cde32a58c629a0193eea36ddaab.json | Fetch | 200 | 137 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/images/splash/lottie/833a22b2834050d139f266a29899bb00.svg | Image | 200 | 122 KiB |
| https://cdn.cookielaw.org/scripttemplates/202404.1.0/otBannerSdk.js | Script | 200 | 109 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/50bda50231c0bce1584e982cebfe8f33.json | Fetch | 200 | 107 KiB |
| https://connect.facebook.net/en_US/fbevents.js | Script | 200 | 103 KiB |
| https://accounts.google.com/gsi/client | Script | 200 | 97 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/vendor/f2331bbfd902cdf8971c4d3184a44283.woff2 | Font | 200 | 75 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/9819-2006552c.js | Script | 200 | 69 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/vendor/3bbe299f41d8289a47d91773fee0cb6a.woff2 | Font | 200 | 65 KiB |
| https://connect.facebook.net/signals/config/1735692093320310?v=2.9.361&r=stable&domain=www.duolingo.com&hme=eec000113e1e9f56e9fc6cdeb39d59ad805f76a48c77cf3d5c028dcf3b38ee7c&ex_m=108%2C209%2C159%2C22%2C73%2C74%2C150%2C69%2C68%2C11%2C168%2C93%2C16%2C142%2C131%2C39%2C76%2C81%2C138%2C164%2C170%2C26%2C27%2C28%2C30%2C48%2C151%2C78%2C116%2C18%2C20%2C44%2C40%2C42%2C41%2C86%2C95%2C99%2C114%2C149%2C152%2C46%2C115%2C24%2C21%2C123%2C70%2C36%2C154%2C153%2C155%2C146%2C144%2C25%2C35%2C59%2C113%2C166%2C71%2C17%2C157%2C118%2C84%2C67%2C19%2C88%2C89%2C120%2C87%2C140%2C139%2C143%2C100%2C165%2C34%2C49%2C117%2C47%2C8%2C4%2C5%2C7%2C6%2C3%2C94%2C105%2C171%2C176%2C223%2C75%2C236%2C235%2C234%2C23%2C33%2C55%2C107%2C61%2C10%2C64%2C101%2C102%2C103%2C109%2C134%2C31%2C29%2C136%2C137%2C133%2C132%2C160%2C77%2C163%2C161%2C162%2C50%2C60%2C127%2C15%2C167%2C45%2C281%2C282%2C280%2C295%2C311%2C216%2C205%2C62%2C206%2C204%2C314%2C305%2C52%2C217%2C111%2C135%2C83%2C125%2C54%2C124%2C130%2C129%2C58%2C65%2C63%2C156%2C79%2C80%2C119%2C37%2C32%2C53%2C56%2C104%2C169%2C1%2C128%2C14%2C126%2C12%2C2%2C57%2C96%2C66%2C122%2C92%2C91%2C172%2C173%2C97%2C98%2C9%2C106%2C51%2C147%2C90%2C82%2C72%2C121%2C110%2C43%2C148%2C0%2C85%2C141%2C145%2C158%2C38%2C112%2C13%2C174 | Script | 200 | 55 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/904f242fe2ab5477e3b97928d3e1cb89.json | Fetch | 200 | 53 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/71b01cd301b53ec9879f2d06eb85f5db.json | Fetch | 200 | 52 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/js/5314-33cb86aa.js | Script | 200 | 46 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/c16e90b93e35750c893be4b58720cef2.json | Fetch | 200 | 44 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/lottie/splash/aea5aff1143a9410b81448245ad7c839.json | Fetch | 200 | 41 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/images/splash/lottie/23ab11cb1e1a9aff54facdf57833373d.svg | Image | 200 | 40 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/images/splash/lottie/08ec8d0260c55c054e1b97bcbc96ea0f.svg | Image | 200 | 40 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/images/splash/lottie/9d3c2c99dd19996319a372f79b2ed3c1.svg | Image | 200 | 35 KiB |
| https://cdn.cookielaw.org/consent/55a7f100-001e-4085-87ec-1a6d522f7d67/018f30d2-10c8-771e-8439-98a6c95838b2/en.json | Fetch | 200 | 27 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/vendor/68d22534874c554b0c9ebabea379fc60.woff2 | Font | 200 | 25 KiB |
| https://www.google-analytics.com/analytics.js | Script | 200 | 21 KiB |
| https://d35aaqx5ub95lt.cloudfront.net/images/splash/lottie/890eb76de9a395b182c1c28322721405.svg | Image | 200 | 17 KiB |
Long tasks (>50 ms)
| Start | Duration |
|---|---|
| 567 ms | 541 ms |
| 2395 ms | 251 ms |
| 3563 ms | 193 ms |
| 3400 ms | 158 ms |
| 3765 ms | 130 ms |
| 2746 ms | 120 ms |
| 1144 ms | 109 ms |
| 4093 ms | 108 ms |
| 2087 ms | 96 ms |
| 2946 ms | 93 ms |