announcements 2026-07-14

New version 0.64.0 https://neanderthal.uncomplicate.org/?release=0.64.0 just got released. Now it supports half-precision floating point in vectors/matrices (aka float16)!

7
2

https://github.com/weavejester/cljfmt 0.16.5 has been released with various bug fixes. See the https://github.com/weavejester/cljfmt/blob/master/CHANGELOG.md for more information.

🎉 7

https://github.com/babashka/nbb: Scripting in Clojure on Node.js using https://github.com/babashka/sci 1.5.211 (2026-07-14) Highlights: ClojureScript: JIT compilation. Nbb now bundles a SCI that compiles interpreted function bodies to JavaScript at runtime via js/Function. This is enabled by default. Loops, numerical computations and JS interop become much faster due to this.

$ nbb -e "(time (loop [i 0 j 10000000] (if (zero? j) i (recur (inc i) (dec j)))))"
;; interpreter:  ~175 ms
;; JIT (default):  ~7 ms   — over 20x faster
Babashka.fs Nbb now ships https://github.com/babashka/fs as a built-in library. The full file system API (`glob`, copy, move, create-dirs, delete-tree, with-temp-dir, path helpers and more) is available via (require '[babashka.fs :as fs]), matching Babashka. Better CLJS deftype/defrecord support • Support implementing CLJS protocols (e.g.`ILookup`, etc) on`deftype`and`defrecord` For complete changelogs, see https://github.com/babashka/nbb/blob/main/CHANGELOG.md SCI got pretty complete now when it comes to CLJS capabilities so I don't see a reason why nbb couldn't run existing CLJS libraries unless they relied on very specific macros that require the JVM. So if you have anything that doesn't run, challenge welcome in #nbb! Other updates: • Bump SCI to`0.15.56`(ClojureScript JIT, see above) • Support https://github.com/juji-io/editscript: CLJS`deftype`/`defrecord`field interop,`set!`on`^:unsynchronized-mutable`fields, add`cljs.core`type classes like`PersistentHashMap`,`write-all`and`goog.math.Long` • Bump babashka.cli to 0.12.76

2
4
🔥 10
3
🚀 4
2

#yamlstar is a YAML processing library that is written in Clojure and ships to 25 (and counting) different programming languages! It promises to be the most spec compliant and feature rich YAML framework and will work the same everywhere. https://github.com/yaml/yamlstar/releases/tag/0.1.15 just released. See https://yamlstar.org/

👏 2
❤️ 2
🚀 2
🎉 7

Hi @ingy! As one of the ways I give back to the Clojure community, I help, with dramatic martyrdom, to maintain https://github.com/clj-commons/clj-yaml. Should we list YAMLStar as an interesting alternative?

Yes. Certainly. Also it's pure Clojure. So it's likely the only one of the two that can work across most dialects.

Coolio, will doolio. Is it Babashka-compatible?

$ bb -Sdeps '{:deps {org.yamlstar/yamlstar {:mvn/version "0.1.15"}}}' -e '(require (quote [yamlstar.core :as yaml])) (print (yaml/dump (yaml/load "foo: [bar, baz]")))'
foo:
- bar
- baz

1

how does the bb version work, source?

I don't understand your question. You mean the YAMLStar library for Clojure (https://clojars.org/org.yamlstar/yamlstar/versions/0.1.15)?

the literal source file of the library?

so I can read it?

There's no bb version. I can imagine you are asking whether or not it loads the libyamlstar.so shared library. It does not. https://github.com/yaml/yamlstar/blob/main/core/src/yamlstar/api.clj is used by https://github.com/yaml/yamlstar/blob/main/clojure/src/yamlstar/core.clj

yeah, the clojure dir has one api file but the rest of the files are not under the clojure dir, that confused me. great that it works

I just added the https://github.com/yaml/yamlstar/blob/main/clojure/src/yamlstar/core.clj shim so that people would see code under the clojure/ dir like they see under every other language dir. But that file will become more important soon as I add clojure specific behavior for the clojure specific library.

Very cool effort, Ingy!

➕ 1

thanks 🙂

to be honest the pure clojure parser is slow (but also correct). I'm working on making it faster right now. I'm also working on a configurable parser swap plugin API. Configuring Y★ to use SnakeYAML would make it fast (like YAMLScript) and using RapidYAML (C++) would make it faster. I've already got it working with rapidyaml (the world's fastest and most correct YAML parser).

do you run bb tests in CI?

often micro-optimizations will break bb, therefore it's good to test :)

but I noticed it's a bit slow too

YAMLStar is essentially YAMLScript (sans the Script). I want to compile the shared library with Gloat/let-go instead of GraalVM, thus the need to drop the SnakeYAML JVM parser by default.

> do you run bb tests in CI? Not sure what you mean by that. (Interested though)

per language / dialect

you know, to catch regressions?

~/src/yamlstar main $ make test
test                  test-core             test-delphi           test-haskell          test-lua              test-php              test-rust             test-swift
test-all              test-crystal          test-elixir           test-java             test-nim              test-python           test-suite            test-unit
test-bindings         test-csharp           test-examples         test-julia            test-nodejs           test-r                test-suite-emit       test-zig
test-cli              test-d                test-fortran          test-kotlin           test-parser           test-raku             test-suite-load
test-clojure          test-dart             test-go               test-libyamlstar      test-perl             test-ruby             test-suite-roundtrip
I have unit tests, the YAML Test Suite and binding tests for each of the 25 langs. I run all the binding tests on Linux Mac and Windows. (Almost every binding works on all 3). I don't test multiple Clojure implementations/dialects yet. At this point I'm focused on things that apply to all languages, but I'd be happy to expand the Clojure library specific testing to include bb.

I recommend it to avoid breakage :) and of course you can always ping me in case something breaks and you want advise

❤️ 1

YAMLStar starts getting exciting when I introduce the plugin system. I imagine there will be a plugin to be bugward compatible with clj-yaml or pyyaml etc 🙂

👍 1

sadly (before yamlstar) no 2 yaml frameworks are fully compatible. That's the main point of it. It will also facilitate putting out a new YAML Spec version some day, because every language will have support for the new spec from day 0.

👍 1

This effort must be the ultimate version of getting some Clojure traces into everyones codebase 😁 Really amazing Ingy that you are also trying to tackle the Graalvm dependency with Gloat

❤️ 1

cider Drawbridge 0.4 is out! Drawbridge is one of the most obscure projects under the nREPL umbrella - an HTTP(S) transport for nREPL, packaged as a Ring handler - and after years of hibernation it just got a major overhaul: • A local "bridge" that lets any socket-based nREPL client (CIDER, Calva, rebel-readline, etc.) connect to a Drawbridge endpoint - editor support at last! • Secure by default - built-in bearer-token auth, and the new one-form secure-ring-handler refuses to create an unauthenticated endpoint unless you opt out explicitly • A WebSocket transport with real server push instead of HTTP long-polling Handy for REPL-ing into apps in environments where only HTTP(S) gets through (PaaS, restrictive firewalls) and SSH tunnels or TLS sockets aren't an option. The full story (including why the project stalled for a decade): https://metaredux.com/posts/2026/07/14/lowering-the-drawbridge.html Release notes: https://github.com/nrepl/drawbridge/releases/tag/v0.4.0 Not sure if it had any users left, but this might be a good time to have some fun with it. 😄 Feedback and use-case reports very welcome - I'd love to hear if this is useful to you! cider

👍 2
👀 6
🎉 8
2

woah, never heard of this (or had clearly forgotten) - loving this arc of yours, @bozhidar - stay rad.

❤️ 1

Everything old is new again! 😉 cider

🔆 1

I wanted to show a personal project I've been working on in my free time this summer. https://github.com/avanelsas/baredom/tree/main/barebuild is a small ClojureScript runtime that supports the idea that a server is a single source of truth of state and that a thin, framework free client can use presentational Web Components to represent that state and allow a user to interact with it (data, not html, over the wire). The current implementation offers a read-only contract between server and client, a server-resource element that handles fetches and server responses, and a consumer-registration that registers the thin consumer elements wrapped around specific web components. It ships with a small task demo (see attached video), all state is in the server. The demo client has no state, does not use react, re-frame, other framework, just Web Components. I was able to use 4 different types of web components without needing to touch the BareBuild code itself. A next step will be to try and implement writes as well. Some disclaimers: • The idea is not unique but this version comes from building a large web components library (https://github.com/avanelsas/baredom) and then imagining how I could use it without all the issues that arise when managing state in both server and client. • There are other, much more mature projects that support this basic idea of server owns all state (although everyone seems to solve it slightly differently). I am building this to learn, and hopefully add something people might find useful in the future. • I have used Claude during the brainstorming phase by allowing it to ask me questions about the idea to sharpen my thoughts • The core BareBuild code has been written by me. • I have used Claude as a project manager, helping me define stages and steps. • I've used Claude to help me write some unit tests, and to write the Babashka tasks server that implements the contract and is used in the demo I'd love to hear feedback!

👍 6
2
Alex Miller (Clojure team) 2026-07-14T16:14:53.255239Z

https://clojure.org/news/2026/07/14/clojure-1-13-alpha4 is now available! If you have comments or questions on the release, I will encourage you to open a NEW topic-specific thread in either #clojure (if general) or #clojure-dev if an issue/question for the dev team, instead of spamming everything into the reply here. Thanks! Destructuring changes and additions Idents after & in :keys!/syms!/strs!/:keys/syms/strs must now be actual keys, not binding symbols. This is a change in syntax since alpha3. Note that symbol keys should be quoted as unadorned symbols are binding symbols. :or now accepts key→val mappings in addition to binding→val. Added a new :defaults name directive at top level to bind name to a map of defaults, key→val. Binding symbols in the :or map are transformed to the key value in the :defaults map. :defaults without :or is an error. :select name, introduced in alpha3, now selects deeply, through nested maps, and fills in values for missing keys from :or. The :select map contains all keys mentioned anywhere in the binding form. • https://clojure.atlassian.net/browse/CLJ-2964 :select directive in map destructuring • https://clojure.atlassian.net/browse/CLJ-2966 :defaults directive in map destructuring • https://clojure.atlassian.net/browse/CLJ-2967 tests for nested destructuring Other changes since Clojure 1.13.0-alpha3 • Added clojure.core/some-vals, a predicative filter of nil map values • https://clojure.atlassian.net/browse/CLJ-2870 Exception phase during top-level eval is miscategorized

27
1
1

Some actual code examples would help me understand the specs better, would that be possible? Of course I can also try to read more accurately ;)

➕ 2
fogus (Clojure Team) 2026-07-14T16:39:28.474229Z

we added a bunch of tests for this release that might help. happy to help however I can also.

;;if you haven't supplied a map, select won't make one for no reason
user=> (let [{{a :a} :n :select s} nil] s)
nil
user=> (let [{{a :a} :n :select s} {}] s)
{}
;;you get what you supplied if nothing else
user=> (let [{{a :a} :n :select s} {:n nil}] s)
{:n nil}
user=> (let [{{a :a} :n :select s} {:n {}}] s)
{:n {}}
;;defaults can turn nothing into something
user=> (let [{{a :a :or {a 42}} :n :select s} nil] s)
{:n {:a 42}}
user=> (let [{{a :a :or {a 42}} :n :select s} {:n nil}] s)
{:n {:a 42}}

🙏 14
🙏🏻 1

user=> (pprint
 (let [{{:keys [x] :select foo} :nested, 
        {k :k :or {k 2}} :nested-2
        :keys [a b]
        :or {a 42}
        :defaults ds
        :select m}
       { :b 22 :c 3 :d 4 :nested {:w 1 :x 42 :y 3 :z 4}}]
   {:select m
    :defaults ds
    :vals [a b k x]}))

{:select {:nested {:x 42}, :b 22, :nested-2 {:k 2}, :a 42},
 :defaults {:a 42},
 :vals [42 22 2 42]}

🙏 12
🙏🏻 1

it seems a little odd to me that the :qualifier/keys/`:qualifier/keys!` syntax supports the use of a keyword with ANY qualifier after the &. Is that intentional?

(def person
  {:person/name "john"
   :user/id      1
   :person/address {:address/street "1 Main St"
                    :address/city   "Anytown"}})


;; :user/id works here even though it's a different qualifier than :person/keys!
(let [{:person/keys! [name & :user/id]} person]
  name)
;=> "john"

Alex Miller (Clojure team) 2026-07-14T17:35:08.040949Z

@jjttjj yes, after & are keys (not bindings) so it can be anything that might be a key in your map. that is, the namespace context of person from :person/keys! applies only to the bindings before the &. If you find this disconcerting, you could put those in a separate :keys! [& :user/id] and that might be clearer. for future questions, if you could ask in #clojure or #clojure-dev that will make responding to individual questions easier for us

👍 1

So for strs and syms you have to do "my-key" and 'my-key ? What's the reason for the switch, I get that it's maybe to not make them appear like they are bound, but it's also confusing in a different way.

✔️ 1
Alex Miller (Clojure team) 2026-07-14T19:39:55.293269Z

this has already been https://clojurians.slack.com/archives/C06E3HYPR/p1784048309327069?thread_ts=1784047316.517709&cid=C06E3HYPR by Rich in the thread in #clojure-dev - please try to make a new thread there about any new questions

👍 1
👍🏻 1

I'm a bit confused, but only because I was used to the previous alpha. Clj-kondo support merged!

4
🎉 6

Thanks for your work on this new alpha!

https://github.com/clojure-goes-fast/clj-memory-meter 0.5.0: measure object memory consumption in Clojure. The new release adds a couple of convenience functions to dissect the measured data structure and figure out what part of it occupies the most heap. I've used these functions multiple times to save myself from grabbing a heapdump, launching MAT, and becoming miserable. Hope you dodge the misery too. • measure-list measures each item in a sequence separately and returns items together with the sizes. • measure-map does the same for map values. • measure-transposed-maps takes a list of maps that contain common keys, transposes the maps (so that it becomes a map of lists, where each key corresponds to a list of values for that key accross all maps), and then measures each group. Keep in mind that each internal call to measure has a fixed overhead and will double-count shared objects, so expect the result to be calculated slower than just calling measure on the top-level object. The return values of these functions work well with https://clojurians.slack.com/archives/C06MAR553/p1744025452868229, but plain clojure.pprint/print-table works too. Example: calling (measure-transposed-maps (:var-usages @(:analysis context))) to analyze clj-kondo's heap usage.

❤️ 21
🚀 15
🎉 4

Your timing is perfect. Been working on a memory issue and today I was literally asking myself how to measure how much heap my data is consuming. I'll give this a go.

❤️ 1