One command, a handful of flags. Everything below reflects the current release; older behaviour is listed in the changelog.
$ northlint [flags] <directory>
The directory is the build output — the folder you would upload. northlint reads it recursively, keeps an index of every document and every id it declares, then resolves references against that index.
| Flag | Effect |
|---|---|
| --ignore <glob> | Skip paths matching the pattern. Repeatable. |
| --base <path> | Treat root-relative links as rooted here, for sites served under a subdirectory. |
| --index <name> | Directory index filename. Defaults to index.html. |
| --strict-case | Report references whose case differs from the file on disk. |
| --format json | Machine readable output instead of the default text. |
| --quiet | Print nothing; rely on the exit code. |
| Rule | Meaning |
|---|---|
| dead link | Target document does not exist in the tree. |
| dead anchor | Document exists, fragment does not match any id. |
| missing file | Referenced asset is absent. |
| duplicate id | Two elements share an id; links to it are ambiguous. |
| case drift | Reference and file differ only in letter case. |
| empty href | An anchor with no destination, usually a templating slip. |
Generated sites often carry directories that are not worth checking — vendored API references, archived versions, coverage reports. Skip them:
$ northlint ./public \
--ignore 'api/**' \
--ignore 'v1/**' \
--ignore '**/coverage/**'
northlint exits non-zero when it finds problems, so no wrapper is needed:
- name: Check documentation links
run: |
go install northlint.com/cmd/northlint@latest
northlint ./public --ignore 'api/**'
| Code | Meaning |
|---|---|
| 0 | No problems found. |
| 1 | At least one problem reported. |
| 2 | Bad invocation — unreadable directory, unknown flag. |