@sebastienrousseau/dotfiles 0.2.519 → 0.2.521

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/CHANGELOG.md +200 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/{LICENSE → LICENSE-MIT} +1 -1
  4. package/README.md +1172 -166
  5. package/install.sh +77 -11
  6. package/package.json +8 -8
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/CNAME +0 -1
  12. package/docs/CONFIG_STRATEGY.md +0 -124
  13. package/docs/COPYRIGHT +0 -7
  14. package/docs/GOVERNANCE.md +0 -98
  15. package/docs/MAINTAINERS.md +0 -41
  16. package/docs/NAMING_CONVENTIONS.md +0 -102
  17. package/docs/OPENCODE.md +0 -127
  18. package/docs/README.md +0 -84
  19. package/docs/STRUCTURE.md +0 -102
  20. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  21. package/docs/adr/ADR-002-shell-performance.md +0 -130
  22. package/docs/adr/ADR-003-security-first.md +0 -158
  23. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  24. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  25. package/docs/adr/ADR-006-shell-selection.md +0 -124
  26. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  27. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  28. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  29. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  30. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  31. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  32. package/docs/adr/README.md +0 -40
  33. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  34. package/docs/architecture/ARCHITECTURE.md +0 -117
  35. package/docs/architecture/INTEROP.md +0 -44
  36. package/docs/architecture/REPO_LAYOUT.md +0 -241
  37. package/docs/architecture/WALKTHROUGH.md +0 -86
  38. package/docs/architecture/fleet-deployment.md +0 -77
  39. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  40. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  41. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  42. package/docs/archive/PLAN.md +0 -199
  43. package/docs/archive/REPO_AUDIT.md +0 -31
  44. package/docs/articles/.pages +0 -6
  45. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  46. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  47. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  48. package/docs/articles/index.md +0 -36
  49. package/docs/guides/INSTALL.md +0 -144
  50. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  51. package/docs/guides/THEMING.md +0 -230
  52. package/docs/guides/TROUBLESHOOTING.md +0 -176
  53. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  54. package/docs/index.md +0 -132
  55. package/docs/interop/A2A.md +0 -39
  56. package/docs/interop/POWERSHELL.md +0 -102
  57. package/docs/manual/00-introduction.md +0 -89
  58. package/docs/manual/01-concepts/01-architecture.md +0 -138
  59. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  60. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  61. package/docs/manual/01-concepts/04-fleet.md +0 -148
  62. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  63. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  64. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  65. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  66. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  67. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  68. package/docs/manual/03-reference/01-dot-cli.md +0 -450
  69. package/docs/manual/03-reference/02-config-files.md +0 -265
  70. package/docs/manual/03-reference/03-environment.md +0 -124
  71. package/docs/manual/03-reference/04-templates.md +0 -190
  72. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  73. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  74. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  75. package/docs/manual/04-cookbook/03-faq.md +0 -175
  76. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  77. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  78. package/docs/manual/05-appendices/C-glossary.md +0 -40
  79. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  80. package/docs/manual/05-appendices/E-license.md +0 -38
  81. package/docs/manual/_toc.yml +0 -58
  82. package/docs/manual/command-index.md +0 -155
  83. package/docs/manual/concept-index.md +0 -168
  84. package/docs/manual/index.md +0 -66
  85. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  86. package/docs/operations/ATTESTATION.md +0 -44
  87. package/docs/operations/CI_CADENCE.md +0 -107
  88. package/docs/operations/CI_COMPOSITES.md +0 -156
  89. package/docs/operations/COMPLETIONS.md +0 -123
  90. package/docs/operations/COVERAGE.md +0 -204
  91. package/docs/operations/DRIFT.md +0 -107
  92. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  93. package/docs/operations/MAINTENANCE.md +0 -63
  94. package/docs/operations/MANIFEST.md +0 -127
  95. package/docs/operations/MIGRATION.md +0 -109
  96. package/docs/operations/OPERATIONS.md +0 -188
  97. package/docs/operations/PERFORMANCE.md +0 -133
  98. package/docs/operations/REGISTRY.md +0 -90
  99. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  100. package/docs/operations/RELIABILITY.md +0 -122
  101. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  102. package/docs/operations/ROADMAP.md +0 -10
  103. package/docs/operations/ROADMAP_2026.md +0 -7
  104. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  105. package/docs/operations/TESTING.md +0 -216
  106. package/docs/operations/TRACEABILITY.md +0 -43
  107. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  108. package/docs/operations/VERSION_SYNC.md +0 -393
  109. package/docs/reference/ALIASES.md +0 -131
  110. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  111. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  112. package/docs/reference/FEATURES.md +0 -66
  113. package/docs/reference/FONTS.md +0 -112
  114. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  115. package/docs/reference/PROFILES.md +0 -69
  116. package/docs/reference/SCREENSHOTS.md +0 -121
  117. package/docs/reference/SCRIPTS.md +0 -71
  118. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  119. package/docs/reference/THEMES.md +0 -117
  120. package/docs/reference/TOOLS.md +0 -110
  121. package/docs/reference/UTILS.md +0 -242
  122. package/docs/registry.json +0 -6
  123. package/docs/schema/dot-env-v1.json +0 -110
  124. package/docs/schema/dot-registry-v1.json +0 -33
  125. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  126. package/docs/security/AUDIT_BYPASS.md +0 -103
  127. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  128. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  129. package/docs/security/CI_PINNING.md +0 -129
  130. package/docs/security/COMMIT_SIGNING.md +0 -138
  131. package/docs/security/COMPLIANCE.md +0 -458
  132. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  133. package/docs/security/DISCLOSURE.md +0 -130
  134. package/docs/security/ENCRYPTION.md +0 -57
  135. package/docs/security/FMEA.md +0 -159
  136. package/docs/security/FUZZING.md +0 -114
  137. package/docs/security/HISTORY_FILTERING.md +0 -132
  138. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  139. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  140. package/docs/security/KEYS.md +0 -49
  141. package/docs/security/KEY_ROTATION.md +0 -303
  142. package/docs/security/MCP_POLICY.md +0 -78
  143. package/docs/security/POLICY_RELEASES.md +0 -37
  144. package/docs/security/README.md +0 -28
  145. package/docs/security/SCORECARD.md +0 -195
  146. package/docs/security/SECRETS.md +0 -158
  147. package/docs/security/SECURITY.md +0 -45
  148. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  149. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  150. package/docs/security/SOUP_REGISTER.md +0 -36
  151. package/docs/security/THREAT_MODEL.md +0 -130
  152. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  153. package/docs/security/VERIFY_RELEASE.md +0 -201
  154. package/docs/security/security-pubkey.asc +0 -15
  155. package/docs/stylesheets/extra.css +0 -444
  156. package/docs/themes/README.md +0 -10
  157. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  158. package/docs/themes/hero-shot.svg +0 -78
  159. package/scripts/README.md +0 -123
  160. package/scripts/ci/check-copyright-headers.sh +0 -8
  161. package/scripts/ci/check-shell-preamble.sh +0 -8
  162. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  163. package/scripts/demo/record.sh +0 -43
  164. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  165. package/scripts/diagnostics/alias-governance.sh +0 -138
  166. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  167. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  168. package/scripts/diagnostics/benchmark.sh +0 -408
  169. package/scripts/diagnostics/conflicts.sh +0 -73
  170. package/scripts/diagnostics/doctor-unified.sh +0 -39
  171. package/scripts/diagnostics/doctor.sh +0 -751
  172. package/scripts/diagnostics/drift-dashboard.sh +0 -202
  173. package/scripts/diagnostics/health.sh +0 -623
  174. package/scripts/diagnostics/history-analysis.sh +0 -86
  175. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  176. package/scripts/diagnostics/perf.sh +0 -453
  177. package/scripts/diagnostics/scorecard.sh +0 -119
  178. package/scripts/diagnostics/secret-governance.sh +0 -65
  179. package/scripts/diagnostics/security-score.sh +0 -467
  180. package/scripts/diagnostics/smoke-test.sh +0 -88
  181. package/scripts/diagnostics/snapshot.sh +0 -90
  182. package/scripts/diagnostics/verify.sh +0 -108
  183. package/scripts/diagnostics/verify_state.sh +0 -73
  184. package/scripts/diagnostics/version-locks.sh +0 -94
  185. package/scripts/diagnostics/workstation-attestation.sh +0 -187
  186. package/scripts/dot/commands/agent.sh +0 -485
  187. package/scripts/dot/commands/agents.sh +0 -336
  188. package/scripts/dot/commands/ai.sh +0 -587
  189. package/scripts/dot/commands/aliases.sh +0 -277
  190. package/scripts/dot/commands/appearance.sh +0 -110
  191. package/scripts/dot/commands/completion.sh +0 -134
  192. package/scripts/dot/commands/core.sh +0 -217
  193. package/scripts/dot/commands/diagnostics.sh +0 -265
  194. package/scripts/dot/commands/env-emit.sh +0 -203
  195. package/scripts/dot/commands/fleet.sh +0 -688
  196. package/scripts/dot/commands/init.sh +0 -185
  197. package/scripts/dot/commands/lint.sh +0 -208
  198. package/scripts/dot/commands/manual.sh +0 -169
  199. package/scripts/dot/commands/meta.sh +0 -333
  200. package/scripts/dot/commands/patterns.sh +0 -55
  201. package/scripts/dot/commands/registry.sh +0 -419
  202. package/scripts/dot/commands/restore.sh +0 -232
  203. package/scripts/dot/commands/secrets.sh +0 -296
  204. package/scripts/dot/commands/security.sh +0 -102
  205. package/scripts/dot/commands/tools.sh +0 -556
  206. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  207. package/scripts/dot/powershell/Dot.psm1 +0 -319
  208. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  209. package/scripts/fonts/patch-fonts.sh +0 -36
  210. package/scripts/git-hooks/install.sh +0 -12
  211. package/scripts/git-hooks/pre-commit +0 -12
  212. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  213. package/scripts/git-hooks/pre-push +0 -105
  214. package/scripts/git-hooks/prepare-commit-msg +0 -29
  215. package/scripts/lib/secrets_provider.sh +0 -185
  216. package/scripts/ops/ai-setup.sh +0 -71
  217. package/scripts/ops/bundle.sh +0 -104
  218. package/scripts/ops/chaos.sh +0 -50
  219. package/scripts/ops/chezmoi-apply.sh +0 -333
  220. package/scripts/ops/chezmoi-diff.sh +0 -16
  221. package/scripts/ops/chezmoi-remove.sh +0 -46
  222. package/scripts/ops/chezmoi-update.sh +0 -63
  223. package/scripts/ops/heal-chezmoi.sh +0 -87
  224. package/scripts/ops/heal-system.sh +0 -129
  225. package/scripts/ops/heal-tools.sh +0 -297
  226. package/scripts/ops/heal.sh +0 -223
  227. package/scripts/ops/post-apply-repair.sh +0 -107
  228. package/scripts/ops/prewarm.sh +0 -128
  229. package/scripts/ops/release.sh +0 -262
  230. package/scripts/ops/rollback.sh +0 -604
  231. package/scripts/ops/setup.sh +0 -138
  232. package/scripts/ops/teleport.sh +0 -34
  233. package/scripts/qa/check-version-consistency.sh +0 -124
  234. package/scripts/qa/coverage-baseline.sh +0 -61
  235. package/scripts/qa/docs-coverage.sh +0 -112
  236. package/scripts/qa/examples-coverage.sh +0 -94
  237. package/scripts/qa/powershell-contract.ps1 +0 -95
  238. package/scripts/qa/reliability-audit.sh +0 -139
  239. package/scripts/qa/scorecard-snapshot.sh +0 -128
  240. package/scripts/qa/traceability-coverage.sh +0 -117
  241. package/scripts/qa/validate-examples.sh +0 -27
  242. package/scripts/qa/wsl-contract.sh +0 -12
  243. package/scripts/secrets/age-init.sh +0 -82
  244. package/scripts/secrets/create-secrets-file.sh +0 -46
  245. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  246. package/scripts/security/backup.sh +0 -58
  247. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  248. package/scripts/security/dns-doh.sh +0 -52
  249. package/scripts/security/encryption-check.sh +0 -55
  250. package/scripts/security/enforce-policies.sh +0 -335
  251. package/scripts/security/firewall.sh +0 -91
  252. package/scripts/security/lock-configs.sh +0 -67
  253. package/scripts/security/lock-screen.sh +0 -56
  254. package/scripts/security/manage-secrets.sh +0 -429
  255. package/scripts/security/ssh-cert.sh +0 -204
  256. package/scripts/security/telemetry-kill.sh +0 -51
  257. package/scripts/security/usb-safety.sh +0 -52
  258. package/scripts/theme/apply-gnome-theme.sh +0 -333
  259. package/scripts/theme/extract-heic-frames.sh +0 -115
  260. package/scripts/theme/extract-theme.py +0 -742
  261. package/scripts/theme/install-boot-logo.sh +0 -63
  262. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  263. package/scripts/theme/install-cursors.sh +0 -26
  264. package/scripts/theme/install-file-icons.sh +0 -27
  265. package/scripts/theme/install-grub-theme.sh +0 -62
  266. package/scripts/theme/install-lock-icon.sh +0 -31
  267. package/scripts/theme/merge-wallpaper.sh +0 -146
  268. package/scripts/theme/rebuild-themes.sh +0 -544
  269. package/scripts/theme/switch.sh +0 -449
  270. package/scripts/theme/wallpaper-rotate.sh +0 -137
  271. package/scripts/theme/wallpaper-sync.sh +0 -690
  272. package/scripts/tools/cmatrix.sh +0 -22
  273. package/scripts/tools/detect-collisions.py +0 -103
  274. package/scripts/tools/emoji-picker.sh +0 -49
  275. package/scripts/tools/figlet-banner.sh +0 -19
  276. package/scripts/tools/log-rotate.sh +0 -31
  277. package/scripts/tools/lolcat-wrap.sh +0 -20
  278. package/scripts/tools/pipes.sh +0 -49
  279. package/scripts/tuning/linux.sh +0 -186
  280. package/scripts/tuning/macos.sh +0 -56
  281. package/scripts/uninstall.sh +0 -86
  282. package/scripts/version-sync.sh +0 -654
  283. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  284. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  285. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  286. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  287. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  288. package/templates/projects/go/README.md +0 -7
  289. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  290. package/templates/projects/go/go.mod +0 -3
  291. package/templates/projects/go/go.sum +0 -0
  292. package/templates/projects/molecule/README.md +0 -7
  293. package/templates/projects/molecule/converge.yml +0 -7
  294. package/templates/projects/molecule/molecule.yml +0 -16
  295. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  296. package/templates/projects/node/README.md +0 -7
  297. package/templates/projects/node/package-lock.json +0 -12
  298. package/templates/projects/node/package.json +0 -10
  299. package/templates/projects/node/src/index.js +0 -3
  300. package/templates/projects/packer/README.md +0 -15
  301. package/templates/projects/packer/main.pkr.hcl +0 -15
  302. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  303. package/templates/projects/python/README.md +0 -7
  304. package/templates/projects/python/pyproject.toml +0 -25
  305. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  306. package/templates/projects/python/tests/test_basic.py +0 -3
@@ -1,128 +0,0 @@
1
- ---
2
- title: "Renaming master to main in 2026: A Zero-Downtime Runbook"
3
- description: A supply-chain-safe procedure for renaming the default branch of a mature open-source repository — 96 in-repo edits, a grace-period mirror workflow, zero broken install URLs.
4
- date: 2026-07-05
5
- ---
6
-
7
- # Renaming `master` to `main` in 2026: A Zero-Downtime Runbook for a Repository at the Heart of an Open-Source Supply Chain
8
-
9
- *Renaming the default branch of a mature repository is a supply-chain event, not a cosmetic one; done wrong, it strands `curl \| bash` install commands, breaks CI, and severs external distribution channels.*
10
-
11
- *Sebastien Rousseau · Published 5 Jul 2026 · 12 min read*
12
-
13
- ## Why Default-Branch Naming Matters in 2026 #
14
-
15
- Every open-source project with a public install path publishes a URL of the form `raw.githubusercontent.com/<owner>/<repo>/<branch>/install.sh`. Every downstream consumer who has copied that URL — into a README, a Slack message, a devcontainer, a company wiki, a StackOverflow answer, a Homebrew tap, an AUR PKGBUILD, an internal Ansible playbook — has taken an implicit dependency on that branch name. Renaming the branch is a **breaking change to the project's public API surface**, whether the maintainer intended one or not.
16
-
17
- The industry moved off `master` as the default branch name years ago; new repositories default to `main`. Existing repositories, however, live with a naming inconsistency that becomes actively confusing when a maintainer has multiple projects — some on `main`, some still on `master`. The migration is unavoidable, but the operational risk profile is significant enough that most maintainers put it off indefinitely.
18
-
19
- This article documents the migration of the [.dotfiles](https://github.com/sebastienrousseau/dotfiles) repository — 60+ files with hardcoded branch references, four external distribution channels, three CI providers tracking the default branch, and a public install command bookmarked by an unknown number of downstream users. The migration was **zero-downtime**: no install command broke, no CI job failed, no downstream integration degraded. The blueprint is generalisable to any medium-complexity open-source repository.
20
-
21
- ## The Branch-Rename 2026 Architecture Lens #
22
-
23
- A default-branch rename is not a single operation. It's a sequence of coordinated changes across a defined dependency graph, each with its own migration mechanism:
24
-
25
- | Layer | Design Decision | Why It Matters | Risk if Mishandled |
26
- |---|---|---|---|
27
- | **GitHub metadata** | Native rename via Settings → Branches or `POST /repos/{owner}/{repo}/branches/{branch}/rename` | GitHub auto-migrates default-branch setting, open PR targets, branch-protection assignment, ruleset targeting, and Pages source | Renaming via manual `git push :old-name` + `git push new-name` skips the auto-migration and orphans PRs |
28
- | **In-repo workflow triggers** | `.github/workflows/*.yml` `branches:` lists updated pre-rename | Workflows that trigger on `push:` or `pull_request:` targeting the old name silently stop firing after rename | Migration PR itself under-tested — the workflows it edits no longer fire on it |
29
- | **Grace-period mirror** | New workflow fast-forwards `master` from `main` on every push | Preserves `raw.githubusercontent.com/…/master/…` URLs for downstream consumers who cannot be reached | External `curl \| bash` install commands return HTTP 404 the moment `master` ceases to exist |
30
- | **Documentation URIs** | `mkdocs.yml` `edit_uri`, README install commands, docs prose | GitHub redirects `github.com/…/blob/master/…` automatically; `raw.githubusercontent.com/…/master/…` does **not** redirect | Docs site edit buttons point at nonexistent branches; install commands 404 |
31
- | **Rulesets as code** | `.github/rulesets/<branch>.json` file renamed alongside the JSON `target.include` | Machine-readable ruleset files that reference `refs/heads/master` misalign with GitHub's auto-migrated state | Configuration drift between the in-repo policy source of truth and GitHub's live enforcement |
32
- | **Test-suite assertions** | Regression tests that asserted `/master/` URLs in README updated to assert `/main/` | Tests written before rename fail *after* rename in the exact commit that fixes them | Migration PR shows red CI, blocking merge |
33
- | **External distribution** | Homebrew tap, Scoop bucket, AUR PKGBUILD — pinned to release tags, not branches | Version-pinning insulates external distribution from branch renames | Branch-pinned distribution manifests break silently on rename |
34
-
35
- ## Key Branch-Rename Migration Signals #
36
-
37
- | Signal | Operational Benchmark | Reference | Technical Platform Implementation |
38
- |---|---|---|---|
39
- | **URL Reachability Post-Rename** | `HTTP 200` on both `main/install.sh` and `master/install.sh` for the full grace period | External-consumer continuity | Mirror workflow: `on: push: branches: [main]` → `git push origin main:refs/heads/master` |
40
- | **CI Coverage on Migration PR** | Workflow-trigger `branches:` list transitionally includes both `main` and `master` | Migration PR must be tested against the current default | `pull_request: branches: [main, master]` — remove `master` once the mirror retires |
41
- | **In-Repo URL Consistency** | Zero remaining `/master/` URIs on the head branch, excluding intentional mirror-preservation strings | Doc/install correctness | `git grep 'raw.githubusercontent.com/.../master/'` returns empty (or only test-fixture strings) |
42
- | **Ruleset File Alignment** | `.github/rulesets/*.json` filename matches its `target.include` refspec | Config-as-code hygiene | File rename via `git mv` + JSON `target.include` update in the same commit |
43
- | **Grace-Period Retirement Marker** | Calendar-visible tracking item with an explicit sunset date | Operational-debt visibility | GitHub issue with target date in title + calendar event (`.ics` or Google Calendar quick-add URL) |
44
-
45
- ## Diagnosis: Enumerating the Blast Radius #
46
-
47
- Before touching a single file, an authoritative audit surfaces the full inventory of `master` references. On the .dotfiles repository, that surfaced **~88 mechanical replacements across 60 files**, grouped as:
48
-
49
- - **24 GitHub Actions workflow files** — trigger lists, `github.ref_name == 'master'` conditionals, `--base master` PR-creating steps, inline `@SHA # master` comments describing what commit was pinned
50
- - **7 `raw.githubusercontent.com/.../master/…` URLs** — README install command, `install.sh` (referencing itself in its own comment header), `bin/dot-bootstrap`, `docs/index.md`, install guide, MkDocs edit_uri, chezmoi-data JSON `$id` field
51
- - **~25 documentation files** — `github.com/…/blob/master/…` references in operations runbooks, security docs, architecture decision records
52
- - **1 ruleset-as-code file** — `.github/rulesets/master.json` with a `target.include: refs/heads/master` field
53
- - **1 regression test** — asserting the README contains `/master/` (a red-team catch: this test PROTECTS against accidental rename, which now needs its assertion inverted)
54
- - **4 legitimately-kept references** — the `gbd` bulk-branch-delete script with a `main|master` whitelist regex, the `git-primary-branch` shell function's fallback path, the release-branch check in `scripts/ops/release.sh`, and Scorecard-linter fixtures demonstrating `@master` as an anti-pattern
55
-
56
- ## Remediation Sequence #
57
-
58
- The rename is executed as a five-phase sequence, each with a distinct commit or GitHub operation:
59
-
60
- **Phase 1 — Pre-migration content preparation.** A single pull request rewrites all in-repo `master` references while `master` is still the default branch. This PR must merge before any GitHub-side rename. Workflow `pull_request:` triggers gain `[main, master]` (paired) so the PR itself triggers CI against the current default. The ruleset file is renamed via `git mv` and its JSON target updated. The regression test's assertion is inverted from "must contain `/master/`" to "must contain `/main/`".
61
-
62
- **Phase 2 — GitHub-side rename.** Via UI (`Settings → Branches → Rename`) or API (`POST /repos/{owner}/{repo}/branches/master/rename`). GitHub auto-migrates default-branch setting, PR targets, branch-protection assignment, ruleset targeting, Pages source. Blocked if a branch-protection *rule pattern* targeting the new name already exists — delete the empty rule first via GraphQL:
63
-
64
- ```
65
- gh api graphql -f query='
66
- mutation {
67
- deleteBranchProtectionRule(input: { branchProtectionRuleId: "..." }) {
68
- clientMutationId
69
- }
70
- }'
71
- ```
72
-
73
- **Phase 3 — Mirror workflow activation.** Trigger the pre-committed mirror workflow via `workflow_dispatch` or a small push to `main`. The workflow performs a fast-forward `git push origin main:refs/heads/master`, recreating `master` as a passive mirror. From this point forward, every push to `main` mirrors automatically.
74
-
75
- **Phase 4 — Local clone update (per-workstation).** Every developer with an active clone runs:
76
-
77
- ```
78
- git branch -m master main
79
- git fetch origin
80
- git branch -u origin/main main
81
- git remote set-head origin -a
82
- ```
83
-
84
- **Phase 5 — Retirement scheduling.** A GitHub issue with a title-embedded target date (`[2027-07-05] Retire master mirror + tighten workflow triggers to main-only`) plus a calendar reminder ensures the grace-period mirror doesn't become permanent operational debt.
85
-
86
- ## Verification: URLs, CI, Docs Site #
87
-
88
- Post-rename smoke tests:
89
-
90
- ```
91
- $ curl -sI https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh | head -1
92
- HTTP/2 200
93
- $ curl -sI https://raw.githubusercontent.com/sebastienrousseau/dotfiles/master/install.sh | head -1
94
- HTTP/2 200
95
- ```
96
-
97
- Both branch names resolve during the grace period. When the mirror is retired in 12 months, `/master/` returns 404 by design — but by then no active install command should still reference it.
98
-
99
- CI status post-rename: on the .dotfiles repository, the migration PR (`#961`) ran **70 checks green, 0 failed**, driven by the `[main, master]` trigger-list transitional configuration. The follow-up test-coverage PR (`#963`) confirmed no downstream test regression.
100
-
101
- Docs site: MkDocs `edit_uri` — updated from `edit/master/docs/` to `edit/main/docs/` — resolves correctly. `github.com/…/blob/master/…` links continue to work via GitHub's built-in redirect; `raw.githubusercontent.com/…/master/…` works via the mirror.
102
-
103
- ## Return on Resilience #
104
-
105
- The commercial value of a supply-chain-safe rename is defensive, not offensive: nothing new is built, but nothing existing breaks.
106
-
107
- | Metric | Result |
108
- |---|---|
109
- | Files updated in migration PR | 97 (96 edits + 1 rename + 1 new workflow) |
110
- | Grace-period external URL uptime | 100% (both `/main/` and `/master/` return HTTP 200) |
111
- | CI checks post-rename | 70 green, 0 failed |
112
- | Downstream distribution channels broken | 0 (Homebrew tap, Scoop bucket, AUR pinned to tags) |
113
- | Local-clone update commands | 4 lines, ~5 seconds per workstation |
114
- | Operational debt introduced | 1 mirror workflow, retired via calendar-scheduled task 2027-07-05 |
115
-
116
- ## Takeaways #
117
-
118
- 1. **Land the in-repo edits before the GitHub-side rename.** Merging Phase 1 while `master` is still default gives you both a working CI baseline and a rehearsal.
119
-
120
- 2. **Add the mirror workflow before renaming, not after.** The interval between the GitHub rename and the mirror's first fast-forward push is the window during which `raw.githubusercontent.com/…/master/…` returns 404. Minimising that window is a matter of ordering.
121
-
122
- 3. **Update `pull_request:` triggers transitionally.** `branches: [main, master]` covers the migration PR itself (which targets the pre-rename default) and every future PR (which will target `main`). The grace-period `master` entry retires with the mirror.
123
-
124
- 4. **Track retirement as an issue with an explicit sunset date.** Mirror workflows are the classic case of "temporary" becoming "permanent". A calendar event and a GitHub issue with a date-anchored title enforce end-of-life.
125
-
126
- 5. **Rulesets-as-code files must be renamed alongside their JSON targets.** GitHub auto-migrates the *live* ruleset assignment; the file in your repo is the source-of-truth if you ever reapply. Both must agree.
127
-
128
- The reference implementation landed as [PR #961](https://github.com/sebastienrousseau/dotfiles/pull/961) with the retirement issue tracked at [#962](https://github.com/sebastienrousseau/dotfiles/issues/962), shipped in [v0.2.510](https://github.com/sebastienrousseau/dotfiles/releases/tag/v0.2.510).
@@ -1,36 +0,0 @@
1
- ---
2
- title: Articles
3
- description: Long-form writing on the design and operation of the .dotfiles framework.
4
- ---
5
-
6
- # Articles
7
-
8
- Long-form writing on the design and operation of the [.dotfiles framework](https://github.com/sebastienrousseau/dotfiles) — deep dives into performance, supply-chain safety, developer experience, and the architectural decisions that shape a mature open-source dotfiles project.
9
-
10
- <div class="grid cards" markdown>
11
-
12
- - :material-console:{ .lg .middle } **[Fish Startup in 2026](2026-07-05-fish-startup-abbr.md)**
13
-
14
- ---
15
-
16
- Cutting interactive shell latency by 48% with `abbr` on multi-shell dotfiles. One printf format change + one chezmoi hook = 112 ms saved per fresh terminal.
17
-
18
- *5 Jul 2026 · 10 min read*
19
-
20
- - :material-source-branch:{ .lg .middle } **[Renaming `master` to `main`](2026-07-05-master-to-main-rename-runbook.md)**
21
-
22
- ---
23
-
24
- A zero-downtime runbook for a repository at the heart of an open-source supply chain. 96 in-repo edits, a 12-month mirror workflow, zero broken install URLs.
25
-
26
- *5 Jul 2026 · 12 min read*
27
-
28
- - :material-palette:{ .lg .middle } **[Custom Documentation Sites in 2026](2026-07-05-custom-mkdocs-material-dark-theme.md)**
29
-
30
- ---
31
-
32
- Building a distinctive dark-themed developer reference on MkDocs Material — three files, no theme forking, WCAG AAA contrast, hash-locked build.
33
-
34
- *5 Jul 2026 · 11 min read*
35
-
36
- </div>
@@ -1,144 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # Install
6
-
7
- Set up on macOS, Linux, or WSL in 3 to 5 minutes.
8
-
9
- **You will need:** `git` and `curl`.
10
-
11
- **Default shell:** Fish. You can change it after you install.
12
-
13
- ## Install
14
-
15
- ```bash
16
- bash -c "$(
17
- curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh
18
- )"
19
- ```
20
-
21
- Then restart your terminal or run `exec $SHELL`.
22
-
23
- ## Verify
24
-
25
- ```bash
26
- dot --version # Confirm installation
27
- dot doctor # Check shell, git, and tools
28
- dot help # Browse available commands
29
- ```
30
-
31
- ## Choose a shell
32
-
33
- Fish is the default shell. To switch to Zsh or Nushell, edit `~/.dotfiles/.chezmoidata.toml`:
34
-
35
- ```toml
36
- default_shell = "zsh"
37
- ```
38
-
39
- Supported values: `zsh`, `fish`, `nushell`.
40
-
41
- Then apply the change:
42
-
43
- ```bash
44
- dot apply
45
- ```
46
-
47
- ## Feature flags
48
-
49
- Turn optional tools on or off after setup. Edit `.chezmoidata.toml`:
50
-
51
- ```toml
52
- [features]
53
- zsh = true # Zsh shell configuration
54
- fish = true # Fish shell configuration
55
- nushell = true # Nushell configuration
56
- nvim = true # Neovim IDE configuration
57
- tmux = true # Terminal multiplexer
58
- nix = true # Nix package manager integration
59
- ```
60
-
61
- ## Update
62
-
63
- ```bash
64
- dot update
65
- ```
66
-
67
- ## Next steps
68
-
69
- 1. Run `dot learn` to take a guided tour.
70
- 2. Add your own tweaks in `~/.config/shell/custom/`.
71
- 3. Read the [Utilities and `dot` CLI](../reference/UTILS.md) reference.
72
-
73
- ---
74
-
75
- ## Advanced
76
-
77
- ### Local source install
78
-
79
- Clone the repo first, then run the installer from your local copy:
80
-
81
- ```bash
82
- git clone https://github.com/sebastienrousseau/dotfiles.git ~/.dotfiles
83
- cd ~/.dotfiles
84
- ./install.sh
85
- ```
86
-
87
- ### Minimal install
88
-
89
- Install only shells and core tools. This skips editor and terminal extras:
90
-
91
- ```bash
92
- ./install.sh --minimal
93
- ```
94
-
95
- ### Non-interactive install
96
-
97
- Use this mode for CI or scripts that run without user input:
98
-
99
- ```bash
100
- DOTFILES_SILENT=1 DOTFILES_NONINTERACTIVE=1 \
101
- bash -c "$(
102
- curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/dotfiles/main/install.sh
103
- )"
104
- ```
105
-
106
- ### Nix
107
-
108
- ```bash
109
- nix develop ~/.dotfiles/nix
110
- nix profile install ~/.dotfiles/nix#dot-utils
111
- ```
112
-
113
- ### Offline bundle
114
-
115
- On a machine with internet access, create a bundle:
116
-
117
- ```bash
118
- dot bundle ~/Downloads
119
- ```
120
-
121
- Copy the archive to the target machine. Then unpack and install:
122
-
123
- ```bash
124
- tar --zstd -xf dotfiles_offline_bundle_*.tar.zst -P
125
- cd ~/.dotfiles
126
- ./install.sh --force
127
- ```
128
-
129
- ### Uninstall
130
-
131
- ```bash
132
- chezmoi purge
133
- rm -rf ~/.dotfiles
134
- rm -rf ~/.local/share/chezmoi ~/.local/share/dotfiles.log
135
- ```
136
-
137
- ### Signed contributions
138
-
139
- All commits must be signed. See [Contributing](https://github.com/sebastienrousseau/dotfiles/blob/main/CONTRIBUTING.md) for details.
140
-
141
- ---
142
-
143
- - [Troubleshooting](TROUBLESHOOTING.md)
144
- - [Support matrix](../reference/SUPPORT_MATRIX.md)
@@ -1,61 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
-
5
- # Neovim
6
-
7
- ## Modern Core
8
-
9
- - **Requirement**: Neovim >= 0.11.2. The config checks this at startup.
10
- - **Configuration**: Modular, lazy-loaded configuration based on `lazy.nvim`.
11
- - **Completion**: `blink.cmp` for fast, keystroke-level completion with LSP, snippets, and path sources.
12
- - **UI**: Snacks.nvim dashboard, notifications, status line, buffer line, and file explorer.
13
- - **LSP**: Full LSP support for diagnostics, code actions, and more, managed by `mason.nvim`.
14
-
15
- ## Language Support
16
-
17
- - **Rust**: Out-of-the-box support with `rustaceanvim`.
18
- - **Python**: Full support with `basedpyright`, `ruff`, and `venv-selector`.
19
- - **Web**: Support for web development with `prettier` and `eslint`.
20
-
21
- ## AI Integration
22
-
23
- - **Copilot**: `copilot.lua` for code completion. Run `:Copilot auth` to sign in.
24
- - **Copilot Chat**: AI sidebar for asking questions and getting help (`<leader>cc`).
25
-
26
- ## VS Code Parity
27
-
28
- - **Problem Panel**: `trouble.nvim` for a VS Code-like problems panel (`<leader>xx`).
29
- - **Search & Replace**: `nvim-spectre` for project-wide search and replace (`<leader>S`).
30
- - **Auto-Pairs**: Automatically closes brackets and pairs (via `blink.cmp` auto-brackets).
31
- - **TODOs**: Highlights `TODO` and `FIXME` comments.
32
- - **Session**: Auto-restores your last session.
33
- - **Snippets**: Native `vim.snippet` engine (Neovim 0.11+).
34
-
35
- ## Keybindings
36
-
37
- | Key | Action |
38
- | --- | --- |
39
- | `<Space>ff` | Find Files |
40
- | `<Space>fg` | Grep (Search) text |
41
- | `<Space>fb` | File browser |
42
- | `<Space>fp` | Projects |
43
- | `<Space>e` | Toggle File Explorer |
44
- | `<Space>a` | Add file to Harpoon |
45
- | `<Ctrl>e` | Open Harpoon menu |
46
- | `gd` | Go to Definition |
47
- | `gr` | Go to References |
48
- | `<leader>ca` | Code actions |
49
- | `<leader>cf` | Format code |
50
- | `<leader>cr` | Rename symbol |
51
- | `<leader>tt` | Toggle terminal |
52
- | `<leader>tn` | Test nearest |
53
- | `<leader>tf` | Test file |
54
- | `<leader>ts` | Test suite |
55
- | `<F5>` | Continue (Debug) |
56
- | `<F10>` | Step over (Debug) |
57
- | `<F11>` | Step into (Debug) |
58
- | `<F12>` | Step out (Debug) |
59
- | `<leader>cc` | Toggle Copilot Chat |
60
- | `<leader>xx` | Toggle Diagnostics (Trouble) |
61
- | `<leader>S` | Toggle Spectre (Search/Replace) |
@@ -1,230 +0,0 @@
1
- ---
2
- render_with_liquid: false
3
- ---
4
- {% raw %}
5
-
6
- # Theming Guide
7
-
8
- The dotfiles ship a wallpaper-driven theme system that generates terminal color palettes directly from wallpaper images using K-Means clustering in CIELAB color space. One command changes the terminal, editor, window manager, GTK, desktop environment, wallpaper, and browser-facing color mode in under a second.
9
-
10
- Themes are not hand-crafted — they are extracted from whatever wallpapers are available on the system.
11
-
12
- ## How Themes Work
13
-
14
- Wallpapers are the source of truth. The system discovers wallpapers from two locations:
15
-
16
- 1. **System wallpapers** — platform-native (macOS `/System/Library/Desktop Pictures/`, Linux `/usr/share/backgrounds/`)
17
- 2. **Custom wallpapers** — user-provided in `~/Pictures/Wallpapers/` (custom overrides system)
18
-
19
- `extract-theme.py` extracts dominant colors from each wallpaper using K-Means clustering in CIELAB color space, then generates a full terminal palette (16 ANSI colors, accent, bg/fg, panel, border) with WCAG contrast enforcement.
20
-
21
- `rebuild-themes.sh` orchestrates discovery → extraction → assembly into `.chezmoidata/themes.toml`. Themes are cached in `~/.cache/dotfiles/themes/` and only regenerated when wallpapers change.
22
-
23
- The `theme` key in `.chezmoidata.toml` controls the active theme. Every template references the active theme's data through `{{ $t := index .themes .theme }}`.
24
-
25
- ## Switching Themes
26
-
27
- ### Interactive Picker
28
-
29
- ```bash
30
- dot theme
31
- ```
32
-
33
- Opens an fzf picker listing every paired wallpaper theme (themes that have both `-dark` and `-light` variants). Two columns: **WALLPAPER** name and **SOURCE** (System or Custom). The current theme is marked with `✓` and `◀`. Select one and press Enter.
34
-
35
- ### Direct Switch
36
-
37
- ```bash
38
- dot theme tahoe-dark
39
- ```
40
-
41
- Sets the theme immediately. Regenerates configs and reloads running applications.
42
-
43
- ### Rebuild Themes
44
-
45
- ```bash
46
- dot theme rebuild # incremental (uses cache for unchanged wallpapers)
47
- dot theme rebuild --force # full regeneration
48
- dot theme rebuild --list # discover wallpapers without rebuilding
49
- ```
50
-
51
- Discovers wallpapers from system + custom paths, runs K-Means extraction in parallel (4 jobs), caches generated themes in `~/.cache/dotfiles/themes/`, and writes `.chezmoidata/themes.toml`. Custom wallpapers override system wallpapers on name collision.
52
-
53
- ### Under the Hood: dot-theme-sync
54
-
55
- `dot-theme-sync` handles the full switching pipeline:
56
-
57
- 1. Writes the new theme name into `.chezmoidata.toml` (and `chezmoi.toml` if present).
58
- If those files drift, `dot-theme-sync` now resynchronizes them before rendering because `chezmoi.toml` `[data]` overrides the source data file.
59
- 2. Runs a targeted `chezmoi apply` on theme-dependent config files only -- much faster than a full apply.
60
- 3. Signals running applications to reload and coordinates browser-facing theme state:
61
-
62
- ```bash
63
- dot-theme-sync # Reload current theme
64
- dot-theme-sync macos-wave-light # Switch to a new theme
65
- dot-theme-sync --full # Full chezmoi apply instead of targeted
66
- ```
67
-
68
- ## What Changes
69
-
70
- Each theme switch touches these applications:
71
-
72
- | Application | Mechanism | What Changes |
73
- | :--- | :--- | :--- |
74
- | **Ghostty** | `chezmoi apply` + macOS app-support sync + DBus `reload-config` or runtime signal fallback | Background, foreground, all 16 ANSI colors, cursor |
75
- | **Tmux** | `chezmoi apply` + `source-file` | Status bar colors, pane borders, mode indicators |
76
- | **Niri** | `chezmoi apply` + `load-config-file` IPC | Window borders, focus ring, inactive tint |
77
- | **Desktop (macOS)** | `osascript` + `defaults write` + `killall` | System appearance (Light/Dark), accent color, highlight color; forces SystemUIServer/Dock/cfprefsd refresh |
78
- | **Wallpaper (macOS)** | `osascript` System Events | Desktop wallpaper set across all displays |
79
- | **Wallpaper (Linux)** | `gsettings` / `dms` / `swaybg` / `feh` | HEIC auto-converted to PNG; `picture-uri` and `picture-uri-dark` set separately |
80
- | **Desktop (Linux/GNOME)** | `chezmoi apply` + `gsettings` | Theme name, icon theme, color scheme preference |
81
- | **Safari / Chrome / Edge** | Native browser appearance follows desktop theme | Browser chrome stays aligned when using the default/native browser theme |
82
- | **Firefox** | `chezmoi apply` on `~/.config/firefox/user.js` | Website color scheme preference follows the active dot theme; link that file into a Firefox profile to enforce it |
83
- | **DMS** | `sed -i` on settings.json + IPC | Stock theme mapped to accent family, dark/light mode |
84
- | **Neovim** | `--remote-expr` Lua eval over socket | Colorscheme, style variant, background mode |
85
- | **VS Code** | `chezmoi apply` on `settings.json` | `workbench.colorTheme` value |
86
- | **Alacritty** | `chezmoi apply` | Full color block regeneration |
87
- | **Kitty** | `chezmoi apply` | Full color block regeneration |
88
- | **WezTerm** | `chezmoi apply` | Color scheme in Lua config |
89
-
90
- ## Dark/Light Toggle
91
-
92
- ```bash
93
- dot theme toggle
94
- ```
95
-
96
- Toggles between the dark and light variant of the current theme family. A theme named `macos-tahoe-dark` toggles to `macos-tahoe-light`, and vice versa.
97
-
98
- ## Theme Families
99
-
100
- Available themes depend on your system. Run `dot theme list` to see what's discovered. On macOS Sonoma, you'll see ~150+ themes from system wallpapers. Custom wallpapers in `~/Pictures/Wallpapers/` add more.
101
-
102
- ### Rebuilding themes
103
-
104
- When wallpapers change (new system update, new custom wallpapers), regenerate:
105
-
106
- ```bash
107
- dot theme rebuild # Regenerate (uses cache for unchanged wallpapers)
108
- dot theme rebuild --force # Force full regeneration
109
- dot theme rebuild --list # List discovered wallpapers without rebuilding
110
- ```
111
-
112
- ## What works without wallpapers
113
-
114
- Theme switching is a two-tier system:
115
-
116
- **Core (always works)** — ships in the repo, no setup needed:
117
-
118
- - Terminal colors (Ghostty, Alacritty, Kitty, WezTerm, tmux)
119
- - Editor themes (Neovim colorscheme, VS Code)
120
- - macOS dark/light mode and accent color
121
- - Linux GNOME color-scheme, GTK theme, icon theme
122
- - Browser color mode (Safari, Chrome, Firefox)
123
-
124
- **Wallpapers (optional)** — user-provided, enhances the theme:
125
-
126
- - Desktop wallpaper matched to the active theme
127
- - Requires `~/Pictures/Wallpapers/` with files named `macos-NAME-dark.heic`
128
-
129
- If no wallpapers are present, `dot theme` applies all core changes and skips the wallpaper step. No errors, no manual config.
130
-
131
- ## Wallpapers (optional)
132
-
133
- Wallpapers are not shipped in the repo. Each user sources their own and places them in `~/Pictures/Wallpapers/`:
134
-
135
- ```
136
- macos-tahoe-dark.heic
137
- macos-tahoe-light.heic
138
- ```
139
-
140
- The naming convention is `macos-NAME-APPEARANCE.heic` (or `.jpg`/`.png`). The theme picker marks themes with matching wallpapers as `[W]`.
141
-
142
- ### Wallpaper guidelines
143
-
144
- - **Resolution**: 6016x6016 recommended (matches Apple's native resolution)
145
- - **Format**: `.heic` preferred on macOS, `.png`/`.jpg` also supported
146
- - **Brightness**: dark/light pairs targeting a golden ratio (1.618) relationship give balanced contrast across displays
147
-
148
- ### Platform behavior
149
-
150
- | Platform | Wallpaper support | Mechanism |
151
- |---|---|---|
152
- | **macOS** | `.heic`, `.jpg`, `.png` | `osascript` (all desktops) |
153
- | **Linux (GNOME)** | `.png`, `.jpg` (`.heic` auto-converted) | `gsettings picture-uri` + `picture-uri-dark` |
154
- | **Linux (Wayland)** | `.png`, `.jpg` (`.heic` auto-converted) | `swaybg`, `feh`, or Niri/DMS IPC |
155
- | **WSL** | Not applicable | No compositor; terminal colors still apply |
156
-
157
- On Linux, `.heic` files are automatically converted to `.png` using `magick`, `heif-convert`, or `convert` (whichever is available). The `.png` is cached and only regenerated when the source `.heic` changes.
158
-
159
- ### Using your OS default wallpapers
160
-
161
- If you don't provide custom wallpapers, your OS keeps its current desktop wallpaper. The theme still applies all color changes (terminal, editor, accent, dark/light mode). This is the expected default for most users.
162
-
163
- ## Build Artifacts
164
-
165
- All build caches (Cargo, Go, pip, uv, Zig) are redirected to `/tmp/builds/` via environment variables in `mise.toml` and `cargo/config.toml`. The directory is created on shell init via `fish/conf.d/env.fish`. Build artifacts are cleared on reboot.
166
-
167
- ## Troubleshooting
168
-
169
- ### Theme switch did not apply
170
-
171
- Run a full apply to force all configs:
172
-
173
- ```bash
174
- dot-theme-sync --full
175
- ```
176
-
177
- ### Ghostty did not reload
178
-
179
- Ghostty reloads via DBus (`com.mitchellh.ghostty` / `reload-config`). If DBus is unavailable, the fallback sends `SIGUSR2` to the main process and also matches the macOS app bundle path when needed. Verify Ghostty is running:
180
-
181
- ```bash
182
- pgrep -x ghostty
183
- ```
184
-
185
- On macOS, Ghostty may also read `~/Library/Application Support/com.mitchellh.ghostty/config`. `dot-theme-sync` now mirrors the regenerated XDG config into that location before reloading so the app-support override cannot keep an older palette active.
186
-
187
- ### Neovim did not change colors
188
-
189
- `dot-theme-sync` finds Neovim server sockets at `/tmp/nvim*/0` and `$XDG_RUNTIME_DIR/nvim.*.0`. If Neovim runs with a custom `--listen` path, the auto-discovery misses it. Restart Neovim to pick up the new theme from the regenerated config.
190
-
191
- ### GTK theme looks wrong
192
-
193
- GTK theme names must match installed themes exactly. Catppuccin themes use names like `catppuccin-mocha-blue-standard+default`. Install the matching GTK theme package or fall back to `Adwaita-dark` / `Adwaita`.
194
-
195
- ### macOS accent or appearance did not update
196
-
197
- `dot-theme-sync` applies macOS appearance using `osascript` and accent via:
198
-
199
- ```bash
200
- defaults write -g AppleAccentColor -int <value>
201
- ```
202
-
203
- `dot-theme-sync` now kills `cfprefsd`, `SystemUIServer`, `Dock`, and `System Settings` after writing accent/highlight defaults to force an immediate refresh. If the UI still does not update, close and reopen System Settings.
204
-
205
- ### Browser theme did not change
206
-
207
- Safari, Chrome, and Edge are coordinated through the desktop theme, so custom browser themes can override what `dot-theme-sync` is trying to align. Switch those browsers back to their native/default theme if you want them to track macOS or GTK automatically.
208
-
209
- Firefox uses the managed file at `~/.config/firefox/user.js`. Link that file into your active Firefox profile as `user.js` if you want `dot-theme-sync` to control website `prefers-color-scheme` behavior:
210
-
211
- ```bash
212
- ln -sf ~/.config/firefox/user.js ~/.mozilla/firefox/<profile>/user.js
213
- ```
214
-
215
- ### tmux shows old colors
216
-
217
- Tmux reloads via `source-file`. If TPM plugins override colors, run:
218
-
219
- ```bash
220
- tmux source-file ~/.config/tmux/tmux.conf
221
- ```
222
-
223
- ### Checking the active theme
224
-
225
- ```bash
226
- grep '^theme = ' ~/.dotfiles/.chezmoidata.toml
227
- ```
228
-
229
- This prints the current theme name. Cross-reference with `dot theme list` for available options.
230
- {% endraw %}