A lightweight, terminal-optimized Doom Emacs configuration for practical use
dotdoom-starter is a streamlined Doom Emacs configuration optimized for terminal (-nw) usage. It works consistently across Ubuntu 24.04, NixOS 25.05, and Termux (Android) environments.
- Terminal-first design: Optimized for
-nwmode - Cross-platform: Identical setup for laptop, server, and Android
- Lightweight: ~2000 lines of focused configuration
- Simple setup: Uses DOOMDIR environment variable instead of Doom's profile system
- Platforms: Ubuntu 24.04, NixOS 25.05, Termux
- Emacs version: 30.2
- Terminal: Ghostty recommended (works with others)
Ubuntu 24.04
snap install emacs --classicNixOS 25.05
environment.systemPackages = [ pkgs.emacs ];Termux
pkg install emacs-nox
bash install-termux-pkgs-for-emacs.sh # Additional packages# Clone Doom Emacs
git clone https://github.com/doomemacs/doomemacs.git ~/doomemacs-starter
# Clone dotdoom-starter
mkdir -p ~/repos/gh/
git clone https://github.com/junghan0611/dotdoom-starter.git ~/repos/gh/dotdoom-starter
# Initial sync
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom sync# Aliases
alias esync='DOOMDIR="$HOME/repos/gh/dotdoom-starter" $HOME/doomemacs-starter/bin/doom sync'
alias esyncenv='DOOMDIR="$HOME/repos/gh/dotdoom-starter" $HOME/doomemacs-starter/bin/doom env'
alias esyncf='DOOMDIR="$HOME/repos/gh/dotdoom-starter" $HOME/doomemacs-starter/bin/doom sync -u -j 4'
alias e='env GTK_IM_MODULE=emacs XMODIFIERS=@im=emacs EMACS=emacs DOOMDIR=$HOME/repos/gh/dotdoom-starter $HOME/doomemacs-starter/bin/doom run -nw'# Copy and modify paths in dotdoom-starter.desktop
cp dotdoom-starter.desktop ~/.local/share/applications/
# Edit the file to match your paths# Basic launch
e
# Open file
e ~/document.org
# GUI mode (rarely used)
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom run# Normal sync (after init.el, packages.el changes)
esync
# Environment sync
esyncenv
# Force sync with package updates
esyncfdotdoom-starter/
├── init.el # Doom module declarations
├── config.el # Main configuration
├── packages.el # Package declarations
├── +user-info.el # User information
├── +gptel.el # AI/LLM integration
├── +functions.el # Custom functions
├── per-machine.el # Machine-specific config (git-ignored)
├── user-keys.el # Custom keybindings (git-ignored)
├── custom.el # Emacs customize (git-ignored)
├── snippets/ # Custom snippets
├── var/ # Runtime data
└── docs/ # Project documentation
- init.el: Doom module activation (~160 lines)
- config.el: Core settings and package configuration (~1850 lines)
- packages.el: Package additions/disables (~140 lines)
- per-machine.el: Machine-specific customization (auto-loaded, git-ignored)
- Evil mode: Vim keybindings (
+everywhere) - Completion: Corfu + Orderless + Vertico
- Snippets: YASnippet + Tempel
- File templates: Auto-templates for empty files
- Git: Magit
- Tree-sitter: Enhanced syntax highlighting
- Direnv: Project-specific environments
- Docker: Container management
- LLM: GPTel + Claude Code integration
Python, Nix, JavaScript/TypeScript, Web (HTML/CSS), YAML, Zig, Janet, Emacs Lisp
- Denote: Note-taking system (with silo, sequence)
- Org-roam: Knowledge graph
- Org-journal: Journaling
- Org-contacts: Contact management
- Export: Hugo, Pandoc
Integrated export system - Convert Denote notes to Hugo markdown with parallel processing
Key features:
- Denote links → Hugo relref automatic conversion
- Security filtering: ROT13, sensitive strings
- Parallel processing: Process 1,400+ files in 2-3 minutes with 8 cores
- Sequential/parallel modes supported
Usage:
;; Sequential mode
(my/update-dblock-export-garden-all)
;; Parallel mode (recommended)
(my/update-dblock-export-garden-all-parallel)Documentation: docs/20251027T092900--denote-export-system__denote_export_hugo_guide.org
These packages are intentionally disabled:
- LSP-mode (prefer eglot when needed)
- Flycheck (using flymake)
See packages.el for complete list.
Create per-machine.el for machine-specific configuration:
;;; per-machine.el -*- lexical-binding: t; -*-
;; Font settings
(setq doom-font (font-spec :family "JetBrains Mono" :size 14))
;; Theme
(setq doom-theme 'doom-one)Create user-keys.el for personal keybindings.
- Add package declaration to
packages.el - Add configuration to
config.el - Run
esync
# Full rebuild
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom sync -u -j 4
# Clean byte-compiled files
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom cleanDOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom doctorTerminal mode auto-starts an Emacs server named starter:
# Stop server
emacsclient -s starter -e '(kill-emacs)'
# Restart
eThis project was born from the realization that my personal Emacs configuration had become too complex to serve as a starter kit. After evaluating Doom's profiles feature and finding it problematic, I opted for a simpler approach using the DOOMDIR environment variable.
The goal is to create a practical Emacs environment that can serve as an alternative to CLI tools like Claude Code, covering diverse functionality in a terminal setting. While packages and configurations continue to grow, the focus remains on maintaining only essential features through continuous refinement.
MIT License
Issues and PRs welcome.