---
name: web-designer
description: "Design and build a self-contained single-page website for any business and put it live on Cloudflare. Guided intake, brand extraction from an existing URL, a domain-neutral builder, social share tiles, and deploy with D1 form capture, gated access, and e-signing. Ships one command, /website, that runs the pipeline end-to-end. Any install can enable it directly; it is not bundle-gated, not tied to a business category, and adds no background specialist worker, no graph write, and no memory write. Its only host coupling is one credential resolver that reads the Cloudflare token from the account secrets file inside maxy-code or from CLOUDFLARE_API_TOKEN as a standalone plugin. Trigger phrases include design me a website, build a landing page for this business, put this site live on its own domain."
tools: []
skills:
  - skills/web-intake/SKILL.md
  - skills/brand-extract/SKILL.md
  - skills/web-design/SKILL.md
  - skills/socials/SKILL.md
always: false
embed: false
---

# web-designer

Designs and builds a website for any business and puts it live on Cloudflare. It is a normal platform plugin: a plain directory under `platform/plugins/` with this `PLUGIN.md`. Any install can enable it directly by listing it in `enabledPlugins`; it is not bundle-gated and not tied to any business category. It registers no background specialist worker; every skill runs in the admin/main session.

## The pipeline

Four skills, run in order or on their own:

1. **`web-intake`** — the single entry orchestrator. Asks the operator what the site is for and what visitors should do, then routes the answers through the rest of the pipeline. It is a routing playbook, not a dispatcher.
2. **`brand-extract`** — pulls a brand pack from an existing website URL: the palette tokens, the logo and icon as image files, and a `brand.md` of company facts with an explicit list of what is still unknown.
3. **`web-design`** — builds the self-contained single-page site tree from the brand pack, the operator's copy, and their photos, by substituting a domain-neutral template. Its structured-data type defaults to `LocalBusiness` and is operator-supplied; no business category is baked in.
4. **`socials`** — renders Open Graph, square, and portrait share tiles plus per-platform captions for the built site, and wires the site's `og:image`.

## Command entry point

The plugin ships one slash command, `/website` (`commands/website.md`), a thin
launcher over `web-intake` for the standalone and marketplace editions, where a
`/`-invokable entry is the idiomatic surface. It carries no account assumptions and
defers token and root resolution to `bin/resolve-cf.sh`, so the same command works
in every edition. Inside maxy-code the skill triggers remain the primary surface and
the command is an equivalent entry point.

## The resolver seam

The plugin's only host coupling is `bin/resolve-cf.sh`. It resolves two things and prints them so the rest of the plugin is blind to which edition it runs in, and it never prints a token value:

- **the Cloudflare token key name** — inside maxy-code it delegates to `cloudflare:cf-token.sh` and prints the account secrets key (`CF_PAGES_D1_TOKEN`); as a standalone plugin it prints `CLOUDFLARE_API_TOKEN` from the environment;
- **the site-tree root** that holds `pages/<project>/` — inside maxy-code the account directory, standalone the current directory or `$WEB_DESIGNER_SITE_ROOT`.

`resolve-cf.sh` is the only file that encodes where the token and root come from; every other file consumes its printed key name and root and carries no account-scoped path assumption. The marketplace edition is a repackage, not a fork: the same files ship, and the resolver auto-selects the token source from the environment.

## Cloudflare features: compose, do not reimplement

Going live and the richer Cloudflare features reuse existing, proven surfaces rather than reimplementing them. The deploy references in `skills/web-design/references/` name each dependency:

- **deploy + D1 forms** — inside maxy-code the canonical site tree is handed to `cloudflare:site-deploy` unchanged; standalone it follows the generic `wrangler pages deploy` sequence from the Cloudflare references. On a multi-tenant install a **client account** takes neither path: it is denied the `pages` scope (`reason=not-house`) and publishes with `storage-broker:storage-pages-deploy`, which deploys house-side against a project the house has recorded to it. Extra form "buckets" are extra D1 tables and Pages Functions on the same pattern.
- **gated access** — Cloudflare Access is composed from the Cloudflare Access references and the proven gating pattern; no new gating mechanics are authored here.
- **e-signing** — routed to the `business-assistant:e-sign` skill, which owns signature capture, D1 recording, PDF stamping, and dispatch. This is a host dependency, not shipped self-contained in the marketplace edition.

## What this plugin does not do

It reads no bundle gate, no business-category field, and no `brand.json` gating field. It touches no account graph and no memory store. It does not modify `cloudflare:site-deploy`, the Cloudflare token or DNS mechanics, `sitedesk:microsite`, or `business-assistant:e-sign` — those are dependencies used as-is.
