A static analyzer and linter for Clojure, ClojureScript, and EDN that detects errors and enforces style without executing code.
Clj-kondo is a static analyzer and linter for Clojure, ClojureScript, and EDN code. It detects potential errors, enforces style guidelines, and identifies code smells without executing the program, providing immediate feedback during development. It solves the problem of catching bugs early and maintaining consistent code quality across Clojure projects.
Clojure and ClojureScript developers who want to improve code reliability and adherence to style guides, particularly those working in teams or on large codebases where consistent linting is crucial.
Developers choose clj-kondo for its fast, static analysis that doesn't require a runtime, its extensive linting rules covering both errors and style, and its seamless integration with editors and build tools. Its native compilation via GraalVM ensures quick feedback loops.
Static analyzer and linter for Clojure code that sparks joy
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Compiled to native code with GraalVM, it executes quickly without a runtime, providing immediate feedback during development as emphasized in the README.
Uses a cache to analyze dependencies across the entire project, accurately catching arity errors and unresolved symbols between namespaces, which is key for large codebases.
Detects a wide range of issues from unused vars to style guide violations, with support for common macros and configurable hooks for customization.
Works seamlessly with Leiningen, Boot, deps.edn, and Shadow CLJS, and integrates with various editors, making it flexible for diverse Clojure workflows.
Since it doesn't execute code, unrecognized macros require manual setup via hooks or community configs, which can be time-consuming for unique libraries.
Achieving cross-namespace accuracy requires linting the classpath and managing cache directories, adding steps compared to simpler linters.
Out-of-the-box macro support is limited; for many libraries, users must rely on imported configurations or write their own, which may be incomplete.