announcements 2026-07-24

https://github.com/brettatoms/zodiac 1.0.119 released This is the first stable release of Zodiac. Zodiac is a small web framework for Clojure that provides a reasonable set of defaults while also being easily extensible. At its core Zodiac is mostly just a preconfigured Ring app and not more that a few hundred lines of code. You can optionally install one of the ready-made Zodiac extensions: • https://github.com/brettatoms/zodiac-assets: Static asset building and url lookup with https://vite.dev/. • https://github.com/brettatoms/zodiac-sql: Helper for connecting to SQL database and running https://github.com/seancorfield/honeysql queries. • https://github.com/brettatoms/zodiac-headers: Add secure HTTP headers to a Zodiac app • https://github.com/brettatoms/zodiac-hot-reload: Automatically update changes in the browser via https://github.com/brettatoms/ring-hot-reload

🎉 2

https://github.com/clj-kondo/clj-kondo: static analyzer and linter for Clojure code that sparks joy ✨ 2026.07.24 Highlights Type checking The type checker now infers much more and respects required :keys! in Clojure 1.13 alphas. It derives argument types from how a param is used in the body:

(defn f [s] (subs s 1))
(f 42)
   ^ Expected: string, received: positive integer.
It types the keys and values of destructured maps:
(defn f [{:keys [x]}] (inc x))
(f {:x "foo"})
       ^ Expected: number, received: string.
It flows map types from return values into destructured bindings:
(defn cfg [] {:port "8080"})
(let [{:keys [port]} (cfg)] (inc port))
                                 ^ Expected: number, received: string.
It flags keys that are provably nil:
(inc (:y {}))
     ^ Expected: number, received: nil.
It narrows a local's type when guarded by a known predicate:
(defn f [x] (if (string? x) (inc x) x))
                                 ^ Expected: number, received: string.
Clojure 1.13: built-in analysis is bumped to 1.13.0-alpha4 and the new map destructuring features are supported: required keys via :keys!, :syms! and :strs!, :select and :defaults. Required keys are checked at call sites:
(defn f [{:keys! [x]}] x)
(f {})
   ^ Missing required key: :x
Constant condition The linter :constant-condition, which is :warning by default, warns on a condition whose truthiness is the same on every run:
(when inc :hello)
      ^ Condition always true
It replaces :condition-always-true, which was off by default. Combined with the improved type inference, this can now find many more issues. In regression tests I've found multiple cases of filter and remove results being used as conditions, which are always true since they always return a seq. Performance: linting is faster and allocates less. Var usages and bindings are now records, several rewrite-clj internals were optimized (https://github.com/alexander-yakushev) and hot analyzer functions were split so they can be JIT-compiled. For all updates, look https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#all-updates Follow up in #CHY97NXE2 Thanks to clojurists-together and github-dark sponsors and all who contribute in other ways!

17
🎉 42

Thanks to @seancorfield and other people for giving this a test run through clojure-lsp nightly builds and thanks to @ericdallo for pro-actively including clj-kondo nightlies into clojure-lsp nightly!

6

great upgrade!

It found some bugs at work (and several very dumb pieces of code that weren't quite bugs). Very impressive release!

❤️ 1

Can I use type information in custom hooks? Example use cases: Calls to some in boolean positions (e.g., (if (some ...))) are linted as a warning that suggests using a custom variant of some that always returns a boolean Boolean local variables with ? suffix are linted a warnings because question mark suffix is for predicate functions, not booleans

Do you need type information for this?

Can I know if a local binding is a boolean? Especially if a value is some function call?

hooks were originally created for macro expansion. full type inference is only available at a later phase

e.g. you can still infer types for a specific argument after your hook has run

so currently this isn't available

there is :discouraged-var where you can globally to advice an alternative to some

What I want is to emit a warning with type information awareness, doesn't have to be a hook

I'll think about it. type inference isn't perfect (as it depends on usage in the function body etc) so you wouldn't get perfect warnings

Btw many thanks for clj-kondo! The project I'm working on has some super complex macros, so I haven't used it until recently because it was too hard to set up, but coding agents can do this, so recently I managed to get it working in my project and it found many bugs!

Alex Miller (Clojure team) 2026-07-24T13:40:15.002479Z

transit-java 1.1.406 and transit-clj 1.1.363 are now available - these bump to latest versions of deps, no other changes

6

Reading the intro, part of the pitch for Wolfram + AI, sounds like the pitch for Clojure + AI: Simple and consistent language = easier for ai to use. Code remains human readable. Quality composition = reliable automation and deterministic tools agents can leverage.

❤️ 1
Jakub Holý (HolyJak) 2026-07-26T11:16:50.871489Z

Absolutely!