Architecture
The user profile is declarative: a single home.scm is the source of truth, and guix home reconfigure applies it. Reproducing the same profile on another POWER9 host is one file plus a channel-pinned guix describe snapshot. Three concerns live in the same file:
- Package profile — everything user-visible under
~/.guix-home/profile.
- Shell configuration — Bash aliases, environment variables, profile scripts via
home-bash-service-type.
- Dotfiles —
~/.fbtermrc and ~/.gitconfig deployed via home-files-service-type.
Two package managers cohabit the Emacs side, with non-overlapping scope: Guix Home installs emacs-no-x and every Emacs package available in the Guix channel; straight.el installs the Drew Adams ecosystem from emacsmirror — see the Emacs page and the Drew Adams page for the split rationale.
Package inventory
What ships, in shape:
Emacs core
| Package | Purpose |
emacs-no-x | Terminal-only Emacs (no X11 deps) |
emacs-straight | straight.el for the Drew Adams overlay |
emacs-eat | In-Emacs terminal (vterm-ish) |
Org & notes
emacs-org | Org-mode |
emacs-denote | File-naming and note-linking |
emacs-org-ql | Query language for org headings |
Git
git | Git CLI |
emacs-magit | Git porcelain for Emacs |
emacs-git-auto-commit-mode | Auto-commit on save for the config repo |
LLM
emacs-gptel | LLM chat / tool interface |
emacs-llm-tool-collection | Bundled gptel tool functions |
Browser / fediverse
emacs-elpher | Gemini / Gopher |
emacs-mastodon | Mastodon client |
Scheme REPL
emacs-geiser | Scheme interaction mode |
emacs-geiser-guile | Guile backend for Geiser |
Editing & completion
emacs-paredit | Structural editing for lisps |
emacs-corfu + emacs-corfu-terminal | Popup completion at point (terminal-aware) |
emacs-vertico | Vertical minibuffer completion |
emacs-orderless | Flexible matching style |
emacs-marginalia | Annotations in minibuffer margins |
emacs-consult | Navigation commands (consult-ripgrep, consult-org-heading) |
emacs-avy | Jump to visible text by char |
emacs-ace-window | Fast window switching by number |
emacs-expand-region | Semantic region expansion |
emacs-wgrep | Editable grep buffers |
emacs-vundo | Visual undo tree |
emacs-envrc | Buffer-local direnv / guix shell |
emacs-jinx | Spellchecker |
File modes
emacs-markdown-mode | Markdown syntax |
emacs-yaml-mode | YAML syntax |
Input methods
emacs-ddskk | Japanese SKK |
emacs-pyim + emacs-pyim-basedict | Mandarin pinyin (extra dicts come from ~/src — see the Talos page) |
Math & statistics
r-minimal | R interpreter |
emacs-ess-ppc64le | ESS, custom build for ppc64le (see below) |
maxima | Computer algebra system |
System & CLI utilities
sdcv | StarDict console dictionary |
glibc-locales | UTF-8 locale data |
curl | HTTP client |
libheif | HEIF / HEIC image codec |
tmux | Terminal multiplexer |
fbterm | Framebuffer terminal (Unicode console) |
rsync | File sync |
physlock | Console screen lock |
Fonts
font-dejavu | Latin coverage |
font-google-noto | Pan-script fallback |
font-google-noto-sans-cjk | CJK sans (JP, SC, etc.) |
font-google-noto-serif-cjk | CJK serif |
font-google-noto-emoji | Emoji glyphs |
Custom package: emacs-ess-ppc64le
r-roxygen2 fails to build on ppc64le, so the stock emacs-ess can't land on the Talos. The fix is a derived package that strips r-roxygen2 from native inputs and removes the architecture whitelist:
(define emacs-ess-ppc64le
(package
(inherit emacs-ess)
(supported-systems %supported-systems)
(native-inputs (modify-inputs
(package-native-inputs emacs-ess)
(delete "r-roxygen2")))))
This is the cleanest possible Guix recipe shape for "the upstream package, minus one input that doesn't build here." It is also the only custom package definition in home.scm — every other package comes straight from the channel.
Shell & dotfiles
The home-bash-service-type service ships the bash configuration: aliases (ls --color=auto), a profile script that exports TERM=fbterm so terminfo picks the framebuffer terminal entry, and environment variables for TLS certificates, GPG TTY routing, and library / package-config paths.
The home-files-service-type service deploys two dotfiles directly:
~/.fbtermrc — multi-font fallback chain (DejaVu Sans Mono → Noto Sans Mono CJK JP → Noto Sans CJK SC → Noto Sans → Noto Color Emoji), 22pt, white-on-black, 1000-line scrollback. The CJK fallbacks are required for the IME workflows; the emoji font keeps Mastodon timelines legible.
~/.gitconfig — single-user git identity, deployed declaratively rather than committed loose.
Reproduction
To apply this configuration on another POWER9 host:
guix home reconfigure ~/.emacs.d/docs/guix.scm
To capture the exact channel state for full reproducibility:
guix describe
Two artifacts together — the home.scm and the guix describe snapshot — describe the entire user profile to the byte.