No description
  • Lua 59.6%
  • Shell 40.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Emilio S 927a3f2309 fix: format Nix with nixfmt; bootstrap prefers Terra's Nerd Font
- zed/vscodium (regenerated from nix-config 607638c): nixd and zed's
  format-on-save use nixfmt, the formatter nix-config's treefmt uses,
  instead of the archived nixpkgs-fmt.
- tmux (regenerated): allow-passthrough all, from nix-config.
- bootstrap.sh --gui installs jetbrainsmono-nerd-fonts from Terra; the
  GitHub download is now only the fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:06:38 -04:00
bash Move zoxide init to the end of bash/.bashrc 2026-09-23 21:02:22 -04:00
btop/.config/btop feat: add btop and zed stow packages 2026-09-24 13:10:43 -04:00
cosmic/.config/cosmic/com.system76.CosmicTk/v1 feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
fish/.config/fish feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
ghostty/.config/ghostty chore: regenerate starship and ghostty from nix-config 2026-10-06 14:20:41 -04:00
git/.config/git chore(git): regenerate with the new commit email 2026-10-05 20:46:56 -04:00
lazyvim/.config/nvim feat(lazyvim): add Omarchy's LazyVim config as an opt-in nvim package 2026-10-06 14:32:37 -04:00
neofetch/.config/neofetch Add install.sh and the generated stow packages 2026-09-21 18:10:59 -04:00
nvim/.config/nvim feat(nvim): load nixvim's plugins with lazy.nvim off Nix 2026-10-05 19:56:32 -04:00
starship/.config chore: regenerate starship and ghostty from nix-config 2026-10-06 14:20:41 -04:00
tmux/.config/tmux fix: format Nix with nixfmt; bootstrap prefers Terra's Nerd Font 2026-10-09 16:06:38 -04:00
variety/.config feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
vscodium/.config/VSCodium/User fix: format Nix with nixfmt; bootstrap prefers Terra's Nerd Font 2026-10-09 16:06:38 -04:00
wallpaper/.config/cosmic/com.system76.CosmicBackground/v1 feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
wpaperd feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
zed/.config/zed fix: format Nix with nixfmt; bootstrap prefers Terra's Nerd Font 2026-10-09 16:06:38 -04:00
zsh feat: regenerate from mjolnir, add GUI packages, fix Fedora gaps 2026-10-05 19:03:44 -04:00
.gitignore Activate tmux's TPM plugins, silence first-run warning, ignore TPM's checkouts 2026-09-21 20:14:01 -04:00
bootstrap.sh fix: format Nix with nixfmt; bootstrap prefers Terra's Nerd Font 2026-10-09 16:06:38 -04:00
install.sh feat(lazyvim): add Omarchy's LazyVim config as an opt-in nvim package 2026-10-06 14:32:37 -04:00
README.md feat(lazyvim): add Omarchy's LazyVim config as an opt-in nvim package 2026-10-06 14:32:37 -04:00

dotfiles (stow)

Plain, Nix-free versions of the configs declared in modules/dots/, laid out as GNU Stow packages — one folder per app, each mirroring $HOME inside it. Home-manager stays the source of truth for Nix-capable hosts; this is for the case you deliberately don't want Nix on a machine (or just want a plain-file copy to poke at).

Usage

On a new machine, start with:

./bootstrap.sh               # tools + core stow + zsh/tmux plugins
./bootstrap.sh --gui         # also ghostty, JetBrainsMono Nerd Font, GUI stow

It installs what the configs expect on $PATH with dnf (zsh, fish, tmux, neovim, fzf, zoxide, direnv, starship, grc, eza, bat, btop, …; starship and ghostty need the Terra repo, which it offers to add), clones zplug and TPM, moves distro-default shell rc files (identical to /etc/skel) out of stow's way, runs install.sh, then fetches the zsh and tmux plugins. GUI packages are stowed one at a time, so one that conflicts with existing desktop files is skipped instead of aborting the rest. Re-runnable; on non-dnf distros it prints the package list and does everything else.

Day to day:

./install.sh                 # stow the core (non-GUI) packages
./install.sh --all           # core + GUI packages (wpaperd/variety stay opt-in)
./install.sh zsh tmux nvim   # only the packages named
./install.sh -D [packages]   # unstow
./install.sh -R [packages]   # restow (after editing a package)

It's a thin wrapper around stow -t "$HOME" -d <this repo>, runnable from anywhere; see it for the exact package lists. Stow refuses to overwrite a file it doesn't already own, so pre-existing dotfiles are left alone rather than clobbered.

Keeping it in sync

This repo is generated from nix-config (a sibling checkout) — modules/dots/ there is the actual source of truth. From the nix-config repo:

just regen-dotfiles [host]        # defaults to "mjolnir"
bin/regenDotfilesPodman.sh [host] # same, on a machine without Nix (podman)

runs bin/generateDotfiles.sh, which pulls zsh, fish, tmux, ghostty, git, nvim, btop, zed — plus vscodium, cosmic, wallpaper when the host sets myHomeDots.enableGui — straight from the evaluated Nix config (nix eval, not a full build — takes a few seconds) and re-copies starship, neofetch from their already-plain source files, writing into ../dotfiles (this repo, expected as a sibling directory of nix-config). It needs jq on $PATH (zed's settings.json is built from userSettings + extensions). Re-run it after editing modules/dots/{zsh,fish,tmux,ghostty,nvim,btop,zed,vscodium,cosmic,wallpaper} or modules/users/angelus/gitconfig.nix there, then review with git diff in this repo before committing — it's a straight overwrite, not a merge.

The default host is mjolnir: it's the NixOS desktop with enableGui on (so the GUI packages exist to render), and it runs nixpkgs-unstable's home-manager, whose output differs cosmetically from the 26.05 release the standalone targets use. Generating from another host is fine but shows up as churn in git diff — the Bitwarden auto-login block in .zshrc/ config.fish, for one, is only rendered for mjolnir/tyr/stormbreaker (it's guarded by a file test, so it's a no-op anywhere the agenix secret isn't).

bin/regenDotfilesPodman.sh runs the same script in a throwaway nixos/nix container, mounting both checkouts plus your SSH key ($SSH_KEY, default ~/.ssh/angelus, read-only) to fetch the private flake inputs. The first run downloads a few hundred MB into the container and takes a few minutes; nothing is installed on the host.

nvim isn't wired into any standalone host (only Darwin imports modules/dots/nvim), so the script evaluates it through a scratch home-manager config in bin/nvim-standalone.nix that mirrors the Darwin wiring. Nixvim exposes the fully-rendered Lua as config.programs. nixvim.content, so this is the literal generated config, not a reconstruction. Nixvim loads plugins through a wrapped nvim binary rather than through init.lua itself, so off Nix the generated init.lua starts with require("lazy-bootstrap"): lua/lazy-bootstrap.lua (hand-maintained) clones lazy.nvim on first start and installs lua/nix-plugins.lua, a spec the script renders from nixvim's final plugin set (bin/nvim-lazy-spec.nix, dependencies such as plenary/nui/vim-repeat included) pinned to the same commits/tags nixpkgs builds them from. lazy's lockfile and update checker are off, so plugin versions only move when nix-config's flake.lock does and you regenerate. Language servers (nixd, nixpkgs-fmt, the ansible server, …) are still yours to install.

The script also strips Nix store paths down to bare command names (e.g. eval "$(/nix/store/.../bin/zoxide init zsh)" → eval "$(zoxide init zsh)") so the output runs off $PATH instead of pinned store paths — that means zsh/fish (and bash, see below) need fzf, zoxide, starship, direnv installed and on $PATH to behave the same. The direnv hook line is the one exception that's rewritten with an is-it-installed guard (as .bashrc already does), since a missing direnv otherwise errors on every shell start. zsh's zplug sourcing is rewritten to source "$ZPLUG_HOME/init.zsh", i.e. the standard non-Nix zplug self-installer layout ($ZPLUG_HOME is already ~/.zplug), rather than requiring a zplug binary on $PATH. A few lines are Nix-only plumbing with no off-Nix equivalent and get dropped instead of rewritten: the NIX_PROFILES/fpath loop and HELPDIR in .zshrc, hm-session-vars.sh/ .fish sourcing in .zshenv/config.fish, and the nix-index command-not-found integration in both. fish's grc shell-integration is rewritten to if test -f /etc/grc.fish; source /etc/grc.fish; end — grc ships that file itself, and /etc/grc.fish is where dnf/rpm installs put it (Fedora/RHEL); the test -f guard makes it a no-op elsewhere. If your distro puts it somewhere else, adjust the path by hand.

tmux plugins (yank/resurrect/continuum) are wired via TPM instead of Nix — see the comment block at the bottom of tmux/.config/tmux/tmux.conf (right above the run '~/.tmux/plugins/tpm/tpm' line, which must stay last). ghostty opens a plain shell (it no longer auto-launches tmux). Its theme = Nord is resolved from Ghostty's own share/ghostty/themes, which some distro packages ship empty (Fedora's does), so the script also copies the named theme file out of the Ghostty package home-manager uses into ghostty/.config/ghostty/themes/.

Generated GUI packages

  • vscodium — settings.json only. Extensions declared in Nix (jnoortheen.nix-ide, arcticicestudio.nord-visual-studio-code, anthropic.claude-code) need to be installed by hand, and it assumes nixd/nixpkgs-fmt are on $PATH. nixd's options expression points at /etc/nixos + mjolnir, as in Nix.
  • zed — its extensions become Zed's own auto_install_extensions map, so nothing needs installing by hand. It still assumes nixd/nixpkgs-fmt are on $PATH, and nixd's options.nixos.expr has a literal <HOSTNAME> placeholder — the Nix version bakes in whatever $HOSTNAME was set at build time, which doesn't really translate to a static file; fill in your actual host. Note that Zed (and btop, which sets save_config_on_exit) writes its settings back through the stow symlink, so UI changes show up as a git diff here.
  • cosmic — pins COSMIC's minimize/maximize titlebar buttons (com.system76.CosmicTk); the dock favorites file is added too if a host ever sets programs.cosmic.dock.shortcuts. The Nix module also sets the matching GTK button layout through dconf, which isn't a file stow can place — run once: gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close'
  • wallpaper — the COSMIC background config, rotating hourly through ~/Pictures/Wallpaper. Nix fills that directory from the wallpaper repo; here, clone it yourself: git clone https://git.avgtechguy.com/avgtechguy/wallpaper ~/Pictures/Wallpaper

COSMIC writes its settings in place, so if ~/.config/cosmic/... files already exist, stow refuses to replace them (move them aside first), and changes made in COSMIC Settings afterwards land in this repo as a git diff, the same as zed/btop.

Hand-maintained (not touched by the regen script)

  • wpaperd, variety — static text from modules/dots/wpaperd/default.nix and modules/dots/variety/default.nix, both commented out of dots.nix (not applied on any host), so there's no live option value to pull from; update them by hand if those sources change. Both rotate wallpapers from ~/Workspace/Projects/wallpaper and fight with the wallpaper package and each other, so they're left out of --all — stow one explicitly (./install.sh wpaperd). wpaperd's exec script is bundled as .local/bin/sync-cosmic-wallpaper.sh, and its systemd user unit as .config/systemd/user/wpaperd.service (systemctl --user enable --now wpaperd after stowing); variety ships an autostart entry. Paths are hardcoded to /home/angelus/... — adjust if yours differs.

  • lazyvim — Omarchy's LazyVim config as it runs on mjolnir (copied from ~/.config/nvim, which omarchy-nix seeds once from pkgs/omarchy-nvim.nix and then leaves writable; nixvim isn't used on NixOS hosts). It's an alternative to the nvim package, not an add-on: both own ~/.config/nvim, so it's opt-in and install.sh refuses to stow the two together (./install.sh -D nvim && ./install.sh lazyvim). Differences from the live copy: lua/plugins/theme.lua is a plain file pinned to tokyonight-night instead of a symlink into Omarchy's theme state, and the Omarchy theme hot-reload hook stays inert without Omarchy. First launch installs plugins at their latest commits; run :Lazy restore to pin them to lazy-lock.json (the exact revisions mjolnir runs). Needs git, a C compiler, curl and tar on $PATH for nvim-treesitter; mason installs the tree-sitter CLI itself. Refresh by re-copying ~/.config/nvim (and re-flattening theme.lua) after changing it there.

  • bash — not a regen candidate at all: home-manager only manages zsh and fish there, so there's no modules/dots/bash to pull from. .bashrc/ .bash_profile here are a hand-written port of zsh/fish's shared bits (starship, zoxide, direnv, fzf, aliases, motd, the ghostty TERM/ shell-integration fix, the ssh/mosh mouse-reset) for whoever's default shell is bash. Left out on purpose: zsh's zplug plugins and fish's built-in autosuggestions/syntax-highlighting/history-prefix-search have no bash equivalent without pulling in a separate plugin manager (e.g. bash-it), so bash just doesn't get those.

Skipped entirely

  • avatar, ssh — both source files from the private inputs.secrets flake input (avatar.jpeg, ssh.nix). Duplicating its contents into a plain committed file here would undo the point of keeping them in a separate private repo — copy them yourself from wherever you keep that input if you need them outside Nix.
  • agents — myAgents (the agent launcher, crash watcher, usage collectors and Quickshell panel, plus their COSMIC shortcuts and systemd user units) is built by Nix rather than written as config: scripts get their settings and tool paths injected at build time, and the Claude/Codex collectors come from the pinned omarchy source. There's no plain-file equivalent to extract; it would need a separate install script.
  • opencode — host-specific to mayra (talks to its local Ollama), not part of dots.nix.
  • bitwarden, firefox, librewolf, tssystray — these modules only install packages / wire up native-messaging hosts / define a systemd user service; there's no dotfile content to extract. One thing worth carrying over by hand: bitwarden/default.nix sets SSH_AUTH_SOCK=$HOME/.bitwarden-ssh-agent.sock for the Bitwarden SSH agent. With the Flatpak build the socket is ~/.var/app/com.bitwarden.desktop/data/.bitwarden-ssh-agent.sock instead — set it in ~/.config/environment.d/ or point ssh at it with IdentityAgent.
  • Nix plumbing — .zprofile and environment.d/10-home-manager.conf only source home-manager's session variables / set Nix's locale archive, nix-direnv's direnv/lib/hm-nix-direnv.sh needs Nix, and the app-com.mitchellh.ghostty.service override points at the Nix ghostty (distro packages ship their own unit).