This repository is the source of truth for my machines, user environment, and a large set of day-to-day workflow scripts. It started as an Emacs configuration, and that is still here, but the repo is now mostly a Nix-managed personal systems repo: NixOS hosts, a nix-darwin host, Home Manager link management, desktop/window-manager configuration, shell tooling, agent configuration, and org-agenda-api deployment glue.
The old literate Emacs README lives at dotfiles/emacs.d/README.org. The published GitHub Pages site is still generated from that document.
- NixOS systems under nixos/, with one flake configuration per file in nixos/machines/.
- A nix-darwin configuration under nix-darwin/ for the macOS machine.
- Shared Nix modules and overlays under nix-shared/.
- Home Manager placement of files from dotfiles/ into
$HOMEand$XDG_CONFIG_HOME. - Shell functions and executable helpers in dotfiles/lib/, added to
PATHandfpathby the NixOS environment module. - Desktop environment and tiling-window-manager configuration for Hyprland, XMonad, River/XMonad experiments, Taffybar, Waybar, Rofi, Alacritty, autorandr, and related utilities.
- Emacs and org-mode configuration, including the tangled org configuration used by the org-agenda-api container.
- Agent and tool configuration for Codex, Claude, project guides, and local task-specific skills.
- Container and deployment configuration for personal org-agenda-api instances.
This is not intended to be a generic starter dotfiles repo. Many modules assume
my users, hostnames, hardware, SSH keys, secrets layout, and local checkout path
(~/dotfiles). It is still useful as a reference for how the pieces fit
together.
| Path | Purpose |
|---|---|
| nixos/ | Main NixOS flake. Imports feature modules, host files, agenix secrets, Home Manager, overlays, and package checks. |
| nixos/machines/ | Per-host NixOS entrypoints such as strixi-minaj, ryzen-shine, railbird-sf, WSL hosts, and Raspberry Pi hosts. |
| nix-darwin/ | macOS system flake using nix-darwin, nix-homebrew, Home Manager, agenix, and shared packages. |
| nix-shared/ | Shared package lists, overlays, Home Manager modules, and Syncthing fragments used by Linux and macOS. |
| dotfiles/ | Files that are linked into the home directory. Top-level entries become dotfiles; dotfiles/config/* becomes XDG config. |
| dotfiles/lib/bin/ | User commands and desktop helpers, including Rofi scripts, Hyprland helpers, audio controls, and Syncthing utilities. |
| dotfiles/lib/functions/ | Zsh autoload functions and shell helpers. |
| dotfiles/config/hypr/ | Hyprland Lua config, lock/idle config, workspace files, scripts, and plugin state. |
| dotfiles/config/xmonad/ | XMonad configuration, local Cabal package, flake, and upstream submodules. |
| dotfiles/config/taffybar/ | Personal Taffybar package/configuration, CSS themes, scripts, and local upstream checkout. |
| dotfiles/emacs.d/ | Emacs configuration, literate org config, org-mode setup, snippets, and generated/tangled Elisp. |
| dotfiles/agents/ | Agent instructions, project constellation guides, and local Codex skills. |
| org-agenda-api/ | Instance-specific config and container/deploy glue for org-agenda-api. |
| docs/ | Design notes for Cachix, tiling WM behavior, River evaluation, and org-agenda-api consolidation. |
| gen-gh-pages/ | Legacy/publication pipeline that exports the Emacs README to GitHub Pages. |
The NixOS flake is nixos/flake.nix. It discovers host configurations from
nixos/machines/ and exposes them as nixosConfigurations.<hostname>.
The broad feature set is assembled by nixos/configuration.nix, where
features.full.enable expands into the normal desktop/profile modules.
Common workflow:
cd ~/dotfiles/nixos
just switchThe local just switch recipe wraps nixos-rebuild switch --flake ".#", waits
for an already-running switch to finish, and overrides the Taffybar inputs to
the live checkout under this repo. Use it instead of running nixos-rebuild
directly.
Useful variants:
cd ~/dotfiles/nixos
just switch-remote
just switch-local-taffybar
just remote-switch <host>Build/check examples:
nix flake check ~/dotfiles/nixos
nix build ~/dotfiles/nixos#nixosConfigurations.strixi-minaj.config.system.build.toplevelThe flake also exposes package/check outputs for Hyprland plugins and a Hyprland Lua config syntax/verification check.
The macOS configuration lives in nix-darwin/flake.nix. It uses nix-darwin, nix-homebrew, Home Manager, agenix, and the shared package list in nix-shared/system/essential.nix.
Common workflow:
cd ~/dotfiles/nix-darwin
just switchThe active host configuration is mac-demarco-mini. There is also a
mac-demarco-mini-imalison target used while migrating the primary macOS user.
The NixOS Home Manager module nixos/dotfiles-links.nix reproduces the useful
part of rcm/rcup:
- files under dotfiles/ are linked into
$HOMEwith a leading dot; - directories under dotfiles/config/ are linked into
$XDG_CONFIG_HOME; - links are out-of-store symlinks, so editing the checkout updates runtime config immediately;
- generated or special directories such as
codex,lib,config, andemacs.dare handled separately.
On NixOS, shell scripts belong in dotfiles/lib/bin/ and autoloaded shell functions belong in dotfiles/lib/functions/. nixos/environment.nix adds those paths to the shell environment.
The nix-darwin Home Manager module in nix-darwin/home/common.nix uses the same basic idea for macOS, with extra launchd, GPG, Raycast, Homebrew, and agent setup.
The desktop setup is modular. nixos/desktop.nix enables the common desktop surface, while individual modules layer in window managers, panels, launchers, notifications, SNI/tray support, fonts, and app defaults.
The currently important pieces are:
- Hyprland configuration in dotfiles/config/hypr/hyprland.lua, backed by custom plugin inputs in the NixOS flake.
- XMonad configuration in dotfiles/config/xmonad/xmonad.hs, with upstream
xmonadandxmonad-contribavailable as submodules/checkouts. - Taffybar configuration in dotfiles/config/taffybar/taffybar.hs, plus a local flake and scripts for restart, screenshots, and SNI debugging.
- Waybar, Rofi, autorandr, Alacritty, Zellij, and miscellaneous app configs under dotfiles/config/.
The intended tiling-WM behavior is documented in docs/tiling-wm-experience.md, and the River/XMonad exploration is documented in docs/riverwm-evaluation.md.
Emacs is still a major part of the repo, just no longer the only thing here. The main files are:
- dotfiles/emacs.d/README.org: the original literate Emacs README.
- dotfiles/emacs.d/init.el and early-init.el: runtime entrypoints.
- dotfiles/emacs.d/org-config.org: the org-mode configuration that is tangled for normal Emacs and for org-agenda-api.
- gen-gh-pages/ and .github/workflows/gh-pages.yml: export the Emacs README to the public GitHub Pages site.
The repo carries the personal integration layer for org-agenda-api. nixos/org-agenda-api.nix tangles the org-mode configuration from dotfiles/emacs.d/org-config.org. org-agenda-api/container.nix combines that tangled config with per-instance loaders under org-agenda-api/configs/ and builds OCI containers exposed by the NixOS flake.
The host-side NixOS module nixos/org-agenda-api-host.nix runs the container behind nginx with ACME certificates and Podman.
To enter the deployment shell:
nix develop ~/dotfiles/nixos#org-agenda-apiSecrets are intentionally not stored as plaintext in the repo. Nix-managed
secrets use agenix files under nixos/secrets/. Runtime credentials and
personal service passwords live in pass. Modules and scripts should consume
secrets from those sources at runtime rather than checking derived values into
git.
Some third-party or upstream projects are tracked as submodules:
dotfiles/config/taffybar/taffybardotfiles/config/xmonad/xmonaddotfiles/config/xmonad/xmonad-contribdotfiles/config/alacritty/themesnixos/railbird.ai
Clone with submodules when bootstrapping a new checkout:
git clone --recurse-submodules git@github.com:IvanMalison/dotfiles.git ~/dotfilesThis repo also contains project-local git worktrees under .worktrees/ during
active development. Those are machine-local working state and are ignored.
.github/workflows/cachix.yml can build the strixi-minaj NixOS closure and
push paths to Cachix. docs/cachix.md documents the cache setup.
The top-level justfile contains helper commands for populating the
colonelpanic8-dotfiles Cachix cache from a local machine.
- Prefer Nix modules for system-level behavior and Home Manager modules for user-level placement and services.
- Put user commands in dotfiles/lib/bin/ and shell functions in dotfiles/lib/functions/.
- Run NixOS switches from nixos/ with
just switch. - Run macOS switches from nix-darwin/ with
just switch. - Keep host-specific behavior in nixos/machines/ where possible.
- Do not commit secrets or generated local state; use agenix,
pass, or ignored machine-local files.