← Home

Open source update

A big thanks to Clojurists Together, Nubank, and other sponsors of my open source work! I realise that it’s a tough time for a lot of folks and businesses lately, and that sponsorships aren’t always easy 🙏

- Peter Taoussanis

2025 Jul - Aug

Hi folks! 👋 Will try keep today’s update brief.

Recent work

Sente

(Sente is a realtime web comms library for Clojure/Script)

Sente v1.21.0-RC1 is out now. v1.21 is a big release with improved performance, improved reliability, improved logging (via Trove) and new high-speed binary serialization that supports Clojure’s rich data types.

The binary serialization is still marked as experimental to be safe, though I have it running in production myself. This is a nice improvement, especially for folks with larger payloads and/or with mobile users that might be sensitive to network speed/limits.

To try the new serialization: just give (taoensso.sente.packers.msgpack/get-packer) to your client and server constructor calls. No extra deps needed.

Truss

(Truss is a micro toolkit for Clojure/Script errors)

Truss v2.2.0 is out now with some usability improvements, and a new demo video to show what the library can do. In short: the goal is to help improve the Clojure/Script error experience. Almost all of my Clojure/Script code uses Truss in some way.

The video should be a decent starting point if you’re not familiar with Truss.

Trove and Telemere

Trove is a modern logging facade for Clojure/Script. Telemere is the successor to Timbre.

Trove v1.0 final and Telemere v1.1.0 are out now with some usability improvements.

How do these libraries relate?

  • Trove is intended for library authors that want to emit rich logging (incl. un/structured logging) without forcing their users to adopt any particular backend (like TelemereTimbreμ/logtools.loggingSLF4J, etc.).

  • Telemere is intended for general users that want to emit rich logging (incl. un/structured logging) from their own applications.

The two share the same map-oriented logging API:

(trove/log!    {:level :info, :id :auth/login, :data {:user-id 1234}, :msg "User logged in!"})
(telemere/log! {:level :info, :id :auth/login, :data {:user-id 1234}, :msg "User logged in!"})

Both support traditional and structured logging:

  • Traditional logging outputs strings (messages).
  • Structured logging in contrast outputs data. It retains rich data types and (nested) structures throughout the logging pipeline from logging callsite → filters → middleware → handlers.

A data-oriented pipeline can make a huge difference - supporting easier filteringtransformation, and analysis. It’s also usually faster, since you only pay for serialization if/when you need it. In a lot of cases you can avoid serialization altogether if your final target (DB, etc.) supports the relevant types.

So the structured (data-oriented) approach is inherently more flexible, faster, and well suited to the tools and idioms offered by Clojure and ClojureScript.

Other stuff

Other misc releases included:

As usual please see the linked release notes for details.

Upcoming work

Next couple months I expect my focus to include Tempel and likely Carmine, both of which are long overdue for some love :-)

Cheers everyone!