In this post I'll give updates about open source I worked on during September and October 2025.
To see previous OSS updates, go here.
I'd like to thank all the sponsors and contributors that make this work possible. Without you, the below projects would not be as mature or wouldn't exist or be maintained at all! So a sincere thank you to everyone who contributes to the sustainability of these projects.

Current top tier sponsors:
Open the details section for more info about sponsoring.
If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!
The summer heat has faded, and autumn is upon us. One big focus for me is preparing my talk for Clojure Conj 2025, titled "Making tools developers actually use". I did a test run of the talk at the Dutch Clojure Meetup. It went a bit too long at 45 minutes, so I have to shrink it almost by half for the Conj. The more I work on the talk the more ideas come up, so it's challenging!

Of course I spent a ton of time on OSS the past two months as well. Some special mentions:
sci.impl.Reflector code, based on clojure.lang.Reflector was ported to Clojure with the purpose that it would then be easier to translate to Clojure CLR.str in ClojureScript (worst case 4x, best case 200x)Here are updates about the projects/libraries I've worked on in the last two months in detail.
babashka: native, fast starting Clojure interpreter for scripting.
.addMethod to clojure.lang.MultiFnclojure.lang.ITransientCollection for instance? checksreify + equals + hashCode on Objectjava.nio.charset.CharsetDecoder, java.nio.charset.CodingErrorAction, java.nio.charset.CharacterCodingException in support of the sfv librarynrepl-server completions and lookup op to be compatible with rebel-readlineclojure.lang.Ref for instance? checksNO_SOURCE_PATH instead of <expr> since this can cause issues on Windows when checking for absolute file pathsjava.security and allowing setting deprecated Cipher suites at runtime. See this commit.SCI: Configurable Clojure/Script interpreter suitable for scripting
edamame: configurable EDN and Clojure parser with location metadata and more
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
duplicate-key-in-assoc, defaults to :warning:equals-nil linter to detect (= nil x) or (= x nil) patterns and suggest (nil? x) instead (@conao3)defparkingop macro in core.async alpha:interface flag to :flags set in :java-class-definitions analysis output to distinguish Java interfaces from classes (@hugoduncan)requiring-resolve etc.def body, no results due to laziness bug:not-empty? to only warn on objects that are already seqs:ns-groups (thanks @severeoverfl0w):self-requiring-namespace level from :off to :warningdbg from data_readers.clj since this breaks when using together with CIDERdestruct syntaxget and get-in (especially to catch swapped arguments to get in threading macros) (@borkdude, @Uthar):inline-def with nested deftestsquint: CLJS syntax to JS compiler
mapvidentical? callsnat-int?, neg-int?, pos-int? (@eNotchy)randnull and undefined in #html#html escape fixassoc calls, e.g. produced with ->auto-transient)=, and, and not= even morenot= on undefined and false should return trueassoc, assoc! and get when object argument can be inferred or is type hinted with ^objectstr using macro that compiles into template strings + ?? '' for null/undefinedtake-last should return nil or empty seq for negative numberskeys and vals should work on js/Mapmap-indexed and keep-indexed lazy= when using it on numbers, strings or keyword literals= to a deep-equals implementation that works on primitives, objects, Arrays, Maps and Setsparse-doubleassoc-in on nil or undefineddissoc on nil or undefined:import-maps support in squint.edn (just literal replacements, prefixes not supported yet)reagami: A minimal zero-deps Reagent-like for Squint and CLJS
clerk: Moldable Live Programming for Clojure
unused-deps: Find unused deps in a clojure project
scittle: Execute Clojure(Script) directly from browser script tags via SCI
(.catch ...) was accidentally munched:start attribute to ordered lists not starting with 1 (@spicyfalafel)cherry: Experimental ClojureScript to ES6 module compiler
=, str, not=:macros option + :refer so you can use unqualified macros using compiler state (see macro-state-test)deps.clj: A faithful port of the clojure CLI bash script to Clojure
pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
close-connectionget-connection to cache connectionquickdoc: Quick and minimal API doc generation for Clojure
Contributions to third party projects:
str (4x worst case, 200x best case)munge-str public:ns-groups handling by caching regex creation and usageThese are (some of the) other projects I'm involved with but little to no activity happened in the past month.
Published: 2025-11-02
Tagged: clojure oss updates