In this post I'll give updates about open source I worked on during January and February 2025.
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.
Current top tier sponsors:
Open the details section for more info about sponsoring.
Sponsor info
If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!
On to the projects that I've been working on!
Updates
As I'm writing this I'm still recovering from a flu that has kept me bedridden for a good few days, but I'm starting to feel better now.
Here are updates about the projects/libraries I've worked on in the last two months.
- clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- Unreleased:
- #2493: reduce image size of native image
- 2025.02.20:
- #2473: New linter:
:unknown-ns-options
will warn on malformed (ns)
calls. The linter is {:level :warning}
by default. (@Noahtheduke) - #2475: add
:do-template
linter to check args & values counts (@imrekoszo) - #2465: fix
:discouraged-var
linter for fixed arities - #2277: prefer an array class symbol over
(Class/forName ...)
in defprotocol
and extend-type
- #2466: fix false positive with tagged literal in macroexpand hook
- #2463: using
:min-clj-kondo-version
results in incorrect warning (@imrekoszo) - #2464:
:min-clj-kondo-version
warning/error should have a location in config.edn
(@imrekoszo) - #2472 hooks
api/resolve
should return nil
for unresolved symbols and locals - #2472: add
api/env
to determine if symbol is local - #2482: Upgrade to Oracle GraalVM 23
- #2483: add
api/quote-node
and api/quote-node?
to hooks API (@camsaul) - #2490: restore unofficial support for ignore hints via metadata
- squint: CLJS syntax to JS compiler
- Fix #609: make
remove
return a transducer when no collection is provided - Fix #611: Implement the
set?
function (@jonasseglare) - Fix #613: Optimize
aset
- Fix #626: Implement
take-last
- Fix #615:
(zero? "0")
should return false
- Fix #617:
deftype
field name munging problem - Fix #618: Named multi-arity
fn
args don't get munged (@grayrest) - Fix #622: operator precendence issue with
|
and if
- Add
clojure.string
functions lower-case
, upper-case
, capitalize
(@plexus) - Fix #605: merge command line
--paths
with squint.edn
config properly - Fix #607: make
mapcat
return a transducer if no collections are provided (@jonasseglare)
- babashka: native, fast starting Clojure interpreter for scripting.
- Experimenting upgrading to new beta core.async, work in is a branch ready to be merged
- #1785: Allow subclasses of
Throwable
to have instance methods invoked (@bobisageek) - #1791: interop problem on Jsoup form element
- #1793: Bump
rewrite-clj
to 1.1.49
(fixes parsing of foo//
among other things) - Bump
deps.clj
- Bump
fs
- fs - File system utility library for Clojure
- v0.5.24 (2025-01-09)
- #135: additional fix for preserving protocol when calling
fs/path
on multiple arguments (@Sohalt)
- SCI: Configurable Clojure/Script interpreter suitable for scripting
- Records should have keys present and set to
nil
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Catch up with several new versions of clojure CLI
- Fix #132: copy install tools.edn to config dir when install version is newer, similar to clojure CLI bash script
- Adds support for
XDG_DATA_HOME
environment variable according to XDG Base Directory Specification
- sql pods: babashka pods for SQL databases
- edamame: Configurable EDN/Clojure parser with location metadata
- Fix #115: add location to exception for invalid keyword
- rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- #40:
assoc
/update
now handles map keys that have no indent at all (@lread) - #43: bump rewrite-clj to 1.1.49 (@lread)
- #40:
assoc
/update
now handles map keys that have no indent at all (@lread) - #40:
assoc
/update
now aligns indent to comment if that's all that is in the map (@lread) - #40:
update
now indents new entries in same way as assoc
(@lread)
Other projects
These are (some of the) other projects I'm involved with but little to no activity happened in the past month.
Click for more details
- CLI: Turn Clojure functions into CLIs!
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- nbb: Scripting in Clojure on Node.js using SCI
- rewrite-clj: Rewrite Clojure code and edn
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- http-client: babashka's http-client
- cherry: Experimental ClojureScript to ES6 module compiler
- http-server: serve static assets
- bbin: Install any Babashka script or project with one comman
- sci.configs: A collection of ready to be used SCI configs.
- Added a configuration for
cljs.spec.alpha
and related namespaces
- qualify-methods
- Initial release of experimental tool to rewrite instance calls to use fully qualified methods (Clojure 1.12 only0
- clerk: Moldable Live Programming for Clojure
- Add support for
:require-cljs
which allows you to use .cljs
files for render functions - Add support for nREPL for developing render functions
- process: Clojure library for shelling out / spawning sub-processes
- Work has started to support prepending output (in support for babashka parallel tasks). Stay tuned.
- neil: A CLI to add common aliases and features to deps.edn-based projects.
- quickdoc: Quick and minimal API doc generation for Clojure
- tools: a set of bbin installable scripts
- sci.nrepl: nREPL server for SCI projects that run in the browser
- html: Html generation library inspired by squint's html tag
- instaparse-bb: Use instaparse from babashka
- babashka.json: babashka JSON library/adapter
- 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.
- grasp: Grep Clojure code using clojure.spec regexes
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- pod-babashka-fswatcher: babashka filewatcher pod
- 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
Published: 2025-02-28
Tagged:
clojure
oss updates
In this post I'll give updates about open source I worked on during November and December 2024.
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.
Current top tier sponsors:
Open the details section for more info about sponsoring.
Sponsor info
If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!
On to the projects that I've been working on!
Updates
Clojurists Together announced that I'm among the 5 developers who were voted to receive the Long Term Funding in 2025. You can see the announcement here. Thanks so much!
Here are updates about the projects/libraries I've worked on in the last two months.
- babashka: native, fast starting Clojure interpreter for scripting.
- #1771:
*e*
in REPL should contain exception thrown by user, not a wrapped one - #1777 Add
java.nio.file.attribute.UserDefinedFileAttributeView
- #1776
Add java.nio.file.attribute.PosixFileAttributes
- #1761 Support calling
clojure.lang.RT/iter
- #1760 For compatibility with Fireworks v0.10.3, added the following to
:instance-checks
entry in babashka.impl.classes/classes
(@paintparty)clojure.lang.PersistentArrayMap$TransientArrayMap
clojure.lang.PersistentHashMap$TransientHashMap
clojure.lang.PersistentVector$TransientVector
java.lang.NoSuchFieldException
java.util.AbstractMap
java.util.AbstractSet
java.util.AbstractList
- #1760 For compatibility with Fireworks v0.10.3, added
volatile?
entry to babashka.impl.clojure.core/core-extras
(@paintparty) - Bump
babashka.cli
to 0.8.61
- Bump
clj-yaml
to 1.0.29
- #1768: Add
taoensso.timbre
color-str
function - Add classes:
javax.crypto.KeyAgreement
java.security.KeyPairGenerator
java.security.KeyPair
java.security.spec.ECGenParameterSpec
java.security.spec.PKCS8EncodedKeySpec
java.security.spec.X509EncodedKeySpec
java.security.Signature
- Add
java.util.concurrent.CompletionStage
- Bump
core.async
to 1.7.701
- Bump
org.babashka/cli
to 0.8.162
- Include jsoup for HTML parsing. This makes bb compatible with the hickory library (and possibly other libraries?).
- #1752: include
java.lang.SecurityException
for java.net.http.HttpClient
support (@grzm) - #1748: add
clojure.core/ensure
- Upgrade
taoensso/timbre
to v6.6.0
- Upgrade
babashka.http-client
to v0.4.22
- Add
:git/sha
from build to bb describe
output (@lispyclouds) - Fix NPE with determining if executing from self-contained executable
- squint: CLJS syntax to JS compiler
- Fix #255: fn literal with rest args
- #596: fix unary division to produce reciprocal
- #592: fix
clj->js
to not process custom classes - #585: fix
clj->js
to realize lazy seqs into arrays - #586: support extending protocol to
nil
- #581: support docstring in
defprotocol
- #582: add
extend-protocol
- Add
delay
- Fix #575:
map?
should not return true
for array - Fix #577: support
$default
+ :refer
- Fix #572: prevent vite page reload
- CLI: Turn Clojure functions into CLIs!
- Fix #109: allow options to start with a number
- scittle: Execute Clojure(Script) directly from browser script tags via SCI
- #99: make
js/import
work - #55: create gh-pages dir before using.
- #89: allow
evaluate_script_tags
to specify individual scripts. - #87: prod build on fresh checkout fails
- clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- Unreleased
- #2272: Lint for nil return from if-like forms
- Add
printf
to vars linted by analyze-format
. (@tomdl89) - #2272: Report var usage in
if-let
etc condition as always truthy - #2272: Report var usage in
if-not
condition as always truthy - #2433: false positive redundant ignore with hook
- Document
:cljc
config option. (@NoahTheDuke) - #2439: uneval may apply to nnext form if reader conditional doesn't yield a form (@NoahTheDuke)
- #2431: only apply redundant-nested-call linter for nested exprs
- Relax
:redundant-nested-call
for comp
, concat
, every-pred
and some-fn
since it may affect performance - #2446: false positive
:redundant-ignore
- #2448: redundant nested call in hook gen'ed code
- #2424: fix combination of :config-in-ns and :discouraged-namespace
- 2024.11.14
- #2212: NEW linter:
:redundant-nested-call
(@tomdl89), set to level :info
by default - Bump
:redundant-ignore
, :redundant-str-call
linters to level :info
- #1784: detect
:redundant-do
in catch
- #2410: add
--report-level
flag - #2416: detect empty
require
and :require
forms (@NoahTheDuke) - #1786: Support
gen-interface
(by suppressing unresolved symbols) - #2407: support ignore hint on called symbol
- #2420: Detect uneven number of clauses in
cond->
and cond->>
(@tomdl89) - #2415: false positive type checking issue with
str/replace
and ^String
annotation
- nbb: Scripting in Clojure on Node.js using SCI
- 1.3.196 (2024-11-25)
- Add
locking
macro for compatibility with CLJS - 1.3.195 (2024-11-07)
- #343: support
:reload
for reloading CLJS namespaces and JS code
- rewrite-clj: Rewrite Clojure code and edn
- Fix parsing of
b//
symbol
- pod-babashka-go-sqlite3: A babashka pod for interacting with sqlite3
- #19: Restore mac intel support (this time for real)
- tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- Fix #30: pod won't run on newer versions of macOS
- http-client: babashka's http-client
- #73: Allow implicit ports when specifying the URL as a map (@lvh)
- #71: Link back to sources in release artifact(@lread)
Other projects
These are (some of the) other projects I'm involved with but little to no activity happened in the past month.
Click for more details
- SCI: Configurable Clojure/Script interpreter suitable for scr- cherry: Experimental ClojureScript to ES6 module compil- http-server: serve static assets
- bbin: Install any Babashka script or project with one comman
- sci.configs: A collection of ready to be used SCI configs.
- Added a configuration for
cljs.spec.alpha
and related namespaces
- qualify-methods
- Initial release of experimental tool to rewrite instance calls to use fully qualified methods (Clojure 1.12 only0
- clerk: Moldable Live Programming for Clojure
- Add support for
:require-cljs
which allows you to use .cljs
files for render functions - Add support for nREPL for developing render functions
- deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Upgrade/sync with clojure CLI v1.12.0.1479
- process: Clojure library for shelling out / spawning sub-processes
- Work has started to support prepending output (in support for babashka parallel tasks). Stay tuned.
- neil: A CLI to add common aliases and features to deps.edn-based projects.
- edamame: Configurable EDN/Clojure parser with location metadata
- quickdoc: Quick and minimal API doc generation for Clojure
- fs - File system utility library for Clojure
- tools: a set of bbin installable scripts
- sci.nrepl: nREPL server for SCI projects that run in the browser
- html: Html generation library inspired by squint's html tag
- rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- instaparse-bb: Use instaparse from babashka
- babashka.json: babashka JSON library/adapter
- 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.
- grasp: Grep Clojure code using clojure.spec regexes
- lein-clj-kondo: a leiningen plugin for clj-kondo
- http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- jet: CLI to transform between JSON, EDN, YAML and Transit using Clojure
- pod-babashka-fswatcher: babashka filewatcher pod
- lein2deps: leiningen to deps.edn converter
- sql pods: babashka pods for SQL databases
- 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
Published: 2024-12-31
Tagged:
clojure
oss updates
Dear sponsors,
It's almost Thanksgiving again. We don't have this tradition here in The Netherlands, but I do think it's a good to have a special day to count our blessings. I feel very blessed because of your ongoing support. My Clojure projects wouldn't be as well maintained and fully featured if I didn't have the sponsoring that I have currently.
You can read about the past year of OSS updates (and further back) here. Main projects are still clj-kondo, babashka, SCI, scittle, squint.
You can read about my plans for the next year here (a vote would be appreciated as well if you happen to be a CT sponsor!).
Feel free to reach out if you want to contact me about anything. Here, on Clojurians Slack, e-mail (michielborkent@gmail.com) or otherwise. I'd love to chat and catch up with you about how you are using (some of) my projects.
Here's to another year of Clojure OSS! Thanks for your support!
With gratitude,
Michiel Borkent / @borkdude
PS: if you aren't sponsoring, but are interested, here are the main ways to do so:
Sponsor info
Published: 2024-11-27
Tagged:
sponsors