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.
$ 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
# 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.
| step | os | what it does |
|---|---|---|
| packages | L M | packages/apt.txt on Linux, packages/Brewfile on macOS |
| suckless | L | builds and installs dwm, dmenu, dwmblocks, st and slock (and libxft-bgra if libXft is old) |
| builds | L M | Linux: Emacs, zathura-pdf-mupdf, mix-mpd from builds/. macOS: the Swift dmenu into ~/.local/bin, Zathura.app, CodeIsland |
| tools | L M | packages/tools.txt: uv, cargo, go, npm and pip tools |
| opt | L | packages/opt.txt: downloaded apps, into /opt |
| fonts | L M | the fonts of the assets repo |
| links | L M | every config symlink in links.txt for this OS, plus the Firefox profile files |
| shell | L M | Linux: oh-my-bash and dotfiles/bash/desktop.sh from ~/.bashrc. macOS: the swallow hook in ~/.zshrc |
| emacs | L M | Doom Emacs |
| session | L | a dwm entry for display managers (/usr/share/xsessions) |
| keyboard | L | keyd remap: /etc/keyd/default.conf links to keymap/linux/keyd.conf |
| defaults | L M | zathura as the default document viewer |
| services | M | starts skhd, borders and SketchyBar |
| syncthing | L M | starts 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 |
| theme | L M | generates 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.
/opt$HOME, with a platform columnBy 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.