OSS updates November and December 2025
In this post I&aposll give updates about open source I worked on during November and December 2025.
To see previous OSS updates, go here.
Sponsors
I&aposd 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&apost 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!
- Github Sponsors
- The Babashka or Clj-kondo OpenCollective
- Ko-fi
- Patreon
- Clojurists Together
Updates
Clojure Conj 2025
Last November I had the honor and pleasure to visit the Clojure Conj 2025. I met a host of wonderful and interesting long-time and new Clojurians, many that I&aposve known online for a long time and now met for the first time. It was especially exciting to finally meet Rich Hickey and talk to him during a meeting about Clojure dialects and Clojure tooling. The talk that I gave there: "Making tools developers actually use" will come online soon.

Babashka conf and Dutch Clojure Days 2026
In 2026 I&aposm organizing Babashka Conf 2026. It will be an afternoon event (13:00-17:00) hosted in the Forum hall of the beautiful public library of Amsterdam. More information here. Get your ticket via Meetup.com (currently there&aposs a waiting list, but more places will come available once speakers are confirmed). CfP will open mid January. The day after babashka conf, Dutch Clojure Days 2026 will be happening. It&aposs not too late to get your talk proposal in. More info here.
Projects
Here are updates about the projects/libraries I&aposve worked on in the last two months in detail.
babashka: native, fast starting Clojure interpreter for scripting.
- Bump
processto0.6.25 - Bump
deps.clj - Fix #1901: add
java.security.DigestOutputStream - Redefining namespace with
nsshould override metadata - Bump
nextjournal.markdownto0.7.222 - Bump
edamameto1.5.37 - Fix #1899:
with-metafollowed bydissocon records no longer works - Bump
fsto0.5.30 - Bump
nextjournal.markdownto0.7.213 - Fix #1882: support for reifying
java.time.temporal.TemporalField(@EvenMoreIrrelevance) - Bump Selmer to
1.12.65 - SCI:
sci.impl.Reflectorwas rewritten into Clojure dissocon record with non-record field should return map instead of record- Bump edamame to
1.5.35 - Bump
core.rrb-vectorto0.2.0 - Migrate detecting of executable name for self-executing uberjar executable from
ProcessHandleto to native imageProcessInfoto avoid sandbox errors - Bump
clito0.8.67 - Bump
fsto0.5.29 - Bump
nextjournal.markdownto0.7.201
- Bump
SCI: Configurable Clojure/Script interpreter suitable for scripting
- Add support for
:refer-globaland:require-global - Add
println-str - Fix #997: Var is mistaken for local when used under the same name in a
letbody - Fix #1001: JS interop with reserved js keyword fails (regression of #987)
sci.impl.Reflectorwas rewritten into Clojure- Fix babashka/babashka#1886: Return a map when dissociating a record basis field.
- Fix #1011: reset ns metadata when evaluating ns form multiple times
- Fix for https://github.com/babashka/babashka/issues/1899
- Fix #1010: add
js-inin CLJS - Add
array-seq
- Add support for
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- #2600: NEW linter:
unused-excluded-varto warn on unused vars in:refer-clojure :exclude(@jramosg) - #2459: NEW linter:
:destructured-or-always-evaluatesto warn on s-expressions in:ordefaults in map destructuring (@jramosg) - Add type checking support for
sorted-map-by,sorted-set, andsorted-set-byfunctions (@jramosg) - Add new type
arrayand type checking support for the next functions:to-array,alength,aget,asetandaclone(@jramosg) - Fix #2695: false positive
:unquote-not-syntax-quotedin leiningen&apossdefproject - Leiningen&aposs
defprojectbehavior can now be configured usingleiningen.core.project/defproject - Fix #2699: fix false positive unresolved string var with extend-type on CLJS
- Rename
:refer-clojure-exclude-unresolved-varlinter tounresolved-excluded-varfor consistency - v2025.12.23
- #2654: NEW linter:
redundant-let-binding, defaults to:off(@tomdl89) - #2653: NEW linter:
:unquote-not-syntax-quotedto warn on~and~@usage outside syntax-quote (`) (@jramosg) - #2613: NEW linter:
:refer-clojure-exclude-unresolved-varto warn on non-existing vars in:refer-clojure :exclude(@jramosg) - #2668: Lint
&syntax errors in let bindings and lint for trailing&(@tomdl89) - #2590:
duplicate-key-in-assocchanged toduplicate-key-args, and now lintsdissoc,assoc!anddissoc!too (@tomdl89) - #2651: resume linting after paren mismatches
- clojure-lsp#2651: Fix inner class name for java-class-definitions.
- clojure-lsp#2651: Include inner class java-class-definition analysis.
- Bump
babashka/fs - #2532: Disable
:duplicate-requireinrequire+:reload/:reload-all - #2432: Don&apost warn for
:redundant-fn-wrapperin case of inlined function - #2599: detect invalid arity for invoking collection as higher order function
- #2661: Fix false positive
:unexpected-recurwhenrecuris used insideclojure.core.match/match(@jramosg) - #2617: Add types for
repeatedly(@jramosg) - Add
:ratiotype support fornumeratoranddenominatorfunctions (@jramosg) - #2676: Report unresolved namespace for namespaced maps with unknown aliases (@jramosg)
- #2683: data argument of
ex-infomay be nil since clojure 1.12 - Bump built-in ClojureScript analysis info
- Fix #2687: support new
:refer-globaland:require-globalns options in CLJS - Fix #2554: support inline configs in
.cljcfiles
- #2600: NEW linter:
edamame: configurable EDN and Clojure parser with location metadata and more Edamame: configurable EDN and Clojure parser with location metadata and more
- Minor: leave out
:edamame/read-cond-splicingwhen not splicing - Allow
:read-condfunction to override:edamame/read-cond-splicingvalue - The result from
:read-condwith a function should be spliced. This behavior differs from:read-cond+:preservewhich always returns a reader conditional object which cannot be spliced. - Support function for
:featuresoption to just select the first feature that occurs
- Minor: leave out
squint: CLJS syntax to JS compiler
- Allow macro namespaces to load
"node:fs", etc.to read config files for conditional compilation - Don&apost emit IIFE for top-level let so you can write
letoverdefnto capture values. - Fix
js-yieldandjs-yield*in expression position - Implement
some?as macro - Fix #758:
volatile!,vswap!,vreset! pr-str,prnetc now print EDN (with the idea that you can paste it back into your program)- new
#js/Mapreader that reads a JavaScriptMapfrom a Clojure map (maps are printed like this withpr-strtoo) - Support passing keyword to
mapv - #759:
doseqcan&apost be used in expression context - Fix #753: optimize output of dotimes
alengthas macro
- Allow macro namespaces to load
reagami: A minimal zero-deps Reagent-like for Squint and CLJS
- Performance enhancements
- treat
innerHTMLas a property rather than an attribute - Drop support for camelCased properties / (css) attributes
- Fix
:default-valuein input range - Support data param in
:on-render - Support default values for uncontrolled components
- Fix child count mismatch
- Fix re-rendering/patching of subroots
- Add
:on-renderhook for mounting/updating/unmounting third part JS components
NEW: parmezan: fixes unbalanced or unexpected parens or other delimiters in Clojure files
CLI: Turn Clojure functions into CLIs!
clerk: Moldable Live Programming for Clojure
- always analyze doc (but not deps) when no-cache is set (#786)
- add option to disable inline formulas in markdown (#780)
scittle: Execute Clojure(Script) directly from browser script tags via SCI
- #114: Enable source maps (@jeroenvandijk)
- #140: Enable customizing the nrepl websocket port (@PEZ)
- Bump shadow-cljs and SCI
- Add config option to avoid TeX formulas
- API improvements for passing options
cherry: Experimental ClojureScript to ES6 module compiler
- Fix
cherry compileCLI command not receiving file arguments - Bump shadow-cljs to
3.3.4 - Fix #163: Add assert to macros (@willcohen)
- Fix #165: Fix ClojureScript protocol dispatch functions (@willcohen)
- Fix #167: Protocol dispatch functions inside IIFEs; bump squint accordingly
- Fix #169: fix
extend-typeonObject - Fix #171: Add
satisfies?macro (@willcohen)
- Fix
deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Released several versions catching up with the clojure CLI
quickdoc: Quick and minimal API doc generation for Clojure
- Fix extra newline in codeblock
quickblog: light-weight static blog engine for Clojure and babashka
- Add support for a blog contained within another website; see Serving an alternate content root in README. (@jmglov)
- Upgrade babashka/http-server to 0.1.14
- Fix
:blog-image-altoption being ignored when using CLI (bb quickblog render)
nbb: Scripting in Clojure on Node.js using SCI
- #395: fix
vim-fireplaceinfinite loop on nREPL session close. - Add
ILookupandCons - Add
abs - nREPL: support
"completions"op
- #395: fix
neil: A CLI to add common aliases and features to deps.edn-based projects.
fs - File system utility library for Clojure
- #154 reflect in directory check and docs that
movenever follows symbolic links (@lread) - #181
delete-treenow deletes broken symbolic linkroot(@lread) - #193
create-dirsnow recognizes sym-linked dirs on JDK 11 (@lread) - #184: new check in
copy-treefor copying to self too rigid - #165:
zipnow excludeszip-filefromzip-file(@lread) - #167: add
rootfn which exposesPathgetRoot(@lread) - #166:
copy-treenow fails fast on attempt to copy parent to child (@lread) - #152: an empty-string path
""is now (typically) understood to be the current working directory (as per underlying JDK file APIs) (@lread) - #155:
fs/with-temp-dirclj-kondo linting refinements (@lread) - #162:
unixifyno longer expands into absolute path on Windows (potentially BREAKING) - Add return type hint to
read-all-bytes
- #154 reflect in directory check and docs that
process: Clojure library for shelling out / spawning sub-processes
- #181: support
:discardorProcessBuilder$Redirectas:outand:erroptions
- #181: support
Contributions to third party projects:
- ClojureScript
- CLJS-3466: support qualified method in return position
- CLJS-3468: :refer-global should not make unrenamed object available
Other projects
These are (some of the) other projects I&aposm involved with but little to no activity happened in the past month.















