Annually-Funded Developers' Update: May & June 2026
By Kathy Davis
Hello Fellow Clojurists!
This is the third of six reports from the developers who are receiving annual funding for 2026. Thanks to everyone for supporting their work and these important contributions to the Clojure community.
Their previous reports can be found here:
January/February 2026
March/April 2026
Bozhidar Batsov: cider-nREPL, neat, Sayid, port, Orchard, CIDER, and more
Clojure Camp: datascript playground, fill in the blank excercises
Eric Dallo: eca, eca clients, clojure-lsp
Jeaye Wilkerson: Jank optimization and beta release prep
Michiel Borkent: babashka, SCI, fs, squint, cream, and much more
Bozhidar Batsov
2026 Annual Funding Report 3. Published July 10, 2026.
The past two months were some of the most productive I’ve had in a long while. I had a lot of inspiration during this period and managed to tackle plenty of long-standing ideas and issues across the entire nREPL/CIDER ecosystem. I even grew the ecosystem with a couple of brand new projects. The highlights:
- CIDER 1.22 is out
- CIDER 2.0 is essentially ready and needs more user testing
- Sayid is reborn
- Two brand new projects saw the light of day: port and neat
- Piggieback 0.7.0 is out (and Weasel got modernized while I was in the area)
- clj-refactor and refactor-nrepl got some love as well
Below are the details, project by project.
CIDER
CIDER 1.22 (“São Miguel”) landed in mid-June, wrapping up the 1.x series. Its main features:
- a registry for jack-in tools, so third parties can plug new build tools and
Clojure dialects into
cider-jack-in - a “default session” escape hatch from sesman’s project-based dispatch
- keyword-argument versions of the low-level request APIs, alongside a proper decoupling of the nREPL client layer from CIDER’s UI
It also fixed a long list of small annoyances: severe editor lag in unlinked buffers, several TRAMP and SSH tunnel problems, request id leaks, and a bunch of broken menu entries.
- CIDER 1.22.0
- CIDER 1.22.2 (plus a quick 1.22.1 fixing a docs site problem)
Right after that I switched the development version to 2.0 and most of the planned work is already done. The headline items so far:
- transient menus for all the command groups (plus new menus for the debugger and the inspector)
- inline stepwise macroexpansion
- SLIME-style call graph browsers (who-calls, who-implements and friends)
- source-based find-references
- a
tap>buffer and a dedicated trace buffer - namespace load-state indicators
- the revival of rich content in the REPL
That last one deserves a special mention: evaluation results that are images
now render inline out of the box, and file/URL results offer their content
on demand, six years after the feature had to be disabled over its safety
problems. There was also a big cleanup pass: consolidated configuration
options, the REPL history browser renamed to cider-history to end a
long-standing naming clash, theme-aware faces instead of hardcoded colors,
refreshed docs and a regenerated refcard.
CIDER 2.0 is available from MELPA snapshots and I’d love for more people to take it for a spin before the final release.
cider-nrepl
Lots of cider-nrepl releases, driving the CIDER work above:
- 0.60.0 added the ops backing the new protocol exploration commands (
cider/who-implements,cider/type-protocols,cider/protocols-with-method). - 0.61.0 brought ClojureScript test support, a ClojureScript macroexpansion fix, formatting that honors the project’s cljfmt configuration, and a
pprintbacked byorchard.pp. - 0.62.0-alpha1 and 0.62.0-alpha2 hardened the content-type and slurp middleware (URL scheme allowlist, size caps, graceful fetch errors) and cleaned up the response protocol, which is what made it safe to turn rich content on by default in CIDER 2.0.
Along the way the project’s build was migrated from Leiningen to tools.deps, which required a new MrAnderson release (see the blog posts below).
Orchard
Orchard, the library that powers much of cider-nrepl’s functionality, kept pace:
- 0.42.0 and 0.43.0 continued the inspector polish, added symbol classification to
orchard.meta, a programmatic listener API for the tracer, and protocol/multimethod introspection inorchard.xref. The project also moved to tools.deps and its CI now covers JDK 26.
Sayid
Sayid, the omniscient Clojure debugger, had been dormant for years and I finally gave it the revival it deserved:
- 0.2.0 was the big modernization pass: new
mx.cider/sayidcoordinates, a documented nREPL middleware API, a consolidated op surface (37 ops down to 26) and fixes for the most annoying Emacs client breakages. - 0.3.0 followed with usability work: no more frozen Emacs during the reload workflow, simpler query commands and help buffers generated from the keymaps.
port
port is a brand new project I started in May: a minimalist Clojure interactive programming environment for Emacs, built on prepl instead of nREPL. It went from nothing to three releases in the course of the month:
- 0.1.0
- 0.2.0
- 0.3.0, which added eldoc with active argument highlighting, a wire-level message log for debugging and a roughly 10x speedup in handling large prepl responses.
I don’t have any particular plans for the future of this project - it was just
something I’d wanted to experiment with for a while. I see it as an interesting
option for people looking for some middle ground between inf-clojure and
CIDER.
neat
neat is the other new arrival: a small, language-agnostic nREPL client for Emacs. 0.1.0 has the essentials in place: a pure-elisp bencode codec, a comint-based REPL, and a source-buffer minor mode with eval, completion, eldoc, xref and doc lookup, tested against Clojure, Babashka and Basilisp. It’s early days, but it’s a nice testbed for exercising the nREPL protocol outside CIDER.
This project also means I’ve dropped any plans to try to make CIDER a
language-agnostic development environment. Going forward CIDER will focus only
on Clojure-like languages, and everything else will be covered by neat.
Piggieback and Weasel
The nREPL org saw some ClojureScript-flavored action:
- Piggieback 0.6.2 and Piggieback 0.7.0. The 0.7.0 release makes
load-fileevaluate the editor’s buffer contents instead of re-reading from disk, tears down ClojureScript REPLs when their sessions close (no more leaked Node processes) and surfaces ClojureScript status in thedescriberesponse. - Weasel 0.8.0 modernized the WebSocket REPL: the client now uses the platform’s native
WebSocket, so it runs in any modern JavaScript runtime (browsers, Node 22+, Deno, Bun, workers), and the minimum requirements moved to Clojure/ClojureScript 1.12.
I also backfilled proper GitHub releases for the historic tags of both projects, so their release history is finally browsable.
Improving the ClojureScript support in CIDER has long been a major objective for me, and these small changes were some initial steps in that direction.
refactor-nrepl and clj-refactor
refactor-nrepl got three releases: 3.12.0, 3.13.0 and 3.14.0, the last one making the AST-based indexing much faster and more reliable. clj-refactor.el received a round of maintenance on master as well, and will get a new release after I wrap up the work on CIDER 2.0.
I’m still pondering the future of both projects, as I plan to move the most
useful refactor-nrepl features (those that don’t carry a lot of complexity) to
CIDER and cider-nrepl eventually, and I’m not sure the flagship AST-powered
refactorings are very competitive these days (compared to clojure-lsp and
static project-wide analysis a la clj-kondo in general). I’d certainly
appreciate more feedback from the users of clj-refactor on the subject.
Blog posts
I wrote a few articles related to the work above:
- Port: a minimalist prepl client for Emacs
- neat: a language-agnostic nREPL client for Emacs
- nREPL Forever
- CIDER 1.22 (“São Miguel”)
- MrAnderson 0.6
- CIDER 2.0 is Brewing…
- nREPL and ClojureScript: Demystifying Piggieback
- Sayid Redux
What’s next
Getting CIDER 2.0 across the finish line is the main priority, followed by a clj-refactor release once that settles. I’ve plucked most of the low-hanging fruit by now, but there’s always more to do.
Thanks to Clojurists Together for the continued support of my Clojure OSS work!
You rock!
Clojure Camp
2026 Annual Funding Report 3. Published July 12, 2026.
What happened:
- Released: datascript playground https://clojure-camp.github.io/datascript-playground/
- Released: better “fill-in-the-blank” exercises, drag-and-drop https://exercises.clojure.camp/
- Mobs - regular mobs are back
- Book Club - going well, this kind of group likely to become an ongoing camp offering
- Conj Code Jam - proposal for 2x 3 hour pairing/mobbing sessions at conj (accepted)
- Badges - technical side pretty much done, now for the content
Plans:
- announcing Conj bursary soon
- prep for Conj Code Jams
- build event management into our tooling (Discord’s events are mediocre)
- work on Badges content
Eric Dallo
2026 Annual Funding Report 3. Published July 11, 2026.
Another 2 months of intense work! The focus this time was on stability, performance and polish: ECA got smarter context management, a new provider, and much more robust MCP/OAuth support, while clojure-lsp finally received the long-awaited memory and startup performance overhaul I planned in the last report. Thanks ClojuristsTogether and everyone from the community helping with issues, feedback and contributions! :heart:
ECA
ECA keeps growing steadily, now with more than 900 stars and contributions coming every week. As usual the changelog is huge, so here are the main highlights:
0.132.0 - 0.144.0
/contextcommand + live context-usage bar: shows how full the context window is, broken down by category (system prompt, rules, skills, tools, conversation), with the same data sent to all clients to render a live usage bar with the auto-compaction marker.- AWS Bedrock provider: using the native
Converse/ConverseStreamAPIs, supporting models like Claude inference profiles. - Durable chat persistence: chats are saved after every step with atomic writes plus several
/resumefixes, so long chats are never lost. - Chat pagination: new
chat/historymethod so clients open long chats instantly and load older messages on demand. - Chat
/exportand/import: transfer a chat between machines as a resumable file. - Hooks expansion: new
preCompact,postCompact,subagentStartandchatStatusChangedhooks, a/hookscommand and richer contracts. - MCP robustness: proactive OAuth token refresh, per-workspace tokens, and recovery of stale/broken connections with keep-alive pings and auto re-initialization.
- Live-reload config: config file edits now reconcile MCP servers and refresh tools without restarting the server.
- Remote improvements:
ask_userreaches editor and web clients simultaneously, pending approvals exposed in the REST API, and runtime-fetched TLS certs. - Per-chat scoping: model/agent/variant changes are now scoped per chat, fixing selections leaking between chats.
- Custom models QoL: per-model
limit/costoverrides enabling the usage bar and auto-compaction for local models, newextraConfigs, and custom commands with named arguments. - Prompt-cache friendliness: reworked system prompt and per-turn cursor context so providers reuse cached prompts (big win for llama.cpp).
- More providers and models: Claude Opus 4.8, Sonnet 5, Fable 5 and Mythos 5, gpt-5.5, glm-5.2 and deepseek-v4-pro variants, Claude console subscription auth, and swapping between Anthropic and non-Anthropic models mid-chat.
ECA clients
All clients received improvements (resume-chat picker, MCP servers management from settings, per-chat model/agent scoping, context-usage bar, light theme fixes) plus client specific work:
- eca-desktop: big robustness and security pass: resolve the user’s login shell env before spawning the server (fixing the classic “GUI app can’t find my tools” issue), Electron 33 -> 41 with 0
npm auditvulnerabilities, and server lifecycle fixes with verified downloads. - eca-emacs: big performance overhaul backed by a new benchmark harness making long chats fast again (streaming rendering up to ~4000x cheaper), context-usage bar in the mode-line, paginated chat history, inline image rendering and a new
eca-doctorcommand for bug reports. - eca-vscode (0.48.6 - 0.49.4): shared webview improvements and several UI fixes.
- eca-intellij (0.26.6 - 0.27.3): CI publishing to the JetBrains marketplace with plugin zips on every release, blank tool window fix, lots of Light theme fixes and Emacs keymap support in the prompt.
- eca-web: per-chat close and clear-history actions in the sidebar.
We also started two new experiments in the org: eca-cli, an ECA client for terminals, and eca-ios, an iOS app to remotely connect to a running ECA server.
clojure-lsp
These 2 months were all about the plan mentioned in the last report: memory management and startup performance! The results are really exciting for large projects: warm initialize dropped from ~73s to ~8s on a large monorepo, and memory usage was drastically reduced for projects with big dependency sets. All of this is guarded by the new performance integration tests so we don’t regress, thanks for the community sharing their kind words with good results of the improvements, that means a lot to me!
Details about the release below:
2026.07.06-14.34.19
- Skip re-analysis of unchanged source paths on warm startup by persisting the internal analysis, dep-graph, documents and clj-kondo findings in the db cache, only re-analyzing files whose checksum changed. #2316
- Publish startup diagnostics off the
initializecritical path, so large projects become interactive much sooner (warminitializefrom ~73s to ~8s on a large monorepo). #2326 - Analyze external java member definitions lazily on first navigation/hover/completion instead of all up front, drastically reducing memory usage. #2313
- Reduce memory usage of java class and member definitions analysis, and shrink the db cache considerably by not serializing redundant analysis uris. #2314 #2315
- Scale the JVM server heap with
-XX:MaxRAMPercentageinstead of a fixed-Xmx, matching the native image and avoiding OOMs on very large projects. #2313 - Run the db cache write on a dedicated thread, write it atomically, and sanitize clj-kondo findings before caching so custom hooks can’t break the cache. #2318 #2313
- Optimize clj-kondo analysis ingestion with single-pass normalization using transients and caches. #2317
- Added performance integration tests for server initialization measuring cold and warm start.
- Auto generate clojure-lsp nightly builds from clj-kondo master commits.
- Add missing namespace form, guessing the name when outside project sources, when adding a missing
:requireor:importvia code action. #1734 - Group comments and clj-kondo directives along with namespaces when sorting or removing
:require/:importduring ns organization. #1237 - Remove restriction on renaming unqualified keywords. #2139
- Fix
cyclic-dependencieslinter falsely reporting cycles for:as-aliasrequires. #2108 - Fix crash when using
:exclude-when-defined-byas a vector. #2292 - Lots of bumps: Clojure 1.12.5, core.async 1.9.865, promesa 12.0.0, nrepl 1.7.0, cljfmt 0.16.4, sci 0.13.52, rewrite-clj 1.2.55, opentelemetry 1.63.0 and more.
Jeaye Wilkerson
2026 Annual Funding Report 3. Published July 11, 2026.
Hi everyone. :) Thank you so much for the sponsorship this year. Last update, I covered how I had just added a new intermediate representation (IR) for jank, as well as some other optimization work. The last two months of jank development have been broken into two parts:
Further optimization work
Beta release preparation
Optimization work
I wrote a blog post about the optimizations I did to jank in order to run a naive ray tracer faster than Clojure JVM. This involved more than tripling jank’s overall speed at the benchmark by improving the low-level representation of our numbers, improving compiler inlining, optimizing the machinery behind function calls, and minimizing the generated code size by 30%. These benefits will carry to many other benchmarks, and real applications, going forward.
Beta release
Starting in June, I switched my focus away from optimization and toward checking all of the boxes needed to get jank into people’s hands as quickly as possible. To do this, I want to ensure there is an impressive vertical slice of jank for everyone to use.
A big part of that vertical slice is related to build systems, AOT compilation, and native packages. I have been working, with Kyle Cesare, on jank’s native build setup. At this point, we have an incredible UX for the lein-jank plugin, thanks to all of Kyle’s work, and it plays into all of the things I’ve been building on the jank side. AOT compilation in jank is very fast, compared to Graal native images, and the binary sizes are even smaller. Startup time is instantaneous.
To play into our new build system, I have created the jank commons, which is a set of packages for consuming native libraries from jank. This builds on all of the tooling Kyle has created. To start with, we have libraries focused on graphics programming (OpenGL, GLFW, Raylib, Dear ImGUI) and TUI programming (ftxui). We’ll be building on this to incorporate more and more of the native world, making the consumption of native libs in jank just a one line change in your project.clj.
I’ve also been working a lot on jank’s distribution and packaging. There are new continuous Arch builds, which make the jank-bin AUR package much more reliable. I’ve also fixed some LLVM 23 related issues to make the jank-git AUR package work better.
On top of all of this has been countless small fixes for jank’s behavior. Right now is a great time to jump in and try out jank. More documentation is on the way, along with more fixes and stability.
Thanks, again, for the support as I develop jank! Stay tuned for my next blog
post, covering the state of jank and what’s to come.
Michiel Borkent
2026 Annual Funding Report 3. Published July 8, 2026.
In this post I’ll give updates about open source I worked on during May and June 2026.
To see previous OSS updates, go here.
Sponsors
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. If you work for a company that uses my OSS, please ask your employer, that would be even better. Thank you!
- Github Sponsors
- The Babashka or Clj-kondo OpenCollective
- Ko-fi
- Patreon
- Clojurists Together
Updates
A lot happened in the past two months! Not just coding but also…
Babashka Conf 2026 and Dutch Clojure Days
Three years after the initial installment, Babashka Conf 2026 happened on May 8th at the OBA Oosterdok library in Amsterdam, with David Nolen, primary maintainer of ClojureScript, as our keynote speaker. Thanks to our sponsors Nubank, Exoscale, Bob, Flexiana and Itonomi, to Wendy Randolph for hosting, and to all the speakers, volunteers and attendees who made it such an inspiring day. You can watch all the videos here. Thanks to Ray for recording! The day after, Dutch Clojure Days 2026 rounded out a full weekend of Clojure in Amsterdam, where I did a presentation about ClojureScript and async/await. The video of that is hopefully coming soon.
Babashka Conf 2026. From left to right: David Nolen, Jen Myers, Adrian Smith, Josh Glover, Rahul Dé, Arne Brasseur, Christoph Neumann, Timo Kramer, Jynn Nelson, Wendy Randolph.
Upcoming: babashka workshop at the Clojure/conj
I’m pleased to announce that Rahul Dé and I will be hosting a babashka workshop at the Clojure Conj 2026. The workshop will showcase various use cases of babashka. This hands-on workshop covers the whole lifecycle of a babashka tool, from a quick script to a published, installable CLI app. We assume you know the basics of Clojure and won’t explain the language itself. Topics include:
- Setting up your dev environment
- Managing projects with babashka tasks (
bb.edn) - A tour of built-in libraries (fs, process, http-client, and more)
- Writing and running tests
- Building a CLI with subcommands and automatic help
- Programming a terminal UI (TUI)
- Producing a small web app
- Publishing via GitHub or as an installable tool with
bbin
Every concept comes with an exercise, building toward one culminating CLI app. There will be lots of interaction and fun!
Blog posts
Besides this update I published two blog posts in the past two months:
and a ClojureScript reference on async functions:
Projects
Babashka CLI got the most attention this cycle. I added automatic --help generation for dispatch-based CLIs and shell tab completion for bash, zsh, fish, PowerShell and Nushell. There’s a dedicated post with a “build your own git” walkthrough linked above. I also made Babashka CLI Squint compatible, so CLIs built with it run on Node.js and in the browser, published as the @babashka/cli npm package. Also ClojureDart support for Babashka CLI got added.
Squint saw a large amount of work that kept going right into early July: a browser nREPL, dynamic vars and binding that survive across separately-compiled ESM modules, an EDN reader, cached lazy seqs, defrecord and a wide set of core protocols, and a big compatibility push to make it pass jank’s clojure-test-suite. Replicant now runs on Squint too. I added key diffing to Reagami and did some benchmarks, showing that Reagami on squint performs in the ballpark of React. The benchmark also shows that Replicant on Squint performs even a tad better than on ClojureScript. Not that this makes a huge difference in practice, but it’s nice to validate the idea that Squint, for typical apps, can be a valid CLJS replacement while not giving up that much in terms of Clojure features.
A security issue in SCI deserves a callout. A string type-hint could bypass the :classes allowlist and statically initialize any class on the classpath at analysis time. If you sandbox untrusted code with SCI, upgrade to 0.13.53. ClojureDart support and fine-grained interop control (which was needed for cljd support since it has no reflection) also got added. You can now make REPLs for your mobile apps!
Since porting was a theme these past months, I’ll mention another one: babashka.fs now runs on Node.js via ClojureScript and squint, published as the @babashka/fs npm package.
Here are some highlights per project. See each project’s CHANGELOG.md for the full list.
-
babashka CLI: Turn Clojure functions into CLIs!
- Automatic
--helpgeneration fordispatchCLIs, plus shell completions for bash, zsh, fish, PowerShell and Nushell (#112, #24, #95). I wrote a full post on it with a “write your own git” walkthrough: babashka CLI: automatic –help and shell completions - Exposed the underlying building blocks so you can roll your own custom CLI parsing:
parse-opts*,coerce-opts,validate-opts,apply-defaults,table->tree dispatchnow accepts a tree directly (as returned bytable->tree), and subcommand order is preserved in printed help and completions- Squint support and a new
@babashka/clinpm package - ClojureDart support (#182)
opts->tableaccepts:columnsto override the auto-detected columns (#148, thanks Jan Seeger)- Better error messages: negation errors now name the base option,
--no-fooon a non-boolean option errors instead of silently coercing, and:edn:coercenow requires an explicit value (#166, #174) - Thanks to @lread for a lot of documentation review and general maintenance during this cycle
- Full changelog
- Automatic
-
Squint: CLJS syntax to JS compiler
- Browser nREPL support landed, followed by a number of REPL/nREPL fixes: #815 (
strwrapping tripping esbuild), #819 (macro changes not picked up in watch mode), #820 (:macrosoption ignored from JS callers) and #832 (nREPL server hanging on advertised-but-unimplemented ops) - The CLI now gets its
--help, usage and error handling from babashka.cli’sdispatch, plus shell tab completion - Dynamic vars and
bindingnow work via a mutable box, safe across separately-compiled ESM modules; syntax-quote resolves symbols through the current namespace and aliases like Clojure.defprotocolgot:extend-via-metadatasupport. reifyaddedclojure.walkadded- Added
squint.edn/clojure.ednwith a ~300-line EDN reader - Printing is now done through
*print-fn*,print,prandwith-out-str, like CLJS - Lazy seqs are now cached instead of recomputed on every consumption, matching CLJS’s chunked-seq behavior
- A big push for compatibility with jank’s clojure-test-suite: dozens of core functions (
sorted-map,hash-map,subvec,pop,merge,keys/vals,peek, transducers,=on dates/regexes/lazy seqs, and more) now throw or behave exactly like CLJS instead of the old loose JS semantics, alongside full built-incljs.testsupport - #771: dead-code elimination for varargs/multi-arity functions, now emitted via
...spread - Replicant support landed, with an example
- Added
defrecord,record?and theIRecordmarker protocol. Records store their fields as own string-keyed properties and implement the map-facing protocols, so keyword lookup,keys,seq,assoc,conjand=all work through the regular core functions; the generated implementations are shared runtime functions imported only by files that usedefrecord - Added a large set of core protocols so custom types participate in the standard functions:
ILookup,IAssociative,IMap,ICounted,ICollection,IEquiv,ISet, the transient protocols, andIAtom/IDeref/IReset/ISwap/IWatchable(so a reagent-style reactive atom can be a plaindeftype) - Compile-time namespace resolution:
cljs.analyzer.api/resolvenow sees vars of built-in library namespaces likeclojure.string, plus:squint/compile-timeforms and fixes for macro self-use - Full changelog
- Browser nREPL support landed, followed by a number of REPL/nREPL fixes: #815 (
-
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- NEW: macros from source. A
defmacro(plus any supportingdefn/defn-/def) tagged with{:clj-kondo/macroexpand-hook true}is automatically extracted into.clj-kondo/and registered as a:macroexpandhook on the next run. See doc/hooks.md - Support for
async/awaitin ClojureScript: bumped built-in CLJS analysis to 1.12.145 and added the:await-without-async-fnand:misplaced-async-metadatalinters - #2822: NEW linter
:alias-same-as-ns, warns when an alias equals the namespace it aliases (default:off) (@tomdl89) - #2807: NEW linter
:conditional-build-up, warns on successive(if pred (assoc m ...) m)rebinding and suggestscond->(default:off) (@walber-araujo) - #2062: NEW linter
:if-x-x-y, suggests(or x y)instead of(if x x y)(default:off) (@jramosg) - #2818: fix
:redefined-varfalse positive across files declaring the same namespace - #2814: fix
:protocol-method-arity-mismatchfalse positive fordefinterfacedeclaring the same method with multiple arities (@jramosg) - #2817: warn on
recurinside a vector, map or set literal, sincerecuris never in tail position there - #2854: fix
:invalid-arityfalse positive when an inner binding or fn param shadows a local function name (@yuhan0) - Performance work on the rewrite-clj parser and analysis internals: efficient
get-in/select-keys, fastersexpr, leaner node allocation (@alexander-yakushev) - Deprecation notice: 2026.05.25 is the last release to include the clj-kondo LSP server and VS Code extension; use clojure-lsp instead, which embeds clj-kondo
- Queued for the next release: early support for the Clojure 1.13 map destructuring keys (
:keys!/:syms!/:strs!), including inferring required keys and reporting them at call sites (#2870) - Full changelog
- NEW: macros from source. A
-
SCI: Configurable Clojure/Script interpreter suitable for scripting
- ClojureDart support, with a Flutter REPL example
- Instance/static method and field overrides plus a
:closedallowlist for:classes, giving fine-grained control over host interop; see the interop control docs. Also 1.6x faster instance-method interop on babashka - Security fix (sandbox escape): a string type-hint (e.g.
^"some.Class" x) bypassed the:classesallowlist, loading and static-initializing any class on the classpath at analysis time. Only affects sandboxing of untrusted code via:classes; upgrade to 0.13.53 - Add an
:interrupt-fnoption: a zero-arg function called on every interpreted fn entry, so host code can interrupt or cancel a running SCI eval (thanks @whilo) - Add
sci.interrupt/interrupt!to throw an interrupt that sandboxedtry/catchcannot catch, and gatefinallyand the regex functions (re-matches/re-find/re-seq, JVM) through:interrupt-fntoo, closing off ways to mask an interrupt and escape the sandbox #1044 - Fix
copy-varincorrectly marking a function as inlined when its unqualified name collided with aclojure.core/cljs.coreinlined var (e.g. a customget), silently breakingwith-redefs(@verberktstan) - Fix cross-namespace
defrecord/deftypetype symbol resolution via alias (e.g.(instance? r/Foo x)), fixing nbb#410 - Fix a self-require (a namespace requiring itself) being reported as a cyclic load dependency
- Full changelog
-
fs: file system utility library for Clojure
- Released 0.5.34 with Node.js support (#265): fs now runs on Node.js via ClojureScript and Squint / JavaScript, published as the
@babashka/fsnpm package. Most functions are supported. The JVM behavior is the reference implementation so all operations are synchronous, and the glob syntax is reimplemented from scratch to match the JVM. File times are BigInt nanoseconds to preserve sub-millisecond precision.zipis left out since Node.js has no native support for it - Added
spitandslurpon both the JVM and Node.js exec-pathsreturns[]whenPATHis unset or blank instead of throwing- @lread did a thorough review pass making the return values of
copy,copy-tree,delete-tree,zip/unzip,gunzipand the setters explicit and documented/tested (#197)
- Released 0.5.34 with Node.js support (#265): fs now runs on Node.js via ClojureScript and Squint / JavaScript, published as the
-
Babashka: native, fast starting Clojure interpreter for scripting.
- Working towards a new release integrating all the newest updates in Babashka CLI and babashka.fs. Most importantly I’m working on autocompletions added for tasks defined in
bb.edn. - #1979: fix
with-redefson copied vars (e.g.org.httpkit.client/get) incorrectly treated as inlined - Add
org.jline.keymap.BindingReaderfor reading key bindings in terminal applications, completing the input side of the bundled JLine API - #1982: add
clojure.lang.ChunkedCons,clojure.lang.APersistentVector$SubVector,clojure.lang.ArraySeq,clojure.lang.PersistentVector$ChunkedSeq,java.util.AbstractCollectionandjava.util.Queueto:instance-checks(@paintparty) - Added a terminal tetris example (
examples/tetris.clj) built on JLine’sDisplayandAttributedString, showing off the new terminal APIs - Full changelog
- Working towards a new release integrating all the newest updates in Babashka CLI and babashka.fs. Most importantly I’m working on autocompletions added for tasks defined in
-
Reagami: A minimal zero-deps Reagent-like for Squint and CLJS
- Added keyed reconciliation (#40): support
:keyon children for stable node identity, so diffing reuses nodes instead of recreating them - Fixed CLJS
:lite-modecompatibility and added it to CI (#41) - Added a benchmarks page comparing reagami against CLJS React wrappers and React-free solutions, with mermaid charts to visualize the results (#42, #43)
- Expanded the README with an ADR on the unkeyed reconciliation algorithm
- Added keyed reconciliation (#40): support
-
Cream: Clojure + GraalVM Crema native binary
- I was finally able to reproduce an issue with core.async and filed this upstream
- Once this is fixed I’m going to consider crema more seriously and play with the thought that this could be a substrate for “Babashka next”.
-
html: Html generation library inspired by squint’s html tag
- Fixed inline
stylemaps emitting a literal\nbetween declarations viapr-str, which produced invalid CSS and dropped every declaration after the first (@cycl1st) - Only render a map attribute value as CSS when the key is
style; other map-like values (e.g. records) now render viastr(@telekid) - Fixed a symbol-valued attribute resolving to its runtime value instead of its literal name
- Fixed inline
-
Edamame: configurable EDN and Clojure parser with location metadata and more
- Added ClojureDart support (non-indexing plain readers matching tools.reader, zero-literal parsing fix, and more)
- With
:auto-resolve-ns, bare syntax-quoted symbols now resolve to the current namespace, matching Clojure’s behavior
-
Neil: A CLI to add common aliases and features to deps.edn-based projects
- #261:
neil dep upgradenow upgrades unstable deps (e.g. release candidates) to a newer unstable version when no newer stable version exists - Added a README note on
brew trustfor users who installed neil before Homebrew introduced tap trust - The next neil version will make use of the new Babashka CLI features which is already prepared in a PR
- #261:
-
Nbb: Scripting in Clojure on Node.js using SCI
-
deps.clj: a faithful port of the clojure CLI bash script to Clojure
- As always, catching up with the most recent Clojure CLI versions
-
Pod-babashka-gozxing: a babashka pod for QR code and barcode decoding/encoding, backed by gozxing
- Initial release 0.0.1, installable via the pod registry
-
Graal-build-time: initialize Clojure classes at build time for GraalVM native-image
- #55: munge package names for namespaces with special characters
Contributions to third party projects:
- ClojureScript: documented the
async/awaitsupport from last cycle on the ClojureScript site, including an enhanced reference (#423, #424) - Nexus: a data-driven state management library by Christian Johansen. I ported the core engine and test suite to run under squint and added a cljs test runner alongside the existing kaocha setup, so both babashka and squint stay covered in CI (#15, #16, merged)
- Replicant: a data-driven DOM rendering library by Christian Johansen. I made Replicant itself run under Squint (converting
dom.cljsto.cljc, adjustingcore.cljcfor portability), added babashka/squint test runners and wired them into CI, and fixed a multi-root render bug under squint by switching DOM state tracking to a node-map (#71, #72, merged)
Other projects
These are (some of the) other projects I’m involved with but little to no activity happened in the past two months.
Click for more details
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- cherry: Experimental ClojureScript to ES6 module compiler
- quickblog: light-weight static blog engine for Clojure and babashka
- quickdoc: Quick and minimal API doc generation for Clojure
- clerk: Moldable Live Programming for Clojure
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- unused-deps: Find unused deps in a clojure project
- pod-babashka-fswatcher: babashka filewatcher pod
- sci.nrepl: nREPL server for SCI projects that run in the browser
- babashka.nrepl-client
- http-server: serve static assets
- sci.configs: A collection of ready to be used SCI configs.
- rewrite-edn: Utility lib on top of rewrite-clj
- rewrite-clj: Rewrite Clojure code and edn
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- bbin: Install any Babashka script or project with one command
- qualify-methods
- Initial release of experimental tool to rewrite instance calls to use fully qualified methods (Clojure 1.12 only)
- tools: a set of bbin installable scripts
- babashka.json: babashka JSON library/adapter
- speculative
- squint-macros: a couple of macros that stand-in for applied-science/js-interop and promesa to make CLJS projects compatible with squint and/or cherry.
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- lein2deps: leiningen to deps.edn converter
- cljs-showcase: Showcase CLJS libs using SCI
- babashka.book: Babashka manual
- pod-babashka-buddy: A pod around buddy core (Cryptographic Api for Clojure).
- gh-release-artifact: Upload artifacts to Github releases idempotently
- carve - Remove unused Clojure vars
- 4ever-clojure - Pure CLJS version of 4clojure, meant to run forever!
- pod-babashka-lanterna: Interact with clojure-lanterna from babashka
- joyride: VSCode CLJS scripting and REPL (via SCI)
- clj2el: transpile Clojure to elisp
- deflet: make let-expressions REPL-friendly!
- deps.add-lib: Clojure 1.12’s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
- process: Clojure library for shelling out / spawning sub-processes
- parmezan: fixes unbalanced or unexpected parens or other delimiters in Clojure files