Dotfile configuration for archlinux.
After a fresh Arch install, you'll be in a TTY. Run these steps to get a working desktop:
# 1. Install prerequisites
sudo pacman -S --needed base-devel git stow
# 2. Install paru (AUR helper)
git clone https://aur.archlinux.org/paru.git /tmp/paru
cd /tmp/paru && makepkg -si
# 3. Clone dotfiles
cd ~/
git clone --recurse-submodules -j8 git@github.com:phcurado/dotfiles.git
cd dotfiles
# 4. Install all packages
make install
# 5. Create symlinks
stow --no-folding .
# 6. Set zsh as default shell
chsh -s /usr/bin/zsh
# 7. Reboot
rebootSDDM will start on boot. Select niri and login. Open a terminal with Super + T and connect to WiFi using noctalia's network panel.
Enable required system services after installing packages:
sudo systemctl enable --now NetworkManager
sudo systemctl enable sddmParu 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 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 ghosttytmux is a terminal multiplexer.
paru tmuxTo install plugins, open a tmux session and press prefix + I (prefix is Ctrl + a).
Mise manages versions of programming languages and tools.
paru mise
mise install # Install versions from mise.tomlZsh is my preferred shell.
paru zsh
chsh -s /usr/bin/zshReboot or log out/in to apply.
Starship is a cross-shell prompt.
paru starshipGNU Stow manages symlinks for dotfiles.
paru 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 arch-pkgs/pkgs.txt |
make show |
List installed packages |
make tofile |
Save installed packages to pkgs.txt |
make cleanCache |
Clean paru 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 Shell provides the desktop shell (bar, notifications, launcher, lock screen, etc). WiFi is managed via NetworkManager through noctalia's network panel.
| Key | Action |
|---|---|
Super + T |
Terminal |
Super + Space |
App launcher |
Super + Q |
Close window |
Super + M |
Session 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) |
Voxtype provides voice-to-text. Before first use, download the Whisper model:
voxtype setup --downloadPress Super + Y to start recording, press again to stop and transcribe.
voxtype setup gpu # Enable GPU acceleration (Vulkan)
voxtype setup model # Select transcription modelNote
Voxtype is still experimental on this config
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
