Framework
doomemacs/core avatar
doomemacs/core

Doom Emacs: A Configuration Framework for Engineers Who Already Know Emacs

An Emacs framework for the stubborn martian hacker

22,711 stars3,145 forksEmacs LispMIT

At a glance

What is it?
Doom Emacs is an MIT-licensed configuration framework for GNU Emacs that provides vim keybindings, declarative package management pinned to specific commits, and roughly 150 optional modules. It targets Emacs users who want reproducible configurations and faster startup without giving up access to vanilla Emacs internals.
Who is it for?
Doom Emacs is a good fit for Emacs users who have already spent time tuning a personal config and want a more structured foundation with reproducible package management. It is not the right choice for developers who want a self-contained editor they can install in one step with no prerequisite dependencies, since Doom requires Emacs itself, Git, and ripgrep before a single command is run.
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 24 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 September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Doom Emacs Is and Who It Is For

Doom Emacs is a configuration framework for GNU Emacs, not a fork of Emacs and not a standalone editor. Its README describes it as tailored for "Emacs bankruptcy veterans who want less framework in their frameworks." The target user is someone who has already used Emacs, has probably built and discarded multiple personal configs, and wants a stable base that does not hide what Emacs is doing underneath.

The README outlines four design goals: fast startup and runtime performance, minimal distance from vanilla Emacs, opinionated defaults that can be discarded, and explicit control over system dependencies. On the last point, Doom does not automatically install system-level dependencies and actively prevents packages from doing so. The `doom doctor` command exists specifically to report what is missing rather than installing it.

Doom describes itself as suitable as either a foundation for a personal config or a reference for learning how Emacs internals work. These two uses have different requirements: the first needs stability, and the second benefits from the code being readable and well-commented.

Prerequisites and the Emacs Version Constraint

Doom's prerequisites split into two tiers. Using only Doom's command-line interface requires GNU Emacs 27.1 or later. Using Doom as a full starter kit requires Emacs 29.1 or later. The README recommends Emacs 31.1 specifically. In addition to Emacs, Git 2.23 or later and ripgrep 11.0 or later are required. These are hard dependencies, not optional enhancements.

Optional but recommended additions include fd 7.3.0 or later for improved 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 otherwise display.

The README includes a specific warning against unstable and pre-release Emacs builds, identifying them by version number pattern: builds ending in `.50`, `.60`, or `.9X` such as `28.1.91`. The maintainer uses Emacs HEAD personally, but the README states that support for the bleeding edge lags by at least a month. This means if you are running Emacs from a nightly build, some Doom modules may not work as documented.

Installing Doom and the First Sync

Installation follows a two-step process. First, clone the repository into the standard Emacs configuration directory:

sh
git clone --depth 1 https://github.com/doomemacs/core ~/.config/emacs
~/.config/emacs/bin/doom install

The `--depth 1` flag creates a shallow clone, which the README uses to keep the initial download small. The `doom install` command sets up the initial configuration and package state. After installation, the README recommends adding `~/.config/emacs/bin` to your PATH so that `doom` commands are available from any terminal.

Four bin/doom subcommands cover the ongoing lifecycle of the installation. `doom sync` installs missing packages, removes orphaned packages, and regenerates caches; the README says to run it whenever you modify `init.el` or `packages.el`. `doom sync --env` captures a snapshot of the current shell environment, including PATH, so that Emacs inherits it at startup. `doom upgrade` updates Doom and all installed packages to their latest versions. `doom doctor` reports configuration problems and missing system dependencies.

Doom's ~150 optional modules, listed in the project documentation, each carry their own additional dependencies. The README recommends running `doom doctor` after enabling new modules rather than discovering missing dependencies at runtime.

How Doom Differs from Plain GNU Emacs

The most visible difference between Doom and unconfigured Emacs is the keybinding scheme. Doom provides a Spacemacs-style leader key layout centered on the SPC key for evil-mode users and C-c for users who prefer vanilla key bindings. This gives Doom a consistent discoverability structure that plain Emacs lacks by default.

Package management is the architectural difference that matters most for reproducibility. Doom uses straight.el as its package manager. This allows packages to be installed from any Git source, not only MELPA or ELPA, and to be pinned to a specific commit. The README identifies reproducibility as a first-class goal: a private config should be portable across machines without version drift.

Doom's popup manager controls how temporary buffers, such as compilation output and help windows, appear and disappear. Plain Emacs has no equivalent system; windows appear wherever Emacs decides, which is unpredictable. The popup manager applies rules to buffer types so that a help buffer appears in a defined location and is dismissed cleanly.

Project search and replace is powered by ripgrep and is accessible via ivy or helm. This is why ripgrep is a hard dependency: the search integration is not optional glue code but a core workflow feature.

Vim Emulation and the evil-mode Trade-off

Doom's evil-mode integration provides vim keybindings inside GNU Emacs. The README lists ports of several vim plugins: vim-sneak, vim-easymotion, and vim-unimpaired among others. These ports bring familiar vim muscle memory into Emacs without running a separate editor.

The trade-off is that this is an emulation layer, not native vim. Someone who depends on specific vim behavior at the C level, or on plugins with compiled components, will find that the evil-mode port does not cover every case. The README does not claim complete vim compatibility, and that claim would be false: evil-mode approximates vim's normal, insert, and visual modes but does not replicate the full vim scripting environment or all plugin APIs.

For users coming from Neovim specifically, the comparison is not apples-to-apples. Doom adds Emacs's editing model, its extensive package ecosystem, and its REPL integration to vim keybindings. Neovim adds Lua-native configuration and a tighter plugin API to the vim runtime. The choice depends on which editing model you want to build on top of.

Maintenance Cost and Licence Implications

The MIT licence means Doom can be embedded in or distributed alongside commercial software without the source-sharing requirements of GPL. Your private Doom config, which is separate from the Doom core repository, can be licensed however you choose.

The README describes Doom as an ongoing project and publishes a roadmap at doomemacs.org/roadmap. Package management rollback is listed as a work in progress. The project tracks packages under review for inclusion in a separate board, and the README asks users to check this list before requesting new packages or features.

Maintenance cost for users is real. Doom's packages are pinned, but when you run `doom upgrade` you are accepting whatever changes Doom's maintainers have decided are stable. Module dependencies change over time, and `doom doctor` exists precisely because what worked last month may require a system-level fix today. The README's emphasis on reproducibility and disaster recovery reflects this reality: Emacs ecosystem packages break, and Doom is designed to make recovery possible rather than to prevent breakage entirely.

Editorial conclusion

Doom Emacs is a good fit for Emacs users who have already spent time tuning a personal config and want a more structured foundation with reproducible package management. It is not the right choice for developers who want a self-contained editor they can install in one step with no prerequisite dependencies, since Doom requires Emacs itself, Git, and ripgrep before a single command is run. Neovim users who are evaluating Doom should understand that Doom's evil mode port is an Emacs layer on top of Emacs, not a native vim runtime. The last push to the repository was on 2026-09-06.

Frequently asked questions

What does Doom Emacs do?

Doom Emacs is a configuration framework that sits on top of GNU Emacs. It adds vim-style keybindings via evil-mode, about 150 optional language and tool modules, declarative package management pinned to specific commits via straight.el, and a set of curated defaults. It does not replace Emacs; it configures it.

Is anyone still using Emacs?

The Doom Emacs repository shows a last push date of 2026-09-06, indicating active development. The project's forums, Discord, and GitHub discussions are listed in the README as active support channels. The README also references a newsletter and three GitHub project boards for tracking ongoing work.

What are the key differences between Doom Emacs and normal Emacs?

Plain GNU Emacs ships with minimal configuration; every user builds their own setup. Doom adds vim keybindings, a leader-key scheme, 150 optional modules, a popup manager, and declarative package management with commit pinning. The README describes Doom's design goal as staying close to vanilla Emacs while providing a structured starting point.

Which is better, Doom Emacs or Neovim?

Doom runs on the GNU Emacs runtime and adds vim keybindings through evil-mode, while Neovim is a native vim fork with Lua configuration. Doom gives access to Emacs's package ecosystem and REPL integrations; Neovim gives access to the vim plugin ecosystem with tighter performance. The README does not compare the two directly.

Official sources

  1. doomemacs/core on GitHub
  2. Issues
  3. License: MIT
  4. Project website
  5. README
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.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/doomemacs-core.svg)](https://hysenlabs.com/projects/doomemacs-core)