Personal dotfiles managed with chezmoi.
| File | Purpose |
|---|---|
dot_zshrc |
Zsh config (Oh My Zsh, git plugin, aliases, PATH, zoxide, NVM) |
dot_gitconfig |
Git session defaults (no personal identity, set per machine) |
run_once_before_setup-zsh-10.sh |
Install Oh My Zsh (unattended) |
run_once_before_packages-10.sh |
Core CLI packages via the right package manager (apt on Linux, Homebrew on macOS) |
run_once_before_setup-zoxide-20.sh |
Zoxide installer (curl; APT's version is stale on Ubuntu, brew has it too) |
run_once_before_setup-macos-30.sh |
macOS-only system defaults (dark mode, key repeat, Dock, Finder, clock, ...) |
bootstrap.sh |
Hosted one-line installer (see Setup) |
install.sh |
Optional checkbox menu (see below) |
optional/pi/ |
Optional pi config, skills, extensions, agents, guardrail, templates |
optional/macos/ |
Optional macOS app configs (aerospace.toml, vorssaint_settings.plist, iterm2_config.plist) |
- Linux (APT-based),
apt-getfor packages, plus XDG utils - macOS, Homebrew for packages (installed automatically if missing) + Apple's Xcode Command Line Tools
The setup scripts detect the running platform at runtime, and pick the package manager accordingly.
curlandgitavailable to bootstrap- On Linux:
sudoaccess to install packages - On macOS: you'll be prompted to accept Apple's Xcode Command Line Tools installer dialog (Homebrew needs it)
Run this — it installs chezmoi, clones + applies the dotfiles, and offers to switch your login shell to zsh. Everything is idempotent, so re-running is safe (needed after macOS finishes the Xcode CLT install):
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ItsZcx/dotfiles/main/bootstrap.sh)"On macOS, if prompted, accept the Xcode Command Line Tools installer, wait for it to finish, then run the command again.
The equivalent steps, if you prefer to do it yourself:
1. Install chezmoi (installs to ~/.local/bin):
sh -c "$(curl -fsLS get.chezmoi.io)"
export PATH="$HOME/.local/bin:$PATH"2. Initialize the dotfiles (no credentials needed — public repo):
chezmoi init --apply ItsZcx/dotfilesThis applies the dotfiles and runs the install scripts: Oh My Zsh,
core packages (via Homebrew/Xcode CLT on macOS, apt on Linux), Zoxide, and the
macOS system defaults (macOS only), and writes ~/.zshrc and ~/.gitconfig.
3. Make zsh your default shell (optional) — macOS already defaults to zsh:
chsh -s "$(which zsh)" # then log out and back inThe default shell commands do not set your git identity. Do this yourself
after setup, so you can use the right name/email for each machine (e.g. work vs
personal). It is required before your first git commit:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"bootstrap.sh finishes by asking which optional extras to configure. Core
items (.zshrc, .gitconfig, and the four unconditional installers) are
always applied; optional items are opt-in so a work machine can stay clean.
To run the selection menu yourself (from the source checkout):
bash ~/.local/share/chezmoi/install.shA checkbox list appears — move with Up/Down, toggle with Space, run checked items with Enter, quit with q.
Available optional features:
-
pi— deploysoptional/pi/agent-settings.jsonandoptional/pi/keybindings.jsonto~/.pi/agent/.settings.jsonsets the theme (dark), default provider/model (deepseek/deepseek-flash), thinking level (off), TUI mode, the enabled-model list, and thenpm:pi-web-accesspackage.keybindings.jsonadds word-wise delete bindings (Ctrl/Alt+Backspace, Ctrl+W, Alt+D).API keys are never stored here. Authenticate once per machine inside a pi session with
/login(or export the provider key), then your config file is ready. Existing files are backed up before overwriting. -
pi-skills— installs the curated skills inoptional/pi/skills/to~/.pi/agent/skills/so they are available as/skillcommands on every pi session.Installed skills (adapted from mattpocock/skills, cursor/plugins pstack and MengTo/Skills; Codex
agents/scaffolding, Cursor-specific coupling, and bundleddemo/payloads removed; each is pi-compatible):Skill Purpose ask-mattRouter: asks which skill/flow fits your situation (manual only) build-awwwards-quality-sitesFront door for premium motion-led sites; art direction, hero, asset honesty, validation. Pulls in the four companions below codebase-designDeep-module architecture vocabulary code-reviewReview changes since a fixed point against standards + spec diagnosing-bugs4-step reproduce→isolate→trace→fix loop for hard bugs domain-modelingSharpen project domain model, CONTEXT.md, ADRs grillingRelentless design/plan interview grill-with-docsGrilling that also writes ADRs and a glossary (manual only) gsapGSAP timelines, ScrollTrigger, stagger, transforms (companion, manual only) implementBuild a spec/ticket set test-first, then review the diff (manual only) improve-codebase-architectureScan for deepening opportunities, report, then grill (manual only) landing-pageLanding-page structure, copy, objection handling, SEO/AEO (companion, manual only) prototypeThrowaway spikes to answer design questions researchStructured research against high-trust primary sources resolving-merge-conflictsMethodical git conflict resolution tailwindcssTailwind layout, typography, theming, pitfalls (companion, manual only) tddTest-driven development (red-green-refactor) technical-writingLayered doc standard (Diátaxis/Google/STE/Global English; manual only) threejsThree.js scenes, materials, GLTF, performance (companion, manual only) to-specTurn the conversation into a written spec (manual only) to-ticketsBreak a plan into tracer-bullet tickets (manual only) unslopStrip AI tells / add human voice (auto-applies to all prose) wizardGenerate an interactive bash wizard for human-only steps unslopis model-invocable (auto-applies when pi writes any prose). Skills marked manual only carrydisable-model-invocation: true: they stay out of automatic context and are fired deliberately via/skill:<name>.Web-design family:
build-awwwards-quality-sitesis the front door and the only model-invocable member. It readsgsap,threejs,tailwindcss, andlanding-pageby relative path from its own directory (../gsap/SKILL.md, etc.), so those four stay subordinate and out of automatic selection. They remain usable standalone via/skill:gsap,/skill:threejs,/skill:tailwindcss, and/skill:landing-page. The family's upstreamdemo/folders (third-party site clones with broken runtime paths) were removed.Skills are idempotent to deploy and never overwrite an existing local skill of the same name. Some carry supporting files (e.g.
DEEPENING.md,tests.md,template.sh) that are copied along with them. -
pi-extensions— installs the worker extensions inoptional/pi/extensions/to~/.pi/agent/extensions/:btw.ts— a/btwside-chat screen pinned togoogle/gemini-3.5-flash-lite. It is fully isolated from your main session: it never routes through the agent loop, never grows the main model's context, and is discarded when you leave. Slash commands inside it:/context,/read <path>,/ls//tree,/clear,/quit.subagent/— delegate tasks to subagents in isolated context windows, with streaming output, parallel execution, and per-agent usage tracking.
git-guard.tsis deliberately not installed by this feature — it belongs topi-guard, which force-copies it so guardrail updates land.Deployment never overwrites an existing extension of the same name, so a locally-tweaked
btw.tsis safe. -
pi-agents— installs the subagent definitions inoptional/pi/agents/to~/.pi/agent/agents/:scout(fast recon returning compressed context),planner(implementation plans),reviewer(quality/security review), andworker(general-purpose, full capabilities, isolated context).Needed by the
/implement,/scout-and-planand/implement-and-reviewprompts, which drive thesubagentextension. Install this alongsidepi-extensionsandpi-prompts. -
pi-guard— installsoptional/pi/extensions/git-guard.tsandoptional/pi/APPEND_SYSTEM.mdto~/.pi/agent/.This is a global guardrail: pi can never run
git push, and it must not commit unless you tell it to. Pushing is always done by you manually, and push is hard-blocked with no approval escape hatch (fail-closed) — the extension intercepts everybashcall, splits compound commands, and blocks any statement whose git subcommand ispush. Commits are governed by a standing instruction (APPEND_SYSTEM.md): pi leaves finished work uncommitted and waits for you to ask, so it never commits on its own after making changes. Any clear instruction works —/commitis the canonical form, but "commit this" counts too. Restart pi or run/reloadafter installing.Unlike the other pi features, these two files are overwritten (with a timestamped
.orig.<timestamp>backup) so that guardrail fixes actually reach a machine that already has an older copy. -
pi-prompts— installsoptional/pi/prompts/*.mdto~/.pi/agent/prompts/, giving you reusable/commands./commit— commits uncommitted work in separate logical commits following the Conventional Commits spec (type/scope/subject/body rules), shows you the plan and exact commands first, waits for your confirmation, and never pushes (push stays manual). This is the canonical way to ask pi to commit (seepi-guardabove)./bro— restates pi's last message in plain human language, no jargon./implement— scout → planner → worker chain over$@./scout-and-plan— scout → planner, no implementation./implement-and-review— worker → reviewer → worker chain.
The three workflow prompts require the
subagentextension (pi-extensions) and the agent definitions (pi-agents). -
pi-web-access— installs thepi-web-accesspackage viapi install npm:pi-web-access(skipped if already present) and seeds~/.pi/agent/web-search.jsonfrom the repo template.This provides the
web_search,source_check,fetch_content, andget_search_contenttools plus the/websearch,/curatorand/searchcommands.The template ships an empty/placeholder
tinyfishApiKey, so searches fall back to zero-config Exa until you paste a real key. The installer never overwrites an existingweb-search.json, so a pasted key is safe. Keep the repo copy empty — never commit your real key. -
mac-aerospace— macOS-only. Installs the AeroSpace tiling window manager (casknikitabobko/tap/aerospace) and deploysoptional/macos/aerospace.tomlto~/.aerospace.toml.Requires macOS ≥ 13. AeroSpace reads
~/.aerospace.tomlon launch and reloads it when the file is saved, so deploying the file applies it. -
mac-vorssaint— macOS-only. Installs the Vorssaint menu-bar toolkit (caskvorssaint) and deploysoptional/macos/vorssaint_settings.plistto~/.vorssaint_settings.plist.Requires arm64 + macOS ≥ 14. The deployed file is Vorssaint's export/backup (it carries
vorssaintBackup*keys), not the live config that Vorssaint reads on launch. Restore it from Vorssaint's settings UI (Import/Backup). -
mac-iterm2— macOS-only. Installs iTerm2 (caskiterm2) and deploysoptional/macos/iterm2_config.plistto~/.iterm2_config.plist.The file holds iTerm2's settings only: the profile, colors, and global prefs, extracted from an iTerm2 export with no history, chats, or saved state. iTerm2 does not read it on launch, so import it once. Quit iTerm2 first, or the app overwrites the import when it exits:
defaults import com.googlecode.iterm2 ~/.iterm2_config.plistOr use Settings > General > Preferences > Import.
For the three mac-* features, an existing file that differs is backed up to
<file>.orig.<timestamp> before it is overwritten, so local edits are never
lost.
Adding future optional things (skills, editors, tools) = one entry in
install.sh's feature manifest plus an optional/<name>/ folder.
# Pull any remote changes and apply them (works via HTTPS on a public repo;
# if you cloned over SSH this uses your key)
chezmoi update
# Re-apply the dotfiles after editing (also triggers the "before" scripts)
chezmoi apply
# Edit the zshrc (opens $EDITOR on the source file, then offers to apply)
chezmoi edit ~/.zshrc
# Add an existing file into the dotfiles repo
chezmoi add ~/.somefile
# See the diff between your local file and the repo
chezmoi diffchezmoi runs scripts automatically based on their filename prefix:
| Prefix | When it runs |
|---|---|
run_once_* |
Only once, ever (until the script changes) |
run_once_before_setup-zsh-10.sh, installs Oh My Zsh once (unattended).run_once_before_packages-10.sh, installs core CLI packages once, using the platform's package manager.run_once_before_setup-zoxide-20.sh, installs Zoxide once (via curl atsetup-zoxide-20, as its.shsuffix + curl approach keeps it portable).run_once_before_setup-macos-30.sh, applies personal macOS system defaults once (dark mode, fast key repeat, Dock autohide / no Spaces reordering, Finder and menu-bar clock options). It is a no-op on non-macOS.
Why curl for Zoxide? The Ubuntu APT repo ships a very outdated Zoxide. The maintainers recommend installing via the official curl script, so Zoxide lives in its own portable
run_once_beforescript that works on both Linux and macOS (it also picks upbrewwhere present).
The numeric suffix (e.g. -10, -20) controls ordering.
-
Generate an Ed25519 SSH key:
ssh-keygen -t ed25519
-
Add the public key from
~/.ssh/id_ed25519.pubto GitHub's SSH key settings. -
Verify the connection:
ssh -T git@github.com