You opened wire.yml to change one thing and now you're not sure which setting controls what you're trying to fix.

Wire reads configuration from three places: `wire.yml`, environment variables in `.env`, and prompt files scattered through your docs directory. Most problems trace back to one of those three. The tricky part is that some settings look like they belong in `wire.yml` but actually live in `.env`, and vice versa. Which of these is closest to where you are right now?

Wire's news behavior is controlled by `refresh_days` under `extra.wire`. Each topic section gets its own interval in days. The part that surprises most operators: setting a topic to `0` doesn't mean "refresh constantly." It means "never fetch news for this topic at all." That's intentional for auto-generated pages like comparisons. So if a section is getting no news updates, check whether it's set to `0` before assuming something is broken.

Wire needs three environment variables to function. `ANTHROPIC_API_KEY` is required for everything. The two Google variables are only required if you're pulling data from Google Search Console. A common setup mistake: the `.env` file goes in the Wire installation directory, not your site directory. If Wire is running but returning authentication errors, the file is probably in the wrong place. Once you confirm the location, the variable names are straightforward.

Wire looks for prompt files in your docs directory before falling back to its built-in prompts. The site-wide file is `_styleguide.md` in the root of `docs/`. Topic-specific overrides go in `docs/{topic}/` and only affect that section. The complication: if you place a `_styleguide.md` in a topic subdirectory instead of the root, Wire treats it as a topic-level override, not a global one. Your rules apply to that section only. Everything else still runs on the defaults.

Wire's visual layer runs entirely through CSS custom properties. You set color and font values in `wire.yml` under `theme:`, and Wire injects them as a `<style>` block into every page. You never edit the CSS file directly. The part that catches operators: there are ten CSS variables, but `wire.yml` only exposes five of them directly. The rest (`--primary-dark`, `--primary-light`, hover states, border radius) are derived or set in `wire.css`. If your hover states look wrong, that's why.

Wire stores its GSC database at `{site_dir}/.wire/gsc.db`. That directory is created automatically on the first `data` run. If the database isn't appearing, the `data` command hasn't run yet, or it ran against a different site directory than you expected. The `.wire/` directory also holds batch progress files and cached newsweek extracts. If you're seeing stale data, a cached extract file from a previous run may be the cause. Check the filename dates before re-running.

Wire reads configuration from three sources: wire.yml in your site directory, environment variables in .env, and prompt files in your docs directory. This reference covers every option.

wire.yml - Site Configuration

# Required
site_name: My Site
docs_dir: docs

# Recommended
site_url: https://example.com
description: What your site is about.
templates_dir: templates
output_dir: site

# Navigation (optional — auto-discovered if omitted)
nav:
  - index.md
  - Insights:
    - Content Strategy: insights/content-strategy/index.md
    - SEO Fundamentals: insights/seo-fundamentals/index.md

# Build exclusions (optional)
exclude:
  - ".*/_.*\\.md$"
  - ".*/drafts/.*"

# Wire-specific settings (all optional)
extra:
  wire:
    refresh_days:
      products: 21
      services: 60
      guides: 120
      comparisons: 0
    default_refresh_days: 21

    reword_tiers:
      full: 20
      light: 30

    max_articles: 20
    rate_limit_delay: 1
    min_opportunity_score: 15
    newsweek_batch_chars: 150000

Wire Settings Reference

All settings under extra.wire are optional. Defaults are shown.

News Freshness

refresh_days:
  products: 21       # Check every 3 weeks
  services: 60       # Every 2 months
  guides: 120        # Every 4 months
  comparisons: 0     # Never (auto-generated)
default_refresh_days: 21  # Fallback for unknown topics

Set a topic to 0 to disable news gathering entirely. This is useful for auto-generated content (comparisons, hub pages) that should not receive news updates.

Reword Tiers

reword_tiers:
  full: 20    # Top 20% get full SEO rewrite
  light: 30   # Next 30% get title + description only
  # Bottom 50% are skipped

Adjust these percentages based on your editorial capacity. More aggressive tiers (full: 40, light: 40) cost more but touch more pages. Conservative tiers (full: 10, light: 20) save budget.

Content Limits

Setting Default What it controls
max_articles 20 Maximum articles fetched per news search
rate_limit_delay 1 Seconds between API calls
min_opportunity_score 15 Minimum score for keyword opportunities
newsweek_batch_chars 150000 Max characters per newsweek extract batch

Environment Variables

Set these in .env in the Wire installation directory.

Variable Required Purpose
ANTHROPIC_API_KEY Yes Claude API access
GOOGLE_CLIENT_ID For GSC Google OAuth client ID
GOOGLE_CLIENT_SECRET For GSC Google OAuth client secret

Prompt Overrides

Wire looks for prompt files in your docs directory before falling back to built-in prompts. Place these files to customize Claude's behavior.

File Location Purpose
_styleguide.md docs/ Site-wide editorial rules (prepended to all prompts)
_create.md docs/{topic}/ Custom create prompt for a topic
_update.md docs/{topic}/ Custom update/refine prompt
_seo.md docs/{topic}/ Custom SEO reword prompt
_expand.md docs/{topic}/ Custom expand prompt

See the prompt engineering guide for details on writing effective prompts.

Theming - Customize the Look

Wire's CSS uses CSS custom properties (variables) for all visual tokens. You change the look of your entire site by setting a few values in wire.yml. No CSS editing required.

theme:
  primary_color: "#059669"        # Links, buttons, active states
  accent_color: "#f59e0b"         # Highlights, accents
  text_color: "#1a1a2e"           # Body text
  font_family: "'Inter', sans-serif"
  code_font: "'JetBrains Mono', monospace"

Wire injects these as CSS custom properties into every page. The base stylesheet reads from these variables, so one change propagates everywhere.

How it works

The base.html template generates a <style> block from your theme config:

<style>
  :root {
    --primary: #059669;
    --accent: #f59e0b;
  }
</style>

This overrides the defaults in wire.css. You never edit the CSS file directly. You configure through wire.yml.

Available CSS variables

Variable Default What it controls
--primary #1a56db Links, buttons, active nav items, logo
--primary-dark #1040a8 Hover states for primary elements
--primary-light #e8effc Active nav background, callout background
--accent #059669 Command prompt color, success states
--text #111827 Body text, headings
--text-muted #6b7280 Secondary text, sidebar labels
--bg #fff Page background
--bg-subtle #f9fafb Sidebar, table headers, code blocks
--border #e5e7eb Borders, table lines, dividers
--radius 8px Border radius on cards, code blocks

Custom CSS

For changes beyond color and typography, add a custom CSS file:

# wire.yml — not yet implemented, coming soon
theme:
  custom_css: assets/css/custom.css

For now, create docs/assets/css/custom.css and add a <link> in your base.html template after wire.css. Your overrides take precedence.

Example: Agency with teal brand

theme:
  primary_color: "#0d9488"
  accent_color: "#f59e0b"
  font_family: "'Source Sans Pro', sans-serif"

Three lines. The entire site matches the brand. No CSS editing, no designer needed.

Frontmatter-Driven Metadata

Pages can override metadata defaults through frontmatter:

---
title: About Us
description: Learn about our team and mission.
og_type: website          # Default: article
template: custom.html     # Default: page.html
---

The og_type field controls the Open Graph type meta tag. Most pages should use article (the default). Set website for the homepage, product for product pages.

The template field lets individual pages use different Jinja2 templates. This is useful for landing pages, contact forms, or any page that needs a different layout.

Build Configuration

The build system reads from the same wire.yml:

Setting Default Purpose
docs_dir docs Markdown source directory
templates_dir templates Jinja2 templates directory
output_dir site HTML output directory
exclude (see above) Regex patterns for files to skip

If nav is specified in wire.yml, Wire uses that exact structure for the sidebar. If omitted, Wire auto-discovers topics from the directory structure and builds navigation automatically.

# Explicit navigation
nav:
  - index.md
  - Insights:
    - Content Strategy: insights/content-strategy/index.md

# Or omit nav entirely for auto-discovery

Database Location

The GSC database lives at {site_dir}/.wire/gsc.db. This directory is created automatically on first data run. Add .wire/ to your .gitignore.

Progress tracking files for batch operations also live in .wire/:

.wire/
  gsc.db                              # GSC keyword database
  progress-news-products.json         # Batch progress tracking
  progress-refine-products.json
  newsweek_extracts_2026-03-10.md     # Cached newsweek extracts