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.
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:
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
pprint backed by orchard.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 in orchard.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/sayid coordinates, 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-file evaluate 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 the describe response.
- 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:
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 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
/context command + 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/ConverseStream APIs, supporting models like Claude inference profiles.
- Durable chat persistence: chats are saved after every step with atomic writes plus several
/resume fixes, so long chats are never lost.
- Chat pagination: new
chat/history method so clients open long chats instantly and load older messages on demand.
- Chat
/export and /import: transfer a chat between machines as a resumable file.
- Hooks expansion: new
preCompact, postCompact, subagentStart and chatStatusChanged hooks, a /hooks command 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_user reaches 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/cost overrides enabling the usage bar and auto-compaction for local models, new extraConfigs, 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 audit vulnerabilities, 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-doctor command 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.
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
initialize critical path, so large projects become interactive much sooner (warm initialize from ~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:MaxRAMPercentage instead 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
:require or :import via code action. #1734
- Group comments and clj-kondo directives along with namespaces when sorting or removing
:require/:import during ns organization. #1237
- Remove restriction on renaming unqualified keywords. #2139
- Fix
cyclic-dependencies linter falsely reporting cycles for :as-alias requires. #2108
- Fix crash when using
:exclude-when-defined-by as 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.
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!
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
--help generation for dispatch CLIs, 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
dispatch now accepts a tree directly (as returned by table->tree), and subcommand order is preserved in printed help and completions
- Squint support and a new
@babashka/cli npm package
- ClojureDart support (#182)
opts->table accepts :columns to override the auto-detected columns (#148, thanks Jan Seeger)
- Better error messages: negation errors now name the base option,
--no-foo on a non-boolean option errors instead of silently coercing, and :edn :coerce now requires an explicit value (#166, #174)
- Thanks to @lread for a lot of documentation review and general maintenance during this cycle
- Full changelog
-
Squint: CLJS syntax to JS compiler
- Browser nREPL support landed, followed by a number of REPL/nREPL fixes: #815 (
str wrapping tripping esbuild), #819 (macro changes not picked up in watch mode), #820 (:macros option 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’s dispatch, plus shell tab completion
- Dynamic vars and
binding now work via a mutable box, safe across separately-compiled ESM modules; syntax-quote resolves symbols through the current namespace and aliases like Clojure. defprotocol got :extend-via-metadata support.
reify added
clojure.walk added
- Added
squint.edn/clojure.edn with a ~300-line EDN reader
- Printing is now done through
*print-fn*, print, pr and with-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-in cljs.test support
- #771: dead-code elimination for varargs/multi-arity functions, now emitted via
... spread
- Replicant support landed, with an example
- Added
defrecord, record? and the IRecord marker protocol. Records store their fields as own string-keyed properties and implement the map-facing protocols, so keyword lookup, keys, seq, assoc, conj and = all work through the regular core functions; the generated implementations are shared runtime functions imported only by files that use defrecord
- 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, and IAtom/IDeref/IReset/ISwap/IWatchable (so a reagent-style reactive atom can be a plain deftype)
- Compile-time namespace resolution:
cljs.analyzer.api/resolve now sees vars of built-in library namespaces like clojure.string, plus :squint/compile-time forms and fixes for macro self-use
- Full changelog
-
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- NEW: macros from source. A
defmacro (plus any supporting defn/defn-/def) tagged with {:clj-kondo/macroexpand-hook true} is automatically extracted into .clj-kondo/ and registered as a :macroexpand hook on the next run. See doc/hooks.md
- Support for
async/await in ClojureScript: bumped built-in CLJS analysis to 1.12.145 and added the :await-without-async-fn and :misplaced-async-metadata linters
- #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 suggests cond-> (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-var false positive across files declaring the same namespace
- #2814: fix
:protocol-method-arity-mismatch false positive for definterface declaring the same method with multiple arities (@jramosg)
- #2817: warn on
recur inside a vector, map or set literal, since recur is never in tail position there
- #2854: fix
:invalid-arity false 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, faster sexpr, 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
-
SCI: Configurable Clojure/Script interpreter suitable for scripting
- ClojureDart support, with a Flutter REPL example
- Instance/static method and field overrides plus a
:closed allowlist 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 :classes allowlist, 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-fn option: 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 sandboxed try/catch cannot catch, and gate finally and the regex functions (re-matches/re-find/re-seq, JVM) through :interrupt-fn too, closing off ways to mask an interrupt and escape the sandbox #1044
- Fix
copy-var incorrectly marking a function as inlined when its unqualified name collided with a clojure.core/cljs.core inlined var (e.g. a custom get), silently breaking with-redefs (@verberktstan)
- Fix cross-namespace
defrecord/deftype type 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/fs npm 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. zip is left out since Node.js has no native support for it
- Added
spit and slurp on both the JVM and Node.js
exec-paths returns [] when PATH is unset or blank instead of throwing
- @lread did a thorough review pass making the return values of
copy, copy-tree, delete-tree, zip/unzip, gunzip and the setters explicit and documented/tested (#197)
-
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-redefs on copied vars (e.g. org.httpkit.client/get) incorrectly treated as inlined
- Add
org.jline.keymap.BindingReader for 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.AbstractCollection and java.util.Queue to :instance-checks (@paintparty)
- Added a terminal tetris example (
examples/tetris.clj) built on JLine’s Display and AttributedString, showing off the new terminal APIs
- Full changelog
-
Reagami: A minimal zero-deps Reagent-like for Squint and CLJS
- Added keyed reconciliation (#40): support
:key on children for stable node identity, so diffing reuses nodes instead of recreating them
- Fixed CLJS
:lite-mode compatibility 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
-
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
style maps emitting a literal \n between declarations via pr-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 via str (@telekid)
- Fixed a symbol-valued attribute resolving to its runtime value instead of its literal name
-
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 upgrade now upgrades unstable deps (e.g. release candidates) to a newer unstable version when no newer stable version exists
- Added a README note on
brew trust for 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
-
Nbb: Scripting in Clojure on Node.js using SCI
- #410: fixed a regression, introduced by the async/await work in #408, where a
defrecord/deftype type symbol referenced through a namespace alias (e.g. (instance? r/Foo x)) failed to resolve
-
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/await support 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.cljs to .cljc, adjusting core.cljc for 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
Permalink