install.sh installs software and symlinks config into $HOME. Read it
before running it on a machine you care about.
git clone https://github.com/lummax/dotfiles.git && cd dotfiles
./install.sh
Re-running is cheap: every step is skipped once it is already done.
Detected automatically, nothing to pass by hand. An unrecognised distro is an error rather than a guess.
| Target | Detected by | Profile | Extra stow |
|---|---|---|---|
darwin |
$OSTYPE |
profile |
macos/ |
devcontainer |
/.dockerenv, $CODESPACES, ... |
profile-container |
- |
fedora-silverblue |
VARIANT_ID=cosmic-atomic |
profile |
cosmic/ |
fedora |
ID=fedora |
profile |
- |
debian |
ID/ID_LIKE of debian/ubuntu |
profile-headless |
- |
profile is the only one with GUI apps; profile-headless drops them for
devboxes and profile-container is base CLI only. The flake cannot tell
which distro it is on, so install.sh picks the profile.
nix run .#profile.switch # apply
nix run .#profile.rollback # undo the last switch
nix build .#profile # build without applying
Upgrading is deliberate: install.sh only ever installs what is pinned in
flake.lock and .config/nvim/lazy-lock.json. To move the pins forward,
apply them, and update both lockfiles for review:
./upgrade.sh # all flake inputs
./upgrade.sh nixpkgs # just one
- Everything top-level is stowed into
$HOMEexcept what.stow-local-ignoreexcludes.install.shnever overwrites existing config: it simulates each stow pass and stops with a list of conflicts to move aside yourself. - The Determinate Systems installer is the only script piped into a shell.
prekrunsnixfmton commit.install.shinstalls the hook, since.git/hooksis not tracked;prek run --all-fileschecks everything by hand. The hook is alocal/systemone so it uses thenixfmtpinned inflake.lockrather than a second version pinned byrev— the cost is that it needs the Nix profile onPATH, so committing from a GUI client that does not source it will fail to findnixfmt.cosmic/tracks only the keyboard layout and custom shortcuts. Theming and wallpaper stay with COSMIC's own settings daemon.ssh-agent.servicereplaces gnome-keyring's agent on the desktops, which cannot sign for the YubiKey's FIDO2 (sk-*) keys — it answers "agent refused operation".config.fishis what pointsSSH_AUTH_SOCKat it, and it has to be the shell rather thanenvironment.d, because gnome-keyring claims the variable at runtime and a value set that late wins. Hiding the keyring's autostart entry does not stop it under COSMIC either. The unit hangs offgraphical-session.targetrather thandefault.targetso it starts late enough to have a display to put the askpass prompt on. Not installed on devboxes: they are reached over ssh, whereconfig.fishleaves the forwarded agent alone. The prompt is a one-off GTK dialog, socosmic/carries a tiling exception to keep autotiling from swallowing it.~/.ssh/configis not tracked and deliberately sets noIdentityFile: naming both YubiKeys costs a PIN prompt and a touch on the wrong one before it fails.ssh-add -Kloads the resident keys off whichever token is plugged in, and the agent then offers only that one.- fish plugins come from nixpkgs, not fisher.
fish_variablesis runtime state and is gitignored, so keep anything worth having inconfig.fish. - Devcontainers install Nix with
--init none(no systemd), so only root or a sudo-capable user can run it;chshand fonts are skipped. - Fedora Atomic needs
/nixto exist before the installer runs, which a composefs root does not allow. Setroot.transient-roin/etc/ostree/prepare-root.conf, track it withrpm-ostree initramfs-etc, and add a boot unit that creates/nix. See nix-installer#1445.