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:




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

#28

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

#29

Docs here

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


Alabaster Dark        
Alabaster Light        

Figlet banners:

Docs here

Bling 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

#30

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

#27

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

#15

Deeper hiccup support for a cleaner template syntax

'(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:

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:

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):

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:

  1. Added support for manual memory management via cpp/new and cpp/delete
  2. Added support for explicit C++ bools via cpp/true and cpp/false
  3. Added complex type literals via (cpp/type "std::map<std::string, int>")
  4. Added opaque boxing of native values via cpp/box and cpp/unbox
  5. 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!