You can’t really know where you are going until you know where you have been.
– Maya Angelou
CIDER started its life as an effort to replace a hacked version of SLIME1 with a proper environment for Clojure development on Emacs. Many of you probably don’t remember those days, but initially almost everyone was using a modified version of SLIME for Clojure development, as there weren’t many (any?) alternatives back in the day. The creation of CIDER was fueled mostly by the advent of nREPL, which was the first project that aimed to provide a common tool-agnostic foundation for Clojure development tools, and by the desire to address the impedance mismatch between SLIME and Clojure.
CIDER was started in spring 2012 (under the name
nrepl.el) by Phil
Hagelberg (of Leiningen fame), who hacked a prototype of an nREPL
client in Emacs Lisp on a flight to San Francisco. He got a bit stuck
on the socket-based bencode functionality and dropped it after the
flight, but not before pushing the code out and mentioning it on the
What followed is the best example of the power of open-source software…
Tim King came across Phil’s post, picked
nrepl.el back up, and it quickly became
a respectable competitor to SLIME. The project evolved at a rapid pace
and eventually superseded SLIME in August 2012.2 Unfortunately in
early 2013 Tim ran out of time for nrepl.el and after another period of
stagnation, handed it over to me, as I was the main
nrepl.el besides him back then. I have been the project’s
steward ever since. Third time’s a charm, right?
My tenure at the helm started with a bit of
controversy as I renamed nrepl.el to CIDER in version 0.3 to avoid the
common case of confusion between the nREPL server and the
package for Emacs.3 If I have to be completely honest - I also
wanted the project to have a name as cool as SLIME, and I’m fairly
certain I succeeded in that regard.
Eventually CIDER became one of the most popular development
environments in the Clojure community and it spawned many important
orchard), that are widely
used by other development tools (e.g.
iced-vim and Calva). My work on CIDER also led to me
becoming the maintainer of nREPL and restarting its development
after a long period of hibernation. In hindsight probably the work
I did on nREPL was even more important than the work I did on CIDER.
Over the years a big ecosystem of packages grew around CIDER and nREPL and they became important parts of the Clojure development tooling. Today CIDER and nREPL face a lot of competition, but they are still evolving at a steady pace, occasionally innovating, and serving as inspiration for other tools. That makes me proud of the work we’ve done over the past 8 and a half years, even if fewer and fewer people are using CIDER and Emacs every year.
One thing that constantly eluded me, however, was a 1.0 release. I guess I’m the one to blame for this not happening sooner, as I had some really grand ambitions for CIDER 1.0 (and some rather high quality standards to go with them) and I was optimistic that somehow my plans would become a reality in a reasonable amount of time. Clearly I was mistaken. Between me having to split my time between a dozen OSS projects and most of them currently having no other active maintainers but me, it eventually became obvious that the grand plans will have to wait for CIDER 2.0. Grand plans and ambitions for world domination aside, CIDER has been pretty stable for a while now and it seems to get the job done. And there’s also the theory that if a piece of software has some (happy) users then it qualifies for a 1.0 release… Oh, well…
Today the long wait is over - CIDER 1.0
is officially out!4 There’s nothing particularly interesting in this
release - it’s almost the same as CIDER 0.26. If you notice one
difference, it would probably be that commands that act on the symbol
at point (e.g.
cider-doc) will no longer prompt you to confirm the
symbol. The old default was a mistake and I decided to adjust it for
this grand release. If you notice another difference, it’d probably be
that CIDER is officially using SemVer now. I still have to define
what exactly is going to constitute a breaking change going forward (e.g.
are changes to keybindings breaking changes?), but I’m reasonably
sure the adherence to SemVer will make CIDER upgrades less painful
There are many things that prompted me to do the 1.0 release now, but probably the most important factor was that 2020 was such a horrible year for all of us. I felt we needed all the good news we could get to counter all the pain and suffering we’ve had to endure. While I can’t help the fight against the pandemic, I hope I can cheer you up a bit, by delivering another iteration of your favorite software that rocks.
So, what’s next? I don’t really have any particular plans for CIDER 1.1, so we’ll see how exactly it’s going to shape up. Some vague ideas that have been floating in my mind are proper support for sideloading, adding support for dynamic middleware loading, and improvements to the session management. No promises, though. I’m also aiming to finally do an nREPL 1.0 release at some point. There are plenty of tickets marked with the label “Good First Issue” on CIDER’s issue tracker, so if you’re looking for more fun challenges after the end of the “Advent of Code” be my guest. I can definitely use all the help I can get.
One thing is certain, though - CIDER will always stay true to its guiding principles:
- REPL-first (as opposed to relying on static code analysis)
- Community-first (CIDER is defined by its community)
- Keep on rocking in a Lisp world!
I’m writing this article while enjoying a bottle of proper (hard) French cider, so I think I should wrap it up before I start enjoying myself too much. Thanks to everyone who has been a part of CIDER’s community over the years! Thanks to everyone who has contributed to the project and supported it! Thanks to everyone who still loves Emacs and CIDER! This release is for all of you! Cheers!
A legendary Common Lisp interactive programming environment. ↩
The most important CIDER release to date can only be named after the greatest city in the world. ↩