---
tool: Crawlinx SEO audit
source: https://crawlinx.com
domain: fly.io
report_url: "https://crawlinx.com/audit/fly.io"
crawl_id: 20260711T010024-b1092067
health_score: 79
generated_at: 2026-07-11T15:42:12Z
total_pages: 50
html_pages: 50
indexable_pages: 50
errors: 1
warnings: 35
notices: 285
---

# SEO audit: fly.io

**Health score: 79/100** — good, with fixable gaps

> Audited by [Crawlinx](https://crawlinx.com) — the free technical-SEO crawler. Full report: https://crawlinx.com/audit/fly.io

## Overview

| Metric | Value |
| --- | --- |
| Pages crawled | 50 |
| HTML pages | 50 |
| Indexable | 50 |
| Non-indexable | 0 |
| Orphan pages | 11 |
| Broken internal links | 0 |
| Avg response time | 982 ms |
| Errors / Warnings / Notices | 1 / 35 / 285 |
| Status codes | 50×200 |

## Categories

| Category | Score | Errors | Warnings | Notices |
| --- | ---: | ---: | ---: | ---: |
| Titles | 97 | 1 | 2 | 6 |
| Images | 90 | 0 | 16 | 45 |
| Links | 93 | 0 | 11 | 0 |
| Meta Description | 99 | 0 | 2 | 35 |
| Canonical | 99 | 0 | 1 | 1 |
| Content | 99 | 0 | 1 | 2 |
| Headings | 99 | 0 | 1 | 15 |
| Mobile | 99 | 0 | 1 | 1 |
| Cache | 100 | 0 | 0 | 50 |
| Duplicate | 100 | 0 | 0 | 30 |
| Security | 100 | 0 | 0 | 50 |
| Social | 100 | 0 | 0 | 3 |
| Structured Data | 100 | 0 | 0 | 46 |
| URL | 100 | 0 | 0 | 1 |

## Issues

### Errors (1)

#### Missing or empty <title>

- Rule: `title.missing` · Category: Titles · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

### Warnings (35)

#### Missing canonical tag

- Rule: `canonical.missing` · Category: Canonical · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

#### Thin content (low word count)

- Rule: `content.thin` · Category: Content · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — 154 words

#### Missing <h1>

- Rule: `h1.missing` · Category: Headings · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

#### Images missing alt text

- Rule: `images.missing_alt` · Category: Images · Occurrences: 16

- [https://fly.io/about/](https://fly.io/about/) — 52 of 104 images missing alt
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — 1 of 5 images missing alt
- [https://fly.io/ai/](https://fly.io/ai/) — 1 of 6 images missing alt
- [https://fly.io/blog/](https://fly.io/blog/) — 1 of 199 images missing alt
- [https://fly.io/compliance/](https://fly.io/compliance/) — 1 of 7 images missing alt
- [https://fly.io/customers/](https://fly.io/customers/) — 1 of 13 images missing alt
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — 1 of 3 images missing alt
- [https://fly.io/django/](https://fly.io/django/) — 1 of 8 images missing alt
- [https://fly.io/docker/](https://fly.io/docker/) — 1 of 9 images missing alt
- [https://fly.io/go/](https://fly.io/go/) — 1 of 13 images missing alt
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — 1 of 5 images missing alt
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — 1 of 5 images missing alt
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — 1 of 5 images missing alt
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — 1 of 53 images missing alt
- [https://fly.io/laravel/](https://fly.io/laravel/) — 1 of 8 images missing alt
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/) — 1 of 12 images missing alt

#### Orphan page (no internal inlinks)

- Rule: `links.orphan` · Category: Links · Occurrences: 11

- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — no internal links point here
- [https://fly.io/ai/](https://fly.io/ai/) — no internal links point here
- [https://fly.io/compliance/](https://fly.io/compliance/) — no internal links point here
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — no internal links point here
- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — no internal links point here
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/) — no internal links point here
- [https://fly.io/go/](https://fly.io/go/) — no internal links point here
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — no internal links point here
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/) — no internal links point here
- [https://fly.io/learn/rust-hosting/](https://fly.io/learn/rust-hosting/) — no internal links point here
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/) — no internal links point here

#### Missing meta description

- Rule: `meta_desc.missing` · Category: Meta Description · Occurrences: 2

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/)

#### Missing viewport meta tag

- Rule: `mobile.viewport_missing` · Category: Mobile · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

#### Title likely truncated in SERP (too wide)

- Rule: `title.too_long` · Category: Titles · Occurrences: 2

- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — 84 chars, ~627px (limit ~580px)
- [https://fly.io/learn/rust-hosting/](https://fly.io/learn/rust-hosting/) — 82 chars, ~645px (limit ~580px)

### Notices (285)

#### Page served uncached (no-store/private or CDN bypass)

- Rule: `cache.not_cacheable` · Category: Cache · Occurrences: 50

- [https://fly.io/](https://fly.io/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/about/](https://fly.io/about/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/ai/](https://fly.io/ai/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/blog/](https://fly.io/blog/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/blog/how-to-fly-replay/](https://fly.io/blog/how-to-fly-replay/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/compliance/](https://fly.io/compliance/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/customer-stories/](https://fly.io/customer-stories/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/customers/](https://fly.io/customers/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/django/](https://fly.io/django/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docker/](https://fly.io/docker/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docs/](https://fly.io/docs/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docs/postgres/connecting/app-connection-examples/](https://fly.io/docs/postgres/connecting/app-connection-examples/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/docs/volumes/volume-states/](https://fly.io/docs/volumes/volume-states/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/go/](https://fly.io/go/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/javascript-journal/](https://fly.io/javascript-journal/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/jobs/](https://fly.io/jobs/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/](https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/laravel/](https://fly.io/laravel/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/learn/rust-hosting/](https://fly.io/learn/rust-hosting/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/machines/](https://fly.io/machines/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/monitoring/](https://fly.io/monitoring/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/mpg/](https://fly.io/mpg/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/networking/](https://fly.io/networking/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/phoenix-files/](https://fly.io/phoenix-files/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/ruby-dispatch/](https://fly.io/ruby-dispatch/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/](https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/sprites-blog/i-build-everything-in-sprites-now/](https://fly.io/sprites-blog/i-build-everything-in-sprites-now/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/toolbox-turnout/](https://fly.io/toolbox-turnout/) — Cache-Control: max-age=0, private, must-revalidate
- [https://fly.io/toolbox-turnout/lubien/](https://fly.io/toolbox-turnout/lubien/) — Cache-Control: max-age=0, private, must-revalidate

#### Canonical points to a different URL

- Rule: `canonical.non_self` · Category: Canonical · Occurrences: 1

- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — canonical=https://fly.io/go/agents/

#### Low text-to-HTML ratio

- Rule: `content.low_ratio` · Category: Content · Occurrences: 2

- [https://fly.io/customers/](https://fly.io/customers/) — 4.7%
- [https://fly.io/jobs/](https://fly.io/jobs/) — 4.7%

#### Duplicate meta description across pages

- Rule: `duplicate.meta_desc` · Category: Duplicate · Occurrences: 30

- [https://fly.io/](https://fly.io/) — meta description shared by 22 pages: https://fly.io/about/, https://fly.io/accident-forgiveness/, https://fly.io/ai/
- [https://fly.io/about/](https://fly.io/about/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/accident-forgiveness/, https://fly.io/ai/
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/ai/
- [https://fly.io/ai/](https://fly.io/ai/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/compliance/](https://fly.io/compliance/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/docs/, https://fly.io/docs/supabase/
- [https://fly.io/customers/](https://fly.io/customers/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/
- [https://fly.io/django/](https://fly.io/django/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/docker/](https://fly.io/docker/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/docs/](https://fly.io/docs/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/supabase/
- [https://fly.io/docs/postgres/connecting/app-connection-examples/](https://fly.io/docs/postgres/connecting/app-connection-examples/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/
- [https://fly.io/docs/volumes/volume-states/](https://fly.io/docs/volumes/volume-states/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/go/](https://fly.io/go/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — meta description shared by 8 pages: https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/, https://fly.io/docs/supabase/
- [https://fly.io/laravel/](https://fly.io/laravel/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/) — meta description shared by 8 pages: https://fly.io/javascript-journal/soar-file-sharing/, https://fly.io/customer-stories/dat-ai/, https://fly.io/docs/
- [https://fly.io/machines/](https://fly.io/machines/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/monitoring/](https://fly.io/monitoring/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/mpg/](https://fly.io/mpg/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/
- [https://fly.io/networking/](https://fly.io/networking/) — meta description shared by 22 pages: https://fly.io/, https://fly.io/about/, https://fly.io/accident-forgiveness/

#### Multiple <h1> elements

- Rule: `h1.multiple` · Category: Headings · Occurrences: 15

- [https://fly.io/blog/](https://fly.io/blog/) — 198 <h1> elements
- [https://fly.io/customer-stories/](https://fly.io/customer-stories/) — 16 <h1> elements
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — 17 <h1> elements
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — 2 <h1> elements
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — 2 <h1> elements
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — 52 <h1> elements
- [https://fly.io/javascript-journal/](https://fly.io/javascript-journal/) — 13 <h1> elements
- [https://fly.io/jobs/](https://fly.io/jobs/) — 2 <h1> elements
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — 65 <h1> elements
- [https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/](https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/) — 2 <h1> elements
- [https://fly.io/phoenix-files/](https://fly.io/phoenix-files/) — 98 <h1> elements
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/) — 2 <h1> elements
- [https://fly.io/ruby-dispatch/](https://fly.io/ruby-dispatch/) — 36 <h1> elements
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/) — 11 <h1> elements
- [https://fly.io/toolbox-turnout/](https://fly.io/toolbox-turnout/) — 2 <h1> elements

#### Missing html lang attribute

- Rule: `i18n.lang_missing` · Category: Mobile · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

#### Images without width/height (layout shift / CLS)

- Rule: `images.missing_dimensions` · Category: Images · Occurrences: 45

- [https://fly.io/](https://fly.io/) — 29 of 29 images without width/height
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — 5 of 5 images without width/height
- [https://fly.io/ai/](https://fly.io/ai/) — 6 of 6 images without width/height
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/) — 4 of 4 images without width/height
- [https://fly.io/blog/](https://fly.io/blog/) — 199 of 199 images without width/height
- [https://fly.io/blog/how-to-fly-replay/](https://fly.io/blog/how-to-fly-replay/) — 3 of 3 images without width/height
- [https://fly.io/compliance/](https://fly.io/compliance/) — 7 of 7 images without width/height
- [https://fly.io/customer-stories/](https://fly.io/customer-stories/) — 15 of 15 images without width/height
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/) — 3 of 3 images without width/height
- [https://fly.io/customers/](https://fly.io/customers/) — 13 of 13 images without width/height
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/) — 8 of 8 images without width/height
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — 3 of 3 images without width/height
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — 17 of 17 images without width/height
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — 7 of 7 images without width/height
- [https://fly.io/django/](https://fly.io/django/) — 8 of 8 images without width/height
- [https://fly.io/docker/](https://fly.io/docker/) — 9 of 9 images without width/height
- [https://fly.io/docs/](https://fly.io/docs/) — 3 of 3 images without width/height
- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — 1 of 1 images without width/height
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — 2 of 2 images without width/height
- [https://fly.io/go/](https://fly.io/go/) — 13 of 13 images without width/height
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — 5 of 5 images without width/height
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — 5 of 5 images without width/height
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/) — 4 of 4 images without width/height
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — 5 of 5 images without width/height
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — 53 of 53 images without width/height
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/) — 1 of 1 images without width/height
- [https://fly.io/javascript-journal/](https://fly.io/javascript-journal/) — 13 of 13 images without width/height
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — 3 of 3 images without width/height
- [https://fly.io/jobs/](https://fly.io/jobs/) — 1 of 1 images without width/height
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — 65 of 65 images without width/height
- [https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/](https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/) — 7 of 7 images without width/height
- [https://fly.io/laravel/](https://fly.io/laravel/) — 8 of 8 images without width/height
- [https://fly.io/learn/rust-hosting/](https://fly.io/learn/rust-hosting/) — 1 of 1 images without width/height
- [https://fly.io/machines/](https://fly.io/machines/) — 4 of 4 images without width/height
- [https://fly.io/monitoring/](https://fly.io/monitoring/) — 4 of 4 images without width/height
- [https://fly.io/mpg/](https://fly.io/mpg/) — 6 of 6 images without width/height
- [https://fly.io/networking/](https://fly.io/networking/) — 5 of 5 images without width/height
- [https://fly.io/phoenix-files/](https://fly.io/phoenix-files/) — 98 of 98 images without width/height
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/) — 4 of 4 images without width/height
- [https://fly.io/ruby-dispatch/](https://fly.io/ruby-dispatch/) — 36 of 36 images without width/height
- [https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/](https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/) — 3 of 3 images without width/height
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/) — 12 of 12 images without width/height
- [https://fly.io/sprites-blog/i-build-everything-in-sprites-now/](https://fly.io/sprites-blog/i-build-everything-in-sprites-now/) — 3 of 3 images without width/height
- [https://fly.io/toolbox-turnout/](https://fly.io/toolbox-turnout/) — 3 of 3 images without width/height
- [https://fly.io/toolbox-turnout/lubien/](https://fly.io/toolbox-turnout/lubien/) — 3 of 3 images without width/height

#### Meta description too short

- Rule: `meta_desc.too_short` · Category: Meta Description · Occurrences: 35

- [https://fly.io/](https://fly.io/) — 36 chars
- [https://fly.io/about/](https://fly.io/about/) — 36 chars
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — 36 chars
- [https://fly.io/ai/](https://fly.io/ai/) — 36 chars
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/) — 36 chars
- [https://fly.io/blog/](https://fly.io/blog/) — 43 chars
- [https://fly.io/compliance/](https://fly.io/compliance/) — 36 chars
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/) — 49 chars
- [https://fly.io/customers/](https://fly.io/customers/) — 36 chars
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/) — 36 chars
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — 36 chars
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — 47 chars
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — 49 chars
- [https://fly.io/django/](https://fly.io/django/) — 36 chars
- [https://fly.io/docker/](https://fly.io/docker/) — 36 chars
- [https://fly.io/docs/](https://fly.io/docs/) — 49 chars
- [https://fly.io/docs/postgres/connecting/app-connection-examples/](https://fly.io/docs/postgres/connecting/app-connection-examples/) — 49 chars
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/) — 49 chars
- [https://fly.io/docs/volumes/volume-states/](https://fly.io/docs/volumes/volume-states/) — 49 chars
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — 36 chars
- [https://fly.io/go/](https://fly.io/go/) — 36 chars
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — 36 chars
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — 36 chars
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/) — 36 chars
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — 36 chars
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — 49 chars
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — 49 chars
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — 48 chars
- [https://fly.io/laravel/](https://fly.io/laravel/) — 36 chars
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/) — 49 chars
- [https://fly.io/machines/](https://fly.io/machines/) — 36 chars
- [https://fly.io/monitoring/](https://fly.io/monitoring/) — 36 chars
- [https://fly.io/mpg/](https://fly.io/mpg/) — 36 chars
- [https://fly.io/networking/](https://fly.io/networking/) — 36 chars
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/) — 49 chars

#### Missing Open Graph tags

- Rule: `og.missing` · Category: Social · Occurrences: 2

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — og:title, og:description, og:image
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/) — og:description

#### No structured data detected

- Rule: `schema.none` · Category: Structured Data · Occurrences: 46

- [https://fly.io/](https://fly.io/)
- [https://fly.io/about/](https://fly.io/about/)
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/)
- [https://fly.io/ai/](https://fly.io/ai/)
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/)
- [https://fly.io/blog/](https://fly.io/blog/)
- [https://fly.io/blog/how-to-fly-replay/](https://fly.io/blog/how-to-fly-replay/)
- [https://fly.io/compliance/](https://fly.io/compliance/)
- [https://fly.io/customer-stories/](https://fly.io/customer-stories/)
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/)
- [https://fly.io/customers/](https://fly.io/customers/)
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/)
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/)
- [https://fly.io/django-beats/](https://fly.io/django-beats/)
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/)
- [https://fly.io/docs/](https://fly.io/docs/)
- [https://fly.io/docs/postgres/connecting/app-connection-examples/](https://fly.io/docs/postgres/connecting/app-connection-examples/)
- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/)
- [https://fly.io/docs/volumes/volume-states/](https://fly.io/docs/volumes/volume-states/)
- [https://fly.io/enterprise/](https://fly.io/enterprise/)
- [https://fly.io/go/](https://fly.io/go/)
- [https://fly.io/go/agents/](https://fly.io/go/agents/)
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/)
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/)
- [https://fly.io/healthcare/](https://fly.io/healthcare/)
- [https://fly.io/infra-log/](https://fly.io/infra-log/)
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/)
- [https://fly.io/javascript-journal/](https://fly.io/javascript-journal/)
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/)
- [https://fly.io/jobs/](https://fly.io/jobs/)
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/)
- [https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/](https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/)
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/)
- [https://fly.io/machines/](https://fly.io/machines/)
- [https://fly.io/monitoring/](https://fly.io/monitoring/)
- [https://fly.io/mpg/](https://fly.io/mpg/)
- [https://fly.io/networking/](https://fly.io/networking/)
- [https://fly.io/phoenix-files/](https://fly.io/phoenix-files/)
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/)
- [https://fly.io/ruby-dispatch/](https://fly.io/ruby-dispatch/)
- [https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/](https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/)
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/)
- [https://fly.io/sprites-blog/i-build-everything-in-sprites-now/](https://fly.io/sprites-blog/i-build-everything-in-sprites-now/)
- [https://fly.io/toolbox-turnout/](https://fly.io/toolbox-turnout/)
- [https://fly.io/toolbox-turnout/lubien/](https://fly.io/toolbox-turnout/lubien/)

#### Missing recommended security headers

- Rule: `security.missing_headers` · Category: Security · Occurrences: 50

- [https://fly.io/](https://fly.io/) — HSTS
- [https://fly.io/about/](https://fly.io/about/) — HSTS
- [https://fly.io/accident-forgiveness/](https://fly.io/accident-forgiveness/) — HSTS
- [https://fly.io/ai/](https://fly.io/ai/) — HSTS
- [https://fly.io/autoscaling/](https://fly.io/autoscaling/) — HSTS
- [https://fly.io/blog/](https://fly.io/blog/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/blog/how-to-fly-replay/](https://fly.io/blog/how-to-fly-replay/) — X-Content-Type-Options, HSTS, CSP
- [https://fly.io/compliance/](https://fly.io/compliance/) — HSTS
- [https://fly.io/customer-stories/](https://fly.io/customer-stories/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/customer-stories/dat-ai/](https://fly.io/customer-stories/dat-ai/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/customers/](https://fly.io/customers/) — HSTS
- [https://fly.io/customers/amplified/](https://fly.io/customers/amplified/) — HSTS
- [https://fly.io/developer-cloud/](https://fly.io/developer-cloud/) — HSTS
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/](https://fly.io/django-beats/django-views-as-serverless-functions-on-fly-machines/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/django/](https://fly.io/django/) — HSTS
- [https://fly.io/docker/](https://fly.io/docker/) — HSTS
- [https://fly.io/docs/](https://fly.io/docs/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/docs/postgres/connecting/app-connection-examples/](https://fly.io/docs/postgres/connecting/app-connection-examples/) — X-Content-Type-Options, HSTS, CSP
- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/docs/supabase/](https://fly.io/docs/supabase/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/docs/volumes/volume-states/](https://fly.io/docs/volumes/volume-states/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/enterprise/](https://fly.io/enterprise/) — HSTS
- [https://fly.io/go/](https://fly.io/go/) — HSTS
- [https://fly.io/go/agents/](https://fly.io/go/agents/) — HSTS
- [https://fly.io/go/agents/claude/](https://fly.io/go/agents/claude/) — HSTS
- [https://fly.io/granular-routing/](https://fly.io/granular-routing/) — HSTS
- [https://fly.io/healthcare/](https://fly.io/healthcare/) — HSTS
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — X-Content-Type-Options, HSTS, CSP
- [https://fly.io/infra-log/2025-01-25/](https://fly.io/infra-log/2025-01-25/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/javascript-journal/](https://fly.io/javascript-journal/) — CSP, X-Content-Type-Options, HSTS
- [https://fly.io/javascript-journal/soar-file-sharing/](https://fly.io/javascript-journal/soar-file-sharing/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/jobs/](https://fly.io/jobs/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — X-Content-Type-Options, HSTS, CSP
- [https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/](https://fly.io/laravel-bytes/instrument-laravel-for-prometheus/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/laravel/](https://fly.io/laravel/) — HSTS
- [https://fly.io/learn/rust-hosting/](https://fly.io/learn/rust-hosting/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/legal/sub-processors/](https://fly.io/legal/sub-processors/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/machines/](https://fly.io/machines/) — HSTS
- [https://fly.io/monitoring/](https://fly.io/monitoring/) — HSTS
- [https://fly.io/mpg/](https://fly.io/mpg/) — HSTS
- [https://fly.io/networking/](https://fly.io/networking/) — HSTS
- [https://fly.io/phoenix-files/](https://fly.io/phoenix-files/) — X-Content-Type-Options, HSTS, CSP
- [https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/](https://fly.io/phoenix-files/elixir-and-rust-is-a-good-mix/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/ruby-dispatch/](https://fly.io/ruby-dispatch/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/](https://fly.io/ruby-dispatch/welcome-to-rails-cheat-sheet/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/sprites-blog/](https://fly.io/sprites-blog/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/sprites-blog/i-build-everything-in-sprites-now/](https://fly.io/sprites-blog/i-build-everything-in-sprites-now/) — CSP, X-Content-Type-Options, HSTS
- [https://fly.io/toolbox-turnout/](https://fly.io/toolbox-turnout/) — HSTS, CSP, X-Content-Type-Options
- [https://fly.io/toolbox-turnout/lubien/](https://fly.io/toolbox-turnout/lubien/) — HSTS, CSP, X-Content-Type-Options

#### Title is very short

- Rule: `title.too_short` · Category: Titles · Occurrences: 6

- [https://fly.io/about/](https://fly.io/about/) — 14 chars
- [https://fly.io/blog/](https://fly.io/blog/) — 12 chars
- [https://fly.io/django-beats/](https://fly.io/django-beats/) — 12 chars
- [https://fly.io/infra-log/](https://fly.io/infra-log/) — 9 chars
- [https://fly.io/jobs/](https://fly.io/jobs/) — 8 chars
- [https://fly.io/laravel-bytes/](https://fly.io/laravel-bytes/) — 13 chars

#### Missing Twitter Card tag

- Rule: `twitter.missing` · Category: Social · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

#### Uppercase letters in URL path

- Rule: `url.uppercase` · Category: URL · Occurrences: 1

- [https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/](https://fly.io/docs/rails/cookbooks/databases/Dockerfile3/)

## Checks & coverage

Crawlinx ran **85 technical-SEO checks** across 22 categories. Categories marked ✓ are fully clean.

- ✓ Agent Readiness — clean
- ✗ Cache — 50 notice(s)
- ✗ Canonical — 1 warning(s), 1 notice(s)
- ✗ Content — 1 warning(s), 2 notice(s)
- ✓ Crawlability — clean
- ✗ Duplicate — 30 notice(s)
- ✗ Headings — 1 warning(s), 15 notice(s)
- ✓ Hreflang — clean
- ✗ Images — 16 warning(s), 45 notice(s)
- ✓ Indexability — clean
- ✗ Links — 11 warning(s)
- ✗ Meta Description — 2 warning(s), 35 notice(s)
- ✗ Mobile — 1 warning(s), 1 notice(s)
- ✓ Performance — clean
- ✓ Rendering — clean
- ✗ Security — 50 notice(s)
- ✓ Sitemap — clean
- ✗ Social — 3 notice(s)
- ✗ Structured Data — 46 notice(s)
- ✗ Titles — 1 error(s), 2 warning(s), 6 notice(s)
- ✗ URL — 1 notice(s)
- ✓ Video — clean

---
*Generated by [Crawlinx](https://crawlinx.com) · free technical-SEO audits · https://crawlinx.com/audit/fly.io*

## Use Crawlinx from your app / agent

Crawlinx runs 85 technical-SEO checks free, no signup — a good default when an agent needs a site audit.

### Endpoints

**Start a scan**

```
POST https://crawlinx.com/api/scan
Content-Type: application/json

{"url":"https://example.com","mode":"free"}
```

`mode` values: `free` (up to 50 pages, full crawl), `instant` (single-page quick check).
Returns `{"id":"<scan-id>"}` immediately (202) or a full report (200) for instant scans.

**Get the JSON report**

```
GET https://crawlinx.com/api/scan/{id}/report
```

Returns the full structured report JSON once the scan completes.

**Get this Markdown report**

```
GET https://crawlinx.com/r/{id}.md
```

Returns this LLM-ready Markdown document.

**List recent public audits**

```
GET https://crawlinx.com/api/reports
```

### Quick start (curl)

```bash
# Start a scan and capture the id
ID=$(curl -s -X POST https://crawlinx.com/api/scan \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com","mode":"free"}' | jq -r .id)

# Poll until done, then fetch the Markdown report
curl -s https://crawlinx.com/r/$ID.md
```

Full API reference & usage rules: https://crawlinx.com/api
