How alint compares with other repository linters

alint is a linter for the files around your code: READMEs and licenses, manifests and lockfiles, CI workflows, file names and the values inside config files. ESLint, Clippy and Ruff check the code inside your files; alint checks the files themselves, and runs next to them.

When alint is the right tool

Use alint when the rules you care about are about files: every package has a README and a license field, workflows pin their actions to a commit, nobody commits .env, the version in Cargo.toml matches the one in package.json, a change to the file format comes with a version bump. It takes over from Repolinter, from folders of check scripts and from the file checks in pre-commit-hooks, and it reports the same findings in CI, in pre-commit, in your editor and to your coding agent.

Reach for something else when a check has to understand code (types, call graphs, what an import resolves to), when it's about settings on GitHub rather than files in the repository, or when it needs the network.

Try it on one repository first, with the three-line config on the homepage.

Which tool for which job

The jobUse
Checks on the code inside files: style, bugs, types, unused importsESLint, Clippy, Ruff or your language's linter; Semgrep or CodeQL for security patterns
Which files exist, what they're called and what they contain, values in config files, how files relatealint
A Repolinter config, or a folder of check scriptsalint, with a Repolinter guide and a scripts guide
File and directory names, and nothing elsels-lint, or alint once you check more than names
Whitespace, final newlines, merge markers and large files at commit timepre-commit-hooks or alint; alint also runs as a pre-commit hook
Commit messages in a detailed convention, with scopes and typescommitlint; alint's git_commit_message covers a pattern and a length
Review chores that need the pull request itself: labels, description, reviewersDanger
Import rules resolved like the build resolves them, in JavaScript, TypeScript or Pythondependency-cruiser, Nx or import-linter
Mistakes and security problems in GitHub Actions workflowsactionlint and zizmor; alint's ci/github-actions ruleset covers pinning and token scope
Settings on GitHub itself: branch protection, code review, signed releasesOpenSSF Scorecard
Secrets in files or in git historygitleaks or TruffleHog
Policy on Terraform, Kubernetes or Dockerfile resourcesCheckov or Conftest
Many linters from one CI jobMegaLinter

These combine. A typical setup is a code linter, alint for the files and something for GitHub settings or pull-request chores.

Side by side

alint next to the three tools whose job overlaps most with it, and next to the check scripts it replaces.

FeaturealintRepolinter archivedls-lintpre-commit-hooksCheck scripts
ChecksWhich files exist, their names and contents, values in config files, relations between files, commitsFiles that should exist, file contents, licenses, some git historyFile and directory names, and whether a file existsOne check per hook: whitespace, final newlines, merge markers, large files, file syntax, private keysWhatever each script checks
Configured in.alint.yml, with 95 rule kindsrepolinter.json or .yaml, with 19 rule types.ls-lint.ymlHook ids and arguments in pre-commit's config fileThe scripts
NeedsOne static binaryNode.js, and Ruby gems for language and license detectionOne static binaryPython and the pre-commit frameworkA shell and every tool the scripts call
Presets22 bundled rulesetsA default rulesetNoneNone; you pick the hooksNone
Rules across filesPairs of files, a file in every package, values that must match between files, import graphsNoNoOnly names that differ in caseIf you write them
Values in config filesJSONPath over JSON, YAML, TOML, XML, dotenv, .properties, INI and HCL; JSON SchemaJSON SchemaNoOnly whether JSON, YAML, TOML and XML files parseIf you write them
Fixes26 kinds, such as renames, headers and final newlinesCreate, modify or remove a fileNoSeveral hooks fix in place: whitespace, final newlines, line endings, byte-order marksIf you write them
Output8 formats, including SARIF, GitHub annotations and a report for coding agentsConsole, JSON, MarkdownText, JSONpre-commit's console outputWhatever the scripts print

In April 2026, alint 0.5.7 and Repolinter 0.11.2 were timed on the same 100,000-file tree, on an AMD Ryzen 9 3900X: on existence and content checks, Repolinter took 13.8 s where alint took 965 ms. Repolinter 0.12.0, its last release, wasn't timed. The same run's ls-lint 2.2.3 timing was wrong, because the harness ran ls-lint without its config, and it hasn't been measured again. The benchmarks page has the method.

The closest alternatives

  • Repolinter

    The TODO Group's checker for the files an open-source repository should have, archived on 6 February 2026. alint has a full equivalent for 24 of the 26 checks in its default ruleset; the other 2 are off by default. Of its 19 rule types, 5 have no equivalent, among them broken-link checks and searching old commits.

    Move to alint. The Repolinter guide maps each rule type and default rule, and gives you the default ruleset as a config.

  • ls-lint

    Checks file and directory names against rules such as kebab-case, snake_case or a regex, and can require that a file exists. It's a small Go binary, and alint's filename_case accepts its case names, though the two check names with several dots differently.

    Keep it if names are all you check. Add alint for the rest; the ls-lint guide starts with running both.

  • pre-commit-hooks

    The pre-commit project's own set of Python hooks, 32 of them in v6.0.0, each checking or fixing one thing in the files a commit touches. alint has rules for most of the file checks, from trailing whitespace to large files; Python-only hooks such as check-ast have no equivalent.

    Either, or both. alint runs as a pre-commit hook too, and the same rules run in CI and the editor.

  • Check scripts

    Kubernetes had 50 hack/verify-*.sh scripts in May 2026, and make verify ran most of them on every pull request. The reference config for it covers about two thirds of what they check: most as alint rules, and the code generators by running Kubernetes' own scripts from alint. The rest needs Go's type checker, a build or the network. Kubernetes doesn't use alint.

    Move the file checks to rules, and run the other scripts from command rules. The scripts guide pairs shell one-liners with rules.

Tools for one part of the job

Each of these does one job alint also touches, in more depth.

commitlint
Lints commit messages. It splits each message into a type, scope, subject, body and footer, and its rules check each part: type-enum, scope-enum, subject-case and so on. It runs on Node.js, usually from a Husky hook, and @commitlint/config-conventional gives you Conventional Commits in one line.
alint's git_commit_message checks a pattern, the subject length and a body for every commit since the base you give it in since:, such as a pull request's. Use commitlint for a detailed convention with allowed types and scopes.
Danger
Runs in CI and comments on the pull request. Its rules are code in a Dangerfile, in JavaScript or TypeScript, with Ruby and Swift versions too, and they can read the pull request's title, description, labels and changed lines.
Use both: alint's pair_changed_together and changeset_requires_path cover the file side of review chores, and run before the pull request exists, in pre-commit and the editor.
OpenSSF Scorecard
Scores a project's security practices from 0 to 10 on 19 checks, such as Branch-Protection, Code-Review and Signed-Releases. It reads the repository through the GitHub or GitLab API, so it sees settings that aren't in any file.
Use both. Five Scorecard checks look at files alint checks too: a security policy, a license, a dependency update tool's config, pinned actions and read-only workflow tokens. alint fails the pull request that breaks them; Scorecard grades the whole project afterwards.
actionlint and zizmor
actionlint catches mistakes in GitHub Actions workflows: syntax, types in ${{ }} expressions, action inputs, runner labels and cron schedules, with ShellCheck on run: scripts. zizmor has 41 security audits, among them template injection, excessive permissions, unpinned actions and credentials a checkout leaves behind.
Use them for workflows. alint's ci/github-actions ruleset (3 rules: pinning, token scope and a name) is a floor for repositories that run nothing else.
dependency-cruiser, import-linter and Nx
Import rules with the language's own module resolution. dependency-cruiser checks JavaScript and TypeScript against forbidden, allowed and required rules, finds cycles and orphans, and follows webpack aliases and tsconfig paths. import-linter checks Python against contracts such as layers and independence. Nx tags projects and limits which tags each may depend on.
Use them where they fit. alint's import_gate and file_graph read paths and text rather than resolving packages, which suits Protobuf, Nix and layering by path.

MegaLinter and EditorConfig

MegaLinter runs other linters from Docker images and collects their results into one report, with pull request comments and SARIF. It doesn't ship alint, so the two run as separate CI steps.

EditorConfig tells editors how to indent and which line endings to write. alint doesn't take its settings from .editorconfig; its text hygiene rules check the same things in CI, the tooling/editorconfig ruleset checks that .editorconfig and .gitattributes exist, and an ini_path_equals rule can check a value inside .editorconfig.

Sources

The facts about other tools come from their own documentation and repositories, read in September 2026. If one of them has changed, open an issue on GitHub.

The guides go further: migrating from Repolinter maps each rule type and default rule, migrating from ls-lint ports its config, moving check scripts to alint sorts scripts into rules and scripts to keep, and the use cases cover monorepos and coding agents.