{"id":23943862,"url":"https://github.com/jarodtaylor/dotfiles","last_synced_at":"2026-05-18T14:05:57.703Z","repository":{"id":272401162,"uuid":"912983552","full_name":"jarodtaylor/dotfiles","owner":"jarodtaylor","description":"My personal dotfiles system built using Chezmoi with extensive automation, multi-identity support, and macOS-specific optimizations.","archived":false,"fork":false,"pushed_at":"2026-04-30T21:13:36.000Z","size":6425,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-30T23:10:05.004Z","etag":null,"topics":["1password","aerospace","chezmoi","cursor","dotfiles","homebrew","macos","nvim","starship","vscode"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jarodtaylor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-06T19:45:49.000Z","updated_at":"2026-04-16T19:28:59.000Z","dependencies_parsed_at":"2025-01-14T07:42:58.897Z","dependency_job_id":"95a260ce-1208-475e-bdac-28c359c96fd0","html_url":"https://github.com/jarodtaylor/dotfiles","commit_stats":null,"previous_names":["jarodtaylor/dotfiles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jarodtaylor/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarodtaylor%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarodtaylor%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarodtaylor%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarodtaylor%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jarodtaylor","download_url":"https://codeload.github.com/jarodtaylor/dotfiles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarodtaylor%2Fdotfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33180318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["1password","aerospace","chezmoi","cursor","dotfiles","homebrew","macos","nvim","starship","vscode"],"created_at":"2025-01-06T06:14:35.282Z","updated_at":"2026-05-18T14:05:57.698Z","avatar_url":"https://github.com/jarodtaylor.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal Dotfiles (Chezmoi)\n\nOpinionated macOS dotfiles managed by [chezmoi](https://www.chezmoi.io/) for\na single daily-driver Mac. Repo is the declarative source of truth for the\nshell, editor, package list, and other authored configs. AI tool state\n(`~/.claude`, `~/.codex`, `~/.cursor`) is captured from the machine on\ndemand because skills/agents/plugins churn too fast to hand-maintain.\n\n\u003e **Fair Warning**: highly personal setup. Fork and adapt — don't expect a\n\u003e plug-and-play experience on a different person's workflow.\n\n## Quick start (new machine)\n\nPrereqs — see [`SETUP.md`](SETUP.md) for detail:\n\n1. macOS installed; user account created\n2. `xcode-select --install`\n3. 1Password app installed + signed in (enable SSH agent + CLI integration)\n4. 1Password CLI installed + authenticated (`op signin`)\n\nThen:\n\n```bash\nbash \u003c(curl -fsSL https://raw.githubusercontent.com/jarodtaylor/dotfiles/main/bootstrap.sh)\n```\n\n\u003e ⚠️ Use `bash \u003c(curl …)` — process substitution — not `curl … | bash`.\n\u003e The pipe form gives bash a non-TTY stdin, which makes Homebrew's\n\u003e installer fail with a misleading \"Need sudo access\" error because\n\u003e it can't prompt for your password.\n\nThat:\n\n- Installs Homebrew, chezmoi, and age (needed at init time)\n- Clones this repo + runs `chezmoi apply`\n- Brewfile installs ~100 entries (58 brew + 33 casks + 8 MAS + 3 taps)\n- Configs are rendered with secrets pulled from 1Password\n\nTotal: ~5 minutes of active clicks + 30–60 minutes walkaway.\n\nAfter bootstrap finishes, walk through [`SETUP.md` §6\nPost-bootstrap setup](SETUP.md#6-post-bootstrap-setup-manual) — sign\ninto apps, grant macOS permissions (Accessibility, Screen Recording,\nkext approvals), and install the handful of packages excluded from the\nBrewfile (ExpressVPN).\n\n## Daily workflow\n\n```bash\n# Adding a package: edit the Brewfile, then apply.\n$EDITOR $(chezmoi source-path)/Brewfile     # add `brew \"foo\"` / `cask \"foo\"`\ndots apply                                  # install it\n\n# Removing a package: edit the Brewfile, then apply.\n$EDITOR $(chezmoi source-path)/Brewfile     # delete the line\ndots apply                                  # `brew bundle cleanup` uninstalls it\n\n# Adding an AI tool customization (skill, agent, plugin):\n# ... edit ~/.claude/skills/whatever.md ...\ndots sync                                   # capture drift into source repo\ncd \"$(chezmoi source-path)/..\"              # navigate to the repo\ngit diff                                    # review what was captured\ngit add . \u0026\u0026 git commit -m \"...\" \u0026\u0026 git push\n```\n\nThe Brewfile is hand-edited on purpose — the friction prevents package\nsprawl. `dots sync` only captures AI tool state (`~/.claude`, `~/.codex`,\n`~/.cursor`), where machine churn is real.\n\n\u003e ⚠️ **Don't `brew uninstall foo` directly** when `foo` is in the\n\u003e Brewfile. The next `dots apply` will reinstall it (Brewfile is the\n\u003e source of truth for installed packages). Edit the Brewfile first;\n\u003e cleanup will then remove it.\n\n## Key commands\n\n| Command | Purpose |\n|---|---|\n| `dots sync` | Capture AI tool drift into the source repo (no auto-commit) |\n| `dots apply` | Reconcile machine with repo (`chezmoi apply` + `brew bundle`) |\n| `dots doctor` | Multi-layer health check |\n| `dots edit` | Open the source repo in `$EDITOR` |\n\n### What is `dots`?\n\n`dots` (`home/bin/executable_dots`) is a thin Bash wrapper around\n`chezmoi` + `brew bundle` + `git`. If you're already a chezmoi user,\nthe mapping is:\n\n| `dots` command | Equivalent chezmoi/brew/git invocations |\n|---|---|\n| `dots apply` | `chezmoi apply` (which triggers `brew bundle install` via `run_onchange_before_10-install-packages.sh.tmpl` when the Brewfile changes) + `brew bundle cleanup --force` |\n| `dots sync` | `chezmoi re-add ~/.claude ~/.codex ~/.cursor`, with up-front detection of `.tmpl` drift (which `chezmoi re-add` silently skips) |\n| `dots doctor` | `chezmoi doctor` + `brew bundle check` + repo cleanliness + `op whoami` + AI tool dir presence |\n| `dots edit` | `$EDITOR $(chezmoi source-path)/..` |\n\nPlain `chezmoi apply`, `chezmoi diff`, `chezmoi re-add \u003cpath\u003e`, etc.\nstill work directly. The wrapper exists for keystroke economy and to\nbake in the combinations that are easy to get wrong — especially\nsurfacing template drift on `sync` so you don't get false-success\n(\"nothing changed\") when `chezmoi re-add` quietly refused to touch a\n`.tmpl` file.\n\n## Architecture\n\n```mermaid\nflowchart LR\n    subgraph repo[\"📁 Repo (this directory)\"]\n        direction TB\n        BF[\"Brewfile\u003cbr/\u003e(hand-edited)\"]\n        DC[\"dot_config/\u003cbr/\u003envim, zsh, ghostty,\u003cbr/\u003egit, ssh, ...\"]\n        AT[\"dot_claude/\u003cbr/\u003edot_codex/\u003cbr/\u003edot_cursor/\"]\n    end\n\n    subgraph machine[\"💻 Machine\"]\n        direction TB\n        BREW[\"Homebrew\u003cbr/\u003e/Applications\"]\n        CFG[\"~/.config\u003cbr/\u003e~/.zshenv\u003cbr/\u003e~/.ssh\u003cbr/\u003e...\"]\n        AI[\"~/.claude\u003cbr/\u003e~/.codex\u003cbr/\u003e~/.cursor\"]\n    end\n\n    subgraph op[\"🔐 1Password vault\"]\n        AGE[\"Age key\u003cbr/\u003etokens\u003cbr/\u003eenv files\"]\n    end\n\n    BF ==\u003e|dots apply| BREW\n    DC ==\u003e|dots apply| CFG\n    AT ==\u003e|dots apply| AI\n    AI -.-\u003e|dots sync| AT\n    op -.-\u003e|onepasswordRead\u003cbr/\u003eat template render| DC\n```\n\nSolid arrows = `dots apply` (repo → machine, the dominant flow).\nDashed = `dots sync` (machine → repo, AI tool state only) and\n1Password reads (vault → templates at apply time).\n\nShort version:\n\n- **Repo is source of truth for declared state.** Brewfile, SSH config,\n  `nvim`, `ghostty`, `starship`, `zsh`, `git`, etc. Hand-edit in the repo;\n  `dots apply` reconciles to the machine.\n- **Machine is source of truth for AI tool state.** `~/.claude`, `~/.codex`,\n  `~/.cursor` skills/agents/plugins churn too fast to hand-maintain.\n  `dots sync` re-adds them into the repo.\n- **Runtime state never syncs.** Logs, caches, session history, sqlite DBs —\n  filtered in `.chezmoiignore`.\n- **Secrets via 1Password.** SSH keys, work git email, age decryption key,\n  Claude/Codex auth tokens. No secrets on disk outside of 1Password-served\n  templates.\n\n## Key layout\n\n```\nbootstrap.sh                                        one-liner entry\nhome/                                                chezmoi source root\n├── Brewfile                                         package manifest (tap/brew/cask)\n├── bin/executable_dots                              the `dots` CLI\n├── dot_claude/, dot_codex/, dot_cursor/             captured AI tool state\n├── dot_config/                                      authored configs (nvim, ghostty, etc.)\n├── private_dot_ssh/                                 SSH config (1Password-backed)\n├── .chezmoiscripts/                                 runtime scripts (packages, pam, etc.)\n└── .chezmoi.toml.tmpl                               per-machine config, 1Password integration\n```\n\n## Validating changes\n\nFast-feedback checks before committing:\n\n```bash\nchezmoi execute-template \u003c home/path/to/file.tmpl   # render a template\nshellcheck home/bin/executable_dots bootstrap.sh    # lint shell\nchezmoi apply --dry-run -v                          # preview apply (read-only)\ndots doctor                                         # multi-layer health check\n```\n\n## Related docs\n\n- [`SETUP.md`](SETUP.md) — detailed new-machine walkthrough\n- [`docs/ADD_AI_TOOL.md`](docs/ADD_AI_TOOL.md) — onboarding a new AI tool: classify, ignore, secrets\n- [`docs/GOTCHAS.md`](docs/GOTCHAS.md) — rough edges and workarounds (password prompts, manual installs, etc.)\n\n## Inspiration\n\n- [Tom Payne's dotfiles](https://github.com/twpayne/dotfiles) — chezmoi's creator, clean reference implementation\n- [Chezmoi documentation](https://www.chezmoi.io/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjarodtaylor%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjarodtaylor%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjarodtaylor%2Fdotfiles/lists"}