- Lua 59.6%
- Shell 40.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- 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> |
||
| bash | ||
| btop/.config/btop | ||
| cosmic/.config/cosmic/com.system76.CosmicTk/v1 | ||
| fish/.config/fish | ||
| ghostty/.config/ghostty | ||
| git/.config/git | ||
| lazyvim/.config/nvim | ||
| neofetch/.config/neofetch | ||
| nvim/.config/nvim | ||
| starship/.config | ||
| tmux/.config/tmux | ||
| variety/.config | ||
| vscodium/.config/VSCodium/User | ||
| wallpaper/.config/cosmic/com.system76.CosmicBackground/v1 | ||
| wpaperd | ||
| zed/.config/zed | ||
| zsh | ||
| .gitignore | ||
| bootstrap.sh | ||
| install.sh | ||
| README.md | ||
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.jsononly. Extensions declared in Nix (jnoortheen.nix-ide,arcticicestudio.nord-visual-studio-code,anthropic.claude-code) need to be installed by hand, and it assumesnixd/nixpkgs-fmtare on$PATH. nixd's options expression points at/etc/nixos+ mjolnir, as in Nix. - zed — its extensions become Zed's own
auto_install_extensionsmap, so nothing needs installing by hand. It still assumesnixd/nixpkgs-fmtare on$PATH, and nixd'soptions.nixos.exprhas a literal<HOSTNAME>placeholder — the Nix version bakes in whatever$HOSTNAMEwas set at build time, which doesn't really translate to a static file; fill in your actual host. Note that Zed (and btop, which setssave_config_on_exit) writes its settings back through the stow symlink, so UI changes show up as agit diffhere. - cosmic — pins COSMIC's minimize/maximize titlebar buttons
(
com.system76.CosmicTk); the dock favorites file is added too if a host ever setsprograms.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.nixandmodules/dots/variety/default.nix, both commented out ofdots.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/wallpaperand fight with thewallpaperpackage and each other, so they're left out of--all— stow one explicitly (./install.sh wpaperd). wpaperd'sexecscript is bundled as.local/bin/sync-cosmic-wallpaper.sh, and its systemd user unit as.config/systemd/user/wpaperd.service(systemctl --user enable --now wpaperdafter 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 frompkgs/omarchy-nvim.nixand then leaves writable; nixvim isn't used on NixOS hosts). It's an alternative to thenvimpackage, not an add-on: both own~/.config/nvim, so it's opt-in andinstall.shrefuses to stow the two together (./install.sh -D nvim && ./install.sh lazyvim). Differences from the live copy:lua/plugins/theme.luais 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 restoreto pin them tolazy-lock.json(the exact revisions mjolnir runs). Needsgit, a C compiler,curlandtaron$PATHfor nvim-treesitter; mason installs the tree-sitter CLI itself. Refresh by re-copying~/.config/nvim(and re-flatteningtheme.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/bashto pull from..bashrc/.bash_profilehere are a hand-written port of zsh/fish's shared bits (starship, zoxide, direnv, fzf, aliases, motd, the ghosttyTERM/ 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.secretsflake 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.nixsetsSSH_AUTH_SOCK=$HOME/.bitwarden-ssh-agent.sockfor the Bitwarden SSH agent. With the Flatpak build the socket is~/.var/app/com.bitwarden.desktop/data/.bitwarden-ssh-agent.sockinstead — set it in~/.config/environment.d/or point ssh at it withIdentityAgent. - Nix plumbing —
.zprofileandenvironment.d/10-home-manager.confonly source home-manager's session variables / set Nix's locale archive, nix-direnv'sdirenv/lib/hm-nix-direnv.shneeds Nix, and theapp-com.mitchellh.ghostty.serviceoverride points at the Nix ghostty (distro packages ship their own unit).