Skip to main content

Site Builder — how this works

In the app: /sites

How it works

Generating a page fires a signed intent to n8n's site-generate workflow, which calls Claude directly and delivers the drafted title/meta/sections back to this app — this page never calls Claude itself. Every generated Site row publishes IMMEDIATELY (reachable at /sites/{slug} the instant the callback lands), same as the public route's own pre-existing demo page — there is no pre-publish review queue. Archive/Republish here only toggles whether an already-generated page is currently live. The "On-Page Audit Findings" section below is a separate, read-only surface: the weekly seo.onpage-audit job (beast SEO-05e) crawls our own published sites/forms ONLY with Playwright, checking status/title/canonical/meta/H1/JSON-LD/alt-text/broken-links, and lists every currently-open regression — a finding closes itself (resolvedAt stamped) the next time the crawl no longer detects it, never a manual dismiss.

Data source

src/lib/sites/sitesRepo.ts (the Site table), written by n8n's callback via src/app/api/webhooks/n8n-site-generate-result/route.ts. Findings: src/lib/seo/onpageAudit.ts + the SeoAuditFinding table, written by the seo.onpage-audit job.

Troubleshooting

A generated page never showed up? Check /tools for n8n's live/mocked status — under CALLHQ_MOCK_N8N (the default until a founder wires a live n8n), the intent is logged and mocked, so no real Claude call ever happens and no callback ever arrives to publish the Site. A slug that already exists gets its content OVERWRITTEN (republished in place), never a duplicate row. No findings ever appear? The weekly crawl runs Mondays 05:00 UTC via the job worker — it never runs on page load, and a founder must ensure Playwright's Chromium browser binary is provisioned on the worker box (a real crawl, not mock-gated).

Vendors: n8n — check Tools for live/mocked status.

Who can see this: admin