On this page
Wire is a CLI. That was the point. Reporters and operators should not need to learn a tool. They run commands, they ship sites. But watching people use Wire I kept seeing the same friction: alt-tab to VS Code, alt-tab to terminal, alt-tab to git, alt-tab to browser. Four windows to change one sentence.
Today Wire ships wire ui, a local dashboard that wraps the CLI. One command, one browser tab, four panes. The CLI stays the source of truth. The UI is a lens over it.
For context on what Wire does, see About Wire.
Run it

cd your-wire-site
python -m wire.chief ui
It binds to 127.0.0.1:4747, prints a URL with a random per-session token, opens your browser. Localhost only. No account. No cloud. The dashboard talks to files on your disk through the Wire CLI you already have.
What's in it
Topbar. Two buttons: BUILD and PREVIEW. Build runs python -m wire.build with the flags you pick. Preview toggles a static server for site/ on port 8000, independent of the command runner, so you keep iterating while the preview stays up.
Left sidebar. Every Wire command, filtered by where you are in the docs tree:
- At the docs root: site-wide ops (
audit,data,redirects,newsweek) - Inside a topic:
news,refine,reword,enrich,crosslink - On a specific item: page-level ops from
wire.content(update,seo,expand,compare)
Click a command, fill the form, click run. No memorizing which CLI has which subcommand. The palette reads your argparse tree and builds itself.
Main pane. Breadcrumb navigation (docs / authors / tim-filzinger). Read/Edit toggle. Click Edit and the rendered markdown becomes a textarea. Type, Ctrl+S, saved to disk. The editor tracks mtime so it warns you if Wire modified the file while you were typing.
Right sidebar. Full git overview: every unsaved file, one-click save, one-click discard. Recent commits, GSC snapshot counts.
Log pane. Every command streams here with clickable URLs. Next to CLEAR there's a new button: ASK AGENT.
Git, one click away

Wire refuses to run most commands on a dirty docs/. That was deliberate: AI-driven content operations on uncommitted work is how you lose things. But it meant every session started with an alt-tab to the terminal.
The git pane now lives permanently in the right sidebar. Every unsaved file is there. Click save next to one file: one commit, message Update <path>. Click × to discard. Modified files revert to HEAD. Untracked files (including whole untracked directories, e.g. a new author page you decided against) are deleted from disk after a confirm dialog. SAVE ALL commits all dirty files one-by-one, each with its own message. DISCARD ALL reverts everything at once.
No terminal. No git vocabulary. Writers think "save" and "discard", and that's what the buttons say. Underneath, it's still clean git history with one commit per file change.
Ask Agent

You run a command. It fails or outputs something confusing. You click ASK AGENT, type a question:
what broke?
The UI hands Claude Code your question, the last command's output, and a pointer to docs/bot.md, which is Wire's canonical agent protocol. Claude reads bot.md to understand Wire's gates, lint rules, frontmatter schema. Then it investigates your logs and either explains what happened or fixes it.
The agent only writes under docs/. Never touches wire.yml, templates, or Python source. Never commits. You review the changes in the git pane and save them yourself.
Two fixed presets live next to Ask Agent: FIX ERRORS and FIX WARNINGS. They appear under the log after any build that fails, parse .wire/build-errors.txt, and loop until clean.
What it is not
This is not an IDE. It's not a code editor. It's not a CMS. It does not reimplement Wire logic. Every button runs a wire subcommand in a subprocess. The dashboard knows nothing Wire doesn't tell it.
That constraint matters: new Wire commands appear in the UI automatically the next time you restart it. The UI introspects argparse at runtime. Nothing is hardcoded. When Wire grows, the dashboard grows with it. For more on how that kind of single-surface thinking shapes Wire, see The Stack Collapsed.
Stack
- Python stdlib
http.server+ threading. No FastAPI, no async framework. - Vanilla JS with ES modules served as static files. No Vite, no npm, no build step.
- Tailwind-free CSS aligned with Wire's
tech.css, so the dashboard uses Wire's colors and 2px corners. - 0 new runtime dependencies in
pyproject.toml.
The whole thing is about 1,500 lines of Python and JS combined.
Also shipped today: lint got 55% faster
While wiring up the dashboard I profiled a build. 103 pages, 203 seconds. The profiler showed lint_site parsing each HTML page once for cross-page analysis, then lint_page re-reading the file and re-parsing with BeautifulSoup for per-page rules. Every page was being parsed twice.
Three-line fix: pass the already-parsed soup through to lint_page instead of re-reading. Lint dropped from 145s to 50s. Full build from 203s to 90s.
If you were waiting on slow lints, that's gone.
Try it
# in any Wire site
python -m wire.chief ui
If you hit issues, click ASK AGENT and paste the error. That's what it's there for.
wire-ui is in Wire's master branch. Pull, install, run. No migration, no config. It just reads the files you already have.
What's next
The UI is the smallest thing that closed the loop between editing, building, previewing, and reviewing. What's missing: live preview refresh on save, a GSC keyword panel per page, a diff-viewer that understands markdown semantics, keyboard shortcuts for palette nav. These are additive. The foundation is small enough to extend.
The whole point of Wire was to take tools that were separate and make them one. The dashboard is the same move, one layer up.