Accessibility scan
Fly.io
25 automated issues detected
Impact-weighted score: 125 · critical 0 · serious 25 · moderate 0 · minor 0
Automated axe-core 4.11.4 scan of the homepage only, run on June 23, 2026. Results are reproducible: the same engine, the same page.
Automated testing detects roughly 30–50% of WCAG issues. Many barriers — keyboard traps, screen-reader flow, focus order, meaningful alt text — need manual review by a person. A clean automated scan is not the same as an accessible site.
A clean automated scan is not a determination of ADA compliance, legal compliance, or full accessibility. These results describe only what an automated scan found on one page on one date.
Detected issues
<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements
Serious · 2 elementsWCAG: wcag2a, wcag131 · rule: definition-list
.bubble-wrap.xl\:flex.cursor-pointer:nth-child(1)<dl class="flex-none bubble-wrap hidden shrink-0 xl:flex group relative px-3 py-2.5 cursor-pointer">
.bubble-wrap.xl\:flex.cursor-pointer:nth-child(5)<dl class="flex-none bubble-wrap hidden shrink-0 xl:flex group relative px-3 py-2.5 cursor-pointer">
<svg> elements with an img role must have alternative text
Serious · 23 elementsWCAG: wcag2a, wcag111 · rule: svg-img-alt
.btn-purple.btn-border-dark[href$="sign-up"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>.btn-purple.btn-border-dark[href$="sign-up"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>.py-24:nth-child(3) > .gap-x-8.xl\:gap-x-16.lg\:grid > .space-y-4 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>.py-24:nth-child(3) > .gap-x-8.xl\:gap-x-16.lg\:grid > .space-y-4 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>.shadow-emerald-500\/30 > svg[viewBox="0 0 20 20"][fill="currentColor"][role="img"]<svg role="img" class="" style="pointer-events: none; width: 24px; height: 24px; " viewBox="0 0 20 20" fill="currentColor">
.shadow-blue-500\/30 > svg[viewBox="0 0 20 20"][fill-rule="evenodd"][fill="currentColor"]<svg role="img" class="" style="pointer-events: none; width: 24px; height: 24px; " viewBox="0 0 20 20" fill="currentColor" fill-rule="evenodd">
.shadow-orange-500\/30 > svg[viewBox="0 0 20 20"][fill-rule="evenodd"][fill="currentColor"]<svg role="img" class="" style="pointer-events: none; width: 24px; height: 24px; " viewBox="0 0 20 20" fill="currentColor" fill-rule="evenodd">
.shadow-amber-500\/30 > svg[viewBox="0 0 20 20"][fill-rule="evenodd"][fill="currentColor"]<svg role="img" class="" style="pointer-events: none; width: 24px; height: 24px; ;" viewBox="0 0 20 20" fill="currentColor" fill-rule="evenodd">
a[href$="speedrun/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>a[href$="speedrun/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>svg[viewBox="0 0 250 63"]<svg role="img" class="brightness-0 invert max-w-full" viewBox="0 0 250 63" style="pointer-events: none; width: 150px; height: 28px; ">
svg[viewBox="0 0 93.2 112"]<svg role="img" class="brightness-0 invert max-w-full" viewBox="0 0 93.2 112" style="pointer-events: none; width: 150px; height: 32px; ">
a[href$="rails/"] > .invert.max-w-full[viewBox="0 0 250 88"]<svg role="img" class="brightness-0 invert max-w-full" viewBox="0 0 250 88" style="pointer-events: none; width: 150px; height: 24px; ">
svg[viewBox="0 0 250 65"]<svg role="img" class="brightness-0 invert max-w-full" viewBox="0 0 250 65" style="pointer-events: none; width: 150px; height: 26px; ">
a[href$="django/"] > .invert.max-w-full[viewBox="0 0 250 88"]<svg role="img" class="brightness-0 invert max-w-full" viewBox="0 0 250 88" style="pointer-events: none; width: 150px; height: 24px; ">
.space-y-4.mb-6.lg\:mb-0 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>.space-y-4.mb-6.lg\:mb-0 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>a[href$="enterprise"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>a[href$="enterprise"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>a[href$="security"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>a[href$="security"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>.py-24:nth-child(10) > .gap-x-8.xl\:gap-x-16.lg\:grid > .space-y-4 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .w-0.group-hover\/btn\:w-2\.5.translate-x-2\.5<svg role="img" viewBox="0 0 16 16" width="0" height="10" fill="currentColor" class="w-0 group-hover/btn:w-2.5 h-3 translate-x-2.5 ease-out duration-200 transition-all transform-gpu">
<path d="M1 9h14a1 1 0 000-2H1a1 1 0 000 2z"></path>
</svg>.py-24:nth-child(10) > .gap-x-8.xl\:gap-x-16.lg\:grid > .space-y-4 > .btn-purple.btn-border-dark[href$="sprites.dev/"] > .opacity-50.group-hover\/btn\:opacity-100.transition-opacity > .size-\[0\.7em\][width="10"][viewBox="0 0 16 16"]<svg role="img" viewBox="0 0 16 16" width="10" height="10" fill="currentColor" class="size-[0.7em]">
<path d="M7.293 1.707L13.586 8l-6.293 6.293a1 1 0 001.414 1.414l7-7a.999.999 0 000-1.414l-7-7a1 1 0 00-1.414 1.414z"></path>
</svg>Are you Fly.io?
This is a free, automated, homepage-only snapshot. Re-scan fly.io live, get the full element-level worklist across every page, or set up monitoring that re-checks on a schedule and alerts only on new issues.