linkinator
Broken link checker that crawls websites and validates links. Find broken links, dead links, and invalid URLs in websites, documentation, and local files. Perfect for SEO audits and CI/CD.
Linkinator checks websites for broken links
Linkinator is a Node.js broken link checker that crawls sites and local files, validates links, and fits into CI and SEO audits.
What linkinator checks
Linkinator is a broken link checker that crawls websites and validates all links automatically. The README describes it as a super simple site crawler for websites, documentation, and local files. It finds broken links, dead links, and invalid URLs, and it is positioned for SEO audits, quality assurance, continuous integration, and general website health. The tool provides both an API and a CLI, so it can be embedded in a build or run as a one off command. A notable feature is that it scans any element that includes links, not just anchor href attributes, which catches references inside assets and markup that a naive crawler would miss. It supports redirects, absolute links, and relative links, and it lets you configure regex patterns to skip certain URLs. It can scan markdown files without transpilation, which is useful for documentation repos where the source is markdown rather than built HTML. The README stresses that it is quick and efficient at finding broken links across a live site or a local tree. Because it is a library as well as a CLI, teams can call it from Node code and act on the results programmatically rather than parsing CLI output. The feature set is aimed at the practical job of keeping a site's links alive, and the CI framing means a broken link can fail a build before it reaches users. The crawler design keeps the configuration small while still covering the common link shapes found in real sites.
Installation and running
Installation is npm install linkinator for Node.js users. The README also offers standalone binaries that need no Node.js runtime: you download a release, make it executable on Linux or macOS, and run it. Docker is supported too, with the image on the GitHub Container Registry at ghcr.io/justinbeckwith/linkinator. A basic Docker run takes a location and optional arguments, and for reproducible builds you pin a version such as 3.4.0. To check local files you mount the current directory into the container and set it as the working directory, then scan a path recursively with the recurse flag. The CLI takes one or more locations, which can be URLs or disk paths, and supports globs. Flags include concurrency, the number of simultaneous connections, which defaults to 100, a config file path that defaults to linkinator.config.json, directory listing to add an index file for directory links, and clean urls to resolve extensionless links to their html file. The Docker examples show checking a live site like jbeckwith.com and checking a local directory mounted as a volume. Because the binaries and the container are standalone, the tool fits into environments where installing Node is undesirable, such as a thin CI runner. The README's breadth of install paths, npm, binary, and Docker, reflects a goal of being easy to drop into almost any pipeline.
Fitting it into CI
The README frames linkinator as a good fit for continuous integration and SEO audits, and the feature list repeats CI as a core use. Because it exposes both a CLI and a library, a team can run it as a scheduled job, as a pull request check, or as a step in a deployment pipeline. The concurrency flag lets a CI runner tune how many connections it opens, with the default of 100 suitable for most sites but adjustable for constrained runners. The config file, linkinator.config.json by default, lets a project pin skip patterns and other settings so the check is consistent across runs. Skip patterns as regex are useful for known external sites that are flaky or that should not be crawled, keeping the build from failing on noise. The markdown scanning means documentation repositories can validate links in source without a build step, which catches broken references before the docs are rendered. The Docker image on the GitHub Container Registry makes the version explicit and the environment reproducible, which matters for trustworthy CI. Code quality badges in the README show it is checked with Biome and covered by codecov, and releases follow semantic release, so the versioning is predictable. For a site owner, the concrete benefit is a failing build when a link rots, rather than a user hitting a dead link in production. The source, issues, and releases are on the JustinBeckwith linkinator GitHub repository, and the package is published to npm as linkinator.
Editorial conclusion
The project is published under the MIT license and written in TypeScript, with its source at the JustinBeckwith linkinator repository.
Community notes