No description
  • Lua 59.1%
  • Shell 22.3%
  • Ruby 18.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Morten Olsen 9e9c07c72c
update
2026-09-04 13:56:21 +02:00
installs fix signing on termux 2026-07-31 12:12:08 +02:00
profiles update 2026-09-04 13:56:21 +02:00
scripts improved scripts 2026-07-31 12:27:46 +02:00
AGENTS.md improved scripts 2026-07-31 12:27:46 +02:00
CLAUDE.md improved scripts 2026-07-31 12:27:46 +02:00
README.md update 2026-08-28 23:54:17 +02:00
setup.sh improved scripts 2026-07-31 12:27:46 +02:00

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/Brewfile expose it as ~/Brewfile; setup runs brew bundle against the last selected profile's Brewfile when Homebrew is available.
  • Termux: profiles may include packages/termux.txt; setup installs those packages with pkg install -y when 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.