Roadmap: zc-workstation
The plan to replace aurora-mac with zc-workstation, a Go CLI on top of chezmoi that sets up macOS, Linux and Windows from one repo.
aurora-mac sets up one kind of machine, a Mac, with about 850 lines of shell. Its successor, zc-workstation, sets up macOS, Linux and Windows from one repo. It is a new repository. aurora-mac stays as it is until zc-workstation reaches parity on macOS, and then it is archived.
Decisions
| Question | Decision |
|---|---|
Engine |
chezmoi applies the dotfiles. A thin Go CLI does the glue that chezmoi does not do. |
Platforms |
Phased: macOS parity first, then Linux, then native Windows. |
Repository |
New repo |
Scaffold |
Generated from go-tool-template with |
Found on GitHub
Searched first, so that the new code is only the glue nobody else provides.
| Project | License | Verdict | Why |
|---|---|---|---|
twpayne/chezmoi (Go, ~22k stars) |
MIT |
Adopt |
Dotfiles on macOS, Linux and Windows. Per-OS templates, |
jdx/mise (~35k stars) |
MIT |
Keep |
Already manages Java, Node and Python, and works on all three systems. Its |
go-tool-template (private) and toolshell |
MIT |
Adopt |
Our own. Provider/plan/apply engine, |
MIT |
Adopt |
The pick list for |
|
MIT |
Adopt |
Builds the binaries and publishes a Homebrew tap formula, a Scoop/winget manifest and Linux packages. |
|
GPL-3.0 |
Optional |
Upgrades every package manager on a machine. |
|
MIT |
Skip |
Rust tools that overlap with chezmoi. They are smaller and younger, and comtrya says it is early in its development. |
|
yadm, dotbot |
GPL-3.0 / MIT |
Skip |
Symlinks plus shell commands, with weaker Windows support than chezmoi. |
Package manager wrappers (pm, pkm, tux) |
various |
Skip |
Shell, Unix only. The package provider is ours, about 200 lines of Go. |
How it fits together
zc-workstation/
cmd/zc-workstation/ CLI: init, plan, apply, update, doctor, catalog, mcp
internal/provider/
dotfiles/ runs chezmoi (source: home/)
packages/ brew + Brewfile, apt, dnf, winget; one manifest per OS
tools/ mise install
settings/ macOS defaults, GNOME gsettings, Windows registry
services/ launchd, systemd --user timers, Task Scheduler
keyboard/ keyd on Linux
home/ chezmoi source state; *.tmpl where the OS changes the file
packages/
Brewfile macOS
apt.txt, dnf.txt Linux
winget.json Windows (winget import format)
docs/ Antora
-
planshows what each provider would create, update or delete, and changes nothing. -
applyruns a plan after a person says yes, from the CLI, the UI or an agent through MCP. -
doctorreplacesdoctor.sh, built ontoolshell/doctor, and adds--jsonfor agents and CI. -
updatereplaces theupdatealias: pull the repo and the overlay,apply, upgrade (topgrade when installed), thendoctor. -
The overlay stays a separate private repo. It is a second chezmoi source with its own state file and its own package manifests, applied after the public one. The path moves to
~/.config/zc-workstation/overlay. -
The scripts in
bin/(git-tidy, gh-summary, prompt-pr, ci-watch, catalog) become subcommands only where they must run on Windows. Unix-only helpers stay shell scripts underhome/.
What carries over
| Part | macOS | Linux | Windows |
|---|---|---|---|
zsh, antidote, starship, atuin |
yes |
yes |
starship and atuin in PowerShell |
tmux |
yes |
yes |
inside WSL only |
Terminal |
Ghostty |
Ghostty |
WezTerm until Ghostty ships for Windows |
git, delta, lazygit, yazi, mise |
yes |
yes |
yes |
VS Code, IntelliJ settings |
yes |
yes |
yes |
Claude Code config and hooks |
yes |
yes |
yes, hooks rewritten where they call Unix tools |
Theme (Catppuccin Latte/Mocha follows the system) |
yes |
GNOME first |
yes |
Caps Lock and Hyper key |
Karabiner |
keyd |
PowerToys Keyboard Manager |
Launcher |
Raycast |
GNOME default |
PowerToys Run |
Menu bar, window borders |
SketchyBar, JankyBorders |
none |
none |
Scheduled jobs |
launchd |
systemd --user |
Task Scheduler |
System settings |
|
gsettings |
registry |
Clean-machine test |
|
container in CI |
Windows runner in CI |
Where it stands
| Piece | State | Notes |
|---|---|---|
Engine, CLI, MCP server, dashboard |
Done |
From go-tool-template. The dashboard shows coverage, missing items and the programs each target needs. |
|
Done |
One config for every machine. Targets for another system are skipped. |
|
Done |
Installs only, never uninstalls. Read-only status matches the aurora-mac Brewfile: 78 of 80 installed. |
|
Done |
Applies only the planned paths. |
|
Done |
Untrusted configs stay a |
|
Done on macOS, Linux and Windows |
macOS |
Security checks in |
Done on macOS |
`doctor.sh’s FileVault, firewall, screen lock, Gatekeeper, SIP, update, File Sharing, Touch ID and exposed-server checks, as warnings with their fix. |
|
Done |
|
aurora-mac config moved to a private config repo |
Done |
A private zc-workstation-config repo holds the Brewfile, the mise config and a chezmoi |
aurora-mac steps beyond links |
Done |
The git identity, hooks and signing key, app settings (VS Code, IntelliJ, Chrome, CodexBar), |
|
Done |
|
|
Done on macOS |
A new Mac in one command from the config repo. The ZoolCoder theme, wallpaper and screen saver. |
ZCBar menu bar app and ZC Care |
Done on macOS |
The panel over the CLI, and a window that cleans junk and AI clutter, uninstalls apps, finds clutter and idle dependencies, and logs what it freed. Similar Images is still to come. See Menu bar app and ZC Care. |
CI on macOS, Linux and Windows runners |
Done |
|
The toolbox |
Done |
A manual page per tool in the reference setup: what it is for, how it is configured, its keys. See The toolbox. |
Repository hardening |
Ready to apply |
Git flow with |
First release, |
Next |
Binaries, the Homebrew cask, Linux packages and Windows zips through goreleaser. |
Next
The concrete tasks are in TODO.md. In order:
-
Release. Apply the repository settings, cut
v0.1.0, and runbootstrap.shfrom the cask on a clean macOS VM. -
ZC Care. Similar Images in My Clutter, and browser privacy data in Protection.
-
ZCBar distribution. A Developer ID signature and notarisation, so Full Disk Access survives an update, and a cask for the app.
-
Linux and Windows. Phases 2 and 3 below.
Phases
Each phase ends with a check that proves it, not a date.
| Phase | Work | Done when |
|---|---|---|
0. Scaffold |
|
|
1. macOS parity |
Move the config folders into |
On a clean macOS VM, |
2. Linux |
Templates for Linux paths, |
|
3. Windows |
|
|
4. Retire aurora-mac |
Archive the repo on GitHub with a pointer to zc-workstation. Rename aurora-mac-overlay to zc-workstation-overlay. Update CLAUDE.md and memory paths. |
Nothing on any machine still reads |
Docs
The docs move to zc-workstation with the code and change shape:
-
Per-OS getting started. One page each for macOS, Linux and Windows, in place of today’s macOS-only setup page.
-
Generated reference. The command reference comes from the CLI’s help, and the package list comes from the manifests, so neither can drift.
-
Split by purpose. Tutorials (first setup), how-to (add a package, add a dotfile, write an overlay), reference (commands, manifests, providers) and explanation (why chezmoi, the threat model).
-
Workstation notes. Claude Code, Git, Flutter, PostgreSQL, disk management and maintenance stay as notes modules, each marked with the systems it applies to.
-
No personal paths. Before the repo goes public, the five pages that still name personal paths are made generic. The personal detail moves to the overlay.
-
Published. The template’s
docs.ymlworkflow publishes the site to GitHub Pages.
Risks
-
chezmoi copies files by default. Editing
~/.zshrcdirectly no longer edits the repo. Either usechezmoi editandchezmoi re-add, or setmode = "symlink"for the files that you edit often. Decide this in phase 1. -
Windows has no tmux or zsh. The Windows profile is PowerShell-first, with WSL for the Unix workflow. Parity there means the same tools and theme, not the same shell.
-
Two dotfile engines in phase 1. Until parity, aurora-mac and zc-workstation must not both manage one machine. Test zc-workstation on a VM, then switch each Mac once.
Not planned
-
Managing servers or fleets of machines. That is Ansible’s job.
-
Nix or home-manager. They do not cover native Windows.
-
Applying a plan without a person’s yes.
Edit this page Last updated