Dotfiles for Arch Linux and macOS, managed with dots.
Clone the repo and run the bootstrap script:
git clone git@github.com:phcurado/dotfiles.git ~/dotfiles
cd ~/dotfiles
./setup.shsetup.sh installs dots into ~/.local/bin if needed, then runs:
dots applydots apply checks the current machine, prints the changes, and asks for
confirmation before installing packages, linking files, copying fonts, starting
services, or changing user settings.
On Arch, reboot after the first apply so the shell, groups, display manager, and system services all start from a clean login.
Preview changes:
dots checkApply changes:
dots applySwitch profile-specific services:
dots --profile personal apply
# no VPN service
dots --profile work apply
# Twingate
dots --profile company apply
# TailscaleList managed resources:
dots state listThe local state lives in .dots/state.json and is not committed.
dots.lua entrypoint
dots/common.lua shared files, fonts, shell, and tools
dots/arch.lua Arch packages, services, and Linux-only links
dots/macos.lua Homebrew packages, services, and macOS-only links
dots/packages.lua shared package list
fonts/ managed fontsdots.lua uses normal Lua modules:
require("dots.common")
if dots.platform.family == "arch" then
require("dots.arch")
end
if dots.platform.family == "darwin" then
require("dots.macos")
end
require("dots.tools")Common resources include:
- shell:
zsh - config links: Neovim, Ghostty, tmux, zsh, Starship, git, yazi, bat, btop, mise, zoxide
- fonts from
fonts/ - mise tools
- local commands such as
pi,tree-sitter,weather, andtpane
Arch resources include:
- pacman bootstrap packages:
base-devel,git paruinstalled through pacman- desktop packages for niri/noctalia
- user groups:
docker,wheel - system services: Bluetooth, Docker, NetworkManager
- profile services: Twingate for
work, Tailscale forcompany
macOS resources include:
- Homebrew and Homebrew taps
- AeroSpace, SketchyBar, Borders, Ghostty, Brave, Discord, Obsidian, Docker Desktop, Tailscale, 1Password
- SketchyBar Lua bindings
- Homebrew services for SketchyBar and Borders
The Makefile is only a shortcut layer:
| Command | Description |
|---|---|
make secrets.backup |
Print AGE key for backup |
Before using AeroSpace for the first time, turn off Displays have separate
Spaces in System Settings > Desktop & Dock > Mission Control, then log out
and back in. Grant Accessibility permissions to AeroSpace and SketchyBar when
prompted.
| Key | Action |
|---|---|
Super + T |
Terminal |
Super + B |
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 |
Super + Y |
Voice typing |
The SOPS AGE key is restored from 1Password by dots apply.
To print the current key for backup:
make secrets.backupMacropad configuration is in macropad/macropad.ron. Upload it with:
ansible-playbook --ask-become-pass ansible-scripts/macropad.yml
