Local live preview
Works with the CLI alone. No gander.md account.
Local watch is a live-reload preview on this machine. Every save hot-swaps the HTML in your browser and rebuilds the TOC, keeping scroll position. You do not need a gander.md account. Nobody off this computer can open the page, unless they have the unguessable local token and can reach 127.0.0.1.
This is not gander watch. That subcommand is the hosted review loop and needs signup.
gander plan.md --watch
The CLI hands the file to a long-lived runner daemon (gander _serve) and exits. The daemon owns the HTTP server, the filesystem watch, and the reload. Open the URL once. It stays valid across edits, runner restarts, and reboots, because the watch list is stored in ~/.gander/watches.json.
A local server listens on 127.0.0.1:7821. Multiple watches share that port under /w/<id>. Browsers subscribe over Server-Sent Events.
Local vs hosted
# CLI only - stays on this machine
gander plan.md --watch
# Signed up - live gander.md link for a reviewer
gander watch plan.md
gander --watch is local preview. gander watch is the hosted review loop. If you need a teammate to comment, use hosted watch. If you are reading along with the agent in your own browser, local watch is enough.
Runner commands
gander status
gander stop plan.md
gander stop <watch-id>
gander stop --all
gander logs
gander logs <watch-id>
gander logs --follow
gander logs --no-follow
status prints the runner version, each watch, and its URL. stop removes one watch by file or id, or everything with --all. logs tails reload events; pass an id to filter.
Auto-start at login
The first --watch installs a per-user supervisor so the daemon comes back after login: LaunchAgent on macOS, systemctl --user on Linux.
gander runner uninstall
gander runner install
Uninstall if you do not want a background process. Install again to restore auto-start. Uninstall does not delete watches.json; the next --watch can pick the list up.
Foreground (CI and debug)
The old blocking behavior is still there. Ctrl+C stops it. The daemon is not involved; this process owns a transient server.
gander --watch --foreground plan.md
--watch and -outfile cannot be combined.
Same-machine access
Other local users cannot use your URL by guessing the path. Each watch has an unguessable ?t= token in ~/.gander/watches.json (mode 0600). The runner socket is mode 0600 inside a 0700 directory. On Linux the daemon also checks SO_PEERCRED against the connecting UID.