December 2021 Monthly Update

By Alyssa Parado

Happy New Year everyone! I hope all of you had a wonderful holiday season with your loved ones. Below are the recent project updates to wrap up the end of the year 2021.

Dependabot Core

The dependabot core project has successfully been quick-started by having a technical conversation with Daniel.

We rapidly figured out that the people at github are currently considering a major rewrite/upgrade of the current apis, one that wouldn’t “require us to write a whole bunch of ruby” we realized later on.

Shortly after, Github’s stakeholders were contacted involved in the process of figuring out the best way to build the system. I also made sure to create a slack channel on the clojurians slack for communications on this.

We had a discussion with the GitHub Dependabot team, they’re working on a new integration path which will be a lot easier for us to integrate against. The current plan is to review this new API sometime in Q1 2022.

For the next weeks, we’re hoping to understand where the dependabot team is heading towards in terms of designs, and hopefully be able to tag along and start writing code that would benefit from the new apis. I’m also hoping to be able to involve as many people as possible in the work.

Clojure LSP

release 2021.11.16-16.52.14

This release was focused mostly on housekeeping, minor fixes and improvements to keep features more mature and stable for most cases. We had huge improvements on keywords completion, completion snippets improvements adding documentation and other details to common clojure.core snippets, code actions tune and more. One of the new features was the ability to suggest require an already refer required before in other namespace, a very requested feature.

Here is the changelog of this release:

release 2021.12.01-12.28.16

This was a important release for community, a lot of new features we added, the main highlights are: It’s possible to generate stubs for specific namespaces, this is a huge step for clojure-lsp as now it’s possible to get most clojure-lsp features working even for closed source libraries like datomic.api. There are new code actions like Sort map to sort a clojure map keys alphabetically and Create function which creates a unknown public function on the specified namespace or even create the namespace and require it automatically if doesn’t exist yet. We improved the deps.edn source-path discovery, improving support mostly for mono-repo projects like polylith!

Here is the changelog of this release:

Typed Clojure

The goal of this project funded by Clojurists Together is to improve static type error messages in Typed Clojure, specifically to replace expanded code in error messages with surface-level syntax.

In the first half of the project (last update), I concentrated on three main areas:

  1. Increase direct support for problematic clojure.core macros
  2. Improve error messages for inlining functions
  3. Identify classes of implementation quirks in core Clojure macros to prepare for potential typing rules

In the second half (this update), I:


I haven’t been able to work near as much this quarter as the previous one (where I worked too much to finish everything) and I couldn’t manage to finish the big task “Custom commands” (issue 113) but is working on it.

These tasks are finished but I will wait with a release till issue 133 is finished:

These tasks are finished but I will wait with a release till issue 133 is finished:

Holy Lambda

Version 0.6.0

Finally, I’ve removed the mandatory download of dependencies to the local .holy-lambda directory. Previously both deps.edn and bb.edn required a special :mvn/local-repo keyword pointing to .holy-lambda directory to compile the project in Docker context or to pack babashka dependencies into deployable zip. Now uberjaring Clojure sources happen without Docker. Additionally, bb hl:babashka-sync packs babashka dependencies via a combination of bb uberjar and unzip. Thanks to packaging changes, it will be easier to cache dependencies in CI by pointing to standard $HOME/.m2 directory. It’s also possible to use polylith now since HL stopped requiring mounting local dependencies in the Docker context. Moreover, packaging changes allowed me to reduce the deployment artifact size for babashka.

I’m also pleased to announce a new extension for Holy Lambda request/response model that is holy-lambda-ring-adapter. The adapter supports the Ring request/response specification. Users may now utilize an adapter to run full-featured Ring applications on AWS Lambda. To boost productivity for API Lambda development, one can plug in an adapter with Jetty instead of relying on slow AWS Lambda API emulators.

AWS recently announced an AWS Lambda support for ARM-based processors. Running code on Graviton2 is beneficial for the users since both the cost per 1M invocations and the cold start time are lower. I’ve introduced a new holy-lambda-builder images hosted in Github Registry with the support to both ARM64 (aarch64) and AMD64 architectures. Furthermore, HL works now great with M1-powered Macs and aarch64 based builder images.

Babashka backend layers for each architecture are available in AWS Serverless Repository:

Version 0.6.1

Holy Lambda now automatically parses the inner body of the event according to content-type to :body-parsed field. I’ve bumped the inner babashka dependency in the backend layer to version 0.6.3.

Version 0.6.2

The new version brings some improvements in tasks and babashka backend. Users can now update tasks to the latest stable revision by invoking the bb hl:update-bb-tasks command. I was also able to speed up the babashka backend by removing the costly classpath calculation in the init step by taking into account the recent changes to packaging.

Babashka’s backend layer now also doesn’t depend directly on holy-lambda.

Why it’s important?


Hello fellow clojurians!

The beta release of Clojurians log v2 is live at: 🦄 😊

Source code:

The initial goal we had with clojurians=log-v2 was mostly around improved full text searching. But as we all know the clojurians slack was sponsored for a paid version for the next 1 year (thanks to all who got this done!) which means our direction has to change a little.

Although full text search will be available and working on the v2, we would like to focus more on other parts of the app now and find ways to make the logs more usefull because paid slack already does search very well.

With that said the beta release now had the following work put into it:

I would like to extend immense gratitude to the clojurists-together team and the clojure community for helping us get here.

So what’s next? We do have a near-future roadmap of things which should land in very soon:

After that, there are tons more ideas listed on the repo which should keep us busy throughout the next year! Super humbled and excited to continue working on this 🙏😊

Cheers and Happy New Years everyone 🌟🎄

Mitesh (@oxalorg)


Part 2/3 by Tommi Reiman.

Done Stuff


Zillion things to do and 2 months to go. Currently working on destructuring parser to enable first-class support inline typehints and to support inferring of function schemas from vanilla Clojure/Script. Seems like the easy features are all done, just the hard ones left :)




Hello friends. I hope you had a pleasant holiday season. It’s been an interesting 45 days for PCP. I’m in two minds about the progress to date. Hammock time overtook hand on keyboard time. The change was quite uncomfortable but I think overall better for the project.

Initially my thinking was to add functionality like the firebase-cli with something along the lines of pcp deploy as well as something like heroku where git push pcp would trigger a deploy. These two approaches are critical in the absence of container based deploys. They are however (in my estimation) inferior if containerized deploys are possible. I spent a fair bit investigating both.

Both of these issues are eliminated by connecting the pcp docker images and the project repository directly to DigitalOcean or Heroku (or any other app platform) as you get the the benefits of the $5 VPS (low price) without the downside (managing the infra).

After coming this conclusion improving the CLI became a lot more straight forward. The CLI is now easier to maintain and the end user can create project from the CLI directly in a manner that allows the project to be deployed to DigitalOcean directly.

There are two task I need to complete as part of Clojurists Together funding specifically the new documentation and the deployment to Heroku so our end user isn’t locked in to DigitalOcean. I expect to complete these in the next week or so.

So what’s next? This update is the last one as part of the Clojurists Together funding. It’s not the end of PCP though. I used PCP to build a simple In Memoriam during the last quarter. I now want to use PCP in anger, perhaps in e-commerce to really stress test it. I imagine I’ll pick up some rough edges and bugs in the process.

It’s been real. Stay frosty.


Bozhidar Batsov

In the past couple of months I’ve achieved the following major objectives:

Some smaller achievements from this period:

Going forward I’ll need to update Leiningen for nREPL (mostly to support starting a server listening to an Unix socket), solidify the API specs for nREPL and cider-nrepl and continue to polish the new CIDER functionality. If I have enough time and inspiration I might revisit sayid for a bit as well. Thanks to everyone for your support!

Dragan Djuric

The main objective during November and December was to create a cuDNN-based GPU implementation of Deep Diamond’s support for advanced neural networks developed on the CPU in the previous two months. Previously, Deep Diamond’s cuDNN engines supported fully connected layers, convolutional layers, and a bunch of supporting infrastructure for effective learning, including access at different abstraction tiers, from lowest, tensor routines level, to automatic network construction from pure, simple, Clojure functions. Tensor operations were quite well developed, too. This high level API only supported sequential architecture of layers (which is quite useful) but not branching that would enable advanced direct acyclic graphs, which is used in many modern networks. This required matching implementation of relevant lower level concepts that I’ve developed on DNNL, but backed by cuDNN. While working on this, I fixed bugs that slipped previously, improved general code, and tests.

The following features were developed for cuDNN engine:

- Implementation of Bach Normalization (API, functions, layer, and the cuDNN backend)
- Concatenation (API, functions, layer, cuDNN backend)
- Branching (API, functions, layer, cuDNN backend)
- Sum (API, functions, layer, cuDNN)
- Split (API, functions, layer, cuDNN)
- Parallel network branches support for cuDNN
- Tested cuDNN support for directed acyclic graphs in high-level API
- Improved some internal code.
- Several important bugfixes
- Tests for all this
- Research (literature, theory) in the background

Although that work finely summed up by the end of the month, I’m still not satisfied with the polish, so I decided not to rush the release before doing further high-level tests. I expect to uncover some more subtle bugs (of course, whoever wants to experiment, can easily clone the repository from GitHub and build their own snapshot). I plan to tackle this in January, since I wouldn’t be able to do more serious deep work during that time due to numerous classes and exams.

I hope that in February I’ll be able to have more uninterupted periods for the next major theme (still undecided what will come first: Neanderthal sparse matrices, Neanderthal FFT, or some work on Deep Diamond support for recurrent networks). Anyway, the next big chunk of work in February, March, and/or April should be Recurrent Networks support, as the last major feature that was missing from DD.

In addition to this, I devoted lots of time to learning skills in preparation for a new Clojure project. There’s a long path ahead, so it might be many months until I’m ready to actually build and release something, but I hope that this long shot will be interesting to many Clojurists, and hopefully many not(yet)-Clojurists. (I realize that this sentence is verbatim copy/paste from the last report, but it’s the same long-term work that the sentence describes accurately. ;)

Thomas Heller

Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).

Current shadow-cljs version: 2.16.10 Changelog

Notable Updates


(defn ^:dev/asset-load css-updated! [path node]
  (js/console.log "css-updated!" path node))

;; path is the path used in <link href="...">
;; node is the actual link DOM node

David Nolen



Nikita Prokopov

Hi, this is Niki Tonsky and I have been writing lots of Clojure for the past two months!



This first UI demostrates:

Clojure Sublimed






To wrap up 2021, I build this simple interactive demo in Humble UI watch it here

Happy New Year!