Portable application packages and configuration, deployed with GNU Stow.
This repository has a deliberately narrow job:
- Track a small profile of applications and command-line tools.
- Map that profile to the current operating system's package names.
- Link portable application configuration into the user's home directory.
Full workstation provisioning—including repositories, drivers, desktop policy, and system tuning—belongs in a separate repository.
The default Stow deployment includes Git, Ghostty, Neovim/LazyVim, Bash, Starship, Herdr, btop, lazygit, bat, and eza. Package contents mirror paths
relative to $HOME. The managed Bash startup file loads additive fragments from
~/.bashrc.d. If an existing ~/.bashrc already loads that directory,
deployment preserves it; otherwise Stow stops instead of replacing personal
shell startup commands.
Supported package providers today are Fedora (dnf) and Ubuntu (apt). Tools
the distro does not ship cleanly fall through to scripts/install-user-tools.sh
from the package adapters.
Preview the package transaction and dotfile deployment:
./bootstrap.sh --dry-runOn a fresh machine without GNU Stow, this lists the dotfile packages that will be deployed; after Stow is installed, the same command also checks exact link changes and conflicts.
Install missing packages and deploy all configured dotfiles:
./bootstrap.shThe package step is idempotent: each OS adapter checks what is already present
and only installs what is missing. The Stow step always uses --restow so it
also repairs managed symlinks.
Run either half independently:
./bootstrap.sh --packages-only
./bootstrap.sh --dotfiles-onlyNever run these scripts with sudo; the package adapters request elevation only
for the OS package transaction.
After packages are in place, adapters may still call
scripts/install-user-tools.sh for profile entries that apt/dnf cannot satisfy
cleanly (for example Starship on Fedora, uv on Ubuntu, mikefarah yq,
rust-analyzer, Herdr, Codex, and Cursor CLI). Starship and uv fallbacks download a pinned GitHub release and
check sha256 before installing. You can also run that script directly for the
optional lint binaries:
./scripts/install-user-tools.shList the portable identifiers and their OS package mapping:
./scripts/install-packages.sh --provider fedora --list
./scripts/install-packages.sh --provider ubuntu --listThe package data is split into:
packages/profile.txt: provider-neutral application identifiers.packages/providers/<provider>.txt: OS package names.packages/adapters/<provider>.sh: detection, planning, and installation behavior.
Ubuntu notes:
- Prefer Ubuntu 26.04+ so
lazygit,ghostty, andstarshipare in universe. - Universe
starshipcan lag the prompt config; bootstrap overlays the pinned GitHub release into~/.local/binwhen apt is older. uv,rust-analyzer, mikefarahyq,herdr,codex, andcursor-cliare treated as user-space tools because apt either omits them or ships a differentyq. Cursor CLI installs theagentbinary.fd/batmay appear asfdfind/batcat; shell aliases and optional~/.local/binshims cover the usual names.
Fedora notes:
starship,herdr,codex, andcursor-cliare not in the default repos, so the Fedora adapter installs them viascripts/install-user-tools.shwhen the binary is missing. Cursor CLI installs theagentbinary.ghosttyandlazygitexpect their usual COPR/third-party repos from workstation provisioning.
To add another tested provider, add its mapping and an executable adapter with
the same detect, plan, and install interface. The shared profile and Stow
packages do not change.
Preview or deploy the explicit default package list:
./scripts/stow.sh base --dry-run
./scripts/stow.sh baseDeploy selected portable packages:
./scripts/stow.sh base git nvimstow-packages.txt is the source of truth for the default deployment. Keeping
that allowlist separate prevents infrastructure and documentation directories
from being mistaken for dotfile packages.
Ordinary commits are unsigned so unattended tools do not block on 1Password.
Use git cis for an explicitly signed personal commit. GitHub HTTPS credentials
are delegated to gh auth git-credential through ~/.local/bin/gh-credential.
Credentials and private keys are never stored in this repository.
Run the repository checks before committing implementation changes:
./scripts/check.sh