Suds System StudioRelease and design control
Start here · no coding required

Site Builder's Guide

How to take a laundromat client from an intake file to a polished, launch-ready website using the Suds system — by giving instructions, answering decisions, and reviewing pages. The AI does the building; you steer it.

Audience: the site builder / operator. No web-development background assumed. Deeper references are linked at each step and indexed in the documentation registry.

The system in one paragraph

Every Suds site is the same engine wearing a different brand. The Suds Digital Website Builder plugin carries everything — a library whose current count is published in its generated manifest (62 sections today), 7 design archetypes (visual personalities) × 4 hero layouts, the page templates, and the safety rules. Each client gets only a tiny brand theme (their name + colors) that the system generates. You do not need to edit code: choose Claude Code or Codex as the builder, answer decisions in Mission Control, and polish visually in the Section Studio. Both agents consume the same intake, canonical plan, lock, engine, and claim-safety rules; the adapter changes, not the project truth. Data-dependent sections hide themselves instead of inventing facts, and QA remains the final check.

What you need before starting

ThingWhat it is
A Local site from the blueprintThe site in Local (by Flywheel), created from the Suds blueprint — the BCB parent theme, engine plugin, ACF Pro, WPForms, etc. should already be installed. Before a build, verify that the engine and framework match the release you intend to use.
Onboarder access or an intake fileRecommended: connect the site's Prepare Build screen to Onboarder so it installs the framework and fetches the selected project directly. Manual fallback: export SD-<id>-client.json and place it in wp-content/.claude/intake/. In either path, localize photo/logo assets promptly while their signed links are fresh.
Claude Code or CodexOpen the chosen agent in the workspace that contains .claude and .codex (normally the site's wp-content folder). Prepare Build installs both adapters; you choose which one drives the build.
An unlicensed local build targetUse a client-specific Local site with WP_ENVIRONMENT_TYPE=local or development. Do not build client sites on catalog.local; that site is the component-library workbench. Local and ordinary client staging sites remain unenrolled.

One-time operator setup — connect Onboarder

  1. Sign in to the Suds intake console and open Settings → API keys (API keys).
  2. Under Create a new key, use an integration name such as Website Builder — Local, then select Create key.
  3. Copy the new sd_live_… value immediately. The intake app shows the raw key only once and stores only its SHA-256 hash.
  4. In the intended disposable or client WordPress build target, open Prepare Build, keep the API base URL at https://suds.onboarder.website/api/v1, paste the key, choose wp-content/.claude, and select Save credentials.
  5. Select Load projects. The same active integration key can list and fetch available projects; a separate key is not required for every client. Revoke or rotate it from the intake app if it is exposed or no longer needed.
Credential boundary: never save an Onboarder API key in the reusable Local blueprint, a distributable plugin/theme package, source control, screenshots, support messages, or shared database exports. Configure it only after cloning a site. A vendor or separate organization must generate and manage its own key.
Before every build: open the client site's Local shell at the WordPress root and run wp suds compatibility --format=json and wp suds release status --format=json. Resolve any reported engine, thin-theme, protocol, framework, or Codex-skill mismatch, and confirm release status shows "enrolled": false. Do not create a production enrollment code yet. Then choose one intake path:
Prepare Build (recommended): in WordPress, load or enter the project UUID and select Prepare Build. It safely installs/refreshes wp-content/.claude and wp-content/.codex/skills/suds-build, preserves existing project state, and writes the selected intake to .claude/intake/.
Manual fallback: run wp suds install-framework --location=wp_content and place the exported SD-<id>-client.json in wp-content/.claude/intake/.

Choose the builder for this session

BuilderWhere to open itFirst instruction
Claude CodeThe site's wp-content directoryRun /suds:init for a fresh prepared project, then follow the /suds:* sequence.
CodexThe same wp-content directoryInvoke $suds-build and say: Initialize and build this project from the newest prepared intake.

.claude is the historical name of the shared project-state directory; its name does not mean the project belongs to Claude. Start with one builder and do not initialize both agents at the same time.

Switching an existing project: from the Local shell at the WordPress root, run wp suds handoff-agent --to=codex or wp suds handoff-agent --to=claude, then continue in the target agent. The command verifies the current lock, regenerates only the adapter projection/comparison/lock, and proves the intake and canonical plan stayed unchanged. If it reports REVIEW_DIFFERENCES, review the comparison first; only then rerun with --accept-review-differences. Never switch by re-running initialization on a project already in progress.

The build, step by step

The command names below are the Claude interface. Codex follows the same stages and gates through $suds-build, using the roadmap, task files, protocol lock, and live WordPress state.

1

/suds:init — plan the site

Reads the newest intake in .claude/intake/, pins its SHA-256 so the raw export remains immutable, downloads the client's assets before signed links expire, and writes the plan (pages, priorities, roadmap). Init then runs the database-independent protocol gate and writes .claude/product/suds-build.lock.json; this step is mandatory even when Local's database is stopped. Continue on MATCH, review differences when requested, and stop on a factual mismatch or missing lock. If the site was already built by someone else, init routes you to /suds:backfill instead — follow it.

2

/suds:bootstrap — the look

Generates the client's brand theme and turns the engine on. At this design checkpoint, confirm the suggested archetype (one of 7 personalities — Express, Warm, Value, Commercial, Premium, Eco, Basecamp), hero layout, and the color palette derived from the client's logo. The system checks color contrast for accessibility automatically.

3

Fill the site with real content

After bootstrap, use this order (paths shown from the WordPress root): wp suds import-intake wp-content/.claude/intake/SD-<id>-client.json (pages, menu, services, locations, and each location's own hours). Treat that raw intake as immutable. For a photo-poor client, copy it to wp-content/.claude/product/derived-intake.json, run /suds-placeholder-kit on the derived file only, then run wp suds import-assets wp-content/.claude/product/derived-intake.json. When no derived file is needed, import assets from the raw intake. Finally run /suds:copy for claim-safe, client-tailored writing. Normal runs preserve existing operator content; explicit options such as --refresh-intake, --force-framework, or /suds:copy --force can overwrite their documented scope, so use them deliberately.

4

/suds:next → /suds:execute — build out the pages

Run /suds:next to create the next small work package (a “spec”), then run /suds:execute <task-id> with the task ID it returns. Repeat until the roadmap is complete. Watch progress and answer Decisions Needed in Mission Control (/suds:mission-control — a local dashboard in your browser). Every submitted answer is written to the project's decision file and reused by later commands.

5

Polish visually — the Section Studio

On the running site, three URLs are your workbench (also linked from the admin bar):

URLWhat you do there
?sbs_compose=<page>Section Builder — reorder, add, remove, and tune the sections of any page, next to a live preview. Works on every page, the /services/ and /locations/ archive pages, and individual service/location pages.
?sbs_review=boardReview Board — the coverage grid. Flag anything that looks off (your note goes straight to the AI's fix queue), mark things ready, approve.
?sbs_preview=<section>Preview — any section in any of the 7 skins at real phone/desktop widths.

Full visual manual with drills: the plugin's Section Studio runbook. What every field and knob does: section-fields.md.

6

/suds:qa — the local/share gate

Runs the current deterministic checks across content, design, rendering, claim-safety, and composition. The verdict is READY TO SHARE, SHAREABLE with notes, or NOT READY. /suds:qa --fix applies only documented safe fixes and then rechecks once. FAILs block sharing; WARNs become the review punch-list. Passing here allows the build to move to client staging; it does not enroll the site or replace final production QA.

From local build to client launch

Building, client review, release publication, and licensing are separate gates. A merge or an approved Studio system revision does not publish a WordPress update. Licensing controls access to signed updates and support; it must never stop an already-installed public site from rendering.

PhaseEnvironmentCentral Library enrollmentWhat happens
Local buildLocal URL; local or developmentNot enrolledIntake, content, design, repair, and local QA.
Client stagingTemporary HTTPS URL; stagingNot enrolled by defaultMigration checks, client review, revisions, and approval.
ProductionFinal client HTTPS URL; productionEnroll once, after URL migration and final QASigned stable updates and fleet history begin.

Move the approved build to staging

  1. Back up the local files and database, create the staging WordPress install, and set WP_ENVIRONMENT_TYPE=staging.
  2. Migrate with the host's normal tool, perform a serialized-data-safe URL replacement, then flush permalinks and caches.
  3. If the copied database was ever enrolled, run wp suds release scrub-clone --confirm on staging. This removes copied enrollment metadata without revoking the original site. Never use detach on a clone.
  4. Run compatibility and QA again; also test forms/email, mobile and desktop layouts, accessibility, analytics/consent, and the client's critical paths. Share the staging URL and record approval.

Publish the Engine separately, when needed

A new Engine version follows the complete signed-release process: merge the source revision, approve that exact system revision in Studio, prepare and register canary bytes, verify them on a controlled canary site, promote those exact bytes to stable, then publish and close the release run. Never rebuild different bytes under an existing version. Documentation-only corrections such as this guide use the lighter source PR → Studio bundle and matching catalog capture → revision approval path. They do not create a WordPress release, require offline signing, or update the fleet.

Launch and enroll only the final production identity

  1. Take fresh staging backups, migrate to the final host/domain, set the final HTTPS home/siteurl, and set WP_ENVIRONMENT_TYPE=production.
  2. Verify DNS/TLS, redirects, permalinks, caches, forms/email, analytics/consent, indexing, accessibility, responsive layout, backups, and administrator access. Run wp suds qa --no-color on the final URL.
  3. Create a short-lived, single-use enrollment code for this site, enroll it once from production, then verify wp suds release status --format=json and wp suds release check --format=json. Confirm the returned origin is the final production origin and the environment is production.
printf '%s' "$SUDS_ENROLLMENT_CODE" | wp suds release enroll --code=-
wp suds release status --format=json
wp suds release check --format=json
Clone and retirement rule: use scrub-clone on a copied database. Use wp suds release detach --confirm only when permanently retiring the actual production site from its matching enrolled URL.

Keep the detailed checklist open during migration and launch: Build locally → client staging → production licensing.

Everyday edits after the build

Three things never to do: (1) never edit the engine plugin's or parent theme's files; (2) never copy an old client theme to a new client — themes are generated; (3) never type facts into a site that the client didn't give you (claim-safety exists so you don't have to remember this — but don't fight it).

When something breaks

SymptomFirst move
A command refuses to runIt tells you which earlier step is missing — run that. The order is init → bootstrap → content → next/execute → qa.
Engine/framework version warningRun wp suds compatibility. Update the engine package first, then refresh its bundled workflow with wp suds install-framework --location=wp_content.
/services/ or /locations/ shows "not found"Run wp rewrite flush (routes need a refresh after theme/plugin activation).
Buttons/fonts look unstyledThe engine plugin probably isn't active, or the theme was activated after it. Theme first, then plugin, then flush.
A section vanishedIt self-gated: it lost the data or signal it needs (that's claim-safety working). Check its requirements in section-fields.md or the "Sections on this page" guide.
Anything elseRun /suds:qa — it usually names the problem — and check Mission Control for open blockers.

Where the deeper manuals live

DocRead it when…
DOCUMENTATION.mdyou don't know where something is written down (the master index).
Operator Manualyou want the whole-system view: repo layout, parity rules, Mission Control, the fleet.
Workflow Manualyou want every /suds:* stage explained in depth, with decision points.
Section Studio Runbookyou're polishing pages and want the visual tour + stress-test drills.
Archetypesyou're choosing/overriding the design personality.
Design-System Manualyou want to browse every section and token (searchable).
Build-to-launch runbookyou're moving an approved client build through staging, final launch, and production enrollment.