New machine

The same command sets up Linux (Debian/Ubuntu, dwm on X11) or macOS. It detects the OS and runs only that platform's steps. Every step can be run on its own and run again safely.

stclone + run
$ git clone --recursive git@github.com:AnissL93/personal-infra.git ~/System/personal-infra
$ cd ~/System/personal-infra
$ ./bootstrap.sh --dry-run   # see what it would do
$ ./bootstrap.sh             # everything
$ ./bootstrap.sh links theme # or single steps
stsubmodules
# after a plain clone (without --recursive)
$ git submodule update --init --recursive
# change a module: push it first, then record it here
$ git -C dotfiles push
$ git add dotfiles && git commit -m "chore: bump dotfiles"

Steps ./bootstrap.sh --help

Run in this order (14 on Linux, 11 on macOS). L Linux, M macOS.

steposwhat it does
packagesL Mpackages/apt.txt on Linux, packages/Brewfile on macOS
sucklessLbuilds and installs dwm, dmenu, dwmblocks, st and slock (and libxft-bgra if libXft is old)
buildsL MLinux: Emacs, zathura-pdf-mupdf, mix-mpd from builds/. macOS: the Swift dmenu into ~/.local/bin, Zathura.app, CodeIsland
toolsL Mpackages/tools.txt: uv, cargo, go, npm and pip tools
optLpackages/opt.txt: downloaded apps, into /opt
fontsL Mthe fonts of the assets repo
linksL Mevery config symlink in links.txt for this OS, plus the Firefox profile files
shellL MLinux: oh-my-bash and dotfiles/bash/desktop.sh from ~/.bashrc. macOS: the swallow hook in ~/.zshrc
emacsL MDoom Emacs
sessionLa dwm entry for display managers (/usr/share/xsessions)
keyboardLkeyd remap: /etc/keyd/default.conf links to keymap/linux/keyd.conf
defaultsL Mzathura as the default document viewer
servicesMstarts skhd, borders and SketchyBar
syncthingL Mstarts Syncthing at login (Linux: user service + linger; macOS: puts Syncthing.app's CLI on PATH), then runs syncthing-hub's inspect on syncthing-hub/config.toml. apply, which changes every machine over SSH, is run by hand
themeL Mgenerates all colours, cursors and the wallpaper (amber, or the current theme)

What gets installed

The script holds no package names. Everything it installs is listed in plain files, so adding software means adding one line there and one row to SOFTWARE.md. The apps page shows the result.

packages/apt.txtLinux system packages
packages/BrewfilemacOS formulae and casks
packages/tools.txtuv, cargo, go, npm and pip tools, with a platform column
packages/opt.txtLinux apps downloaded into /opt
builds/things built from source
links.txtconfig symlinks into $HOME, with a platform column

By hand, once

Linux

Credentials, vendor apt repositories (VS Code, Docker, Tailscale, Syncthing, CUDA) and Firefox's first start. bootstrap.sh lists them when it finishes. Apps marked manual on the Linux page are not installed by it.

macOS

Apps installed by hand first need HOMEBREW_CASK_OPTS=--adopt brew bundle --file packages/Brewfile. Casks that ask for a password (Squirrel, Karabiner, Docker, Tailscale, Bitwarden) must be installed from a terminal. Then enable the "keymap" rules in Karabiner and allow SketchyBar, AeroSpace and skhd under Accessibility. More on the macOS page.