The setup that works for me.
- Homebrew
- iTerm2
- Neovim with the checked-in Lua configuration
- bat — cat with wings
- delta — git diff
- Raycast
- Obsidian
- Zed
- Karabiner-Elements
- DBeaver
- fzf
- ripgrep — search for editor integrations
- n — Node version manager (
N_PREFIX=$HOME/.n) - lazygit
- lazydocker
- Colima — Docker daemon
git clone <this-repo> ~/dotfiles
cd ~/dotfiles
bash install.shHomebrew is discovered from PATH or its standard Apple Silicon/Intel locations and initialized before package installation. New shells initialize it too. Node uses n; nvm is not configured. Zed uses its native file finder and search, with no Television dependency.
After installation, restart your terminal and complete the account, Docker, and iTerm2 steps below.
Installation and sync copy .config files except those excluded by Git's ignore rules. .gitignore is the place to exclude unwanted configuration or application data; new non-ignored files are picked up automatically.
Ignored application data, including Zed databases and Karabiner automatic backups, is not copied or deleted. Git metadata is always skipped. Paths containing symlinks are rejected. Files absent from the source are left untouched at the destination.
Before replacing existing managed settings, installation saves copies in a unique ~/.local/state/dotfiles-backups/install-<timestamp>-<suffix>/ directory and prints its location. Backup paths mirror your home directory. To restore a setting, close the relevant application, inspect the backup, and copy that individual file back. For example, replace the placeholder with the printed directory:
cp "$HOME/.local/state/dotfiles-backups/install-<timestamp>-<suffix>/.zshrc" ~/.zshrcDo not paste the placeholder literally. Restore other files the same way, then reopen the application. Installation preserves unmanaged files and existing SSH keys.
-
Set your company identity in
~/.config/workspaces.gitconfig, replacing the placeholders with your own values:git config --file ~/.config/workspaces.gitconfig user.name "Your Name" git config --file ~/.config/workspaces.gitconfig user.email "you@company.example"
Labs repositories belong under
~/Documents/labs/; company repositories belong under~/Documents/workspaces/. Git refuses commits without an explicit identity outside these directories, and in workspaces until configured. Check the effective identity from within a repository withgit var GIT_AUTHOR_IDENT. -
Register
~/.ssh/id_ed25519_labs.puband~/.ssh/id_ed25519_workspaces.pubwith their respective GitHub accounts. Keep the private keys local. Use the matching SSH host alias when cloning or setting a remote:git clone git@github.com-labs:OWNER/REPOSITORY.git ~/Documents/labs/REPOSITORY git remote set-url origin git@github.com-workspaces:COMPANY/REPOSITORY.git ssh -T git@github.com-labs ssh -T git@github.com-workspacesRun
set-urlinside the relevant company repository. Successful GitHub authentication prints the account name; GitHub does not provide shell access. -
Start the Docker runtime and verify the daemon:
colima start docker info
-
Import the iTerm2 profile below. Open Neovim and Zed on the Mac, allow their initial plugin/tool setup to finish, and check file finding and project search. Check
brew --version,node --version, andrg --versionin a new terminal. These real-machine checks are separate from the Docker smoke suite.
Profile Import:
- Open iTerm2
- Go to
Preferences > Profiles - On the sidebar, click
Other Actions>Import JSON Profiles - Select
iterm2/iterm2-profile.jsonfrom this repo - Remove the old Default profile
Preferences:
Preferences > Appearance > General- Theme:
Minimal| Tab bar:Top| Status bar:Bottom
- Theme:
Preferences > Appearance > Tabs[x]Show tab bar even when there is only one tab
Preferences > Keys > Hotkey[x]Show/hide all windows with system-wide hotkey —⌥Space
Run the isolated Ubuntu Docker suite (requires a running Docker daemon):
./test.shThe suite mocks Homebrew packages, downloads, Git clones, and the Skills CLI. It starts without downloaded skills and checks restoration from the project lock, copying both skill folders, Homebrew discovery, repeat installation, backups, preserved runtime data/keys, Git identity, and interactive sync behavior. Each run owns its container and image and removes them afterward.
Passing this suite does not verify actual macOS package installation, remote skill availability, or editor startup. Complete the fresh-Mac checks above.
Keep personal skills separate from CLI-installed skills:
agents/skills/ Your own skills
.agents/skills/ Downloaded third-party skills (Git-ignored)
skills-lock.json Project lock managed by the Skills CLI
Run the CLI from this repository, without --global:
npx skills install vercel-labs/skills --skill find-skills --agent codex --yes
npx skills install mattpocock/skills --skill tdd improve-codebase-architecture grill-with-docs code-review --agent codex --yesThe --agent codex option selects the .agents/skills/ project folder. Commit only skills-lock.json for third-party skills; downloaded files are ignored. Create and commit your own skills in agents/skills/<name>/SKILL.md; use distinct names across the two folders.
install.sh first runs npx --yes skills@1.5.23 experimental_install inside this repo to restore skills-lock.json, then copies downloaded and personal skills to ~/.agents/skills/, with backups. The native restore command needs network access; it does not restore exact historical versions from the recorded hashes. The machine's global skill lock is left untouched. Update third-party skills in this repository with npx skills update --project --yes and commit the updated lock. Unrelated machine skills and Git-managed skills are preserved; Superpowers remains a separate Git clone.
Superpowers is a git repo and is not touched by sync.sh. Update it manually:
git -C ~/.agents/skills/superpowers pullWithin ~/Documents/labs/, normal commits use the default labs identity: sgennrw <nt.salisa@gmail.com>.
For a commit authored by AI, override only the name for that one commit:
git -c user.name=sgennrw.ai commit -m "your message"Later commits continue to use sgennrw; the labs email address is unchanged.
Run ./sync.sh from an interactive terminal. Select one or more groups by number:
1—~/.zshrc2—~/.gitconfig3—~/.configfiles, excluding Git-ignored paths4— your own skills already listed as folders underagents/skills/a— all groups
For example, enter 1 3 to sync the shell config and non-ignored .config files, then type sync to confirm. Group 4 uses rsync to copy your personal skills back from the machine. Missing skills are kept in the repository. Third-party skills, unrelated machine skills, and Git repositories are skipped.
The summary includes untracked files as well as tracked changes. Review git diff and inspect newly added files shown by git status --short before deciding whether to commit. Sync never commits automatically.
git diff
git status --short
git add -A && git commit -m "chore: sync dotfiles"