July 2025 Short-Term Q2 Project Updates
By Kathy Davis
This is the July and final project update for four of our Q2 2025 Funded Projects. (Reports for the other two are on a different schedule). A brief summary of each project is included to provide overall context. Thanks everyone for your awesome work!
Jeremiah Coyle: Bling
Add support for using hiccup to style and format messages, a template string syntax to style and format messages, and 1-3 additional formatting templates for callouts, headers, and points-of-interest.
Brandon Ringe: CALVA
A new REPL output view for Calva, which is a webview in VS Code. The webview will allow us to add more rich features to the output webview, while also providing better performance.
Bozhidar Batsov: CIDER
Provide continued support for CIDER, nREPL and the related libraries (e.g. Orchard, cidernrepl, etc) and improve them in various ways.
Jeaye Wilkerson: Jank
Build jank’s seamless C++ interop system.
Bling: Jeremiah Coyle
Q2 2025 $2k. Report No. 2, Published 14 July 2025
I’m happy to report that all of the Q2 primary and secondary goals were completed. In addition, some tertiary goals and user requests that popped up along the way were addressed. Many thanks to Clojurists Together for supporting this work!
Summary of goals achieved in Q2:
-
Primary goals
- Enable Hi-Fidelity, theme-able, colorized, structural printing of values via Fireworks. #29. Docs
- Utilize
callout
to create a specialized template for Malli validation errors. #28. Docs - Figlet banners with lolcat-style gradient coloring. Docs
- Opt-in optimization for enhanced contrast in light or dark terminals. #30. Docs
- Respect
NO_COLOR
env var #27. Docs
-
Secondary goals
- Add enhanced support for using hiccup to style and format messages. #15
- Create 1-3 additional formatting templates for callouts, headers, and points-of-interest.
- Add/update documentation about how to leverage Bling to create great-looking warnings and errors.
- Tertiary goals that arose in the course of solving the above
- Enhanced test suite for JVM Clojure and Node (JS)
- Enhanced test suite for Babashka
- Hifi printing support for custom datatypes whose size cannot be determined #69
The latest release is v0.8.7
, which features most of the enhancements listed above.
Detailed descriptions and screenshots of the above features:
Specialized template for Malli validation errors
This is experimental, with more work to be done on optimizing for disjunctions and cases with multiple errors on same value. Docs here
Bling offers bling.explain/explain-malli
to present Malli validation errors:

The above code would print the following:

You can also pass an option trailing options map to customize the appearance of the printed output. In the example below, we are leaving out the display of the schema within the callout block:

The above code would print the following:

High Fidelity Printing
Bling offers bling.hifi
for colorized pretty-printing of values. bling.hifi/hifi
will return an ansi-sgr decorated string, while bling.hifi/print-hifi
will print such a string.
Under the hood, the formatting/colorizing is achieved with Fireworks.
By default, the theme of this output will be Universal Neutral
.
If you set a valid BLING_MOOD
env var, the theme of the hifi
output will be Alabaster Light
or Alabaster Dark
.
You can choose one of the other available themes by following the instructions in the Fireworks readme and setting up a config.edn
on your system, with a corresponding BLING_CONFIG
env var. This config will also let you control many other aspects of the formatting with the hifi
output.
Check out the other available themes here


Figlet banners:
Docs hereBling now features basic support for composing Figlet ascii-art banners with lolcat-like gradient overlays. Bling ships with a small handful of ported Figlet fonts. The glyph layout implementation is bare-bones and there is currently no support for standard figlet smushing. Figlet banners only work in terminal context (JVM Clojure or Node.js ClojureScript).
Enhanced contrast
Docs here.
You can set a BLING_MOOD
env var to enhance the contrast of Bling-formatted output. Only takes effect on your system, for your eyes only.


Respect NO_COLOR
env var
You can set a NO_COLOR="true"
env var, which will disable any colorization on from any output generated by Bling. The de-colorization only applies locally, for your eyes only. More info on the informal standard.


Enhanced support for hiccup
Deeper hiccup support for a cleaner template syntax
- Utilize
[:br]
tags for line breaks - Introduce a
[:p]
tag, to enclose logical paragraphs and automatically add trailing newlines. - Properly support nesting of styles ala
[:bold "Bold, " [:italic "bold italic, "] [:red "bold red, "] "bold."]
'(require bling.core :refer [print-bling])
(println "\n\n")
(print-bling [:p "First paragraph"]
[:p [:bold
"Bold, "
[:italic "bold italic, "
[:red "bold italic red, "]]
"bold."]]
"Last line")
The above code renders the following:

An initial working implementation of the above is complete on branch 0.9.0
. Next step will be to consider alternate implementations (perf), test, refine, then merge into main branch.
New callout templates
Callout docs here
New callout template with {:theme :minimal}
:


New option :side-label
which may be useful for file info etc.
With {:theme :sideline :label-theme :marquee :side-label "foo.core:11:24"}
:

Enhanced support & improved docs for creating custom and warning callouts
bling.core/callout
now accepts any number of arguments, which makes the templatization a little more flexible:
(defn my-error-callout [{:keys [header body source]}]
(callout {:type :error
:padding-top 1}
header
source
body))
(my-error-callout
{:header "Your header message goes here\n"
:source (point-of-interest
{:type :error
:file "example.ns.core"
:line 11
:column 1
:form '(+ foo baz)
:text-decoration-index 2})
:body (str "The body of your template goes here.\n"
"Second line of copy.\n"
"Another line.")})
The above callout would render like this your terminal emulator:


Hifi printing support for custom datatypes
This was a bug fix + enhancement #69 in the upstream Fireworks lib, which enables the representation of custom datatypes when printing with bling.hifi/hifi
Enhanced test suites
A new suite of tests for both JVM Clojure and Babashka was added. Docs here.
CALVA: Brandon Ringe
Q2 2025 $9k. Report No. 3, Published 13 July 2025
Since the last report, I spent some time adding content reloading support to the output view. By that I mean that when the output view is closed and reopened, and when the VS Code window is reloaded, the output view would reload its contents. However, this became problematic in multiple ways, so I decided to remove the feature in favor of reducing maintenance burden. The benefit of the feature did not outweight the cost of maintaining it, in my opinion. The PR for removing it can serve as a reference for anyone who might want to try implementing the feature in the future.
Here’s the list of changes to the output view that have happened since the last report:
- Reload contents of output view when VS Code window is reloaded
- Reload contents of output view when it’s closed and reopened (without closing VS Code)
- Fix: After VS Code reload a new separate output view is opened on connect when one is already open
- Fix: Output view sometimes opens with broken code highlighting
- Remove content reloading from output view
- Fix: Output view syntax highlighting breaks when it’s dragged into or out of main VS Code window
Thank you to Clojurists Together and its members for supporting this work! I hope Calva users will enjoy using this output view.
CIDER: Bozhidar Batsov
Q2 2025 $9k. Report No. 3, Published 16 July 2025
This month wasn’t as productive as the last two (mostly due to a bit of vacation time and my seasonal allergies draining my energy), but we still made some good progress:
- CIDER 1.19 (“Skiathos”)
- The highlight of this release is that Java source downloading is now enabled by default, as we’re feeling quite confident about its stability
- There are also plenty of small improvements here and there (mostly in the inspector)
- You can now also specify default connection params, which will save you a bit of typing in certain cases
- clojure-ts-mode
- Small improvements to the built-in completion source
- Added the clojure-mode functionality for browsing the Clojure guides and reporting issues
There are a lot more things in progress that I didn’t have manage to get to the finish line (or remained only the realm of research for the time being):
- A new starter configuration for CIDER users (to be released soon)
- I looked into replacing Antora (the docs engine CIDER and friends are using) with mdBook (made popular by Rust)
- I’m on the fence about this and I probably will stick with Antora
- I’ve started work on a couple of blog posts (e.g. the long overdue analysis of the CIDER survey results), but I didn’t manage to finish them. Coming soon, though!
- I’ve encountered a few small blockers while working on removing the hard dependency on clojure-mode in CIDER, but we’ll get there
- I’ve played with some screencast apps to record some new CIDER tutorials and I think I have a winner with which to proceed
Anyways, I plan to drive those over the finish line and once again I’m I’d like to thank the members of “Clojurists Together” for their support of my work on Clojure development tooling. You rock!
Jank: Jeaye Wilkerson
Q2 2025 $9k. Report No. 3, Published 11 July 2025
Hi folks! Thank you so much for the sponsorship this quarter. jank has grown from not being able to reach into C++ at all, in April, to now working with some of the most popular C++ libraries. This past month, the highlights are:
- Added support for manual memory management via
cpp/new
andcpp/delete
- Added support for explicit C++ bools via
cpp/true
andcpp/false
- Added complex type literals via
(cpp/type "std::map<std::string, int>")
- Added opaque boxing of native values via
cpp/box
andcpp/unbox
- Greatly improved stability and portability
Now, at the end of the quarter, jank’s seamless C++ support is incredible. For
all of the details, you can check out the related blog post here:
https://jank-lang.org/blog/2025-07-11-jank-is-cpp/
There’s still so much work to do, so I hope to write to you again next quarter!