live signals
http status
200
OK · all clear
tls cert
valid
chain + trust
security
pass
header scan
response
29ms
rolling avg
lighthouse
Performance
87%
Accessibility
97%
Best practices
100%
SEO
100%
response time · last 31 checks
status codes
uptime split
security · header scan
Use HTTPS
pass
Set MIME types
pass
Content sniff protection
pass
Clickjack protection
pass
XSS protection
pass
Hide server version
pass
HSTS enabled
pass
HSTS preload
pass
performance breakdown
Lighthouse combines these weighted metrics to produce the Performance score. Opportunities below are the biggest wins — savings are estimated against the audited URL only.
TBT · 30%
80 ms
Total Blocking Time
LCP · 25%
3.9 s
Largest Contentful Paint
CLS · 15%
0.022
Cumulative Layout Shift
FCP · 10%
1.4 s
First Contentful Paint
TTI · 10%
3.2 s
Time to Interactive
SI · 10%
1.4 s
Speed Index
top opportunities
Score
Audit
Detail
Est. savings
0.35
Properly size images
Potential savings of 384 KiB
2.0 s
0.50
Enable text compression
Potential savings of 406 KiB
750 ms
0.67
Reduce unused JavaScript
Potential savings of 82 KiB
450 ms
0.70
Eliminate render-blocking resources
Potential savings of 390 ms
391 ms
0.75
Reduce unused CSS
Potential savings of 35 KiB
300 ms
0.88
Defer offscreen images
Potential savings of 46 KiB
150 ms
0.89
Preconnect to required origins
Potential savings of 130 ms
134 ms
0.00
Image elements do not have explicit `width` and `height`
—
—
0.84
Max Potential First Input Delay
150 ms
—
accessibility · 38
Severity
URL
Issue
Item
INFO
/posts/cool-uris-dont-change-unless-an-ai-rewrites-your-blog/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/optimizing-sqlite-for-django-in-production/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/capturing-screenshots-with-chromium-using-python/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/managing-a-python-project-with-uv-in-2026/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/using-vite-with-django-in-2026/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/code-formatting-a-python-project-in-2022/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/make-your-own-new-tab-browser-extension-in-50-lines-of-code/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/finding-broken-external-links-on-websites-using-scrapy/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/minimal-automated-updates-for-alpine-linux/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/adding-dark-mode-with-automatic-system-preference-selection/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/using-codemirror-to-show-formatted-code-in-wagtail/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/set-up-automated-server-backups-with-borg/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/caddy-configuration-for-django-with-some-sensible-defaults/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/counting-table-row-counts-in-postgresql/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/running-a-simple-django-website-in-docker/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/using-editorconfig-to-improve-coding-style-consistency/
8 link(s) have no visible text
https://blog.bythewood.me/
INFO
/posts/generating-a-ed25519-ssh-key-with-openssh/
8 link(s) have no visible text
https://blog.bythewood.me/
WARNING
/blog/tag/databases/
1 form input(s) without associated label
https://blog.bythewood.me/search/
WARNING
/blog/tag/coding/
1 form input(s) without associated label
https://blog.bythewood.me/search/
WARNING
/blog/tag/security/
1 form input(s) without associated label
https://blog.bythewood.me/search/
WARNING
/blog/tag/sysadmin/
1 form input(s) without associated label
https://blog.bythewood.me/search/
WARNING
/blog/tag/webdev/
1 form input(s) without associated label
https://blog.bythewood.me/search/
content · 2
Severity
URL
Issue
Item
links · 31
Severity
URL
Issue
Item
ERROR
/posts/adding-dark-mode-with-automatic-system-preference-selection/
Broken internal link (status 502)
https://blog.bythewood.me/posts/adding-dark-mode-with-automatic-system-preference-selection/pdf/
WARNING
/posts/cool-uris-dont-change-unless-an-ai-rewrites-your-blog/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/optimizing-sqlite-for-django-in-production/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/capturing-screenshots-with-chromium-using-python/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/managing-a-python-project-with-uv-in-2026/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/using-vite-with-django-in-2026/
Broken external link (status 403)
https://medium.com/@ratchapol.thaworn/migrating-from-webpack-to-vite-real-world-lessons-from-a-production-frontend-project-ea4bb53a9d58
WARNING
/posts/using-vite-with-django-in-2026/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/code-formatting-a-python-project-in-2022/
Broken external link (status 404)
https://marketplace.visualstudio.com/items?itemName=ms-python.python
WARNING
/posts/code-formatting-a-python-project-in-2022/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/make-your-own-new-tab-browser-extension-in-50-lines-of-code/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/finding-broken-external-links-on-websites-using-scrapy/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/minimal-automated-updates-for-alpine-linux/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/adding-dark-mode-with-automatic-system-preference-selection/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/using-codemirror-to-show-formatted-code-in-wagtail/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/set-up-automated-server-backups-with-borg/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/caddy-configuration-for-django-with-some-sensible-defaults/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/counting-table-row-counts-in-postgresql/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/running-a-simple-django-website-in-docker/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/using-editorconfig-to-improve-coding-style-consistency/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/blog/tag/databases/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/posts/generating-a-ed25519-ssh-key-with-openssh/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/blog/tag/security/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
WARNING
/blog/tag/sysadmin/
Broken external link (status 404)
https://www.linkedin.com/in/ibythewood/
security · 28
Severity
URL
Issue
Item
WARNING
/posts/cool-uris-dont-change-unless-an-ai-rewrites-your-blog/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/cool-uris-dont-change-unless-an-ai-rewrites-your-blog/
WARNING
/posts/optimizing-sqlite-for-django-in-production/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/optimizing-sqlite-for-django-in-production/
WARNING
/posts/capturing-screenshots-with-chromium-using-python/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/capturing-screenshots-with-chromium-using-python/
WARNING
/posts/managing-a-python-project-with-uv-in-2026/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/managing-a-python-project-with-uv-in-2026/
WARNING
/posts/using-vite-with-django-in-2026/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/using-vite-with-django-in-2026/
WARNING
/posts/code-formatting-a-python-project-in-2022/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/code-formatting-a-python-project-in-2022/
WARNING
/posts/make-your-own-new-tab-browser-extension-in-50-lines-of-code/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/make-your-own-new-tab-browser-extension-in-50-lines-of-code/
WARNING
/posts/finding-broken-external-links-on-websites-using-scrapy/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/finding-broken-external-links-on-websites-using-scrapy/
WARNING
/posts/minimal-automated-updates-for-alpine-linux/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/minimal-automated-updates-for-alpine-linux/
WARNING
/posts/adding-dark-mode-with-automatic-system-preference-selection/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/adding-dark-mode-with-automatic-system-preference-selection/
WARNING
/posts/using-codemirror-to-show-formatted-code-in-wagtail/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/using-codemirror-to-show-formatted-code-in-wagtail/
WARNING
/posts/set-up-automated-server-backups-with-borg/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/set-up-automated-server-backups-with-borg/
WARNING
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
WARNING
/posts/caddy-configuration-for-django-with-some-sensible-defaults/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/caddy-configuration-for-django-with-some-sensible-defaults/
WARNING
/posts/counting-table-row-counts-in-postgresql/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/counting-table-row-counts-in-postgresql/
WARNING
/posts/running-a-simple-django-website-in-docker/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/running-a-simple-django-website-in-docker/
WARNING
/posts/using-editorconfig-to-improve-coding-style-consistency/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/using-editorconfig-to-improve-coding-style-consistency/
WARNING
/blog/tag/ai/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/ai/
WARNING
/blog/tag/databases/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/databases/
WARNING
/blog/tag/coding/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/coding/
WARNING
/posts/generating-a-ed25519-ssh-key-with-openssh/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/posts/generating-a-ed25519-ssh-key-with-openssh/
WARNING
/blog/tag/security/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/security/
WARNING
/blog/year/2026/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/year/2026/
WARNING
/blog/tag/sysadmin/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/sysadmin/
WARNING
/blog/tag/webdev/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/tag/webdev/
WARNING
/blog/year/2022/
Mixed content: 1 http:// resource(s) on https:// page
http://blog.bythewood.me/blog/year/2022/
seo · 82
Severity
URL
Issue
Item
INFO
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Favicon link missing
INFO
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Page not listed in sitemap
WARNING
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Title length is 68 chars (recommended 30-60)
Creating a PWA with Next.js and next-pwa to improve your websites UX
WARNING
/blog/
Description length is 67 chars (recommended 70-160)
Posts on webdev, coding, security, and sysadmin by Isaac Bythewood.
WARNING
/posts/optimizing-sqlite-for-django-in-production/
Description length is 165 chars (recommended 70-160)
The default SQLite settings in Django are fine for development but will hit "database is locked" errors under any concurrency. Here's the config I use in production.
WARNING
/posts/adding-dark-mode-with-automatic-system-preference-selection/
Description length is 201 chars (recommended 70-160)
Creating a dark, or light, version of your website may seem like a daunting task if you think you need an entirely new color pallet. It's 2022 though and we have the widely supported invert CSS filter.
WARNING
/posts/creating-a-pwa-with-nextjs-and-next-pwa-to-improve-your-websites-ux/
Description length is 196 chars (recommended 70-160)
Turning your website into a PWA, especially if your website doesn't rely on an internet connection at all, can greatly improve its user experience by allowing them to access your web app anywhere.
WARNING
/blog/tag/ai/
Description length is 46 chars (recommended 70-160)
Posts tagged ai
Currently filtered by tag Ai.
WARNING
/blog/tag/databases/
Description length is 60 chars (recommended 70-160)
Posts tagged databases
Currently filtered by tag Databases.
WARNING
/blog/tag/coding/
Description length is 54 chars (recommended 70-160)
Posts tagged coding
Currently filtered by tag Coding.
WARNING
/blog/tag/security/
Description length is 58 chars (recommended 70-160)
Posts tagged security
Currently filtered by tag Security.
WARNING
/blog/year/2026/
Description length is 49 chars (recommended 70-160)
Posts from 2026
Currently filtered by year 2026.
WARNING
/blog/tag/sysadmin/
Description length is 58 chars (recommended 70-160)
Posts tagged sysadmin
Currently filtered by tag Sysadmin.
WARNING
/blog/tag/webdev/
Description length is 54 chars (recommended 70-160)
Posts tagged webdev
Currently filtered by tag Webdev.
WARNING
/blog/year/2022/
Description length is 49 chars (recommended 70-160)
Posts from 2022
Currently filtered by year 2022.