https://github.com/clj-kondo/clj-kondo: static analyzer and linter for Clojure code that sparks joy ✨
v2026.04.15 celebrates 7 years of clj-kondo! This release focuses on adding a few new useful linters, support for new potemkin features and last but not least a boatload of performance improvements! Thanks to @jonurnieta, @alexyakushev and other contributors! Thanks to sponsors who keep Clojure OSS alive! clojurists-together github-dark gratitude
• https://github.com/clj-kondo/clj-kondo/issues/2788: NEW linter: :not-nil? which suggests (some? x) instead of (not (nil? x)), and similar patterns with when-not and if-not (default level: :off)
• https://github.com/clj-kondo/clj-kondo/issues/2520: NEW linter: :protocol-method-arity-mismatch which warns when a protocol method is implemented with an arity that doesn't match any arity declared in the protocol (https://github.com/jramosg)
• https://github.com/clj-kondo/clj-kondo/issues/2520: NEW linter: :missing-protocol-method-arity (off by default) which warns when a protocol method is implemented but not all declared arities are covered
• https://github.com/clj-kondo/clj-kondo/issues/2768: NEW linter: :redundant-declare which warns when declare is used after a var is already defined (https://github.com/jramosg)
• https://github.com/clj-kondo/clj-kondo/issues/1878: support potemkin's import-fn, import-macro, and import-def
• https://github.com/clj-kondo/clj-kondo/issues/2498: support new potemkin import-vars :refer and :rename syntax
• https://github.com/clj-kondo/clj-kondo/issues/2579: avoid redundant config merge when switching namespaces
• Performance improvement: refactor lint-cond-constants! to eliminate sexpr usage (https://github.com/jramosg)
• https://github.com/clj-kondo/clj-kondo/issues/2762: Fix false positive: throw with string in CLJS no longer warns about type mismatch (https://github.com/jramosg)
• Add type support for pmap (https://github.com/jramosg)
• Type system: Add type support for future-related functions (`future`, future-call, future-done?, future-cancel, future-cancelled?) (https://github.com/jramosg)
• https://github.com/clj-kondo/clj-kondo/issues/2770: Fix: linter-specific ignores now correctly respect the specified linters instead of suppressing all linters for :unused-excluded-var and :unresolved-excluded-var
• https://github.com/clj-kondo/clj-kondo/issues/2773: Align executable path for images to be /bin/clj-kondo (https://github.com/harryzcy)
• Performance optimizations: https://github.com/clj-kondo/clj-kondo/issues/2779, https://github.com/clj-kondo/clj-kondo/issues/2780, https://github.com/clj-kondo/clj-kondo/issues/2781, https://github.com/clj-kondo/clj-kondo/issues/2782, https://github.com/clj-kondo/clj-kondo/issues/2783, https://github.com/clj-kondo/clj-kondo/issues/2785, https://github.com/clj-kondo/clj-kondo/issues/2786, https://github.com/clj-kondo/clj-kondo/issues/2794, https://github.com/clj-kondo/clj-kondo/issues/2800, https://github.com/clj-kondo/clj-kondo/issues/2801 (https://github.com/alexander-yakushev)
• Performance: cache hook-fn lookups to avoid repeated SCI evaluation
• https://github.com/clj-kondo/clj-kondo/issues/2621: load imports from symlinked config dir (https://github.com/walterl)
• https://github.com/clj-kondo/clj-kondo/issues/2798: report correct filename and error details when StackOverflowError occurs during analysis
happy birthday 🙂
Wow, @jonurnieta. Thanks for working on Calva from this end as well! 🎉
So I built a thing. https://github.com/miniforge-ai/miniforge. ..my own personal Yeet Machine. Built on top of Babashka using a polylith architecture with ~ 90 components. It also includes a governed ETL workflow engine as well as a the governed software factory workflow engine. The blog post is the origin story if you guys are interested. The repo is linked below. It's open source so feel free to fork it, make changes, or give me feedback on what you like / don't like. I'm working on solving the problems that I see in agentic orchestration and miniforge is my answer to those questions. Repo: https://github.com/miniforge-ai/miniforge Blog post: https://www.miniforge.ai/blog/orchestration-is-not-the-hard-part
I’ve read your blog and couldn’t agree more about what the question today is... How would you rate code quality? I mean... From what I’ve seen http://miniforge.ai has kind of co-built itself... Hasn’t it? I’m asking because I’ve been using coding agents to refactor or generate some frontend that is well specified. It is really helpful in those situations. I have mixed feelings about using it on large projects (like miniforge ~ 166k LoC Clojurecode). Generated code often leads to duplicated code, side-questing and easily moving away from main “quest”. Oversimplification as well... Like OK, I’m gonna help you but with lowest given effort. So is this experiment? Is this “real deal”? In your opinion is this approach the future?
(fyi, the github links in Getting Started seem to have residual markdown characters in them (two asterisks at the end), and go to 404's as a result)
@rgersak its not the future .. it's the present. Every company in the Bay and every FAANG is making LLM use mandatory. So much money is getting thrown at this problem that it will not matter how terrible you might think it is .. it is the future of widget making. On your code quality question .. in the past, let's say two weeks, it's been building itself essentially with supervision. Running in a meta meta loop. I use Claude to run miniforge workflows in a tight dogfood loop as a system monitor .. with my own interventions. An ad hoc version of the console I am building. Miniforge doesn't merge automatically yet (a choice) because I review every PR for the problems you highlight. Once it gets to the place where all my policies are adhered to before a PR then yes, I will be releasing the kraken. Humans cannot review that number of PRs in the real world without skipping checks. You can see it in every large SaaS's red status dashboards (including Claude's). I am also working through the PR overwhelm problem in my UX (native TUI and app). I will say that miniforge produces better code now than Claude on it's own does (with rules and skills). I have crossed that point. Review the code, see what the quality is. It isn't going to be as sophisticated as what we can produce by hand, but it doesn't need to be. I also have a decent amount of code it can use as patterns from my own repos. I also am very interested if folks find patterns they would want changed or considered for adoption (as policy in miniforge's repo). Currently I'm working on boostrapping problem .. take a set of docs desribing policies (code style, linting, arch constraints, business rules, etc.) and compiling those into policy packs that miniforge can use.
Thanks for the response... Glad to hear about the code quality/DX side Far from it - I don't think that this is the wrong way, or terrible... It is clear and very tangible that the game has changed, and I'm trying to change my play here too 🙂 For past few months and clawd/openclaw + agent oriented + "lets buy all mac minis" hype... That kind of passed me by, cause I'm ok with Claude code.... Just wanted to hear how does spec-driven DX compare to interactive Claude Code DX... I guess I'll find out for myself soon
Spec driven is materially better, and specs refined between two different frontier models are better still. I.e., walk back and forth between GPT 5.4 extended reasoning (or higher) and Opus 4.6 high/max effort. One or both of those with access to your repository or the repos/data you are working with.
this is going in interesting direction
.. and also review and force yourself to read and think through those specs. The brain will want to skip past anything that looks "done" to get to the fun part (managing the build). Same with PR reviews. Humans will fight the brains desire to give up agency on things already done or you'll turn into a rubber stamp. The highest ROI (for me) is pouring your skills into rulesets, specs and policy that agents can be constrained around. I.e., wrapping agentic pipelines with an expert system.
When working with Claude, in the morning when I’m fresh and talkative I usually setup a problem statement and than go through series of “Do you have any questions?” prompt iterations until things are really clear to Claude. That is how I got best results... So yeah, docs, specs... It really improves code quality and saves time and tokens. Now... miniforge... I’ll just have to try that one, because I’m too interested now. Thanks for building it in Clojure/Babashka