Language-agnostic linter

alint operates on filesystem shape and file content, not parsed code. The rule engine treats files as files. Whether your repo is Python, Rust, Go, Java, TypeScript, or all of the above in one monorepo, the same 60 rule kinds apply.

What this actually means here

What it does not mean

alint is not trying to replace your per-language code linter. ESLint, Clippy, ruff, golangci-lint, and friends do AST analysis that alint deliberately doesn't. alint is the structural floor; those are the semantic surface. The two coexist. See when alint is NOT the right tool on the compare page for the full list of things to use other tools for (AST-aware linting, SAST, IaC scanning, secret scanning, …).

The bundled per-ecosystem rulesets are language-aware in their content (e.g. rust@v1 knows about Cargo.toml conventions; node@v1 knows about package.json shape). Their language-awareness comes from the data they ship (JSONPath queries, filename patterns), not from the engine. The engine never parses a Rust file or a JS file as code.

Real polyglot repos

Production OSS repos where one alint config covers multiple ecosystems:

Browse all 30 case studies →

alint installs as a single static binary. No runtime, no Docker, no per-language toolchain.