On this page

Skip This Guide

If you are using an AI agent (Claude Code, Cursor, Copilot, etc.), tell it: "Read https://wire.wise-relations.com/bot.md fully and guide me." The agent protocol covers everything below in a format optimized for AI.

Wire is a Content Build System that generates, verifies, and deploys content from the command line. This guide follows AutoFix Munchen, a fictional car repair shop, from installation to first generated page. Every terminal block shows real Wire output. By the end, you will have a working site with an audit report and one Claude-generated page.

Cost for this entire walkthrough: one Claude call (covered by your API key or AI subscription). See pricing.

Install Wire

Do NOT run pip install wire. That installs a different package from PyPI.

pip uninstall wire -y                   # Remove wrong package if installed
pip install --no-cache-dir https://wire.wise-relations.com/dist/wire-0.0.0-py3-none-any.whl

Verify the checksum:

curl -s https://wire.wise-relations.com/dist/wire-0.0.0-py3-none-any.whl.sha256

Compare with the checksum of the installed wheel. If they do not match, do not proceed.

To upgrade later, run python -m wire.chief update. It reinstalls the same wheel URL with --force-reinstall --no-cache-dir. Wire nags you to run this once your install is more than seven days old. Wire ships fixes daily; stale installs are the single most common source of false bug reports.

Requirements: Python 3.10+. Authentication: if running inside Claude Code or Claude CLI, you already have it (Wire calls Claude as a subprocess). Otherwise, set ANTHROPIC_API_KEY in .env. Optional: BFL_API_KEY for AI image generation.

Important: Always run Wire commands from the site directory (where wire.yml lives). On Windows with Git Bash, use /c/Users/... paths, not C:\Users\....

Create Your Site

Create a directory and initialize it:

mkdir autofix-muenchen
cd autofix-muenchen
python -m wire.chief init

Wire generates:

autofix-muenchen/
  wire.yml                 # Site config
  .env                     # API key template (fill in your key)
  docs/
    _styleguide.md         # Editorial rules (customize this)

You create docs/index.md (the homepage) and topic directories yourself. No templates directory needed. Wire ships built-in templates with canonical tags, JSON-LD, Open Graph, header, footer, TOC, and reading progress.

Configure

Edit wire.yml. Wire requires every field below. Missing fields cause BUILD REFUSED.

site_name: AutoFix Munchen
site_url: https://autofix-muenchen.de
lang: de
description: "KFZ-Werkstatt in Munchen. Bremsen, Olwechsel, Inspektion."
docs_dir: docs
output_dir: site
logo: false                            # false = text-only, or path to logo file
favicon: false                         # false = none, or path to favicon file

nav:
  - Services:
    - services/index.md
    - services/bremsen/

extra:
  wire:
    sidebar_cta:
      title: "Termin buchen"
      link: /kontakt/
      link_text: "Jetzt anfragen"
    article_cta:
      title: "Werkstatt-Termin"
      description: "Rufen Sie uns an oder buchen Sie online."
      link: /kontakt/
      link_text: "Termin vereinbaren"
    labels:
      on_this_page: "Auf dieser Seite"
      related_articles: "Verwandte Artikel"
      read_more: "Weiterlesen"

See the configuration reference for all options.

Add your API keys to .env:

ANTHROPIC_API_KEY=sk-ant-your-key-here
BFL_API_KEY=bfl_your-key-here          # For AI image generation (api.bfl.ai)

Create Your First Topic

Topics are directories under docs/. Each needs an index.md with frontmatter:

mkdir -p docs/services

Create docs/services/index.md:

---
title: "KFZ-Reparaturen in Munchen"
description: "Alle Werkstatt-Leistungen von AutoFix Munchen."
short_title: Services
layout: page
---

Unsere Werkstatt-Leistungen im Uberblick.

short_title is required on all topic pages (max 20 chars, used in navigation). layout is required on parent pages with child directories.

Create your first content page at docs/services/bremsen/index.md:

---
title: "Bremsen-Reparatur Munchen: Kosten und Ablauf"
description: "Bremsbelage und Bremsscheiben wechseln bei AutoFix Munchen."
short_title: Bremsen
created: 2026-03-10
---

Bremsbelage nutzen sich ab. Wir prufen und wechseln Ihre Bremsen.

Your structure now:

autofix-muenchen/
  wire.yml
  .env
  docs/
    _styleguide.md
    index.md
    services/
      index.md
      bremsen/
        index.md

Build the Site

python -m wire.build
Building Wire from docs
Found 3 pages
Built 3 pages in 0.12s (render 0.08s, lint 0.04s)
Lint: all checks passed.

Open site/index.html in a browser. You have a working static site. The build runs in parallel, rendering 1,000+ pages in seconds. The total build time includes validation, rendering, minification, and lint checks.

To preview locally, start the dev server:

python -m wire.build --serve

This serves the built site at http://localhost:8000. Refresh the browser after rebuilding.

No AI tokens used so far. Building and auditing are free. Only content generation calls Claude.

Run Your First Audit

python -m wire.chief audit services
HEALTH: services (1 page)
  - No GSC data (run: python -m wire.chief data)
  + No dead pages
  + No cannibalization
  + Titles OK
  + Descriptions OK
  + No orphan pages
  + No broken links
  + Source diversity OK
  - 1 thin page(s) (< 200 words)

ACTION: services
  Thin content:
    services/bremsen (12 words)

INFO:
  1 page scanned, 0 archived

The audit found one problem: the bremsen page is a stub with 12 words. That is expected. You have not generated content yet.

What NOT to do on Day 1:

  • Do not run reword before data. Reword needs GSC keywords to optimize for.
  • Do not run news before you have real content. News refines existing pages, not stubs.
  • Do not run deduplicate with one page. You need at least two pages to detect overlap.

The correct Day 1 sequence is: build (verify structure) then audit (see the landscape) then create (generate content).

Generate Your First Page

Let Wire write the bremsen page using web research:

python -m wire.content create services/bremsen

Wire searches the web for information about brake repairs in München, then generates a complete page with proper frontmatter, headings, citations, and internal links. The output might look like:

---
title: "Bremsen-Reparatur Munchen: Kosten und Ablauf"
description: "Bremsbelage und Bremsscheiben wechseln lassen. Kosten ab 150 Euro, Dauer ca. 1-2 Stunden bei AutoFix."
short_title: Bremsen
created: 2026-03-10
---

Quietschende Bremsen deuten fast immer auf abgenutzte
Bremsbelage hin. Laut [ADAC](https://www.adac.de/...)
sollten Bremsbelage alle 30.000 bis 60.000 km gepruft
werden...

Minimal token usage (one Claude call, covered by your API key or AI subscription).

Verify with Dry-Run

If you want to preview before saving, use --dry-run:

python -m wire.content create services/bremsen --dry-run

This writes to index.md.preview and shows a diff. The original file is untouched.

Connect Google Search Console (Optional)

GSC unlocks Wire's most powerful features: keyword cannibalization detection, SEO rewriting, content gap analysis. Skip this if you are starting a new site with no search history.

The short version, two commands:

python -m wire.chief gsc-setup  # interactive wizard: Google Cloud -> .env -> token.json
python -m wire.chief data       # pulls metrics into .wire/gsc.db

gsc-setup is an interactive wizard that walks through every Google Cloud step, parses the downloaded client_secret_*.json, writes .env, runs the OAuth consent flow, and verifies access. Five minutes, one command. The wizard opens Google Cloud Console Credentials in your browser and pauses while you create a Desktop-app OAuth client. The full walkthrough with every click in the Cloud Console and a complete troubleshooting section lives on the GSC Setup page. If Google does not yet list your site as a property, add it at Search Console and verify ownership first.

If you already have GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in .env and only need to refresh token.json, run python -m wire.chief gsc-auth directly.

With GSC connected, re-run the audit:

python -m wire.chief data         # Pull search metrics into local DB
python -m wire.chief audit        # Now includes SEO analysis

The audit now shows keyword overlaps, content gaps, reword opportunities, and dead pages, all computed from real search data.

Protect Your Secrets

Wire writes three credential files next to wire.yml: .env (API keys), token.json (Google OAuth consent), and any client_secret*.json you download from Google Cloud. None of these belong in git. Anyone with read access to your repo can impersonate your GSC, Google Cloud, Anthropic, and BFL accounts.

Wire's build refuses to run if you commit token.json. If you run data without setting up .gitignore first, the build will catch it:

BUILD REFUSED: Secret leak: 'token.json' is tracked by git.
  This file contains credentials. Anyone with read access to
  your repo can impersonate your GSC / Google Cloud / Anthropic
  / BFL accounts.
  Fix (all five steps required):
    1. git rm --cached token.json
    2. git commit -m 'remove leaked secret'
    3. Add 'token.json' to .gitignore
    4. ROTATE the credential immediately:
       - token.json / client_secret*.json: https://console.cloud.google.com/apis/credentials
    5. Re-run: python -m wire.chief gsc-setup

wire.chief init writes a .gitignore with the secret patterns plus .wire/, site/, __pycache__/. If you initialized your site before this gate existed, run init again. It preserves an existing .gitignore so it is safe to re-run. The allowlist permits .env.example, .env.template, .env.sample, and .env.dist so teams can document required variables without leaking real values.

If the gate fires, rotate the credential before doing anything else. Removing the file from git history does not invalidate keys that are already in someone's clone. Generate fresh credentials in the relevant console (Google Cloud, console.anthropic.com, api.bfl.ai) and overwrite the local file. Wire reads it on the next run.

Operate Wire From Your Phone

You do not have to sit at your desk to run Wire. Wire ships with a Telegram bot that wraps the CLI behind a chat interface. Ask for an audit during a customer meeting. Trigger refine from a train. Check the last build from your couch. Setup is a BotFather token, a whitelist of allowed chat IDs, and a systemd service on any Linux VPS. Full walkthrough in the Telegram Bot guide.

What You Have After Day 1

What Status AI tokens used
Working static site Built and served locally None
Audit report Complete with actionable items None
One generated page Full content with citations Minimal
Styleguide Default, ready to customize None
GSC integration Optional, connected if set up None

Total: minimal token usage for your first real content.

Day 2 and Beyond

Once you have 5-10 pages and some search data:

  1. Run python -m wire.chief audit to see the full picture
  2. Run python -m wire.chief enrich services to improve all pages at once
  3. Run python -m wire.chief news services to gather recent news for each page
  4. Run python -m wire.chief refine services to integrate news into pages

See the daily workflow guide for the complete recommended sequence. See Writing for Wire to customize your styleguide. See Prompt Engineering to understand the prompt system. If more than one human runs Wire commands against this repo, read Team Workflow before your second session.

The audit is always free. Content generation uses minimal AI tokens per operation, covered by your API key or AI subscription. A full enrich pass on 200 pages uses far less than what a single freelance article would cost.

See the Guides overview for all Wire documentation.