- Lua 59.1%
- Shell 22.3%
- Ruby 18.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| installs | ||
| profiles | ||
| scripts | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| README.md | ||
| setup.sh | ||
dotfiles
Personal development-environment installer. It layers one or more profiles onto $HOME by symlinking files from profiles/<profile>/home, then syncs platform packages for the selected profiles.
Usage
./setup.sh --dry-run base personal
./setup.sh --force base personal
Options:
--dry-run: print the links and package installs that would happen.--force: move conflicting real files/directories into~/.dotfiles-backup/<timestamp>/before linking.
Profiles are applied in order. Later profiles win when they replace an earlier profile's symlink.
Profiles
base: shared shell/editor/git/terminal configuration.personal: personal Git identity, SSH host snippets, and Homebrew bundle.work: work Git identity, SSH host snippets, project-local Git config, and Homebrew bundle.bitwarden: Bitwarden-specific shell and SSH snippets.
How linking works
setup.sh recursively scans profiles/<profile>/home and symlinks every file into the matching path under $HOME.
If a directory contains a .link marker, the whole directory is symlinked instead of scanning its contents. This is useful for config directories that should be owned as one unit, such as ~/.config/nvim.
Package manifests
- Homebrew: profiles that include
home/Brewfileexpose it as~/Brewfile; setup runsbrew bundleagainst the last selected profile'sBrewfilewhen Homebrew is available. - Termux: profiles may include
packages/termux.txt; setup installs those packages withpkg install -ywhen running on Android/Termux. - Language runtimes: the base profile links
~/.config/mise/config.toml; its pinned portable-tool baseline is shared across platforms.
Runtime ownership
Platform package managers own OS bootstrap software and native integrations, including mise itself. Mise owns portable runtime versions; project mise.toml files override the global baseline. uv owns Python interpreters and environments once mise has installed its pinned uv executable. When a mise backend cannot support a platform such as Termux, the platform package manager may own that runtime as a documented exception. A native package's required runtime remains its package manager's transitive dependency—for example, Homebrew's mpv and yt-dlp require Deno on macOS—while mise selects the interactive Deno version.
Adding a profile
profiles/<name>/
├── home/ # files to symlink into $HOME
└── packages/termux.txt # optional Termux package manifest
Prefer adding profile-specific files over branching inside setup.sh. Use ./setup.sh --dry-run ... before applying a new profile to a real home directory.