λ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ λ

✧ Emacs ✧

Richard Stallman et al.
λ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ λ

Architecture

Terminal Emacs (emacs-no-x) on a Talos II under Guix. Single user, single host, no CI. The config repo (~/.emacs.d/) is itself the source of truth for both the human reader and the local LLM tools — the config is the documentation.

Two package managers cohabit, with non-overlapping scope:

When adding a new package: check Guix first (guix search emacs-FOO). Fall back to straight.el only if it is not in Guix or only an upstream emacsmirror checkout works. See the Drew Adams page for the full straight.el surface.

Layout

init.el is a bootstrap only. It sets load-path, then requires each lisp/init-*.el in a deliberate order. Real configuration does not belong in init.el — every concern gets its own module ending with (provide 'init-<name>).

FilePurposePackages
init-display.elTheme, faces, e-ink colors, UIbuilt-in
init-straight.elDrew Adams ecosystem via straight.elemacs-straight
init-gnus.elEmail + RSS + local mailbuilt-in
init-gptel.elLLM interface + tool definitionsemacs-gptel, emacs-llm-tool-collection
init-org.elOrg-mode + Denote + captureemacs-org, emacs-denote
init-magit.elMagit + auto-commit on saveemacs-magit, emacs-git-auto-commit-mode
init-dictionary.elStarDict CLI wrapper + corpus rgsdcv
init-vocabulary.elControlled tag vocabulary for Orgbuilt-in
init-mastodon.elMastodon clientemacs-mastodon
init-browsing.elWeb browsers (eww, elpher), tor togglesbuilt-in, emacs-elpher
init-editing.elIn-buffer completion, navigation, region, undocorfu, avy, ace-window, expand-region, wgrep, vundo, paredit
init-completion.elMinibuffer completion stackvertico, orderless, marginalia, consult
init-quail.elInput methods (SKK, pyim)built-in
init-scheme.elScheme REPL (Guile)emacs-geiser, emacs-geiser-guile
init-tramp.elHPC TRAMPbuilt-in

The .gitignore in this repo is denylist-then-allowlist: it ignores everything, then re-includes .gitignore itself, init.el, the lisp/ directory, and the bookmarks file. Anything else (straight/, elpa/, Gnus state, autosaves) is intentionally excluded — none of it is reproducibly mine.

Save = publish

Every save in the config repo is a commit and a push. git-auto-commit-mode runs on save for org, elisp, scheme, HTML, and CSS buffers, with gac-automatically-push-p set to t. A second hook commits the bookmarks file whenever bookmark+ saves it.

Consequences I've internalized:

Owned keybinding prefixes

The global keymap has a few prefixes I've claimed for project-internal commands. Avoid stomping these when adding new global bindings.

PrefixUsed for
C-c b *Browsing — eww, elpher, history, tor toggles
C-c d *Dictionary lookup (rg over the text corpus + sdcv fallback)
C-c n *Notebook — capture (c), find (f), heading search (h), corpus ripgrep (g), tag query (t), recent (r)
C-c zDenote / zettel capture
C-c lInput method picker (also denote-insert-link in init-org.el — but init-quail.el loads after init-org.el, so the input-method binding wins)
C-c hTRAMP jump to HPC home
C-x X *highlight.el commands (Drew Adams)

The C-c n prefix is the notes / RAG query map. Capture lives at C-c n c rather than the bare C-c n so the prefix can hold the rest. See the RAG page for what each query does and why.

External assumptions

Hard defaults the config does not try to detect or fall back from. They're set for one host:

This is the right tradeoff for one host: simplicity over portability. Any of these can be changed in one place and re-applied with a single guix home reconfigure.