dotfileswitcher installs, updates, and switches complete Hyprland dotfile distributions side by side.
The design goal is not to merge themes. Each profile keeps its own upstream configuration, keybindings, scripts, bars, launchers, and shell processes. Switching is done by controlled symlinks, health checks, and rollback snapshots.
dotfileswitcher doctor
dotfileswitcher list
dotfileswitcher install all
dotfileswitcher update --check
dotfileswitcher update all
dotfileswitcher switch jakoolit
dotfileswitcher status
dotfileswitcher rollbackUse --dry-run before mutating commands to inspect planned external commands and link changes:
dotfileswitcher --dry-run install noctalia
dotfileswitcher --dry-run switch noctaliaBy default all managed data lives below:
~/.local/share/dotfileswitcher/
~/.local/state/dotfileswitcher/
~/.cache/dotfileswitcher/
The active profile is exposed through symlinks such as:
~/.config/hypr
~/.config/waybar
~/.config/rofi
~/.config/quickshell
Existing user paths are backed up before the first managed switch.
- no automatic
$HOMEmutation during package installation - profile installs go into managed source directories
- updates happen in staging first
- switching uses a transaction directory
- previous targets are recorded for rollback
- commands are scoped to allow-listed paths under
$HOME - manifest link sources are rejected when they are absolute or escape the profile source tree
- each profile defines its own stop/start commands and health checks
start and stop manifest commands must be argv arrays. Health checks of type command
are shell snippets and should only be used in trusted built-in or user-authored manifests.
python -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
.venv/bin/python -m ruff check .
.venv/bin/python -m pytest -q
.venv/bin/python -m build --sdist --wheelThe AUR package should install only the CLI and built-in manifests. Users opt in explicitly:
dotfileswitcher init
dotfileswitcher install all