Dotfile configuration for Arch Linux and macOS.
After a fresh Arch install, you'll be in a TTY. Clone the repo and run the setup script:
git clone git@github.com:phcurado/dotfiles.git ~/dotfiles
cd ~/dotfiles
./setup.sh
rebootSDDM will start on boot. Select niri and login. Open a terminal with Super + T and connect to WiFi using the Noctalia control center.
git clone git@github.com:phcurado/dotfiles.git ~/dotfiles
cd ~/dotfiles
./setup.shThe setup script will install Xcode CLI tools, Homebrew, and all packages from macos-pkgs/Brewfile. Packages can be managed with make install and make tofile (OS is detected automatically).
The setup script can install Pi:
pi
/loginThe macOS desktop uses three Homebrew packages (in macos-pkgs/Brewfile), all autostarting at login:
- AeroSpace — tiling WM →
.config/aerospace/aerospace.toml - SketchyBar — top bar →
.config/sketchybar/ - JankyBorders — focused-window border →
.config/borders/bordersrc
Before first launch, turn off Displays have separate Spaces in System Settings > Desktop & Dock > Mission Control, then log out and back in. Grant AeroSpace Accessibility permissions when prompted.
These configs work on both Linux and macOS: neovim, ghostty, tmux, zsh, starship, git, yazi, bat, btop, mise, zoxide.
These are Linux-specific and create harmless dead symlinks on macOS: niri, noctalia.
Paru is an AUR helper for installing packages from the Arch User Repository.
sudo pacman -S --needed base-devel
git clone https://aur.archlinux.org/paru.git /tmp/paru
cd /tmp/paru
makepkg -siNote
All packages below are included in arch-pkgs/pkgs.txt and can be installed at once with make install. The individual install commands are shown for reference only.
Neovim is my preferred text editor.
paru -S neovimGhostty is a modern terminal emulator.
Important
Ghostty is configured to use the font 0xProto Nerd Font. Install it or change the font in .config/ghostty/config. List available fonts with ghostty +list-fonts.
paru -S ghosttytmux is a terminal multiplexer.
paru -S tmuxTo install plugins, open a tmux session and press prefix + I (prefix is Ctrl + a).
Mise manages versions of programming languages and tools.
paru -S mise
mise install # Install versions from mise.tomlZsh is my preferred shell.
paru -S zsh
chsh -s /usr/bin/zshReboot or log out/in to apply.
Starship is a cross-shell prompt.
paru -S starshipGNU Stow manages symlinks for dotfiles.
paru -S stow
stow --no-folding .If files conflict, use --adopt to override:
stow --no-folding --adopt .Install packages from the saved list:
make install
# or: paru -S --needed - < arch-pkgs/pkgs.txtSave current packages to file:
make tofile
# or: paru -Qqen > arch-pkgs/pkgs.txtReview arch-pkgs/pkgs.txt before installing - some packages may be system-specific.
| Command | Description |
|---|---|
make install |
Install packages from package list |
make show |
List installed packages |
make tofile |
Save installed packages to list file |
make cleanCache |
Clean package cache |
make secrets.setup |
Restore AGE key from 1Password |
make secrets.backup |
Show AGE key for backup to 1Password |
Niri is my window manager (Wayland scrolling compositor).
Noctalia provides the desktop shell (bar, notifications, launcher, lock screen, wallpaper, etc). WiFi is managed via NetworkManager through the Noctalia control center.
| Key | Action |
|---|---|
Super + T |
Terminal |
Super + B |
Open browser |
Super + Space |
App launcher |
Super + Q |
Close window |
Super + Tab |
Previous workspace |
Super + M |
Power menu |
Super + Alt + L |
Lock screen |
Super + Ctrl + W |
Random wallpaper |
Print |
Screenshot (full) |
Ctrl + Print |
Screenshot (screen) |
Alt + Print |
Screenshot (window) |
Super + Y |
Voice typing (hold) |
sudo systemctl enable --now bluetooth.serviceSyncthing is a continuous file synchronization program.
systemctl --user enable --now syncthingAccess the web UI at localhost:8384 or search "Syncthing" in the app launcher.
Personally I use SOPS with AGE for encrypting secrets in projects. My AGE private key is stored in 1Password and it's restored locally using the OP cli.
On a new machine:
make secrets.setup # Restores key from 1Password to ~/.config/sops/age/keys.txtBackup your key (if generating a new one):
mkdir -p .config/sops/age
age-keygen -o .config/sops/age/keys.txt
make secrets.backup # Shows key to copy to 1PasswordThe keys.txt file is gitignored and never committed.
Macropad configuration is in macropad/macropad.ron. Upload using:
ansible-playbook --ask-become-pass ansible-scripts/macropad.yml
