Annually-Funded Developers' Update: Sept. and October 2026

By Kathy Davis

Hello Fellow Clojurists!

This is the fifth 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
May/June 2026
July/Aug 2026


Bozhidar Batsov: nREPL, neorepl, piggieback, CIDER
Clojure Camp: Conj activities, Recurse Center
Eric Dallo: ECA, ECA CLI, clojure-lsp
Jeaye Wilkerson: Jank portability, parity, stability, usability, and performance
Michiel Borkent: Squint, Babashka.ffi, clj-kondo, antq, and much more

Bozhidar Batsov

2026 Annual Funding Report 5. Published Nov. 6, 2026.

For a change, most of my focus in September and October was on nREPL itself, not on CIDER. The big themes were the nREPL protocol spec and how well the servers and clients out there actually stick to it. For years building an nREPL server or client that plays well with the rest of the ecosystem came down to trial and error, and this time I finally did something about it. It paid off much sooner than I expected. The highlights:

Below are the details, project by project.

proof and the nREPL spec

proof is the big new project this time around, and the one I’m most excited about. I’ve been talking about some automated way to check nREPL compatibility for ages (it made my list of things people hate about nREPL back in 2023), so it feels really great to finally see it become a reality. Good things take a while to happen, they said… Does your server work with CIDER? Until now the only way to find out was to implement the protocol, connect CIDER (or Calva, or whatever your users run) and see what breaks. Now you can point proof at your server and it’ll tell you. It’s a single binary that runs about 80 checks against a server. A check fails only when a real client would break (with a link to the client code that depends on the behavior), and everything else is just a warning. proof also comes with client profiles that send exactly what CIDER, Calva, Conjure, vim-fireplace, REPLy and neorepl send, profiles for the servers I know of, and a GitHub Action for running it in a server’s CI.

Once the server side was in place, I started on the clients as well. proof proxy sits between a client and a server and checks what the client sends, and proof serve is a small server for the test suites of clients, which can mimic the quirks of nREPL, Babashka, jank and others (proof serve -like jank). I wrote about proof in a lot more detail in proof: How Strong Is Your nREPL?.

proof goes hand in hand with the nREPL spec, the draft Phil Hagelberg wrote earlier this year. When the spec and the existing clients disagree, proof goes with the clients (a spec that breaks CIDER isn’t much use to anyone), and every such conflict, along with the gaps proof ran into, ends up on a list of spec changes. The first few of them are already PRs against the spec: how replies relate to their requests, the status values, how interrupts are answered and the fields of lookup replies.

What I like the most about proof is how quickly it started paying off:

I was also super happy to see other people using proof already. Tom Waddington has been running it against his nREPL implementations for Janet and Steel Scheme since early October (nrepl-janet even tests its client with proof serve), Jeaye Wilkerson suggested using it for jank’s nREPL server, and Kyle Cesare is already fixing what it found there. That’s exactly what I was hoping for!

neorepl

neorepl is the other brand new project, and it grew up together with proof. It’s a terminal REPL for Clojure (and anything else that runs an nREPL server), and the best way I can describe it is “CIDER in a terminal”: it uses cider-nrepl when it’s around, the same way CIDER does, and falls back to nREPL’s built-in ops when it isn’t. Every lookup the REPL can do is also a command with structured output, and there’s an MCP server and a skill for coding agents, so it’s “CIDER for agents” as well. Five releases in three weeks:

proof checks every server with the exact requests neorepl sends, and neorepl went through proof proxy and every scenario of proof serve before 0.1 was out. Its commands are separate processes sharing a session, so neorepl hits nREPL’s interrupt bugs harder than most clients, and making it work as well on Babashka’s server as with cider-nrepl is where most of the Babashka reports came from. Even JLine got a few bug reports along the way.

By the time I got around to writing this update, neorepl 0.5 was out as well, with a much smarter line editor, a namespace browser, automatic reloading and a CLI that editors can use without a plugin. I wrote about it in neorepl 0.5: CIDER in a Terminal.

nREPL

nREPL 1.8.0 came out on October 2 with the URL-based connections and the TLS improvements I mentioned last time, plus a few session fixes. Sessions survive evaluated code closing *in* or *out*, a race that could split responses between concurrent reads in nrepl.core/client is gone, and Sashko made persistent sessions re-create their thread when a faulty exec thunk kills it. He also moved the Unix sockets to the SocketChannel API.

Master moved on quickly after the release, much of it because of proof and neorepl:

The interrupt bugs that are still open are next on my list.

Piggieback

nrepl.org and cider.mx

nrepl.org got a facelift at the end of October. The manual moved to docs.nrepl.org, and nrepl.org itself is now a landing page that explains what nREPL is and how its protocol works, with real exchanges between a client and a server next to every feature. It even has a “Try it” section with an nREPL server running right in your browser, which turned out to be a story of its own (see the blog posts below). That playground is how nrepl-sci, a small nREPL server for SCI that runs entirely in a web page, came to be, and it even led me to take a closer look at clojure-mode for CodeMirror, which powers the playground’s editor.

CIDER got a landing page of its own at cider.mx, made to look like an Emacs frame running org-mode (mode line, M-x and all), with mini screencasts of CIDER in action. I had a lot of fun working on both sites!

neat, mezcaml and nREPL on the BEAM

My toy nREPL implementations were the first things I ran proof against, and all of them got a round of fixes in early October:

neat’s own integration suite now tests just the client and leaves the servers to proof. None of the three has had a release yet, though.

CIDER

No CIDER release this time (2.1 is still brewing), but master kept moving:

cider-nrepl and Orchard

cider-nrepl releases:

Orchard releases:

Sashko also added JDK 27 to the CI of nREPL, cider-nrepl and Orchard. Thanks, Sashko!

refactor-nrepl and clj-refactor

refactor-nrepl 3.15.0 documented the limitations of its AST-based analysis and deprecated the ops cider-nrepl has taken over. Back in the spring I said I’d like to move the most useful refactor-nrepl features to CIDER and cider-nrepl eventually, and the ns editing commands above are the first step in that direction.

clojure-ts-mode

No release, but quite a few fixes on main. I fixed clojure-ts-mode on Emacs 31 (e.g. the ClojureScript mode asking for the jsdoc grammar, M-q indenting only the innermost form) and a pile of refactoring commands that went wrong around metadata, #_ forms and reader conditionals. Jason Jackson sent a round of indentation and alignment fixes (threading macros, reader prefixes, metadata and comments before arguments), and Kyle Cesare kept up with jank’s syntax. Thanks, Jason and Kyle!

MrAnderson and smaller things

MrAnderson 0.7.2 stopped bundling pomegranate’s Maven classes in its jar, where they clashed with any other resolver on the classpath and broke cider-nrepl’s build once tools.build pulled in a newer tools.deps. The artifact went from 8 MB to about 200 KB in the process.

There was also a lot of release and CI maintenance across nREPL, cider-nrepl, Orchard, Piggieback and friends (e.g. release notes taken from the changelogs, the docs of a release published by its release workflow), and I revived the CI of parseclj and parseedn.

Blog posts

What’s next

Last time I said CIDER 2.1 was the obvious next milestone. It still is, but it got delayed, as most of my time went into nREPL instead. nREPL 1.8 shipped as planned, and mezcaml and the BEAM servers got a lot more reliable thanks to proof, even if neither got a release. While we’ve made solid progress on CIDER and friends as well, my main focus until the end of the year will likely be the broader nREPL ecosystem: fixing the interrupt bugs proof found in nREPL, turning the list of spec changes into PRs against the spec, and getting more servers and clients to run proof.

Thanks to Clojurists Together for the continued support of my Clojure OSS work! You rock!


Clojure Camp

2026 Annual Funding Report 5. Published Nov. 7, 2026.

What Happened

Workshops at Conj

Bringing New Clojurians to Conj

Hosting an Airbnb at Conj

Rewrote Our Pairing Tool

Clojure at the Recurse Center

Corporate Bookkeeping and Filing

Plans


Eric Dallo

2026 Annual Funding Report 5. Published Nov. 6, 2026.

2 months of big milestones! ECA passed 1000 stars on GitHub :proud:, got an official terminal client written in Clojure and became much more resilient for long-running agents, with lots of new people contributing. On clojure-lsp, we had a new release full of community contributions, followed by a big round of refactoring fixes. Thanks ClojuristsTogether and everyone helping with feedback, issues and contributions! :heart:

ECA

ECA reached 1000 stars on GitHub in September :star:, a really special milestone for a project created a bit more than a year ago, and eca-emacs passed 500 stars too, thank you all! These 2 months were focused on reliability for long-running tasks, better support for subscriptions and the terminal experience. I’m starting to plan a stable release soon, since we already consider ECA pretty stable for some time. As usual the changelog is huge, so here are the highlights since the last report:

0.158.0 - 0.169.0

That’s 238 commits from 19 people in the server repo alone, thanks zikajk, emecii, mikemikimike, itkonen, rschmukler and everyone else contributing with issues, PRs and discussions, love this community!

Also, Jeremiah Coyle (@paintparty), funded by ClojuristsTogether as well, started a redesign of the eca.dev docs with better typography and icons, a persistent docs sidebar and a logo wall with some of the companies using ECA, like Nubank, Flexiana, Biolit and Team Ohana, a really amazing work so far!

ECA CLI

eca-cli

The terminal client got a huge push and is now an official ECA client! It’s written in Clojure with Babashka and charm.clj, and ships as a single self-contained binary that downloads and updates the ECA server by itself, no Babashka, JVM or editor needed. It has most of the features of the editor clients: markdown rendering with syntax highlighting, tool approvals with diffs, questions, steering, task panel, rollback, flags and forks, @ contexts, provider login and MCP management, plus a print mode for scripts and pipes, like git diff | eca-cli -p "review this change". Thanks to Sam O’Leary for starting the project, it’s really nice to see a Clojure TUI like this one!

Other ECA clients

Most clients got the subscription quota and TPS in the chat usage, the subagent model and variant in the spawn_agent card and lots of fixes, plus client specific work:

The community also built 2 new clients that are now part of the org: eca-omarchy, a native client for the Omarchy shell by Oliver Marks, and eca-pharo, an ECA integration for Pharo Smalltalk by Larry Staton Jr., showing how the ECA protocol makes it easy to bring the same experience anywhere!

clojure-lsp

A new release is out with the changes mentioned in the last report, plus lots of community contributions: new code actions, better :refer suggestions, hover for special forms and more. We also had eoliphan reporting a batch of 9 detailed bugs in refactorings like move-form, clean-ns, promote-fn and extract-to-def, all fixed and already on master for the next release, thanks!

2026.10.15-11.42.38

Besides the changes from the last report, like the cycle-namespaced-map code action and the API/CLI rename fix:

clojure-lsp-intellij

3.5.6

metrepl

0.5.3


Jeaye Wilkerson

2026 Annual Funding Report 5. Published Oct. 27, 2026.

Hello everyone! Thank you so much for sponsoring me this year. It’s been an incredible year for jank. As I mentioned at Clojure Conj 2026, the next milestone for jank is a beta release. I’m targeting January 2027. In this post, I’d like to spell out exactly what that release will entail and how we’ll get there. The beta release has four priorities, in no particular order:

The progress of all of these is being tracked by this Github milestone.

Stability

jank still has many bugs and we’re not going to catch them all prior to the beta release, but we do want to catch the most obvious and impactful bugs. Over the past couple of years, we’ve added a ton of new functionality to jank and we need to ensure it works reliably. We have great test coverage for most systems, but we still need to fill in the gaps and address the systems which are lacking coverage. The main targets here are:

Core Clojure libs (as tested by jank’s clojure-test-suite – help wanted!) Various C++ interop edge cases nREPL and native build system tooling

Portability

We have jank packages for macOS Homebrew (arm64), Ubuntu (x86_64), Arch (x86_64), and Nix (x86_64). Each of these packages is bleeding edge, since jank doesn’t yet have versioned releases. The biggest change here for beta will be that jank releases will become versioned and immutable. The existing bleeding ege jank packages will be renamed to jank-dev and the default jank packages will track versioned releases. Releases will happen at whatever cadence feels right.

I’d like to grow the package area to include Homebrew packages for Linux x86_64 and macOS x86_64, as well as statically linked Alpine packages and Windows x86_64 MSYS2. If you have an OS where you’d like to see jank, let me know!

Part of portability is to improve jank’s embedding story. This involves filling out jank’s C API, improving error handling, and addressing the common gotchas around embedding an LLVM-based JIT runtime.

Parity

Some areas of Clojure parity, such as protocols and records, have yet to be tackled. We’re also missing a couple of dozen key vars in clojure.core, like rseq, unchecked arithmetic, etc. For the beta release, I want to achieve a strong parity with upstream Clojure JVM and track it in terms of Clojure’s versioned releases. We should be able to say that a particular version of jank tracks a particular version of Clojure JVM.

On the C++ interop side, we need more parity with how we handle native arrays, pointer decays, and initializer lists. I also want to improve our feature set for C++ interop to allow for defining statically typed C++ functions, globals, and structs within jank code.

Usability

As part of the beta release, the jank website will be updated to include starter examples for game development, GUI apps, and terminal apps. Part of this will include more packaged native libraries in awesome-jank. I will also focus more on implementing guides and references for Clojure devs to onboard into jank land, understand the interop, jank’s type system, and start building an intuition for how jank’s host systems work.

Performance

It’s intentionally not a goal to improve jank’s performance for the beta release. There are plenty of areas in jank to optimize and plenty of benchmarks where jank will not do favorably against Clojure JVM, but I will be focusing on those next year, leading up to jank’s gamma release. Don’t worry! When I do focus on performance, we’re going to make some huge gains. I’m already prepared for many of them, but they’re simply not a priority right now compared to everything else.

How’s the progress so far?

If you check out the milestone as of writing this, you’ll see that we’re around 50% of the way through already. Thanks to the help of Chris Badahdah, of Portal fame, we’ve been melting through the bug list at quite a good clip. I’m expecting, and hoping, that we’ll get more bug reports in the coming weeks, thanks to the Lisp Game Jam. That’s exactly where folks like you come in!

Summary

So, in summary, the next milestone is a beta release, targeted for January 2027. We’re focusing on portability, stability, parity, and usability. We need all of you to try jank out and report issues in order to do a great job of that. Find any excuse you can to kick the tires and please file a Github issue if the tires fall off!


Michiel Borkent

2026 Annual Funding Report 5. Published Nov. 8, 2026.

Title: OSS updates September and October 2026 Date: 2026-10-30 Tags: clojure, oss updates Description: My Clojure OSS updates for September and October 2026

In this post I’ll give updates about open source I worked on during September and October 2026.

To see previous OSS updates, go here.

Sponsors

I’d like to thank all the sponsors and contributors who make this work possible. Without you, the projects below would not be as mature or would not exist or be maintained at all! So a sincere thank you to everyone who contributes to the sustainability of these projects.

gratitude

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!

Intro

A lot happened again in the last two months! One major highlight was my visit to the Clojure Conj together with Rahul Dé, where we organized a Babashka workshop. It was great seeing lots of familiar and new faces over there. To give people at the workshop the best experience possible, lots of improvements went into babashka prior to the Conj… workshop driven development I guess. The major milestones I focused on during the last 6-8 months were:

All of this combined made for a great workshop, where we developed a stateless password manager that used cryptography either by shelling out or by FFI. This project combined the most-used libraries in babashka, like babashka.fs, babashka.process, babashka.cli, babashka.ffi, etc. so even if you didn’t end up using this password manager (most people probably didn’t) you certainly were exposed to what you would typically use in a bb script or project. Rahul and I will give this workshop at EuroClojure 2027 as well, so in case you missed it, you’ll get one more chance!

image

Babashka workshop at Clojure/conj 2026, seen from the back of the room.


image

Rich Hickey and Rahul Dé getting his hamster hammock signed at Clojure/conj 2026.

Highlights

Here are some personal favorite highlights from the last two months.

Blog posts

Blog posts that I published in this period:

Updates

Here are some highlights per project. See each project’s CHANGELOG.md for the full list.

Contributions to third party projects:

Other projects

These are some other projects I’m involved with, but little to no activity happened in the past two months.

Click for more details