In this post I'll give updates about open source I worked on during January and February 2026.
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.
Sponsor info
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!
Updates
Babashka conf and Dutch Clojure Days 2026
Babashka Conf 2026 is happening on May 8th in the OBA Oosterdok library in Amsterdam! David Nolen, primary maintainer of ClojureScript, will be our keynote speaker! We're excited to have Nubank, Exoscale, Bob and Itonomi as sponsors. Wendy Randolph will be our event host / MC / speaker liaison :-). The CfP is now closed. More information here. Get your ticket via Meetup.com (there is a waiting list, but more places may become available). The day after babashka conf, Dutch Clojure Days 2026 will be happening, so you can enjoy a whole weekend of Clojure in Amsterdam. Hope to see many of you there!
Projects
I spent a lot of time making SCI's deftype, case, and macroexpand-1 match JVM Clojure more closely. As a result, libraries like riddley, cloverage, specter, editscript, and compliment now work in babashka.
After seeing charm.clj, a terminal UI library, I decided to incorporate JLine3 into babashka so people can build terminal UIs. Since I had JLine anyway, I also gave babashka's console REPL a major upgrade with multi-line editing, tab completion, ghost text, and persistent history. A next goal is to run rebel-readline + nREPL from source in babashka, but that's still work in progress (e.g. the compliment PR is still pending).
I've been working on async/await support for ClojureScript (CLJS-3470), inspired by how squint handles it. I also implemented it in SCI (scittle, nbb etc. use SCI as a library), though the approach there is different since SCI is an interpreter.
Last but not least, I started cream, an experimental native binary that runs full JVM Clojure with fast startup using GraalVM's Crema. Unlike babashka, it supports runtime bytecode generation (definterface, deftype, gen-class). It currently depends on a fork of Clojure and GraalVM EA, so it's not production-ready yet.
Here are updates about the projects/libraries I've worked on in the last two months in detail.
NEW: cream: Clojure + GraalVM Crema native binary
- A native binary that runs full JVM Clojure with fast startup, using GraalVM's Crema (RuntimeClassLoading) to enable runtime
eval, require, and library loading - Unlike babashka, supports
definterface, deftype, gen-class, and other constructs that generate JVM bytecode at runtime - Can run
.java source files directly, as a fast alternative to JBang - Cross-platform: Linux, macOS, Windows
babashka: native, fast starting Clojure interpreter for scripting.
- Released 1.12.214 and 1.12.215
- #1909: add JLine3 for TUI support
- Console REPL (
bb repl) improvements: multi-line editing, tab completion, ghost text, eldoc, doc-at-point (C-x C-d), persistent history - Support
deftype with map interfaces (e.g. IPersistentMap, ILookup, Associative). Libraries like core.cache and linked now work in babashka. - Compatibility with riddley, cloverage, editscript, charm.clj
- #1299: add new
babashka.terminal namespace that exposes tty? - Add keyword completions to nREPL and console REPL
deftype supports Object + hashCode- #1923: support
reify with java.time.temporal.TemporalQuery - Fix
reify with methods returning int/short/byte/float - Full changelog
SCI: Configurable Clojure/Script interpreter suitable for scripting
- Released 0.12.51
deftype now macroexpands to deftype*, matching JVM Clojure, enabling code walkers like riddleycase now macroexpands to JVM-compatible case* format, enabling tools like riddley and cloverage- Support
async/await in ClojureScript. See docs. - Support functional interface adaptation for instance targets
- Infer type tags from let binding values to binding names
defrecord now expands to deftype* (like Clojure), with factory fns emitted directly in the macro expansionmacroexpand-1 now accepts an optional env map as first argument- Add
proxy-super, proxy-call-with-super, update-proxy and proxy-mappings - Support #564:
this-as in ClojureScript - Store current analysis context during macro invocation, enabling tools like riddley to access outer locals
- Full changelog
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
@jramosg, @tomdl89 and @hugod have been on fire with contributions this period. Six new linters!
- Released 2026.01.12 and 2026.01.19
- #2735: NEW linter:
:duplicate-refer which warns on duplicate entries in :refer of :require (@jramosg) - #2734: NEW linter:
:aliased-referred-var, which warns when a var is both referred and accessed via an alias in the same namespace (@jramosg) - #2745: NEW linter:
:is-message-not-string which warns when clojure.test/is receives a non-string message argument (@jramosg) - #2712: NEW linter:
:redundant-format to warn when format strings contain no format specifiers (@jramosg) - #2709: NEW linter:
:redundant-primitive-coercion to warn when primitive coercion functions are applied to expressions already of that type (@hugod) - Add new types
array, class, inst and type checking support for related functions (@jramosg) - Add type checking support for
clojure.test functions and macros (@jramosg) - #2340: Extend
:condition-always-true linter to check first argument of clojure.test/is (@jramosg) - #2729: Check for arity mismatch for bound vectors, sets & maps, not just literals (@tomdl89)
- #2768: NEW linter:
:redundant-declare which warns when declare is used after a var is already defined (@jramosg) - Add type support for
pmap and future-related functions (@jramosg) - Upgrade to GraalVM 25
- Full changelog
squint: CLJS syntax to JS compiler @tonsky and @willcohen contributed several improvements this period.
- Add
squint.math, also available as clojure.math namespace - #779: Added
compare-and-swap!, swap-vals! and reset-vals! (@tonsky) - #788: Fixed compilation of
dotimes with _ binding (@tonsky) - #790: Fixed
shuffle not working on lazy sequences (@tonsky) - Multiple
:require-macros with :refer now accumulate instead of overwriting (@willcohen) - Fix emitting negative zero value (
-0.0) - Fix #792:
prn js/undefined as nil - Fix #793: fix
yield* IIFE - Full changelog
scittle: Execute Clojure(Script) directly from browser script tags via SCI
- Support
async/await. See docs. - Implement
js/import not using eval - Support
this-as - nREPL: print
#<Promise value> when a promise is evaluated
nbb: Scripting in Clojure on Node.js using SCI
- Support async/await. See docs for syntax.
- Print promise result value in REPL/nREPL:
(js/Promise.resolve 1) ;;=> #<Promise 1>
fs - File system utility library for Clojure
- Released 0.5.31
- #212: Introduce
:keep true option in with-temp-dir - #188
copy-tree now throws if src or dest is a symbolic link when not following links (@lread) - #201
gzip now accepts source-file Path (@lread) - #207 review and update
glob and match docstrings (@lread)
clerk: Moldable Live Programming for Clojure
- Fix browse when using random port by passing 0, fixes #801
- bb now supports editscript
neil: A CLI to add common aliases and features to deps.edn-based projects.
- #258:
neil test now exits with non-zero exit code when tests fail
cherry: Experimental ClojureScript to ES6 module compiler
- Multiple
:require-macros clauses with :refer now properly accumulate instead of overwriting each other
Contributions to third party projects:
- ClojureScript:
- Working on
async/await support (CLJS-3470). I also implemented this in SCI, scittle, and nbb. - CLJS-3471: fix printing of negative zero
- CLJS-3472:
str on var that is set! returns empty string
- editscript: Added babashka support, deps.edn for git dep usage, fixed CLJS tests
- riddley: Added babashka compatibility, clj-kondo config
- cloverage: Added babashka compatibility, migrated tools.cli from deprecated
cli/cli to cli/parse-opts, bumped riddley - specter: Added babashka compatibility
- compliment: Added babashka compatibility (PR #131)
- rebel-readline: Removed JLine impl class dependencies for babashka compatibility, released 0.1.7
- Selmer: Namespaced script tag context keys to avoid collisions, removed runtime require of clojure.tools.logging
- charm.clj: Contributed JLine integration, FFM native terminal interface, babashka and native-image compatibility
Other projects
These are (some of the) other projects I'm involved with but little to no activity happened in the past month.
Click for more details
- [pod-babashka-go-sqlite3](https://github.com/babashka/pod-babashka-go-sqlite3): A babashka pod for interacting with sqlite3
- [unused-deps](https://github.com/borkdude/unused-deps): Find unused deps in a clojure project
- [pod-babashka-fswatcher](https://github.com/babashka/pod-babashka-fswatcher): babashka filewatcher pod
- [sci.nrepl](https://github.com/babashka/sci.nrepl): nREPL server for SCI projects that run in the browser
- [babashka.nrepl-client](https://github.com/babashka/nrepl-client)
- [http-server](https://github.com/babashka/http-server): serve static assets
- [sci.configs](https://github.com/babashka/sci.configs): A collection of ready to be used SCI configs.
- [http-client](https://github.com/babashka/http-client): babashka's http-client
- [html](https://github.com/borkdude/html): Html generation library inspired by squint's html tag
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Use instaparse from babashka
- [sql pods](https://github.com/babashka/babashka-sql-pods): babashka pods for SQL databases
- [rewrite-edn](https://github.com/borkdude/rewrite-edn): Utility lib on top of
- [rewrite-clj](https://github.com/clj-commons/rewrite-clj): Rewrite Clojure code and edn
- [tools-deps-native](https://github.com/babashka/tools-deps-native) and [tools.bbuild](https://github.com/babashka/tools.bbuild): use tools.deps directly from babashka
- [bbin](https://github.com/babashka/bbin): Install any Babashka script or project with one command
- [qualify-methods](https://github.com/borkdude/qualify-methods)
- Initial release of experimental tool to rewrite instance calls to use fully
qualified methods (Clojure 1.12 only)
- [tools](https://github.com/borkdude/tools): a set of [bbin](https://github.com/babashka/bbin/) installable scripts
- [babashka.json](https://github.com/babashka/json): babashka JSON library/adapter
- [speculative](https://github.com/borkdude/speculative)
- [squint-macros](https://github.com/squint-cljs/squint-macros): a couple of
macros that stand-in for
[applied-science/js-interop](https://github.com/applied-science/js-interop)
and [promesa](https://github.com/funcool/promesa) to make CLJS projects
compatible with squint and/or cherry.
- [grasp](https://github.com/borkdude/grasp): Grep Clojure code using clojure.spec regexes
- [lein-clj-kondo](https://github.com/clj-kondo/lein-clj-kondo): a leiningen plugin for clj-kondo
- [http-kit](https://github.com/http-kit/http-kit): Simple, high-performance event-driven HTTP client+server for Clojure.
- [babashka.nrepl](https://github.com/babashka/babashka.nrepl): The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- [jet](https://github.com/borkdude/jet): CLI to transform between JSON, EDN, YAML and Transit using Clojure
- [lein2deps](https://github.com/borkdude/lein2deps): leiningen to deps.edn converter
- [cljs-showcase](https://github.com/borkdude/cljs-showcase): Showcase CLJS libs using SCI
- [babashka.book](https://github.com/babashka/book): Babashka manual
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure).
- [gh-release-artifact](https://github.com/borkdude/gh-release-artifact): Upload artifacts to Github releases idempotently
- [carve](https://github.com/borkdude/carve) - Remove unused Clojure vars
- [4ever-clojure](https://github.com/oxalorg/4ever-clojure) - Pure CLJS version of 4clojure, meant to run forever!
- [pod-babashka-lanterna](https://github.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka
- [joyride](https://github.com/BetterThanTomorrow/joyride): VSCode CLJS scripting and REPL (via [SCI](https://github.com/babashka/sci))
- [clj2el](https://borkdude.github.io/clj2el/): transpile Clojure to elisp
- [deflet](https://github.com/borkdude/deflet): make let-expressions REPL-friendly!
- [deps.add-lib](https://github.com/borkdude/deps.add-lib): Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
- [edamame](https://github.com/borkdude/edamame): configurable EDN and Clojure parser with location metadata and more
- [CLI](https://github.com/babashka/cli): Turn Clojure functions into CLIs!
- [quickblog](https://github.com/borkdude/quickblog): light-weight static blog engine for Clojure and babashka
- [process](https://github.com/babashka/process): Clojure library for shelling out / spawning sub-processes
- [deps.clj](https://github.com/borkdude/deps.clj): A faithful port of the clojure CLI bash script to Clojure
- [reagami](https://github.com/borkdude/reagami): A minimal zero-deps Reagent-like for Squint and CLJS
- [parmezan](https://github.com/borkdude/parmezan): fixes unbalanced or unexpected parens or other delimiters in Clojure files
- [quickdoc](https://github.com/borkdude/quickdoc): Quick and minimal API doc generation for Clojure
- [Nextjournal Markdown](https://github.com/nextjournal/markdown)