Find Dead Links on Your Jekyll Blog with HTML Proofer

| programming | quality | ruby |

Introduction

HTML Proofer is a super handy ruby tool that helps you check your statically generated HTML for any inconsistencies. If you have a large statically generated site then it is certainly worth setting this up because as your site continues to grow it will become more and more difficult to audit the validity of your pages. I have used HTML Proofer in the past, but for whatever reason I had "disable_external" set to true which ignored all outgoing links. It is still useful to find things like missing alt tags in images, and general invalid HTML, but this feature makes it a must for all blogs.

Configuration

Rather than clicking on every link on every page, let HTML Proofer do the heavy lifting for you with the following simple steps:

Install HTML Proofer

Add the following to your Gemfile
gem "html-proofer"
gem "rake"
Install all of your Gems
bundle install

Configure a Rake Task

Add the following to your Rakefile.
require 'html-proofer'

task :test do sh “bundle exec jekyll build” HTMLProofer.check_directory("./_site", { :allow_hash_href => true }).run end

Run the Task

bundle exec rake test
This will show you any failures and allow you to act upon them. Some sample output looks like this:
*  External link https://levlaz.org/tag/lxc/ failed: 404 No error
- ./_site/projects/index.html
*  External link https://ezbadge.levlaz.org/ failed: 301 Peer certificate cannot be authenticated with given CA certificates
- ./_site/salting-your-lxc-container-fleet/index.html
*  image /images/minions.jpg does not have an alt attribute (line 150)
- ./_site/setting-up-antlr4-on-windows/index.html
*  image /images/antlr.png does not have an alt attribute (line 156)
*  image /images/grun.png does not have an alt attribute (line 163)
- ./_site/share-this-on-facebook/index.html

Configure CI

If are using CircleCI you can add the following to your circle.yml to run the proofer automatically.
test:
  override:
    - bundle exec rake test
The proofer returns an exit code of 1 upon failure, so this is a great way to enforce quality before deploying your site to production.

Conclusion

There is nothing worse than clicking on a link and seeing a 404. When the post is from 2013, perhaps you can excuse it, but it is still a terrible experience for the user and as a "web master" you owe it to your users to prevent link rot.

Thank you for reading! Share your thoughts with me on bluesky, mastodon, or via email.

Check out some more stuff to read down below.

Most popular posts this month

Recent Favorite Blog Posts

This is a collection of the last 8 posts that I bookmarked.

Articles from blogs I follow around the net

“Insert your favorite nursery rhyme.”

Make Some Noise is one of many fantastic improv comedy shows on Dropout. I noticed one of the ongoing themes is “tech gone bad,” so I compiled a short list below. I just find these really funny. Video call with shitty wifi: Logging in with 30-factor authen...

via Unsung September 17, 2026

Why are short videos bad for learning?

An essay version of the video is below – not just a transcript but a text that I’ve rewritten thoroughly to work as text. As is an audio version. You can subscribe to the audio-only unlisted podcast feed here if audio is more your speed. Overview # In this...

via Baldur Bjarnason's Notes on the Web September 17, 2026

Why we should be very worried about the Hugging Face hack

(Note: This is a re-run of a piece I published on September 3rd. I am backwoods camping this week in the Canadian wilderness and will have no signal so please excuse me for the repeat!)About a month ago, I (and many others) wrote about an incident in which

via The Torment Nexus September 17, 2026

Generated by openring