Doom Emacs core: a configuration framework for Emacs bankruptcy veterans
An Emacs framework for the stubborn martian hacker
At a glance
- What is it?
- Doom Emacs is a modular configuration framework for GNU Emacs aimed at people who want a curated, fast starting point instead of building a config from scratch. It installs by cloning the repository into ~/.config/emacs and running its own CLI installer.
- Who is it for?
- Adopt Doom Emacs if you are comfortable with Emacs Lisp, want a modular base and are willing to treat your private config as a separate, reproducible layer on top of the framework. Do not adopt it if you need a stable, documented rollback path or you expect the installer to fetch your system dependencies for you.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 8 days ago.
- What is it written in?
- Mainly Emacs Lisp, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- doomemacs/core22,825 ★ · +133
| Repository | 2026-09-21 | 2026-11-14 |
|---|---|---|
| doomemacs/core | 22.7k | 22.8k |
133 Stars in the last 54 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
What Doom Emacs solves, and who it is actually for
The README frames the project as a story about a "stubborn, shell-dwelling, and melodramatic vimmer" who ends up writing an Emacs config. That framing is accurate about the audience: Doom Emacs is a configuration framework for GNU Emacs, not an editor distribution in the way a prebuilt binary bundle would be. You still install Emacs yourself. Doom supplies the layer above it.
The problem it addresses is configuration drift. A hand-rolled Emacs config accumulates package declarations, keybindings, autoloads and workarounds over years. Doom replaces that with a modular structure, a declarative package management system powered by straight.el, and a command line interface under bin/doom. The README describes three guiding concerns: startup and run-time performance, staying close to vanilla Emacs, and keeping reasonable defaults without forcing them on you.
The intended user is someone who already knows Emacs well enough to be dangerous. The README says it is for "Emacs bankruptcy veterans" who want "less framework in their frameworks." If you have never written Emacs Lisp or configured a package, the framework's own internals are documented as if reading them were part of the user experience, which tells you who the maintainers expect to show up.
How the module system and package manager fit together
Doom is organized as roughly 150 optional modules, according to the README. Your private configuration lives outside the framework and is expressed through init.el and packages.el. The module list is what you enable in init.el; packages.el declares packages. That separation is the core architectural idea: the framework ships modules, you ship a small set of declarations, and the CLI reconciles the two.
Package management is declarative and powered by straight.el. The README states that you can install packages from anywhere, not just MELPA or ELPA, and pin them to any commit. That is a meaningful difference from setups where packages float on a registry and update whenever the registry moves. Pinning to a commit gives you reproducibility at the cost of maintenance work when you want to move forward.
Startup performance is treated as a first-class concern. The README says Doom modifies packages to load more lazily, and that it saves a snapshot of your shell environment to a file so Emacs inherits things like PATH at startup. That last mechanism solves a genuinely annoying class of bug on macOS and on systems where Emacs is launched outside a login shell.
The framework also ships a rule-based popup manager for temporary buffers, per-file indentation detection with editorconfig integration, project search powered by ripgrep with ivy or helm, and isolated persistent workspaces. Optional vim emulation comes from evil-mode, with ports of vim-sneak, vim-easymotion and vim-unimpaired. LSP integration via lsp-mode or eglot is opt-in, not default.
Installing Doom Emacs and running it the first time
The README gives a two-command install. The first clones the repository into your Emacs config directory with a shallow clone, which keeps the download small. The second runs the bundled installer.
git clone --depth 1 https://github.com/doomemacs/core ~/.config/emacs
~/.config/emacs/bin/doom installThe README recommends adding ~/.config/emacs/bin to your PATH so that the doom command is available without the full path. After install, the documented workflow is to read the Getting Started guide, which walks through installing, configuring and maintaining the setup.
The command you will run most often is doom sync. According to the README, it synchronizes your private config with Doom by installing missing packages, removing orphaned packages, and regenerating caches. You run it whenever you modify init.el or packages.el, or when you install or remove an Emacs package through your OS package manager.
doom syncBefore that, though, check your environment. The README points at bin/doom doctor as the tool that reports what is missing, including dependencies for individual modules.
bin/doom doctorPrerequisites are listed explicitly: GNU Emacs 27.1 through 31.1, with 31.1 recommended; Git 2.23 or newer; and ripgrep 11.0 or newer. Optional but recommended are fd 7.3.0 or newer for file indexing, GNU variants of find, ls and tar on macOS and BSD systems, and the Symbola font as a fallback for glyphs Emacs cannot display. The README warns against unstable and pre-release Emacs builds, identified by version suffixes like .50, .60 or .9X. It notes Doom generally works on Emacs HEAD but that support lags the bleeding edge by at least a month or so.
Where Doom Emacs gets in your way
The README is unusually candid about one thing: rollback. It states that Doom comes with a means to roll back releases and updates, and then adds "still a WIP." That is the clearest limitation in the documentation. If your workflow depends on being able to return to a known-good configuration after a bad update, the framework itself does not currently promise that, and the README does not document a rollback procedure.
The dependency policy is the second constraint, and it is deliberate. Doom "won't automatically install system dependencies (and will force plugins not to either)." This is a defensible design choice, since automatic system package installation is how configs break in surprising ways. But it means the installer will not fix your missing ripgrep or fd. You are expected to run doom doctor and resolve the gaps yourself.
The third constraint is version coupling. Doom supports a bounded Emacs range, currently 27.1 to 31.1, and the README distinguishes two thresholds: using only the CLI requires 27.1 or newer, while using Doom as a starter kit requires 29.1 or newer. If you track Emacs from Git or run a distribution build with a pre-release suffix, you are outside what the README describes as supported, even if it often works.
Finally, Doom is the wrong tool if you want a small config you fully understand. The README's own framing, that internals should read as part of the UX, assumes you will read them. If you will not, the abstraction is a liability rather than a convenience.
Doom Emacs versus Spacemacs and a hand-rolled config
The most direct comparison is Spacemacs, which the README references when it describes Doom's keybinding scheme as "Spacemacs-esque," centered on leader and localleader prefixes. Both projects offer a modular configuration layer over Emacs with vim-style editing. The difference the README emphasizes is weight and proximity to vanilla Emacs: Doom's stated design goal is "less between you and vanilla Emacs by design," with startup performance as a priority and package modifications to make loading lazier. The positioning is clear. Doom is aiming at users who found a heavier framework too far from the metal.
The second alternative is your own config. A hand-rolled init.el has no framework to learn, no module list to curate, and no CLI between you and the editor. What it lacks is the declarative package management with commit pinning, the module organization, and the caches that doom sync regenerates. The README frames Doom as usable either as a foundation for your own config or as a resource to learn from, which is a fair summary of the trade: you get structure and reproducibility in exchange for adopting someone else's opinions and their update cadence.
A third path is not using Emacs at all, which the README's opening joke acknowledges. If you are happy in Neovim, Doom's value proposition is Emacs features with vim bindings, not vim itself.
Maintenance, licensing and what updates cost you
The repository is not archived, and the last push was on 2026-10-02. The repository has no published GitHub releases. Practically, that means you should expect to track the master branch rather than a numbered release.
The maintenance cost is front-loaded into your private config, not the framework. Every time you change init.el or packages.el, or change an Emacs package through your OS package manager, the documented procedure is to run doom sync to install missing packages, remove orphaned packages and regenerate caches. Because packages can be pinned to arbitrary commits, moving a pin forward is a deliberate act, and that is where the reproducibility guarantee comes from.
The licence is MIT. That is permissive, which matters if you intend to fork the framework or vendor parts of it into a product. It does not tell you anything about the licences of the third-party packages your configuration pulls in; those are separate works with their own terms, and the README does not enumerate them. If licence hygiene matters to your organization, verify the terms of the specific packages your modules pull in rather than assuming the top-level MIT licence covers everything in your build.
One more thing worth knowing before you commit: the README carries a caution that doomemacs.com is not associated with or endorsed by the project, and that doomemacs.org is the only official domain. If you land on the wrong site while searching for install instructions, you are on a domain the maintainers disclaim.
Editorial conclusion
Adopt Doom Emacs if you are comfortable with Emacs Lisp, want a modular base and are willing to treat your private config as a separate, reproducible layer on top of the framework. Do not adopt it if you need a stable, documented rollback path or you expect the installer to fetch your system dependencies for you. Before committing, verify that your Emacs version is 27.1 through 31.1, confirm which of the roughly 150 modules you actually need, and run bin/doom doctor to see what is missing.
Frequently asked questions
What does Doom Emacs do?
It is a configuration framework for GNU Emacs that provides a modular structure, curated defaults, a declarative package management system powered by straight.el, and a command line interface under bin/doom. It can serve as the foundation for your own config or as a resource for learning about Emacs.
What are the key differences between Doom Emacs and normal Emacs?
Vanilla Emacs ships the editor and its built-in libraries; Doom adds roughly 150 optional modules, a rule-based popup manager, project search via ripgrep, persistent workspaces, and a CLI for synchronizing packages. The README describes the design as staying close to vanilla Emacs, with less between you and the editor than a heavier framework would put there.
Which is better, Doom Emacs or Neovim?
The README does not compare the two, and its opening frames Doom as a config written by a vimmer who moved to Emacs. Doom offers optional vim emulation through evil-mode, so the choice is really whether you want Emacs itself with vim bindings rather than Neovim.
Is anyone still using Emacs?
The README does not address Emacs usage numbers. It does show that Doom Emacs targets Emacs 27.1 through 31.1 and that the repository's last push was on 2026-10-02.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/doomemacs-core)Star history chart for your README
[](https://hysenlabs.com/projects/doomemacs-core)Was this useful?