# Learning Resources

**URL:** https://clojureverse.org/c/learning-resources/36.md

[Latest](https://clojureverse.org/latest.md) · [Categories](https://clojureverse.org/categories.md) · [Tags](https://clojureverse.org/tags.md)

---

## [About the Learning Resources category](https://clojureverse.org/t/about-the-learning-resources-category/648)

<div class="topic-metadata">

**Author:** [@plexus](https://clojureverse.org/u/plexus)\
**Replies:** 0\
**Last updated:** [November 5, 2017, 4:23pm UTC](https://clojureverse.org/t/about-the-learning-resources-category/648 "2017-11-05T16:23:23Z")

</div>

Everyone has something to learn. This is the place to share learning resources you like or would recommend. You can indicate the level with tags like #beginner, #intermediate, or #advanced.

---

## [Workshop: Build Backends at Any Scale With Rama — taught by Nathan Marz (June 4, 2026)](https://clojureverse.org/t/workshop-build-backends-at-any-scale-with-rama-taught-by-nathan-marz-june-4-2026/14904)

<div class="topic-metadata">

**Author:** [@jacekschae](https://clojureverse.org/u/jacekschae)\
**Replies:** 0\
**Last updated:** [May 12, 2026, 11:34am UTC](https://clojureverse.org/t/workshop-build-backends-at-any-scale-with-rama-taught-by-nathan-marz-june-4-2026/14904 "2026-05-12T11:34:25Z")

</div>

Hi Clojurians I’m really excited that Nathan Marz (@nathanmarz) is teaching a live 4-hour Rama workshop through ClojureStream on June 4, 2026 (17:00–21:00 UTC / 19:00–23:00 CEST) If you don’t know Nathan: he created Ra…

---

## [The power of the :deps alias](https://clojureverse.org/t/the-power-of-the-deps-alias/14606)

<div class="topic-metadata">

**Author:** [@seancorfield](https://clojureverse.org/u/seancorfield)\
**Replies:** 0\
**Last updated:** [August 10, 2025, 6:16pm UTC](https://clojureverse.org/t/the-power-of-the-deps-alias/14606 "2025-08-10T18:16:27Z")

</div>

Maybe you’ve seen clojure -X:deps tree? What else can -X:deps do for you? It’s all built into the Clojure CLI: An Architect’s View: The power of the :deps alias

---

## [Getting started video with Noj v2, VSCode, Calva, and Clay for data analysis](https://clojureverse.org/t/getting-started-video-with-noj-v2-vscode-calva-and-clay-for-data-analysis/11375)

<div class="topic-metadata">

**Author:** [@daslu](https://clojureverse.org/u/daslu)\
**Replies:** 0\
**Last updated:** [May 2, 2025, 9:33pm UTC](https://clojureverse.org/t/getting-started-video-with-noj-v2-vscode-calva-and-clay-for-data-analysis/11375 "2025-05-02T21:33:56Z")

</div>

@timothypratley and I recorded an intro video demonstrating the use of Noj, Calva, the new Calva Power Tools extension, and Clay for data analysis. Many thanks to @PEZ and @timothypratley for the brillian…

---

## [End-to-end tests in Clojure with Etaoin and Testcontainers](https://clojureverse.org/t/end-to-end-tests-in-clojure-with-etaoin-and-testcontainers/11165)

<div class="topic-metadata">

**Author:** [@abogoyavlensky](https://clojureverse.org/u/abogoyavlensky)\
**Replies:** 0\
**Last updated:** [January 25, 2025, 2:10am UTC](https://clojureverse.org/t/end-to-end-tests-in-clojure-with-etaoin-and-testcontainers/11165 "2025-01-25T02:10:24Z")

</div>

---

## [Clojure Book Page](https://clojureverse.org/t/clojure-book-page/11087)

<div class="topic-metadata">

**Author:** [@Hugo](https://clojureverse.org/u/Hugo)\
**Replies:** 1\
**Last updated:** [December 18, 2024, 6:26pm UTC](https://clojureverse.org/t/clojure-book-page/11087 "2024-12-18T18:26:49Z")

</div>

Hi everyone! I’m sure that a responsible for the Clojure web might have to respond to my specific question, as I guess the Clojure Book Page cannot be modified by anyone. I’m currently writing a book on how to create a…

---

## [When to use \`assert\`?](https://clojureverse.org/t/when-to-use-assert/11044)

<div class="topic-metadata">

**Author:** [@dave.liepmann](https://clojureverse.org/u/dave.liepmann)\
**Replies:** 9\
**Last updated:** [December 2, 2024, 9:27am UTC](https://clojureverse.org/t/when-to-use-assert/11044 "2024-12-02T09:27:36Z")

</div>

A short guide: When to use assert? Written with JVM Clojure in mind but if you press me I’ll admit I believe it applies across dialects. Feedback welcome.

---

## [Building a web app with Replicant - an example/template](https://clojureverse.org/t/building-a-web-app-with-replicant-an-example-template/10899)

<div class="topic-metadata">

**Author:** [@PEZ](https://clojureverse.org/u/PEZ)\
**Replies:** 6\
**Last updated:** [November 22, 2024, 6:22pm UTC](https://clojureverse.org/t/building-a-web-app-with-replicant-an-example-template/10899 "2024-11-22T18:22:45Z")

</div>

I am very inspired by Christian Johansen’s takes on about everything todo with programming. If you haven’t watched this talk, you have missed something: Christian is the creator of many libraries and tools helping peo…

---

## [Idiomatic Clojure error handling](https://clojureverse.org/t/idiomatic-clojure-error-handling/11003)

<div class="topic-metadata">

**Author:** [@dave.liepmann](https://clojureverse.org/u/dave.liepmann)\
**Replies:** 0\
**Last updated:** [November 6, 2024, 9:40am UTC](https://clojureverse.org/t/idiomatic-clojure-error-handling/11003 "2024-11-06T09:40:48Z")

</div>

Someone asks “how do I handle errors in Clojure – is X idiomatic?” on Clojurians every couple months. This stirred me to write up something basic: Idiomatic errors in Clojure Nothing earth shattering, but maybe it’ll he…

---

## [Behavioral Programming in Clojure](https://clojureverse.org/t/behavioral-programming-in-clojure/10956)

<div class="topic-metadata">

**Author:** [@thomascothran](https://clojureverse.org/u/thomascothran)\
**Replies:** 1\
**Last updated:** [October 7, 2024, 4:06am UTC](https://clojureverse.org/t/behavioral-programming-in-clojure/10956 "2024-10-07T04:06:56Z")

</div>

Behavioral programming is a relatively new programming paradigm pioneered by David Harel, the creator statecharts. It has very solid theoretical foundations, and lends itself to formal proofs. But it also is intended to …

---

## [Top-Down, Imperative Clojure Architectures](https://clojureverse.org/t/top-down-imperative-clojure-architectures/10844)

<div class="topic-metadata">

**Author:** [@thomascothran](https://clojureverse.org/u/thomascothran)\
**Replies:** 6\
**Last updated:** [August 1, 2024, 1:15pm UTC](https://clojureverse.org/t/top-down-imperative-clojure-architectures/10844 "2024-08-01T13:15:23Z")

</div>

I’ve written an article on the problem with imperative-style architectures in Clojure. A preview: When I first became interested in functional programming, a more experienced engineer told me: “you know functional pro…

---

## [New Blog Post: Lisp's grandfather paradox](https://clojureverse.org/t/new-blog-post-lisps-grandfather-paradox/10861)

<div class="topic-metadata">

**Author:** [@Daniel\_Szmulewicz](https://clojureverse.org/u/Daniel_Szmulewicz)\
**Replies:** 0\
**Last updated:** [July 30, 2024, 5:38pm UTC](https://clojureverse.org/t/new-blog-post-lisps-grandfather-paradox/10861 "2024-07-30T17:38:17Z")

</div>

Can we leverage Lisp to build an intuition about mathematical theories? I think so. If we translate the formulas of a mathematical system in Lisp code, we gain in at least two ways: 1, Readability: S-expressions are mor…

---

## [Relational Mapping and rt.postgres](https://clojureverse.org/t/relational-mapping-and-rt-postgres/10793)

<div class="topic-metadata">

**Author:** [@zcaudate1](https://clojureverse.org/u/zcaudate1)\
**Replies:** 2\
**Last updated:** [July 9, 2024, 3:07am UTC](https://clojureverse.org/t/relational-mapping-and-rt-postgres/10793 "2024-07-09T03:07:10Z")

</div>

I’d like to start open sourcing tooling related to postgresql development in order to attract opportunities to what I’m calling Relational Mapping. I do think my approach is quite relevant in terms of helping map out sys…

---

## [Deploying a full-stack Clojure app with Kamal on a single server](https://clojureverse.org/t/deploying-a-full-stack-clojure-app-with-kamal-on-a-single-server/10756)

<div class="topic-metadata">

**Author:** [@abogoyavlensky](https://clojureverse.org/u/abogoyavlensky)\
**Replies:** 0\
**Last updated:** [May 29, 2024, 11:12pm UTC](https://clojureverse.org/t/deploying-a-full-stack-clojure-app-with-kamal-on-a-single-server/10756 "2024-05-29T23:12:43Z")

</div>

---

## [Clojure: managing throughput with virtual threads](https://clojureverse.org/t/clojure-managing-throughput-with-virtual-threads/10720)

<div class="topic-metadata">

**Author:** [@andersmurphy](https://clojureverse.org/u/andersmurphy)\
**Replies:** 0\
**Last updated:** [May 6, 2024, 10:32am UTC](https://clojureverse.org/t/clojure-managing-throughput-with-virtual-threads/10720 "2024-05-06T10:32:56Z")

</div>

Wrote this blog post over the weekend. Virtual threads are actualy quite fun to work with. I’m using CompletionService to implement unordered paralelism and Semaphore to implement token bucket rate limiting. So far it’…

---

## [The Anatomy of a HTTP server](https://clojureverse.org/t/the-anatomy-of-a-http-server/10709)

<div class="topic-metadata">

**Author:** [@Daniel\_Szmulewicz](https://clojureverse.org/u/Daniel_Szmulewicz)\
**Replies:** 0\
**Last updated:** [April 28, 2024, 7:10am UTC](https://clojureverse.org/t/the-anatomy-of-a-http-server/10709 "2024-04-28T07:10:58Z")

</div>

Greetings fellow Clojurians, The upside of looking for work is that it leaves time to be creative. Over the course of a week, I dedicated my mornings - when I’m at peak mental clarity - to creating content for my blog. …

---

## [Functional Design: Principles, Patterns and Practices](https://clojureverse.org/t/functional-design-principles-patterns-and-practices/10354)

<div class="topic-metadata">

**Author:** [@jgomo3](https://clojureverse.org/u/jgomo3)\
**Replies:** 10\
**Last updated:** [October 16, 2023, 8:28pm UTC](https://clojureverse.org/t/functional-design-principles-patterns-and-practices/10354 "2023-10-16T20:28:26Z")

</div>

Brand new book based on Clojure from Robert C. Martin (Uncle Bob). Looks like it is not for beginners and will help the transition to Functional Programming for the experienced Object Oriented programmers.

---

## [Polling with core.async](https://clojureverse.org/t/polling-with-core-async/10368)

<div class="topic-metadata">

**Author:** [@Daniel\_Szmulewicz](https://clojureverse.org/u/Daniel_Szmulewicz)\
**Replies:** 1\
**Last updated:** [October 16, 2023, 7:23pm UTC](https://clojureverse.org/t/polling-with-core-async/10368 "2023-10-16T19:23:52Z")

</div>

Polling with core.async Here is the video. Instead of my usual screencasts, I went for a stroll and recorded myself moving about. It is said that walking facilitates thinking – and, presumably, talking. Aristotle and h…

---

## [Integrating generative AI features in Clojure projects](https://clojureverse.org/t/integrating-generative-ai-features-in-clojure-projects/10227)

<div class="topic-metadata">

**Author:** [@Daniel\_Szmulewicz](https://clojureverse.org/u/Daniel_Szmulewicz)\
**Replies:** 2\
**Last updated:** [August 9, 2023, 12:39pm UTC](https://clojureverse.org/t/integrating-generative-ai-features-in-clojure-projects/10227 "2023-08-09T12:39:28Z")

</div>

This video show how to integrate service offering by the likes of OpenAi and Cohere in Clojure projects. Its aim is educational as it deconstructs the process into simple steps that anyone can duplicate and try for onese…

---

## [Signals vs Streams](https://clojureverse.org/t/signals-vs-streams/9840)

<div class="topic-metadata">

**Author:** [@dustingetz](https://clojureverse.org/u/dustingetz)\
**Replies:** 6\
**Last updated:** [July 22, 2023, 7:21pm UTC](https://clojureverse.org/t/signals-vs-streams/9840 "2023-07-22T19:21:32Z")

</div>

Blog post - Signals vs Streams I actually wrote this for HN but thought it might make a good discussion here. Tons of stuff didn’t make the cut, such as discussion of discrete/continuous mental models, how to convert be…

---

## [BrickSort in Java and Kotlin with Clojure interop!](https://clojureverse.org/t/bricksort-in-java-and-kotlin-with-clojure-interop/10156)

<div class="topic-metadata">

**Author:** [@Daniel\_Szmulewicz](https://clojureverse.org/u/Daniel_Szmulewicz)\
**Replies:** 0\
**Last updated:** [July 3, 2023, 7:25am UTC](https://clojureverse.org/t/bricksort-in-java-and-kotlin-with-clojure-interop/10156 "2023-07-03T07:25:55Z")

</div>

Another video about the Meyvn polyglot REPL environment. This time we look at a real-world code example, BrickSort, with two reference implementations courtesy of the open source library The Algorithms. In the Java versi…

---

## [An opinionated list of excellent Clojure learning materials](https://clojureverse.org/t/an-opinionated-list-of-excellent-clojure-learning-materials/9585)

<div class="topic-metadata">

**Author:** [@ssrihari](https://clojureverse.org/u/ssrihari)\
**Replies:** 4\
**Last updated:** [January 7, 2023, 10:26pm UTC](https://clojureverse.org/t/an-opinionated-list-of-excellent-clojure-learning-materials/9585 "2023-01-07T22:26:44Z")

</div>

These resources (articles, books, and videos) are useful when you’re starting to learn the language, or when you’re learning a specific part of the language. This an opinionated list, no doubt. I’ve compiled this list fr…

---

## [Using Joyride for Advent of Code](https://clojureverse.org/t/using-joyride-for-advent-of-code/9592)

<div class="topic-metadata">

**Author:** [@PEZ](https://clojureverse.org/u/PEZ)\
**Replies:** 1\
**Last updated:** [December 6, 2022, 10:36am UTC](https://clojureverse.org/t/using-joyride-for-advent-of-code/9592 "2022-12-06T10:36:44Z")

</div>

An alternative environment for using Clojure to solve Advent of Code problems is Joyride, an extension to Visual Studio Code that lets you script the editor like Emacs users script their editor. Here’s a template/exampl…

---

## [Found this juxt/xtdb blog on repl + minecraft](https://clojureverse.org/t/found-this-juxt-xtdb-blog-on-repl-minecraft/9359)

<div class="topic-metadata">

**Author:** [@magnus0re](https://clojureverse.org/u/magnus0re)\
**Replies:** 0\
**Last updated:** [September 16, 2022, 8:01pm UTC](https://clojureverse.org/t/found-this-juxt-xtdb-blog-on-repl-minecraft/9359 "2022-09-16T20:01:22Z")

</div>

Didn’t see this one on here from before, so I though I should share it: JUXT Blog - REPL Driven Minecraft I’m having fun reading it. Quick, simple, to the point, just a bit lacking in the conclusion…

---

## [Demystifying shadow-cljs nREPL connect](https://clojureverse.org/t/demystifying-shadow-cljs-nrepl-connect/9277)

<div class="topic-metadata">

**Author:** [@PEZ](https://clojureverse.org/u/PEZ)\
**Replies:** 2\
**Last updated:** [September 1, 2022, 4:50am UTC](https://clojureverse.org/t/demystifying-shadow-cljs-nrepl-connect/9277 "2022-09-01T04:50:59Z")

</div>

As editor plugins such as Calva and CIDER can add some layers of magic between the user and what’s going on with a Clojure/ClojureScript project, it can be healthy to demystify it some. One way is to perform the dance th…

---

## ["Data-Oriented Programming": Print version is out](https://clojureverse.org/t/data-oriented-programming-print-version-is-out/9180)

<div class="topic-metadata">

**Author:** [@Yehonathan\_Sharvit](https://clojureverse.org/u/Yehonathan_Sharvit)\
**Replies:** 0\
**Last updated:** [August 1, 2022, 4:10am UTC](https://clojureverse.org/t/data-oriented-programming-print-version-is-out/9180 "2022-08-01T04:10:20Z")

</div>

Data-Oriented Programming presents the underlying principles of Clojure’s approach to data. The originality of the book is that it presents the principles in a language-agnostic way in the context of a production system,…

---

## [Clojure support on Leetcode](https://clojureverse.org/t/clojure-support-on-leetcode/9171)

<div class="topic-metadata">

**Author:** [@Liverm0r](https://clojureverse.org/u/Liverm0r)\
**Replies:** 3\
**Last updated:** [July 30, 2022, 11:16pm UTC](https://clojureverse.org/t/clojure-support-on-leetcode/9171 "2022-07-30T23:16:11Z")

</div>

Please, help me get more upvotes so they notice that Clojure has some demand. Leetcode is a great service when it comes to solving algorithmic tasks. I like it particularly for these reasons: Tasks descriptions are …

---

## [Rersources on building distributed systems using Clojure?](https://clojureverse.org/t/rersources-on-building-distributed-systems-using-clojure/9045)

<div class="topic-metadata">

**Author:** [@yuu](https://clojureverse.org/u/yuu)\
**Replies:** 4\
**Last updated:** [June 26, 2022, 8:58pm UTC](https://clojureverse.org/t/rersources-on-building-distributed-systems-using-clojure/9045 "2022-06-26T20:58:52Z")

</div>

I want resources on building distributed systems with Clojure (preferably practical ones), which supposedly should be good with that. Unfortunately I’ve found only few material on that topic (and the only book I found th…

---

## [The hauting problem of collapsing rowspanned table cells](https://clojureverse.org/t/the-hauting-problem-of-collapsing-rowspanned-table-cells/9003)

<div class="topic-metadata">

**Author:** [@Linus\_Ericsson](https://clojureverse.org/u/Linus_Ericsson)\
**Replies:** 0\
**Last updated:** [June 4, 2022, 10:35am UTC](https://clojureverse.org/t/the-hauting-problem-of-collapsing-rowspanned-table-cells/9003 "2022-06-04T10:35:26Z")

</div>

I will present a problem which haunted me for some time, and made me reach for overly complex tools and solutions without really thinking the problem through. The problem is to render an HTML table, using hiccup tag syn…

---

## [Clojure Nails - daily short youtube streams](https://clojureverse.org/t/clojure-nails-daily-short-youtube-streams/8942)

<div class="topic-metadata">

**Author:** [@Ivana](https://clojureverse.org/u/Ivana)\
**Replies:** 0\
**Last updated:** [May 10, 2022, 1:53pm UTC](https://clojureverse.org/t/clojure-nails-daily-short-youtube-streams/8942 "2022-05-10T13:53:19Z")

</div>

Hello! I overcame my embarrassment and started regular short youtube streams called Clojure Nails :grinning: I’l try to make them daily, let’s see how long can I do it. Here is the link on the playlist, enjoy Nail 0. In…

[Next page](https://clojureverse.org/c/learning-resources/36.md?page=1)
