Emacs Prelude: Redux
Programmers know the benefits of everything and the tradeoffs of nothing.
– Rich Hickey
Earlier today I wrote about Emacs Redux turning 13. That felt like the perfect occasion to also ship something I’ve been working towards for a while – Emacs Prelude 2.0.
A Long Time Coming
The last tagged Prelude release (1.1) happened all the way back in February 2021. Five years without a release might sound alarming, but I’d argue it’s a feature, not a bug. Prelude has always aimed to be a foundation – simple, stable, easy to understand. I never wanted users to dread pulling upstream because everything moved under their feet. If you look at some of the more “sophisticated” Emacs distributions out there, the constant churn and complexity can be genuinely overwhelming. That’s not the experience I want for Prelude users.
That said, five years is a long time in Emacs land. Emacs 29 landed with
built-in tree-sitter, Eglot, and use-package. A bunch of third-party packages
that Prelude depended on became obsolete or unmaintained. It was time for a
proper update.
What’s New
Prelude 2.0 is all about modernizing the distribution for the Emacs 29+ era.
Emacs 29.1 is now the minimum version
This was the big enabling change. Emacs 29 brought so many things that Prelude
previously had to install or polyfill – use-package, display-line-numbers-mode,
isearch-lazy-count, use-short-answers, tree-sitter, Eglot – that bumping
the minimum version let me drop a ton of compatibility code and third-party
dependencies in one go. Packages like nlinum, anzu, and epl are gone
entirely, replaced by their built-in equivalents.
Tree-sitter support
Language modules now automatically use tree-sitter modes (e.g., python-ts-mode
instead of python-mode) when a grammar is available, with graceful fallback to
classic modes when it isn’t. This means better syntax highlighting and
structural editing with zero configuration – just install the grammar and
you’re done. Prelude currently supports tree-sitter remapping for C/C++, Go,
Python, JavaScript, TypeScript (including TSX), Ruby, Elixir, Shell, YAML, and
CSS. Some modules like prelude-ocaml (which uses neocaml) are tree-sitter-only
by design.
Built-in LSP via Eglot
Most language modules now come with LSP support out of the box, using Eglot as
the default client. No extra packages to install, no configuration to write –
just make sure you have the right language server on your $PATH and Prelude
handles the rest. Eglot keybindings live under the C-c C-l prefix (rename,
code actions, format, organize imports), consistent with what lsp-mode users
are used to. If you prefer lsp-mode, set prelude-lsp-client to 'lsp-mode
in your personal config and Prelude will use it across all language modules
instead.
Modernized language modules
Python, JavaScript, TypeScript, OCaml, Go, and others have been updated to use
modern tooling. anaconda-mode is replaced by LSP, js2-mode by js-ts-mode,
tide by typescript-ts-mode, tuareg by neocaml, alchemist and
go-projectile are gone (both unmaintained for years). The goal was to bring
every language module up to 2026 standards while keeping them short and
focused – most are still under 50 lines.
Faster startup
I still stand by my older take that Emacs startup time doesn’t really
matter –
you start Emacs once and it runs for days (or weeks, or months). But when the
fruit hangs this low, why not pick it? Interactive packages are now loaded lazily
via use-package :defer, and redundant require calls have been eliminated
throughout. The old defadvice calls have been replaced with modern
define-advice / advice-add, and a fair amount of dead code has been cleaned
up across the board. Nothing dramatic, but it all adds up to a noticeably
snappier startup for those who care about such things.
There’s a detailed changelog if you want the full picture, and a migration guide in the README to help with the upgrade.
The Docs Got a Facelift
The documentation site has been updated and now uses the Material for MkDocs theme, which is a lot nicer to read and navigate than the old ReadTheDocs default. The content has been refreshed too, with all modules now properly documented.
What’s Next
There’s more I’d like to do. For instance, I haven’t yet pushed to convert
everything to use use-package idiomatically – some modules still use the
old with-eval-after-load / add-hook style. I’d also like to explore deeper
integration with project.el and perhaps revisit the module system itself. But
everything is in good shape overall, and I’d rather ship incremental
improvements than hold back a release for perfection.
Starter Kits in the Age of AI
A fair question to ask in 2026 is whether Emacs distributions even matter
anymore. With tools like Claude Code, you can just ask an AI to set up Emacs
however you like – generate an init.el from scratch, configure LSP, pick a
completion framework, wire up keybindings. Why bother with a starter kit?
I think there are a few reasons Prelude (and projects like it) still matter.
First, AI coding agents are only as good as the code they’ve been trained on.
And right now, the Emacs ecosystem has a serious “popularity inertia” problem –
agents will almost always suggest the older, more established package over a
newer alternative, even when the newer one is clearly better. Ask an AI to set
up OCaml in Emacs and you’ll get tuareg + merlin every time, not neocaml +
ocaml-eglot. Ask for a completion framework and you’ll get ivy or helm,
not vertico + marginalia. The training data reflects the past, not the
present. Well-maintained distributions that track the state of the art serve as
a corrective – both for humans browsing GitHub and for the models trained on
it.
Second, there’s real value in curation. An AI can generate a config, but it can’t tell you which packages play well together, which ones are unmaintained, or which defaults will bite you six months from now. That kind of judgment comes from experience, and it’s exactly what a good starter kit encodes.
And third, simplicity still wins. A generated config you don’t understand is worse than a short, readable one you do. Prelude’s modules are deliberately small and straightforward – they’re meant to be read, forked, and modified. I’d rather give someone 20 lines of well-chosen defaults than a 200-line AI-generated config full of cargo-culted settings.
I wrote more about this topic in Emacs and Vim in the Age of AI if you’re curious.
Prelude and Emacs Redux
Emacs Prelude holds a special place in my heart. It was one of my first open-source projects – I started it back in 2011, two years before this blog even existed. When I launched Emacs Redux in 2013, many of my early posts were essentially showcasing features and ideas from Prelude. The two projects grew up together, and in many ways Prelude was the proving ground for the tips and workflows that ended up here. It’s fitting that they celebrate together today.
The Return of the Prelude
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.
– Edsger W. Dijkstra
I’ve always believed that slow, deliberate change beats constant reinvention. It’s not glamorous, it doesn’t generate hype, but it builds something you can actually rely on. Prelude doesn’t try to be everything to everyone – it tries to be a solid, understandable starting point that respects your time and attention.
And here’s a fun bit of trivia to close on: 2026 happens to be the year Honda brings back the Prelude. Very few people know this, but I was actually considering buying a (pretty old) Honda Prelude around the time I created Emacs Prelude back in 2011 – that’s where the name came from! I never did buy the car, but the Emacs distribution turned out to be a much better investment.1 And now, 15 years later, both Preludes are making a comeback. Sometimes things just come full circle.
That’s all I have for you today. Keep hacking!
-
More trivia for you - I did end up buying a BMW E39 in 2010 instead of the Prelude. I still own it and it just turned 26 earlier this month! ↩