Jolt is a self-hosted Clojure implementation that runs on Scheme — Chez natively, Gambit for JavaScript. No JVM, no build step — most portable Clojure runs unchanged.
future, agent, pmap, and core.async on OS threadsjolt build emits a single standalone binary — no Scheme or JVM needed to run itThe terminal on the right is jolt itself — compiled to JavaScript by the Gambit backend — evaluating live in your browser. It runs a reduced build to keep the download small, so regex is left out here and says so if you reach for it.
jolt via Gambit → JS repl
user=> (->> (range 10) (filter even?) (map #(* % %)) (reduce +))
120
Reads Clojure, analyzes it to a host-neutral IR, emits Scheme, and runs it — on Chez natively, or on Gambit compiled to JavaScript. The compiler is written in Clojure and compiles itself.
jolt build ahead-of-time compiles a project — runtime, standard library, app, and its deps — into a single self-contained executable. No Chez, no JVM, no source needed to run it.
future/promise/agent/pmap run on OS threads over a shared heap, matching JVM semantics. core.async provides channels and go blocks.
Exact integers and bignums, exact ratios ((/ 1 2) ⇒ 1/2), and flonum doubles. = is category-aware; == is value-equality.
Immutable vectors (32-way tries), cons lists, and HAMT maps/sets with Clojure value semantics. Transients are real mutable scratch collections.
Lazy/infinite seqs, transducers, destructuring, multimethods, protocols/records, metadata, namespaces, runtime eval, and the full reader.
Install the self-contained jolt binary — it bundles the runtime, compiler, and standard library, so there's nothing else to install.
brew install jolt-lang/jolt/jolt
curl -sL https://raw.githubusercontent.com/jolt-lang/jolt/main/install | bash
jolt -e '(+ 1 2)'
Or run from a clone (needs Chez Scheme) — no build step, the bootstrap seed is checked in:
git clone --recurse-submodules https://github.com/jolt-lang/jolt.git
cd jolt
bin/jolt -e '(+ 1 2)'
$ bin/jolt -e '(->> (range 10) (filter even?) (map (fn [x] (* x x))) (reduce +))'
$ bin/jolt -e '(/ 1 2)'
bin/jolt run -m myapp.core
bin/jolt -M:test [args]
bin/jolt path
bin/jolt build -m myapp.core -o myapp
./myapp arg1 arg2
bin/jolt --nrepl-server
Develop against a live process: see REPL-Driven Development.
Read the documentation for installation, writing libraries, and host interop.
Jolt targets Clojure semantics but runs on Scheme, not the JVM. Most portable Clojure runs unchanged — persistent collections, the numeric tower, lazy seqs, transducers, multimethods, protocols/records, atoms, future/agent/pmap, core.async, runtime eval, and the full reader all behave as on the JVM. The genuine divergences:
| Aspect | Difference |
|---|---|
| Java interop | No JVM, so no general Java interop, reflection, or gen-class/proxy — a shimmed subset of java.* is available, plus a C FFI |
| BigDecimal | Not available (decimal? is always false); the rest of the numeric tower matches |
| Regex | Compiled by irregex, not java.util.regex — common patterns work, some Java-specific features differ |