FAQ

What’s the difference between contrib’s nREPL and this one?

See our history. Very simply put - this project is the continuation of the contrib project. There were several major changes that happened during the migration:

  • The artifact id changed from org.clojure/clojure.tools.nrepl to nrepl/nrepl.

  • The namespace prefix changed from clojure.tools.nrepl to nrepl.

  • The namespace clojure.tools.nrepl was renamed to nrepl.core.

  • Minimal requirements changed from Java 6 and Clojure 1.2 to Java 8 and Clojure 1.7 (currently Java 8 and Clojure 1.9).

  • All the code which existed for compatibility with nREPL 0.0.x was removed.

What’s the plural form of "middleware"?

The plural form of "middleware" is "middleware", not "middlewares".[1] While there’s some debate on whether its okay to write something like "a collection of middlewares", we’ve opted to stick to using "middleware" everywhere in both the codebase and the documentation.

Does nREPL support ClojureScript?

Yes, it does, although you’ll need additional middleware to enable the ClojureScript support (e.g. piggieback or shadow-cljs).

Does nREPL support ClojureCLR?

There is a separate implementation of nREPL for ClojureCLR: https://github.com/clojure/clr.tools.nrepl.

What’s the difference between the bencode and EDN transports?

Bencode is the default wire format and the only one guaranteed to be supported by all nREPL servers and middleware. It’s simple and language-agnostic, but limited to strings and integers — keywords, sets, and other Clojure types are coerced to strings in transit.

The EDN transport preserves richer Clojure types (keywords, sets, symbols, etc.) and is a good choice for clients that only target Clojure servers. See Transports for details.

How do I configure the nREPL server?

nREPL reads configuration from two EDN files: a global ~/.nrepl/nrepl.edn and a project-local .nrepl.edn. You can set the bind address, port, transport, middleware, and more. Command-line flags override config file values. See Server Configuration for the full details.

Can I use nREPL with Unix domain sockets?

Yes, since nREPL 1.2 (requires JDK 16+). Pass a filesystem path instead of a port when starting the server:

$ clj -M:nrepl -m nrepl.cmdline --socket path/to/socket

See Server for more on this.

Why doesn’t interrupt stop my evaluation?

On Java 21+, Thread.stop() has been disabled by the JDK. nREPL ships a native JVMTI agent to restore this capability, but it requires the JVM flag -Djdk.attach.allowAttachSelf at startup. See Enable libnrepl JVMTI agent for setup instructions.

When was nREPL 1.0 released?

nREPL 1.0 was released on August 24, 2022. This completes the promise we made way back in 2018 to address most languishing problems and get nREPL in a great shape.

Future releases will focus on polishing the nREPL protocol and potentially adding some new features.

Are there any interesting nREPL extensions worth checking out?

Sure! See Extensions for details.

Where can I get help regarding nREPL?

See the Support section of the manual.

What should I do if I run into some issues with nREPL?

Don’t panic! Next step - visit the Troubleshooting section of the manual.

How can I help the project?

There are many ways in which you can help nREPL: