September & October 2023 Long-Term Project Updates
By Kathy Davis
Thanks to our 2023 long-term developers for this amazing body of work. This is the 5th report of the year - with one more to come around the new year. (Projects listed are only some of what they are covering in this post).
Bozhidar Batsov: CIDER/REPL
Michiel Borkent: clj-kondo,babashka, squint, neil, CLI,clojure-mode, and more..
Sean Corfield: clojure-doc.org, toolsbuild, deps-new, honey-SQL, expectations
Toby Crawley: Clojars
Eric Dallo: Clojure-lsp, intellij
Christophe Grand: ClojureDart et.al.
Thomas Heller: Shadow-cljs
Nikita Prokopov: new projects, Clojure Sublimed, DataScript, Sublime Executor
Tommi Reiman: Malli, Reitit, Jsonista
Peter Stromberg: Calva, JavaScript REPL, Polylith
Peter Taoussanis: Carmine, Nippy, http-kit, Tempel, Telemere
Bozhidar Batsov
I’m happy to report that after numerous delays the long-awaited CIDER 1.8 (“Geneva”) was shipped on October 13th (which also happened to be my 39th birthday)! This was a truly colossal release that addressed many long-standing issues and introduced some impressive new features (e.g. much improved enrich-classpath, cider-log-mode, a new way to display javadoc and many improvements to the tests runner). See the release notes for more details.
This release was quickly followed by CIDER 1.9 and CIDER 1.10 - much smaller releases that mostly addressed some small issues and polished a bit some of the new functionality in CIDER 1.8. All this work also resulted in the list of open issues on CIDER finally dipping under 100 (currently they stand at 85). That feels nice!
Now that this is done, my focus will switch to completing the support for clojure-ts-mode in CIDER and finally cutting an nREPL 1.1 (which will bring TLS support).
Michiel Borkent
In this post I’ll give updates about open source I worked on during September and October 2023.
To see previous OSS updates, go here.
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!
- Github Sponsors
- The Babaska or Clj-kondo OpenCollective
- Ko-fi
- Patreon
- Clojurists Together
If you’re used to sponsoring through some other means which isn’t listed above, please get in touch. On to the projects that I’ve been working on!
September Updates
I delivered my babashka talk at Strange loop talk and much of my attention went to the preparation of that (slides here). The talk is now available here.
I did manage to get some coding done as well, despite testing positive for COVID when I arrived back home… Here are updates about the projects/libraries I’ve worked in September.
-
clj-kondo: static analyzer and linter for Clojure code that sparks joy. Published a new version (2023.09.07) with these changes:
- #1332: New linter
:unused-alias. See docs. - #2143: false positive type warning for
clojure.set/project - #2145: support ignore hint on multi-arity branch of function definition
- #2147: use alternative solution as workaround for https://github.com/cognitect/transit-clj/issues/43
- #2152: Fix false positive with used-underscored-binding with core.match
- #2150: allow command line options = as in –fail-level=error
- #2149:
:lint-as clojure.core/defmacroshould suppress&envas unresolved symbol - #2161: Fix type annotation for
clojure.core/zero?to number -> boolean - #2165: Fix error when serializing type data to cache
- #2167: Don’t crash when
:unresolved-symbollinter config contains unqualified symbol - #2170:
:keyword-bindinglinter should ignore auto-resolved keywords - #2172: detect invalid amount of args and invalid argument type for
throw - #2164: deftest inside let triggers :unused-value
- #2154: add
:excludeoption to:deprecated-namespacelinter - #2134: don’t warn on usage of private var in
data_readers.clj(c) - #2148: warn on configuration error in
:unused-refeferred-varlinter - Expose more vars in
clj-kondo.hooks-apiinterpreter namespace
- #1332: New linter
-
babashka: native, fast starting Clojure interpreter for scripting. Version 1.3.185 released!
- #1624: Use Oracle GraalVM 21 (@lispyclouds)
- Use PGO to speed up loops (now 2-3x faster for
(time (loop [val 0 cnt 10000000] (if (pos? cnt) (recur (inc val) (dec cnt)) val)))!) - Bump babashka.http-client to v0.4.15
- Bump rewrite-clj to v0.1.1.47
- #1619: Fix reflection issue with
Thread/sleepincore.async/timeout - Support interop on
java.util.stream.IntStream - #1513: Fix interop on
Thread/sleepwith numbers that aren’t already longs - Bump babashka.cli to 0.7.53
- Fix #babashka.nrepl/66
- Various nREPL server improvements (classpath op, file lookup information for
cider-find-var) - Bump cheshire to 5.12.0
-
squint: CLJS syntax to JS compiler A lot of happened in squint this month:
- Many core var implementations got added:
reduce-kv,max,min,every-pred,into-array,some-fn,keep-indexed,iterate,juxt,compare,to-array,fn? - Bun compatibility
- Lots of bug fixes
- REPL improvements
- Adopt CLJS truth semantics:
0and""are no longer considered falsey - Lots more coming next month!
- Many core var implementations got added:
-
neil: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.61 released
- #181: fix
neil --version - fix tests by referring to latest hiccup (@teodorlu)
- #180:
neil dep upgrade: allow upgrading from an unstable version to the latest unstable version (@teodorlu) - #180:
neil dep upgrade: with--unstable, opt-into unstable library updates (@teodorlu) - #183: Don’t drop
:exclusionswhen runningneil dep addorneil dep upgrade([@borkdude] and [@teodorlu])
- #181: fix
-
CLI: Turn Clojure functions into CLIs!
- Small release with the option to add your own header on top of
format-opts, thanks to @Sohalt
- Small release with the option to add your own header on top of
-
http-client: babashka’s http-client
- A number of small bugfixes and additions
-
A number of experiments around squint:
- bun-squint-loader: a demo of how to implement a loader for bun which lets you directly load
.cljsfiles which are then compiled using - squint cloudflare worker
- bun-squint-loader: a demo of how to implement a loader for bun which lets you directly load
-
rewrite-edn: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
- Fixed a round-tripping issue by bumping rewrite-clj
-
tools-deps-native and tools.bbuild: use tools.deps directly from babashka
- aarch64 binary (thanks @TimoKramer for contributing)
- update upstream projects
-
cherry: Experimental ClojureScript to ES6 module compiler
- Bump shared compiler code with squint and publish new version
-
deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Bumped tools jar and fixed a bug concerning SHA comparison
-
SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
- Add experimental
:static-methodsoverride to control how a static method is invoked. This allowed a fix in babashka forThread/sleepon non-longs and forClass/forNamewhich works arond a bug in Oracle GraalVM 21.
- Add experimental
-
sci.configs: A collection of ready to be used SCI configs.
October Updates
-
babashka: native, fast starting Clojure interpreter for scripting.
- Support self-contained binaries as uberjars!
- Add
java.security.KeyFactory,java.security.spec.PKCS8EncodedKeySpec,java.net.URISyntaxException - Fix babashka.process/exec wrt
babashka.process/*defaults* - #1632: Partial fix for
(.readPassword (System/console)) - Enable producing self-contained binaries using uberjars
- Bump httpkit to
2.8.0-beta3(fixes GraalVM issue with virtual threads) - Bump
deps.cljandfs - Expose
taoensso.timbre.appenders.core - nREPL: implement
ns-listop - SCI: optimize
swap!,derefandreset!for normal atoms (rather than user-createdIAtoms)
-
sci.configs: A collection of ready to be used SCI configs.
-
clj-kondo: static analyzer and linter for Clojure code that sparks joy.
- #2207: New
:condition-always-truelinter, see docs) - #2013: Fix NPE and similar errors when linting an import with an illegal token
Published a new version (2023.10.20) with these changes: - #1804: new linter
:self-requiring-namespace - #2065: new linter
:equals-false, counterpart of:equals-true(@svdo) - #2199: add
:syntaxcheck for var names starting or ending with dot (reserved by Clojure) - #2179: consider alias-as-object usage in CLJS for :unused-alias linter
- #2183: respect
:levelin:discouraged-varconfig - #2184: Add missing documentation for
:single-logical-operandlinter (@wtfleming) - #2187: Fix type annotation of argument of
clojure.core/parse-uuidfromnilable/stringto string (@dbunin) - #2192: Support
:end-rowand:end-colin:patternoutput format (@joshgelbard) - #2182: Namespace local configuration does not silence
:missing-else-branch - #2186: Improve warning when
--copy-configsis enabled but no config dir exists - #2190: false positive with
:unused-aliasand namespaced map - #2200: include optional
:callstackin analysis
- #2207: New
-
squint: CLJS syntax to JS compiler
Lots of stuff happened in October with squint!- #350:
js*should default to:context :expr - #352: fix
zero?in return position - Add
NaN?(@sher) - #347: Add
:preand:postsupport infn - Add
number? - Support
docstringindef - Handle multipe source
:pathsin a more robust fashion - #344: macros can’t be used via aliases
- Add
squint.ednsupport, see docs - Add
watchsubcommand to watch:pathsfromsquint.edn - Make generated
letvariable names in JS more deterministic, which helps hot reloading in React - Added a vite + react example project.
- Resolve symbolic namespaces
(:require [foo.bar])from:paths - Add
bit-andandbit-or - Include
lib/squint.core.umd.jswhich defines a globalsquint.coreobject (easy to use in browsers, see docs) - Add
subs,fn?,re-seq - Add
squint.ednwith:pathsto resolve macros from (via:require-macros)
- #350:
-
neil: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.62 released
- Fix NPE during
neil dep upgrade
- Fix NPE during
-
- Porting this CLJS project such that it can run with squint also. You can now use this library directly from NPM as a JS library. See this page for a demo on how to use it directly from a CDN! This work is funded by Nextjournal.
-
cherry: Experimental ClojureScript to ES6 module compiler
- Released version 0.1.9
-
grasp: Grep Clojure code using clojure.spec regexes
- Fix self-requiring namespace (which clj-kondo now also catches via optional linter!)
-
lein-clj-kondo: a leiningen plugin for clj-kondo
- Bumped clj-kondo version
-
http-kit: Simple, high-performance event-driven HTTP client+server for Clojure.
- #543 Migrate away from
SimpleDateFormattojava.time, fixes native-image issue and virtual threads
- #543 Migrate away from
-
http-client: babashka’s http-client
- A number of small bugfixes and additions
-
SCI: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
- Expose
destructureto scripts - Macroexpand
(.foo bar)form inmacroexpand-1 - Optimize
deref,swap!,reset!for host values - Add
timemacro
- Expose
-
nbb: Scripting in Clojure on Node.js using SCI
sci.coreitself was exposed to nbb users
-
fs - File system utility library for Clojure
- Minor fixes in
globby @eval, thanks!
- Minor fixes in
-
deps.clj: A faithful port of the clojure CLI bash script to Clojure
- Get home directory via environment variable rather than system property by @DerGuteMoritz, thanks!
-
babashka.nrepl: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
- Fix
classpathop - Implement
ns-listop
- Fix
Other projects
These are (some of the) other projects I’m involved with but little to no activity happened in September and October. See final section of each report (“Other Projects”) for details.
https://blog.michielborkent.nl/oss-updates-sep-2023.html
https://blog.michielborkent.nl/oss-updates-oct-2023.html
Discuss this post here
Published: 31 October and 30 September, 2023
Tagged: clojure oss updates
Sean Corfield
:tags [“clojure” “clojure-doc.org” “expectations” “honeysql” “jdbc” “open source” “community” “clojurists together”]}
In my previous Long-Term Funding update I said I would review/overhaul the “ecosystem” and “tutorials” sections (once I’d finished the “language” section).
clojure-doc.org
I finished reviewing and updating the last three language sections to Clojure 1.11
(Concurrency and Parallelism,
Macros,
and Laziness), and I
added a new section about transducers to the
Collections and Sequences
section. In the next period, I’ll revisit the “TBD” items in the language
section to see what I can do to address them.
I rewrote the Generating Documentation section (ecosystem) to focus on cljdoc.org and removed the outdated content.
The Web Development section (ecosystem) also got a major rewrite, adding a lot of new content, removing outdated content, and incorporating a lot of community feedback on a draft version (thank you!).
Finally, I added a new section to the
tools.build Cookbook
about template pom.xml file and the :pom-data approach (new in tools.build 0.9.6).
tools.build and deps-new
Following on from the tools.build Cookbook update, I updated
deps-new to use that new
release of tools.build and updated all the project templates to use
:pom-data for generating pom.xml files.
See the v0.5.3
Release
I need to do the same for clj-new at some point – perhaps in the next period!
HoneySQL
HoneySQL also saw a lot of work with two releases that mostly focused on
improving BigQuery support (array subquery, select as struct, create or replace,
ignore/respect nulls, and new :distinct and :expr clauses to facilitate
certain non-standard queries), and introducing basic support for NRQL (New Relic Query Language) as a new dialect.
NRQL has non-standard quoting rules, non-standard entity names, and inlines
all expression values, since it is mostly used directly within the New Relic
web UI or via their CLI, neither of which support parameterized queries. New
clauses and helpers have been added for :compare-with, :since, :timeseries,until, and :facet.
In addition, an important bug in the helper merge functions was fixed that affected anyone using the quoted-symbol style of DSL (instead of the keyword style).
See HoneySQL releases for more details of these two new versions.
Expectations
Expectations also saw
two new releases this period. The first release focused on improving the
way test failures are reported to be more consistent and informative. The
second release was a minor one to improve clj-kondo support for more-of.
See Expectations releases for more details on these two new versions.
next.jdbc
Finally, next.jdbc 1.3.894
provides variants of with-transaction and on-connection that will rewrap an
options-wrapped connectable. This was a long-requested feature that I had
struggled with finding an elegant solution for. In addition, I updated most of
the JDBC drivers that next.jdbc is tested against, to flush out any issues
with those newer versions. Notably, SQLite no longer supports :return-generated-keys true but you can specify RETURNING * in your SQL instead.
What’s Next?
In November/December, I’m hoping to complete a review and update of the
“cookbooks” section and make another pass of “TBD” items in the “language”
section.
Toby Crawley
Clojars Worklog
September 2023
Commit Logs: clojars-web
Most of September was vacation, but I did make a few improvements towards the end of the month:
- Prevent memory leak from in-memory session store This was the source of intermittent OOMs for years, and I finally tracked it down.
- Require a license in the POM for new projects
October 2023
Commit Logs: clojars-web
The work this month was modernization: we moved away from yesql in favor of
honeysql, and to next.jdbc from clojure.java.jdbc:
- Convert from yesql to honeysql for SQL queries
- Convert from java.jdbc to next.jdbc
- Don’t send password change email when just profile email address changed
- Adjust dependencies to address CVEs
Eric Dallo
During these months I worked a lot on clojure-lsp-intellij to make it stable and allow IntelliJ users have the same experience of using clojure-lsp in other editors, the plugin is way more stable now, and I’ve been working with @afucher in a clojure-repl-intellij OSS plugin which should work pretty well with this plugin so users will be able to have both REPL access and LSP features in Intellij, we should announce it soon!
For that to work and scale, I extracted all the clojure integration part from clojure-lsp-intellij to a separated library called clj4intellij, this new library allows the creation of Intellij plugins in Clojure without too much effort, this was the result of months of research and headaches about how IntelliJ’s API could work with Clojure, we are already successfully using it in clojure-repl-intellij!
clj4intellij
0.3.1
- Support custom nrepl ports
- Add NREPL and logger support.
- Include clojure source to jar.
- Add
com.github.ericdallo.clj4intellij.app-managernamespace with functions to accessApplicationManager. - First release
clojure-lsp-intellij
0.9.0 - 0.13.0
- Add support for paredit actions: slurp, barf, raise and kill.
- Bump clojure-lsp to
2023.10.30-16.25.41. - Allow specifying a server log-path to better troubleshooting.
- Fix find definition to work for external deps as well.
- Improve troubleshooting section
- Use nrepl and logger from clj4intellij.
- Improve line indent to recognize some macros.
- Fix exception on startup related to status bar.
- Implement lineIdentProvider to handle enters and move cursor to correct position.
- Start LSP server only when opening clojure files, avoiding starting on non Clojure projects. #20
- Fix LSP not being disconnected on project close/switch.
- Bump clj4intellij to
0.2.1. - Fix language attribute in intentionAction from plugin.xml. #18
- Fix documentationProvider plugin.xml. #19
- Extract Clojure intellij integration to separated lib clj4intellij.
- Fix Find definition to work with Ctrl+B + Ctrl+click.
- Add support for
textDocument/didSavenotification. - Fix rename refactor when file is not opened.
clojure-lsp
The main highlights are performance and memory improvement along with paredit features for clojure-lsp-intellij and other editors.
2023.10.30-16.25.41
-
General
- Bump clj-kondo to
2023.10.21-20231022.204832-4. - Fix move-to-let/expand-let bug for multi-arity functions #1283
- Fix
:dependency-schemesetting for .java files from jars #1653 - Bump graalvm to 21.
- Improve overall performance using GraalVM 21 PGO (Profile-Guided Optimizations).
- Extract the responsibility for merging clj-depend config #1265
- Support passing configurations to clj-depend via CLI #1694
- Bump clj-depend to
0.9.2 - Performance: remove keyword-usages elements from external analysis as they are not used for any feature and for big projects may affect memory. #1700
- Bump clj-kondo to
-
Editor
- New paredit refactorings:
forward-slurpforward-barfbackward-slurpbackward-barfraisekill
- Improve rename to avoid internal errors and show proper error messages. #1691
- Exclude unused-public-vars when inside a comment block.
- Add
:analysis-summaryfield toserverInfocommand to get information about project for performance analysis. - Add
:analysissettings, with options to disable specific analysis for better performance on huge projects. #1700
- New paredit refactorings:
Christophe Grand
ClojureDart
- ClojureDart channel on Clojurians' Slack is getting close to 500 members.
- We demoed ClojureDart at the London Clojurians meetup (video).
- We didn’t had time to work on the REPL or multimethods (still planning to).
Improvements
- In
cljd.flutter,:watchnow always deduplicate values. Previously deduplication only happened when destructuring was used; the rationale for the change is that if:watchreturns the same values the generated UI will be the same. The only exception is when mutable objects are repeatedly returned. That’s why there’s now the:dedup falseoption to turn off deduplication of a given watch binding. - We reimplemented dynamic bindings on top of Dart Zones, this has two benefits:
- making bindings conveyance automatic across all async mechanisms,
- allowing to catch async errors! There’s a new
*async-error-handler*dynamic var which can be bound to a function taking two arguments (exception and stacktrace), when bound it will catch uncaught errors happening in async mechanisms (futures, streams, async/await) started directly or indirectly by code under this binding!
- In
cljd.flutterwe added helper directives for common widgets and cut on the boilerplate::color,:height,:widthand:padding. - This one is big for the ecosystem: we made it possible for cljd deps (managed via
deps.edn) to have dependencies on Dart packages. This is big because it means that cljc or cljd libraries can use Dart dependencies without their own consumers having to redeclare them. The only requirement is for library authors when packaging to jars: copy pubspec.yaml` in the jar (or put a copy of it on the classpath before creating the jar). - We added a new special form:
dart/async-barrier. Basically it’s adowhich preventsawaitfrom leaking outside of thedo(so thedoform will evaluate to aFuture). This is important when writing macros to prevent user code (which may containawait) from contamining macro-generated code. - In
cljd.flutterwe added aget-ofhelper to retrieve widget-scope values bound with:bindfrom aBuildContextobject. - We ported
clojure.datatocljd.data. - We added
instance?to ClojureDart. This is something I have been reluctant to do because in Dart you can’t test an instance against a type value only against a type literal. That’s why we havedart/is?which is a special form and not a function. However when porting code to ClojureDart having to rewrite allinstance?calls todart/is?is tedious – and most of the time the type is passed as a literal toinstance?. So to make porting easier we added aninstance?function which throws when called as a function but is otherwise inline as adart/is?. We do have plans for a trueinstance?. - We added
into-arraywhich suffer from a similar problem toinstance?: the type of an array has to be statically known in Dart, it can’t be specified as a value. Here we followed CLJS lead and ignored the type for compatibility. Most certainly a behaviour which will have to be revisited when more libs are ported. - Last we added the possibility to have conflicting method definitions in a
deftype/defrecord/reify. However one of the conflicting methods must have an^:overridemeta. This was done to port some libraries with hacks arounddefrecord.
Fixes
Several fixes to the compiler, cljd.core. Amongst them:
- type inference on
reify applywith some native Dart functionsnot-emptyinline was causing double evaluations- bug on
dissoc!on transient hash maps - fix field lookup on defrecords fields whose names are not valid Dart names
##NaN,##Infiniteand##-Infinitewere not properly compiled- fix propagation of return-type hint in
defnargvecs.
Future work
ClojureDart
New items:
- Migrate from Clojure’s own reader to
tools.reader. Currently ClojureDart usesLispReaderfrom Clojure but this reader doesn’t allow to ignore the:cljfeature when readingcljcso it requires to modify a lot of reader conditionals, even some which shouldn’t concern ClojureDart, and to order them precisely. - Value semantics on closures (not by default, as an option), this has the potential of simplifying caching in Flutter code.
Existing items:
- Publish the Flutter-only REPL
- Multimethods to allow more libs to be ported
- Look into porting SCI to ClojureDart
- New APIs to leverage our persistent data structures:
** maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS) – hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.
** Sorted colls should be good enough for direct use by Datascript.
** Both hash and sorted maps can support accelerated merge/diff/join/etc. operations. cljdCLI written incljdfor easier project creation etc.- gen tests
- …
Thomas Heller
shadow-cljs
Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).
Current shadow-cljs version: 2.52.10 Changelog
Notable Updates
- Fixed some :dev-http issues that prevented proxying websockets or self-signed SSL certificates.
- Fixed some node REPL issues, hopefully making it more reliable overall
Nikita Prokopov
(aka Niki Tonsky)
Must be something in the air that makes you start new projects in the Fall. Three new ones has popped up:
New project - clj-simple-router:
- A minimal, order-independent Ring router
- An introductory blog post
New project - toml-clj:
- Fast TOML parser for Clojure
- 2000x faster than existing Instaparse-based ones
- 30x faster than tomlj (Java)
New project - extend-clj:
- Easily extend clojure.core built-in protocols
- Both Clojure and ClojureScript
- First version let you implement your own Atoms
- More to come
Old projects also have seen some love:
DataScript:
- :xform is not called on ref attributes #455
- Work started on automatic client-server synchronization. Don’t tell anyone, but you can follow progess in the branch
Clojure Sublimed:
- Socket REPL: handle exceptions in lookup
- Do not silence exception during lazy seq printing
- Report number of reflection warnings in status bar
- Eval inside already evaled region re-evals same region instead of going to top form
- Printer can display newlines
Sublime Executor:
- Don’t die if project has non-existing folders
And, of course, blogging. Unicode article has seen its five minutes of fame:
Tommi Reiman
Working mostly with Malli and Reitit. Will do an open source retreat to get planned things out in 2023.
Malli
- Still WIP with the new effective type system.
- Lot’s of small improvements released and waiting for a release.
0.13.0 (2023-09-24)
- BREAKING Fallback to use result of first branch when decoding
:orand:orn, #946 - BREAKING:
decodefor:doubleanddouble?in cljs doesn’t allow trailing garbage any more #942 - Faster generators for
:map, #948 & #949 - FIX:
:altncan’t handle just one child entry when nested in sequence schema #945 - Officially drop Clojure 1.10 support. Tests haven’t passed for some time with Clojure 1.10, but this was not noticed due to a faulty CI setup.
- Use type inferrer when encoding enums #951
- Use
bound-fninmalli.dev/start!to preserve*out*#954 - FIX: Malli generates invalid clj-kondo type spec for [:map [:keys [:+ :keyword]]] #952
- FIX:
malli.experimental.describedescriptions of:minand:maxare backwards #959 - FIX: Malli tuple should generate clj-kondo seqable #962
Reitit
0.7.0-alpha7 (2023-10-03)
- Revert the group id change from alpha6
- New release to bring alpha6 changes to the old group id
- Updated dependencies:
[metosin/ring-swagger-ui "4.19.1"] is available but we use "4.18.1"
0.7.0-alpha6 (2023-09-11)
- BREAKING: require Clojure 1.11, drop support for Clojure 1.10
- BREAKING: new syntax for
:requestand:responseper-content-type coercions. See coercion.md. #627 - BREAKING: replace the openapi
:content-typeskeyword with separate:openapi/request-content-typesand:openapi/response-content-types. See openapi.md - NOTE!: all reitit libraries are now under the
fi.metosingroup on clojars instead ofmetosin. Usefi.metosin/reititin your dependencies instead ofmetosin/reititto get new versions.- Reverted in alpha7 due to problems with renaming artifacts
Jsonista
- A maintanance release
Something else
We had a family vacation in the Rhodes Island, which had massive wildfires earlier this year

Peter Stromberg
Calva
I had a bit of vacation from hacking on Calva during September. Which does not mean I had (or need ??) a vacation from Calva, I kept pretty busy with user support. And it was not all pause on the hacking either, more that I couldn’t really get a hold on some bugs and after some fruitless hunts I decided to wait for more information. Which I got, both from users and from my own investigations. There was also an issue with VS Code Insider builds, stopping our CI pipeline completely. Calva uses the Insider branch of VS Code for integration testing. I was pretty sure the VS Code team would fix it, so I waited that out instead of installing workarounds. But not without spending considerable time on the issue before figuring out that it was upstream, and where upstream.
The major issue hitting users was quite awful. A hang in Calva’s structural editor, which mostly manifested itself in moments of total Calva unresponsiveness. With the help of Ingy döt Net’s ever more minimal reproductions we finally understood the problem and could fix it. ?? There is also some other hang hitting users of WSL, that we haven’t figured out yet…
Calva user Albert Snow discovered that Calva’s ClojureScript Quick Start REPLs were broken on Windows. He set the Calva development environment up and we could pair on finding the issue, which he then fixed! ??
Also fixed:
- An annoying glitch with some Calva REPL commands not working when the cursor was inside the ns form.
- Another annoying glitch wheredisconnecting and then reconnecting a REPL didn’t work
Giving myself a JavaScript REPl with Joyride
As a not-too-frequent user of JavaScript, I often find myself lacking an easy way to experiment with JS code, especially in the way I am used to being able to experiment with Clojure code. I decided to use Joyride for it, and created a script that gives me a JavaScript REPL, right there in VS Code. It’s still very simple, and I plan to return to it, making it a bit more sophisticated, but it is already pretty useful.
- Joyride Examples entry: Give yourself a JavaScript REPL
Polylith Real World example in the browser
When helping Joakim Tengstrand with feedback on an article about Polylith (pending), we realized that it would be very good with a way to test Polylith without having to set your machine up for Clojure development. So I created an experience for that, leveraging Gitpod and Furkan Bayraktar’s Real World example app.
- Hack on Real World Polylith in your Browser
- CalvaTV: The Polylith Real World Example, with an IDE Running in The Browser
Related: I also wrote about observing when ChatGPT taught itself about Polylith from only a single diagram from that coming article.
Image composition using Babashka & Membrane
But not together. Though enabling using Membrane to Babashka does present itself as something I might try to do one of these days.
Some venturing into image and text composition lead me to two different solutions. One invloving ImageMagick and Babashka, plus it had me create a missing Docker image. And one involving the super exciting Clojure UI library, Membrane:
- Imagemagick + Pango + Babashka:
- Write up: ImageMagick + Pango + Babashka = ??
- CalvaTV: Interactive Shell Scripting with Babashka
- Docker image cospaia/magick-pango-babashka
- Membrane
- Example project: REPL Playground for adding back article info to links shared on X/Twitter
- Write up: Pending…
- CalvaTV: Interactive Programming with Clojure & Membrane
Peter Taoussanis
Open source update
A big thanks to Clojurists Together, Nubank, lambdaschmiede, and other sponsors of my open source work!
Recent work
This was another productive period with 100% of my time going to open source. Highlights:
- The usual support, hotfixes, etc.
- 14 library releases including:
-
Carmine v3.3.0 with the first stable release of a significantly improved message queue architecture and API.
-
Nippy v3.3.0 with updated benchmarks, efficiency improvements, and experimental transducer support.
-
Nippy v3.4.0-beta1 with significant compression performance improvements, support for Zstandard, and a much improved
freezable?util. -
http-kit v2.8.0-beta2 with auto Java 21+ virtual threads for both client+server, extensive new benchmark suite and results, early support for Ring-style async handlers, and more.
-
- Continued work on Tempel, an upcoming data security framework for Clojure.
- Continued work on Telemere, an upcoming structured telemetry library for Clojure/Script.
- Did an interview with Daniel Compton to be published soon.