Multi-agent focused Doom Emacs configuration for AI-assisted workflows
doomemacs-config is my main Doom Emacs configuration, evolved from a lightweight terminal starter to a comprehensive multi-agent environment. It integrates AI tools (GPTel, Agent Shell, ECA Whisper, Edge TTS) with EAF for a powerful GUI experience including Korean input support in terminals.
"Being to Being Collaboration" - Treating AI as a collaborator, not just a tool.
This configuration supports the workflow where AI handles routine tasks while humans focus on creative seeds. Built for reproducibility with NixOS, Emacs, and Digital Garden.
- Multi-agent integration: GPTel, Agent Shell (ACP), Claude Code IDE
- Voice interfaces: ECA Whisper (STT), Edge TTS (text-to-speech)
- EAF applications: Browser, PDF viewer, pyqterminal with Korean input
- Denote ecosystem: Export to Hugo, dblock automation, silo management
- Cross-platform: Ubuntu 24.04, NixOS 25.11, Termux
- Platforms: Ubuntu 24.04, NixOS 25.11, Termux
- Emacs version: 30.x
- Terminals: Ghostty (recommended), Kitty, Termux
Ubuntu 24.04
snap install emacs --classicNixOS 25.11
environment.systemPackages = [ pkgs.emacs ];Termux
pkg install emacs-nox# Clone Doom Emacs
git clone https://github.com/doomemacs/doomemacs.git ~/doomemacs-starter
# Clone doomemacs-config
mkdir -p ~/repos/gh/
git clone https://github.com/junghan0611/doomemacs-config.git ~/repos/gh/doomemacs-config
# Initial sync
DOOMDIR="$HOME/repos/gh/doomemacs-config" ~/doomemacs-starter/bin/doom sync# Aliases for .bashrc or .zshrc
alias esync='DOOMDIR="$HOME/repos/gh/doomemacs-config" $HOME/doomemacs-starter/bin/doom sync'
alias esyncf='DOOMDIR="$HOME/repos/gh/doomemacs-config" $HOME/doomemacs-starter/bin/doom sync -u -j 4'
alias e='DOOMDIR=$HOME/repos/gh/doomemacs-config $HOME/doomemacs-starter/bin/doom run -nw'
alias egui='DOOMDIR=$HOME/repos/gh/doomemacs-config $HOME/doomemacs-starter/bin/doom run'doomemacs-config/
├── init.el # Doom module declarations
├── config.el # Main configuration (loader)
├── packages.el # Package declarations
├── custom.el # Emacs customize (git-ignored)
│
├── lisp/ # Modular configuration (5000+ lines)
│ ├── korean-input.el # Korean input, fonts, NFD→NFC
│ ├── evil-config.el # Evil mode settings
│ ├── completion-config.el # Corfu, Vertico, Consult
│ ├── ui-config.el # Dashboard, Modeline, Themes
│ ├── org-config.el # Org-mode settings
│ ├── denote-config.el # Denote settings
│ ├── denote-silo.el # Dynamic silo management
│ ├── denote-export.el # Export to Hugo/Markdown
│ ├── ai-gptel.el # GPTel (Claude, OpenAI, Gemini)
│ ├── ai-agent-shell.el # Agent Shell, ACP, Claude Code
│ ├── ai-stt-eca-whisper.el # Speech-to-text
│ ├── ai-tts-edge.el # Text-to-speech (Edge)
│ ├── eaf-config.el # EAF applications
│ ├── keybindings-config.el # Key bindings
│ └── ...
│
├── bin/ # Standalone scripts
│ ├── denote-export.el # Unified export/dblock server
│ └── denote-export.sh # Shell wrapper
│
├── autoload/ # Autoloaded functions
└── docs/ # Documentation
| Tool | Description | File |
|---|---|---|
| GPTel | LLM integration (Claude, OpenAI, Gemini, local) | ai-gptel.el |
| Agent Shell | ACP protocol, agent-shell-manager | ai-agent-shell.el |
| ECA Whisper | Speech-to-text via whisper.cpp | ai-stt-eca-whisper.el |
| Edge TTS | Microsoft Edge text-to-speech | ai-tts-edge.el |
| Claude Code IDE | Integration with Claude Code | ai-agent-shell.el |
Configured in lisp/eaf-config.el:
- eaf-browser: Chromium-based web browser
- eaf-pdf-viewer: Fast PDF viewing
- eaf-pyqterminal: Terminal with Korean input support (via Qt native input)
Key settings:
;; Korean input enabled
(setq-local x-gtk-use-native-input t)
;; Evil integration with SPC key handling
;; M-\ for other-window across all modesbin/denote-export.el - Unified Denote operations server
Features:
- Daemon mode for fast repeated exports
- Batch mode for CI/scripts
- Hugo markdown conversion with relref links
- Dblock update automation
- Doom straight.el package loading (standalone execution)
Usage:
# Daemon mode
emacs --daemon=denote-export-server --load bin/denote-export.el
emacsclient -s denote-export-server --eval '(denote-export-file "note.org")'
# Batch mode
emacs --batch --load bin/denote-export.el -- dblock ~/org/meta
# Shell wrapper
./bin/denote-export.sh ~/org/notesComprehensive Korean support in lisp/korean-input.el:
- Input method configuration (korean-hangul)
- Sarasa/D2Coding Nerd fonts
- NFD → NFC normalization (Termux fix)
- Evil mode auto-switching
- EAF Qt native input integration
Global consistency via lisp/keybindings-config.el:
- M-\:
other-window(works in vterm, eaf, dired, org) - M-u/M-v: scroll up/down
- SPC: Doom leader (context-aware in EAF)
Create per-machine.el (git-ignored):
;;; per-machine.el -*- lexical-binding: t; -*-
(setq doom-font (font-spec :family "GLG Nerd Font Mono" :size 15.1))
(setq doom-theme 'doom-one)- Add to
packages.el - Configure in appropriate
lisp/*.el - Run
esync
# Full rebuild
DOOMDIR="$HOME/repos/gh/doomemacs-config" ~/doomemacs-starter/bin/doom sync -u -j 4
# Diagnostics
DOOMDIR="$HOME/repos/gh/doomemacs-config" ~/doomemacs-starter/bin/doom doctor
# Clean
DOOMDIR="$HOME/repos/gh/doomemacs-config" ~/doomemacs-starter/bin/doom cleanStarted as a lightweight terminal-first configuration, evolved into a comprehensive multi-agent environment. Key milestones:
- Terminal optimization with Korean input fixes
- AI tool integration (GPTel → Agent Shell → Voice interfaces)
- EAF adoption for GUI capabilities
- Denote export system for Digital Garden publishing
The focus remains on AI-assisted workflows while maintaining reproducibility across devices.
MIT License