r/Clojure

Built a CLI that generates and iterates on full codebases using DeepSeek
▲ 5 r/Clojure+2 crossposts

Built a CLI that generates and iterates on full codebases using DeepSeek

Instead of just scaffolding, it runs a full pipeline:
plan → generate → write → evaluate → (optional) fix → learn

Example:
deep build "Flask app with SQLite"

You can then:

  • update → modify the existing project
  • fix → auto-repair issues using saved context
  • ask → use it as a technical assistant

Each project includes a .deep/ folder with:

  • original task
  • generated plan
  • evaluation results

So the tool can operate with context instead of starting from scratch each time.

Also includes:

  • REPL interface
  • debug mode (logs prompts, tokens, phases)
  • local web UI (can be used from your phone)

Repo:
https://github.com/cynchro/deepseekCLI

Curious how others are handling evaluation + iteration in LLM-based dev tools.

u/Affectionate_Major87 — 12 hours ago
▲ 57 r/Clojure

Clojurists resilience

I used to program in several programming languages, Clojure being one of my (but not only) favorite. Now that I have some acute (brain-related) disease, this is the only one that still really clicks for me ... from installation to running/testing my old code, the personnally-dreaded DevOps tasks included ! (with of course some remaining "muscle" memory). Resilience is not an empty word in this frantically-moving world, thanks Clojure (and by of transitivity, the JVM), I owe you much!

reddit.com
u/fredokun — 1 day ago
▲ 27 r/Clojure+1 crossposts

Dotolist – app that allows one-click collaboration with my grandma (Replicant, fully data-driven)

DISCLAIMER: This is my hobby project which I used to learn Replicant/Nexus (by Chris Johansen) and Datalevin/Datascript and to leverage data-driven approach of Clojure/script and these libraries. It started as a solution to "scratch my itch" problem and was inspired by u/cjno*.*

You might think sharing a handful of editable tasks among a few people would be dead simple in an era of todo-list apps. You'd be wrong.

To my knowledge, no simple tool of this kind exists. There are countless complex apps that want something from you and your collaborators — a subscription fee, registration, an email address, your smartphone's private data, permission to send you notifications, and everything in between.

So I built something my elderly father, wife, kids, and less tech-savvy co-workers can use instantly, without explanation from their phones.

The solution is deliberately minimal: just a URL per collaborator, opened in their browser (desktop or mobile) — no new tools, no new habits. The list is the single source of truth; ongoing communication happens through whatever channels they already use: chat, Messenger, email…

I built https://dotolist.eu for myself as a proof of concept — but friends quickly adopted it, and you're welcome to use it for free. It is NOT vibe-coded. It is love-coded in Clojure. Wrote about my journey here: https://lifehacky.net/dotolist-creating-a-one-click-team-065a18dbeccd (includes some tips and tricks for the app too).

Let me know if you find it useful.

https://preview.redd.it/42hzzu3c7o1h1.jpg?width=1400&format=pjpg&auto=webp&s=0215db74c5a05ca353a67d90701b19e642f47382

reddit.com
u/tombarys — 3 days ago
▲ 15 r/Clojure

built a video transcript search tool in clojure and the whole thing is about 120 lines

i work at a small data consultancy and we have around 160 youtube videos. recorded client workshops, internal tech talks, vendor demos, conference presentations people found useful. all shared through a notion page with links. the usual problem where nobody can find anything because the titles are things like "workshop recording feb 2024" and you'd have to open each video and scrub through it to figure out what was covered.

i built a search tool for it in clojure last weekend.

the backend is a ring server with reitit for routing. one GET endpoint for search, one for serving the html page. postgres for storage with full text search. the queries use honeysql to build the tsvector match and ts_headline calls. i have one namespace for the db queries, one for the handlers, and one for the system startup. the whole server is maybe 80 lines across those three files.

for pulling transcripts i use transcript api:

npx skills add ZeroPointRepo/youtube-skills --skill youtube-full

the ingestion side is a separate namespace with a -main that reads urls from a file and processes them sequentially. clj-http to call the api, cheshire for json parsing, next.jdbc to insert into postgres. each video gets a row with the title, date, speaker, tags, youtube url, and the full transcript. the ingestion namespace is about 40 lines.

the postgres full text search does the heavy lifting. tsvector on the transcript column with a GIN index. the honeysql for the search query ended up being surprisingly clean. something like:

(-> (select :title :date :speaker :youtube_url
            (call :ts_headline "english" :transcript (call :websearch_to_tsquery "english" ?query)))
    (from :videos)
    (where [:raw "transcript_tsv @@ websearch_to_tsquery('english', ?)" query])
    (order-by [(call :ts_rank :transcript_tsv (call :websearch_to_tsquery "english" ?query)) :desc]))

reads better than the raw SQL honestly.

the frontend is a single html page served from resources. plain html with a fetch call to the search endpoint. no clojurescript, no reagent, no build step. just a text input and a div that gets populated with results. the results show the video title, speaker, date, and a snippet of the transcript with the match highlighted.

i deploy it with an uberjar on a VPS we already had. java -jar and it's running. about 160 videos indexed. the consultants use it before client calls to look up whether we've covered a topic before. someone found a recorded workshop from 18 months ago that answered a question a client had asked that week.

the thing i like about this project is that it's small enough to hold the entire codebase in your head but useful enough that people actually open it daily. 120 lines of clojure, a postgres table, and a static html file.

reddit.com
u/straightedge23 — 4 days ago
▲ 16 r/Clojure

I made a typed authoring layer that emits plain Clojure

I’ve been working on Beagle:

https://github.com/tompassarelli/beagle

It’s an experimental typed authoring layer for Clojure. You write Beagle source, it gets parsed and checked by Racket, and then it emits plain .clj files that run on the normal Clojure runtime.

Roughly:

Beagle source
  -> parser
  -> custom type checker
  -> emitted .clj
  -> normal Clojure runtime

It is not Typed Clojure, and it does not change the Clojure runtime. The type checker is custom and lives on the authoring side.

Some pieces that may be interesting:

  • preserves Clojure [] vs () syntax
  • emits ordinary Clojure
  • has about 666 pre-typed Clojure stdlib functions
  • includes an LSP server, typed REPL, and reactive checker daemon
  • has repair tooling that can turn some failures into ranked patch suggestions

The main thing I’m testing is whether this kind of typed layer helps coding agents repair Clojure programs.

Early result: on an ~8,500 LOC test with 35 injected bugs, Beagle got 3/3 full repair correctness. Raw Clojure got 0/3 in the same setup.

I’m not claiming that proves the whole idea yet. The tests need to get larger, cleaner, and harder. But the early result was interesting enough that I figured it was worth sharing.

github.com
u/tompas7989 — 4 days ago
▲ 28 r/Clojure+5 crossposts

I built a Neovim plugin that provides text motions designed for prose. My goal was to bypass blank lines and handle punctuation edge cases. Because it's Neovim, the default Lisp path is Fennel. I started there, but rewrote it as a ClojureScript Node.js remote plugin using shadow-cljs.

To be fair, Fennel has upsides:

  • There's almost zero ceremony between Fennel and Lua.

  • You avoid the async overhead of remote plugins.

But the friction started with the standard library. I was using nfnl, which comes with its own Clojure-inspired functions. The problem is they are not comprehensive enough. I found myself manually implementing things like difference just to process text bounds. Since Fennel's fn doesn't support multi-arity functions the way Clojure does, I decided to write some macros to implement it myself. Naturally, this devolved into yak shaving. The dealbreaker hit when I ran into a bug in Conjure. When the REPL failed on the macros I was trying to build just to make the language usable, that was the straw that broke the yak's back.

So I switched to a ClojureScript remote plugin. But I traded the macro REPL issues of Fennel for a different kind of REPL headache in ClojureScript.

Specifically, I'm having a bizarre issue where println fails inside my async code. It feels nondeterministic. Sometimes the output prints perfectly fine. But other times, println disappears into the void. To see the value, I resort to a hack: I create a fake atom and reset! the value into it. That works. But if I try to add a watch to that atom to print the updated value, that doesn't print either!

Does anyone have any idea why println is getting swallowed in this async Neovim context?

If anyone has any other feedback, I'd be happy to hear it.

u/8ta4 — 5 days ago
▲ 46 r/Clojure+2 crossposts

stube: a Seaside-style component framework on top of Datastar (personal research project)

I just put the docs on a small Clojure framework I've been hacking on, **stube**. It's a personal research project, not a product — somewhere I'm working out an idea about web apps that has pulled at me for twenty years.

Short version: components are plain maps of pure functions, the conversation is a value, handlers return effects, and one component can *call* another and read its *answer* like a return value (Seaside / UCW lineage). The wire is Datastar (SSE + morph by id); the implementation is a small effect kernel over plain Clojure data.

(s/defcomponent :demo/save-or-cancel
  :render (fn [self]
            [:div (s/root-attrs self)
             [:button (s/on self :click :as :save)   "Save"]
             [:button (s/on self :click :as :cancel) "Cancel"]])
  :handle (fn [self {:keys [event]}]
            (case event
              :save   [(s/call :ui/confirm {:question "Save changes?"} :on-confirmed)]
              :cancel [(s/answer :cancelled)]))
  :on-confirmed
  (fn [self yes?]
    [(s/answer (if yes? :saved :cancelled))]))

Built heavily with LLM assistants — wouldn't have shipped it this fast otherwise — but the shape, the namespace layout, and the choice of what to include and what to leave out is mine and reflects how I think about systems.

If you're a re-frame person and the conversation map feels familiar: yes, deliberately. The conversation here is closer in spirit to a re-frame app-db than to a Smalltalk image.

- Repo: https://github.com/zekzekus/stube

- Rationale (why this exists at all): https://github.com/zekzekus/stube/blob/master/docs/rationale.md

- Tutorial: https://github.com/zekzekus/stube/blob/master/docs/tutorial.md

Happy for feedback, war stories, "have you seen X" pointers.

github.com
u/zekzekus — 5 days ago
▲ 44 r/Clojure

Those of you using ClojureScript in production, how do you like it?

I’m particularly interested to hear anecdotes from folks who have previously used Typescript or Elm or some other statically typed front end tech.

reddit.com
u/HappyAngrySquid — 6 days ago
▲ 33 r/Clojure

Announcing Ducktape: duckdb + tech.v3.dataset via Project Panama

Announcing Ducktape!

Pleased to announce that we just released the first version of dynamic-alpha/ducktape for people who feel like helping us test. It is a near drop-in replacement for tmducken but uses java.lang.foreign instead of JNA for FFI. Highlights include:

• Deterministic native memory. Allocations live in scoped Arenas and are released with with-open rather than via GC finalizers. Helps avoid possible doublefrees under GC load
• 12 more DuckDB types  -BLOB, HUGEINT, DECIMAL, INTERVAL, ENUM, LIST, STRUCT, MAP, and the full timestamp precision family.
• Streaming appender API -  open-appender / append-dataset! / flush-appender! keeps DuckDB's appender alive across batches, amortizing per-call setup. Handy for Kafka consumers, paginated API ingest, file shards - up to 10x faster than repeated insert-dataset! for small batches.
• Performance -  Parallel column encode/decode, direct MethodHandle dispatch, partitioned parallel-concat for multi-chunk reads. Lands at 1.1–4.0× vs tmducken across numeric / string / uuid / mixed / wide workloads (1M rows, JDK 25, DuckDB 1.5.2, all significant at 95% CI - full table in the README).

github.com
u/Rschmukler — 5 days ago
▲ 20 r/Clojure+2 crossposts

Clojure up and running in IntelliJ

Get Clojure up and running in IntelliJ for a fast, productive Lisp development workflow on the JVM. I focus on practical setup for REPL-driven development, dependency management, code evaluation, and debugging so I can build and iterate efficiently. A strong use case is developing a data transformation pipeline that ingests EDN or JSON, applies functional business rules, and validates results directly from the IntelliJ Clojure REPL.

youtu.be
u/Efficient-Public-551 — 6 days ago
▲ 19 r/Clojure+2 crossposts

Leiningen for windows - build and run Clojure programs

Leiningen on Windows is a practical way to manage Clojure projects, handle dependencies, and build and run applications from the command line. I use it to streamline Clojure development, automate project setup, and package JVM-based programs efficiently. A common technical use case is creating a command-line data processing tool in Clojure, then using Leiningen to compile, test, and run it consistently on Windows.

youtu.be
u/Efficient-Public-551 — 7 days ago
▲ 35 r/Clojure+3 crossposts

RacketCon 2026: call for participation

The (sixteenth RacketCon) really will be in Oakland, CA on October 3-4 (Sat-Sun).

> RacketCon is a public gathering dedicated to fostering a vibrant, innovative, and inclusive community around the Racket programming language. We aim to create an exciting and enjoyable conference open to anyone interested in Racket, filled with inspiring content, reaching and engaging both the Racket community and the wider programming world.

We are looking for speakers

Talks will be 20-25 minutes long with 5 minutes for questions at the end. Speakers' registration fees will be waived, but we are unable to cover transportation and lodging expenses.

The deadline for proposals is July 15th. Selected speakers will be notified by August 1st.

Streaming

As in previous years, RacketCon will be streamed for those unable to attend in person. Recordings will also be made available on YouTube some time after the conference. Streaming users will have the option to purchase a remote participation ticket to support the livestream.

Volunteers

Let us know if you interested in joining the team. Someone has to carry and arrange all the parentheses. :banana:

Sponsors

We are accepting sponsorships! If you would like to sponsor the conference, please contact us at con-organizers@racket-lang.org to discuss a sponsorship package that meets your needs. The Racket Programming Language Foundation is registered in Delaware and is recognizes as a 501(3)(c) public charity in the US.


Any questions, comments, or concerns? Please contact us at con-organizers@racket-lang.org.

u/sdegabrielle — 8 days ago