Clean, straightforward dotfiles setup for Linux, macOS, and WSL:
Supported OS: Ubuntu, Ubuntu (WSL), and macOS. Focus: A Homebrew-first, zsh-focused dotfiles toolkit.
- πΊ Brew-first package install (all sections of
packages/brew.yamlinstalled by default) - π§Ύ Release verification (SHA256 + optional GPG on checksum)
- π§© Default skel profile deployment
- π Starship Tokyo Night preset by default
- π Nano syntax highlighting via nanorc
- π§± tmux via Homebrew + oh-my-tmux base config
- π§ͺ Dry-run support
- π Verbose debug mode when needed
- β»οΈ Safe re-runs (backup-and-replace by default; use
--preserveto keep existing files) - π Single-run lock to prevent concurrent installer collisions
- π Optional machine-readable install report (
--report-json)
chmod +x install.sh
# preview changes first
./install.sh --dry-run --verbose
# run install
./install.sh -yBy default, existing files like ~/.zshrc are backed up to .bak.<date> and replaced with fresh skel copies.
If the deployed file already matches skel exactly, the backup and copy are skipped (idempotent reruns).
Use --preserve to keep existing files unchanged without any backups.
# Latest main branch β one-liner, no version required:
curl -fsSL https://dot.rly.wtf/bootstrap.sh | bash
# Pinned to a specific release (recommended for reproducible installs):
curl -fsSL https://dot.rly.wtf/bootstrap.sh | bash -s -- --ref v1.0.7
# Branch (unverified):
curl -fsSL https://dot.rly.wtf/bootstrap.sh | bash -s -- --ref my-branchNote: The refless form downloads the current
mainbranch directly. It skips checksum verification and may include unreleased changes. Use--refwith a release tag for a verified, reproducible install. Branches are also supported but skip checksum verification.
.
βββ bootstrap.sh
βββ install.sh
βββ inventory/
β βββ default.yaml
βββ packages/
β βββ brew.yaml
β βββ apt.yaml
βββ scripts/
β βββ lib/brew-env.sh
β βββ lib/helpers.sh
β βββ lib/install-flags.sh
β βββ setup-starship.sh
β βββ post-install-checks.sh
βββ test/
β βββ root-configs.sh
β βββ lib/test-shims.sh
β βββ backup-collision.sh
β βββ bootstrap-e2e.sh
β βββ brew-env.sh
β βββ brew-package-sections.sh
β βββ installer-lock.sh
β βββ installer-idempotency.sh
β βββ preserve-flag.sh
β βββ sudo-single-prompt.sh
β βββ tmux-oh-my.sh
β βββ report-json.sh
β βββ skel-merge.sh
β βββ ssh-config-migration.sh
β βββ nanorc-optional-failure.sh
β βββ release-reproducible.sh
β βββ suite.bats
βββ skel/
βββ default/
βββ .zshrc
βββ .zshenv
βββ .tmux.conf.local
βββ .gitconfig
βββ .ssh/config
βββ .config/
βββ brew-init.sh
βββ starship.toml
- Standard mode: concise stage updates + status emojis
--verbose: extraπdebug lines--dry-run: commands are printed withπ§ͺand not executed- Post-install checks use traffic lights (
π’ / π‘ / π΄)
--ref <ref>(release tag or branch; release tags get checksum verification)--host <host>(advanced optional profile name; most users can ignore this)--pyver <ver>--create-home-pyver--dry-run--preserve(keep existing files untouched; opt out of backup-and-replace)--brew-only--no-apt--verbose--from-release(set internally by bootstrap)--report-json <path>(writes a JSON phase summary)--no-lock(advanced/debug; disables install lock guard)
BOOTSTRAP_GPG_FINGERPRINTto enforce expected checksum signer fingerprint inbootstrap.sh
TAG=v1.0.0
REPO_NAME="$(basename "$PWD")"
mkdir -p dist
tar --sort=name --mtime='UTC 1970-01-01' --owner=0 --group=0 --numeric-owner \
--exclude='.git' --exclude='./dist' -cf - . | gzip -n > "dist/${REPO_NAME}-${TAG}.tar.gz"
(cd dist && sha256sum "${REPO_NAME}-${TAG}.tar.gz" > "${REPO_NAME}-${TAG}.tar.gz.sha256")Verify deterministic archive output:
./test/release-reproducible.sh "$TAG"On macOS, install GNU tar first for deterministic-archive verification:
brew install gnu-tar
packages/brew.yaml is the single source of truth for Homebrew packages. All sections
(base, development, navigation, networking, system, media, security, inference, optional)
are installed by default. Inference tools (ollama, llama.cpp, llmfit) are now plain brew packages
and no longer require a separate opt-in flag.
packages/apt.yaml defines optional apt packages for Linux hosts. The apt_minimal section
is installed when running without --brew-only or --no-apt.
Repository AI guidance lives in AGENTS.md and includes:
- DRY/minimal change expectations
- Idempotency and safe-default requirements
- Ample, purposeful section/function comments in shell scripts and tests
- Existing files in
$HOMEare backed up to.bak.<date>and replaced with fresh skel copies by default. If the deployed file already matches skel exactly, the backup and copy are skipped. Use--preserveto keep existing files unchanged. ~/.zshenvis deployed fromskel/default/.zshenvvia the samedeploy_skel_profilepath as.zshrc; it respects--preserveand idempotency in the same way.- Existing
~/.ssh/configis auto-migrated to~/.ssh/config.localwhen local file is absent; managed~/.ssh/configthen includes~/.ssh/config.local. If~/.ssh/config.localalready exists it is backed up before migration.--preserveskips the SSH migration entirely, leaving both files untouched.
GitHub Actions runs a CI workflow that checks:
- shell syntax (
bash -n) - shellcheck linting
- no duplicate repo-root shell config files
- installer/bootstrap help output
- installer idempotency behavior (backup-and-replace by default; no new backups when file matches skel)
- backup collision handling for deterministic
.bak.<date>[.<n>]naming - backup accumulation across 4 runs (2 mutations + 1 idempotent + 1 mutation β 3
.bak.*files each) - skel directory merge behavior (preserve existing files, copy missing files)
- SSH config include migration behavior (
test/ssh-config-migration.sh) - oh-my-tmux bootstrap/preserve/override behavior (
test/tmux-oh-my.sh) - installer lock contention behavior (
test/installer-lock.sh) - report JSON validity/escaping checks (
test/report-json.sh) - brew package sections behavior (
test/brew-package-sections.sh) - sudo single-prompt behavior (
test/sudo-single-prompt.sh) - optional nanorc clone failure handling (
test/nanorc-optional-failure.sh) - brew environment resolution scenarios (
test/brew-env.sh) - bootstrap end-to-end README curl flow (
test/bootstrap-e2e.sh) - DRY BATS installer suite (
test/suite.bats) running all integration checks - release reproducibility verification (
test/release-reproducible.sh, tag workflow)
Release notes live in CHANGELOG.md.
Released under UNLICENSE. See UNLICENSE.