Lottie Website Tester v1.0.0

Free testing tool for your personal domain — to get your own copy, just save this .html file.

Crawl configuration

Progress idle

0 / 0
0
Queued
0
In flight
0
Done
0
2xx
0
3xx
0
4xx
0
5xx / err
0 ms
Avg load
0 B
Total bytes

Results

Run a crawl to see the summary.
All 2xx 3xx 4xx 5xx errors HTML subresources
No results yet.
No errors yet — run a crawl.
Subresource checking is enabled by default; results appear here after a crawl.
No mixed-content findings yet.

Export

Download the full results or copy a summary to share.

The standalone HTML report is self-contained — it can be opened directly from disk under file://.

Help

What this tool does

Lottie Website Tester crawls a website starting from a URL you provide, recording the HTTP status code, page weight, load time, redirects, mixed-content issues, and broken subresources for every page it visits. Everything runs in your browser; no data is sent anywhere.

Important — host this file on the site you want to test

Because browsers enforce same-origin restrictions, you must upload this .html file somewhere on the website you want to test. It can live in any folder — for example https://yoursite.com/website-tester.html, https://yoursite.com/tools/website-tester.html, or https://yoursite.com/private/admin/tester.html. Just visit that URL in your browser. Opening the file directly with file:// will not work — see the banner at the top.

The tool will only crawl pages within the same registrable domain (e.g. example.com, including subdomains like blog.example.com). Cross-subdomain requests are technically cross-origin and will show with reduced detail (status appears as "opaque"); same-origin requests show full results.

Running a local web server

If you want to test the tool against a local copy of a site, pick whichever of these is easiest on your machine. Run it inside the directory that contains your site files (and this HTML), then open the printed URL.

# Python 3 (built in to macOS and most Linux distros)
python3 -m http.server 8000

# Python 2 (legacy)
python -m SimpleHTTPServer 8000

# PHP (built in)
php -S localhost:8000

# Node.js — no install needed if you have npx
npx serve
# or
npx http-server -p 8000

# Ruby (built in to macOS)
ruby -run -e httpd . -p 8000

# Busybox (Alpine, embedded systems)
busybox httpd -f -p 8000

# Caddy
caddy file-server --listen :8000

If you use VS Code, the Live Server extension does the same thing with a click. After the server is running, visit http://localhost:8000/website-tester.html.

Why a server is needed

When a page is loaded from a file:// URL, browsers refuse most fetch() requests for security reasons. A real HTTP server gives the page a proper origin that the network stack understands, which lets the crawler do its job.

Feature reference

Start URL

The page to begin crawling from. Defaults to the root of the site this tool is hosted on. Must use http or https.

Max pages

Hard upper bound on how many URLs the crawler will check. Stops the queue from running away on huge sites.

Max depth

How many link hops from the start URL the crawler will follow. The start URL is depth 0. Subresources do not count toward depth.

Concurrency

How many requests are in flight at once. Higher numbers crawl faster but put more load on the server. Most shared hosting handles 2–4 cleanly; bump to 8+ on infrastructure you control.

Delay between requests (ms)

Each worker waits this long before issuing its next request, on top of the natural request duration. Use this to be polite — a slow crawl is a friendly crawl.

Request timeout (ms)

If a request hasn't finished within this many milliseconds, it's aborted and recorded as a timeout error.

Include / exclude patterns

JavaScript regular expressions, one per line. A URL must match at least one include pattern (if any are set) and must not match any exclude pattern, to be crawled.

Respect robots.txt

Fetches /robots.txt from the start URL's origin and skips any path your User-Agent is disallowed from. Strongly recommended.

Check subresources

For every HTML page found, also check that its <img>, <link>, <script>, and <source> URLs return 200. Broken assets appear in the Subresources tab and contribute to the page-weight total of their first-seen parent.

Detect mixed content + insecure links

If the start URL uses HTTPS, the tool flags any HTTP resource it finds. Mixed content is blocked by modern browsers and reported as a security concern.

Check external links (no-cors best-effort)

Off by default. When enabled, the tool sends a no-cors request to off-domain links. Browsers will hide the actual status code (you'll see "opaque"), but reachable vs unreachable will be observable.

User-Agent string

The tool can't actually override the browser's User-Agent request header (browsers forbid that), but this string is sent as a request header named X-Crawler-UA and is also used when matching robots.txt rules.

Pause / Resume / Stop

Pause freezes the worker loop while letting in-flight requests finish. Resume picks up where you left off. Stop aborts everything and freezes the results so you can still export them.

Exports

  • CSV — one row per checked URL, opens in any spreadsheet.
  • JSON — the full structured report, useful for tooling.
  • Standalone HTML report — a separate .html file with the results baked in. No crawler, no config — read-only and shareable. Opens under file://.
  • Copy summary to clipboard — a plain-text summary of totals, the slowest pages, the heaviest pages, and the full error list with referrers.

Limitations

  • JavaScript-rendered pages (SPAs) are not executed — only the initial HTML is parsed. Links injected at runtime won't be followed.
  • The tool uses fetch() from a browser, so it inherits browser CORS rules. Same-origin = full info; cross-origin = limited info.
  • Authentication cookies for the site this tool is hosted on are automatically included. To crawl as a logged-out user, open a private/incognito window.
  • Very large responses are downloaded in full to measure bytes. Use exclude patterns to skip giant binary files if needed.