← WixCONTENT HISTORY

Update to Wix

Snapshot Oct 8, 2026 · 12:02 UTC · version 9.0.0

Collection source: downloaded plugin package.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Build a Wix Headless site fast by wiring SHIPPED, verified @wix/sdk code instead of authoring the integration from recipes. Each Wix business vertical ships a typed, framework-agnostic React core (data layer returning plain DTOs, hooks, headless components) plus an Astro overlay (SSR pages with owner-editable SEO pre-wired) and a build-time REST seed script — the agent scaffolds via the Wix CLI, deploys the shipped code, seeds the backend, designs the presentation layer itself on the shipped hooks (product card/grid, PDP, home, theme), and releases to Wix hosting. Works on Wix-managed Astro (ambient auth, the default) and on any React-based project (Vite, non-Astro) over the public OAuth client id. Verticals: stores/storefront (products, categories, variants, cart, hosted checkout), bookings (services, appointment/class time slots, staff, booking form, checkout-or-place), rentals (rooms, vehicles, gear by the hour or the day: resources, customer-picked length, priced quote, checkout), blog (posts, categories/tags, rich content), cms (structured content collections), forms (schema-driven visitor forms: render, validate, submit), events (listing, RSVP, ticket sales), members (login, gated pages, account), portfolio (project collections, media galleries), pricing-plans (plan grid, hosted purchase), restaurants (menus, online ordering, table reservations), faq (categorized questions and answers, search, a link per question), donations (campaign pages, goal progress, one-time and recurring donations via hosted checkout). Triggers: build me a store/blog/booking/rental/event/restaurant/portfolio/FAQ/donation site fast, take appointments fast, rent out rooms/cars/equipment headless, sell tickets or membership plans headless, collect donations headless, wix headless kit, connect a Wix business app with ready-made SDK code.",
  "included_files": [
    {
      "relative_path": "guides/api-run.md",
      "size_in_bytes": 7976
    },
    {
      "relative_path": "guides/capabilities.md",
      "size_in_bytes": 10864
    },
    {
      "relative_path": "guides/existing-site.md",
      "size_in_bytes": 5852
    },
    {
      "relative_path": "guides/feedback.md",
      "size_in_bytes": 5735
    },
    {
      "relative_path": "guides/migration.md",
      "size_in_bytes": 4276
    },
    {
      "relative_path": "guides/reference-mode.md",
      "size_in_bytes": 8979
    },
    {
      "relative_path": "install/AGENTS.md",
      "size_in_bytes": 2667
    },
    {
      "relative_path": "install/agents-md.mjs",
      "size_in_bytes": 3080
    },
    {
      "relative_path": "install/attach.mjs",
      "size_in_bytes": 26200
    },
    {
      "relative_path": "install/bootstrap.mjs",
      "size_in_bytes": 6452
    },
    {
      "relative_path": "install/check.mjs",
      "size_in_bytes": 5193
    },
    {
      "relative_path": "install/context.mjs",
      "size_in_bytes": 10854
    },
    {
      "relative_path": "install/deploy.mjs",
      "size_in_bytes": 27075
    },
    {
      "relative_path": "install/lock.mjs",
      "size_in_bytes": 2418
    },
    {
      "relative_path": "install/pins.json",
      "size_in_bytes": 128
    },
    {
      "relative_path": "install/setup.mjs",
      "size_in_bytes": 23076
    },
    {
      "relative_path": "install/templates.mjs",
      "size_in_bytes": 10429
    }
  ],
  "name": "wix-headless-kit",
  "skill_md_contents": "---\nname: wix-headless-kit\ndescription: \"Build a Wix Headless site fast by wiring SHIPPED, verified @wix/sdk code instead of authoring the integration from recipes. Each Wix business vertical ships a typed, framework-agnostic React core (data layer returning plain DTOs, hooks, headless components) plus an Astro overlay (SSR pages with owner-editable SEO pre-wired) and a build-time REST seed script — the agent scaffolds via the Wix CLI, deploys the shipped code, seeds the backend, designs the presentation layer itself on the shipped hooks (product card/grid, PDP, home, theme), and releases to Wix hosting. Works on Wix-managed Astro (ambient auth, the default) and on any React-based project (Vite, non-Astro) over the public OAuth client id. Verticals: stores/storefront (products, categories, variants, cart, hosted checkout), bookings (services, appointment/class time slots, staff, booking form, checkout-or-place), rentals (rooms, vehicles, gear by the hour or the day: resources, customer-picked length, priced quote, checkout), blog (posts, categories/tags, rich content), cms (structured content collections), forms (schema-driven visitor forms: render, validate, submit), events (listing, RSVP, ticket sales), members (login, gated pages, account), portfolio (project collections, media galleries), pricing-plans (plan grid, hosted purchase), restaurants (menus, online ordering, table reservations), faq (categorized questions and answers, search, a link per question), donations (campaign pages, goal progress, one-time and recurring donations via hosted checkout). Triggers: build me a store/blog/booking/rental/event/restaurant/portfolio/FAQ/donation site fast, take appointments fast, rent out rooms/cars/equipment headless, sell tickets or membership plans headless, collect donations headless, wix headless kit, connect a Wix business app with ready-made SDK code.\"\n---\n\n# Wix Headless Kit\n\nBuild a Wix Headless site on **shipped, verified code instead of authoring the integration**.\nEach vertical ships the integration itself — a typed data layer, hooks, components, pages, and a\nseed script that are already correct. On a stack that runs it (Wix-managed Astro, any React\nproject) the code is **deployed** and the agent's job narrows to brand, layout, copy, and wiring.\nOn a stack that can't run it (a static site with no bundler, a server-rendered app in another\nlanguage) the same code is the **reference**: its REST twin deploys for the browser side, and the\nrules it encodes are what the agent ports. Either way the decisions live in the code; don't\nre-litigate them.\n\n**Scope.** Tuned for Wix-managed Astro, and each vertical ships *one* shape of its solution. Use\nit as-is when the brief doesn't contradict it. When the brief asks for something that shape\ndoesn't express — or once the site exists and the work turns to managing or extending it — that's\n`wix-docs` and `wix-manage`, not a workaround here.\n\n## The model\n\n- **Shipped code is the implementation.** Every vertical ships in the repository's\n  `wix-headless-templates` skill (`skills/wix-headless-templates/<vertical>/`), not in this skill's\n  folder. `node <SKILL_ROOT>/install/templates.mjs` prints where that skill is: the sibling folder\n  `<SKILL_ROOT>/../wix-headless-templates/` when the install carried both skills (the cold start\n  does), else a one-time fetch into `<SKILL_ROOT>/templates/` (a second); every script below\n  resolves it the same way. **Every `templates/...` path in this document is relative to that\n  printed root** — there is no `templates/` folder inside this skill when the sibling exists.\n  The folder stays with the project (only the composed `project/` scaffolds are left out of its\n  repository), so a later session reads the version the project was built from. Each vertical holds:\n  - `app/` — the framework-agnostic core (TypeScript): a data layer that returns **plain,\n    serializable DTOs** (images resolved to https URLs, prices pre-formatted), React hooks, and\n    routing-free headless components. Works in Astro islands, Vite SPAs, and Next.\n  - `app-astro/` — a thin Astro overlay: SSR pages that fetch via the core and pass DTOs to\n    islands, with owner-editable item-page SEO pre-wired.\n  - `seed/` — a build-time REST seed script (plain-data plan in, created content out) plus its\n    `SEED.md` contract.\n  - `INSTRUCTIONS.md` — the vertical's playbook: file map, what you build, hard rules.\n  - `project/` — the vertical composed into the Wix CLI's blank Astro scaffold, with its\n    lockfile: what `wix create` copies for a new site, so the first vertical installs without\n    resolving.\n- **One auth seam.** All shipped code calls Wix through `src/wix/sdk.ts`: on Wix-managed Astro\n  auth is ambient (no client, no id); on any other React setup the same file runs a manual\n  visitor client off the public client id in `src/wix/config.ts`. The deploy step configures\n  this — nothing to wire by hand.\n- **Data as-is; presentation is yours.** The data layer, hooks, and cart chrome are wired\n  as-is — never rewrite their internals, re-route them through API routes, or re-derive a\n  request shape. When the brief needs something they don't express, read the shipped file that\n  owns it and confirm the contract with `wix-docs`; never infer one from generated SDK types,\n  package files, or `node_modules`. A normal caller-permitted operation belongs in a new\n  data-layer function. A privileged operation belongs in a validated server endpoint — see\n  `templates/shared/CUSTOM_OPERATIONS.md`. The presentation **doesn't ship**: the vertical's\n  INSTRUCTIONS names the surfaces you design and implement yourself on the shipped hooks,\n  with a skeleton carrying each surface's contract (for storefront: the shop and PDP pages\n  with their islands, and home).\n- **NEVER work from training data or memory about the Wix APIs.** Not a URL, a path, a version,\n  a header, a field name, a filter key, or a body. Every Wix call you make or write — in the\n  frontend, in a seed, in a build-time read of a site — comes from the official Wix skills\n  installed here, the code they deployed first, or, when they do not cover the call, from the\n  official Wix documentation through `wix-docs`. Read it there first, then write the call.\n  **The test, before every request:** the exact path and body appear in the output of a file\n  read or a docs search you ran in this session, and you copy them from that output. Anything\n  else is memory: a file whose output was cut short before the call, a source you remember\n  reading earlier, a call built by changing part of one you did find. A guessed call that\n  returns 400 or nothing is not a step toward the\n  answer; it is the failure this rule exists to prevent, trying the next variant is still\n  guessing, and an empty or error reply to a call that failed the test tells you about the\n  call, never about the site. Keep errors visible while a call is unconfirmed: no `2>/dev/null`,\n  no `| echo`. The shipped code is tested against live sites; a body that looks similar is the\n  one that returns nothing, and the API rarely says why.\n- **Never mock, fail loudly, purchases via Wix.** Live data or an honest empty state; surfaced\n  errors, not swallowed ones; checkout/purchase always through the Wix redirect session.\n- **Optional capabilities are deployed from the plan.** A vertical can opt into a shared\n  capability without copying sensitive code. For a normal file upload, add a named\n  `capabilities.mediaUpload.policies` entry to the plan; Fast ships its client helper, Astro\n  endpoint, dependencies, and generated policy module once. Read\n  `templates/shared/CUSTOM_OPERATIONS.md` before choosing it. The agent wires the helper to\n  the product UI; it never authors or widens the endpoint. For a site-wide search (a header box\n  with suggestions, a `/search?q=` page over the deployed verticals' products, services, posts\n  and events), add a `capabilities.siteSearch` entry; Fast ships its data layer, stores, hooks,\n  components and search page once. Enabling it means the Wix Site Search app is installed on the\n  site by the seed step (`install: true`; the capability's `seed/install.mjs`, run after the\n  content seed) — the index fills within about half a minute of the install. Playbook:\n  `templates/shared/capabilities/site-search/INSTRUCTIONS.md`.\n\n## The run\n\nNeeded throughout: Node ≥ 22.12 (Astro 7; the Wix CLI alone runs on 20.11), git, a logged-in Wix CLI (`npx @wix/cli@latest whoami`;\n`npx @wix/cli@latest login` is a device-code flow: surface the URL and code to the user, never\nread tokens into context), and the two companion skills installed beside this one, `wix-docs`\nand `wix-manage`. `node <SKILL_ROOT>/install/bootstrap.mjs` checks the CLI and runs the login\nwhen there is none; the cold-start page, `https://www.wix.com/skills/headless-cold-start/headless-kit.md`,\ngets a machine with none of this, the skills included, to that point. In a folder that\nalready holds a `wix.config.json`, `node <SKILL_ROOT>/install/context.mjs` first: it runs\n`wix env pull` when `.env.local` is missing and prints the folder's **shape** (`folder.shape`, the\ncases of step 3, with the `next` for each) and the two identities a project has — the deploy site\n(the config, where `wix release` goes) and the content site (the env, whose app the SDK client runs\nas and whose dashboard manages the business). They are one site, except on a **migration preview**\n(`guides/migration.md`), where the env names the site being migrated. Every script here reads that\ncontext; the site a call targets is never guessed from the config alone. Then fetch the shipped\ncode once: `node <SKILL_ROOT>/install/templates.mjs`. It prints the folder;\nthe `templates/…` paths below are relative to `<SKILL_ROOT>`, where it lands.\n`node <SKILL_ROOT>/install/check.mjs` says whether the skill or its templates have a newer version\nand prints the update commands; it changes nothing.\n\nThroughout any run: if the user asks to send feedback to Wix, complains or gets frustrated, or the\nrun hits friction of any kind: anything that cost more turns than it should have, whether or not\nit ended in an error (a confusing error, a doc gap, a seed that had to be re-run, a shipped file\nthat did not cover the brief, a playbook line you had to read the source to understand, a call you\nhad to work out by trial, a workaround you had to invent, a slow or flaky step, a platform gate),\noffer to relay it to Wix per `<SKILL_ROOT>/guides/feedback.md`. Default to offering rather than waiting to be asked; send\nonly after an explicit yes, never automatically. Step 5 ends with the same self-check.\n\n1. **Resolve the stack.** Default is **Wix-managed Astro** — take it unless the user names\n   another framework or the directory already holds one. Then, by what the shipped code can run\n   there:\n   - **React** (Vite, Next, …) runs everything shipped — data layer, hooks, components:\n     `--stack react`. The agent's own files may be JS; the shipped files are TypeScript and\n     build untouched inside a JS project — never strip them by hand; if the brief wants no\n     TypeScript anywhere, say the shipped code cannot meet that and ask before going on.\n     A named framework is scaffolded with its own command\n     first (`npm create vite@latest`, …), then step 3 runs in that folder.\n   - **Another bundled JS framework** (Vue, Svelte, Solid, plain Vite): the data layer and the\n     framework-free stores run (`src/wix/` has no React in it), the React hooks and components\n     don't apply: `--stack lib`. The agent binds the stores and writes its framework's components\n     against the same contracts.\n   - **No bundler, or another language** — a static site (plain HTML/CSS/JS), a server-rendered\n     app (Flask, Laravel, Rails, …): **reference mode** (its section below, and\n     `<SKILL_ROOT>/guides/reference-mode.md`). Nothing from `app/` deploys; the REST layer\n     deploys for the browser side, and the server side ports it for its reads.\n\n   **What Wix hosting takes, and what each stack needs to be released there.** `wix release`\n   uploads the folder named in `wix.config.json` (`site.outputDirectory`) and serves it as\n   files — no SPA fallback, no directory index, no rewrites: `/` and real files resolve, a clean\n   client-side route answers 404 when loaded directly or shared. Server code runs only as a\n   Cloudflare Workers build, declared as `outputDirectory: { client, server }`.\n   - **Managed Astro** is the stack the Wix CLI scaffolds: the Wix Astro integration\n     (`@wix/astro`, ambient auth), the hosting adapter (`@wix/astro-wix-hosting-adapter`, the\n     Workers build), `@astrojs/react` with React 18 for the shipped components, and in\n     `astro.config.mjs` `integrations: [wix(), react()]`, `adapter: wixHostingAdapter()`,\n     `output: \"server\"`, `security: { checkOrigin: false }`, `image.domains` with\n     `static.wixstatic.com`. An Astro project made without the CLI has none of that; add it\n     before deploying, and the site serves every route. The integration supports **Astro 5**: a\n     project on another major is pinned to 5 first, or connected as a React host.\n   - **React and other bundlers** release their own build as files. So routes are hash routes,\n     or one emitted HTML file per route linked by its file name — decided before the first route\n     is written; any URL handed to Wix as a return target must be one the host serves. Verify by\n     loading a deep URL directly, not by navigating from `/`.\n   - **A framework whose build is a server** (Next, Nuxt, Remix, SvelteKit, …) releases only as a\n     static export (files, the rule above applies), or as a Workers build through\n     `outputDirectory: { client, server }`; otherwise it is self-hosted, with its domain added to\n     the OAuth app's allowed domains before checkout can return to it.\n   - **Static** (no build): `outputDirectory` points at the folder the pages live in; a route is a\n     page plus a query-string slug (reference mode).\n2. **The seed plan.** The brief decides what is seeded; a site this run makes always opens with content:\n\n   | the brief | the plan |\n   |---|---|\n   | supplies the content in any form: a CSV, JSON or spreadsheet, a list in the prompt, a PDF price list, a folder of photos and a text file, a link to their current catalog, anything that names the content | that IS the plan: map it into `plan.json` per `templates/shared/SUPPLIED-CONTENT.md` and the vertical's `SEED.md` (\"Supplied content\"), every entry, names and prices verbatim, their images and no others |\n   | describes the content without listing it (\"a store for hand-poured candles, four of them\", \"a dozen FAQ questions in three groups\") | draft a plan from the description per the vertical's `SEED.md` (read only that for this; save `INSTRUCTIONS.md` for step 4) |\n   | says nothing about content (\"build me a store\") | on a site made for this run (create, adopt, config-only) draft a plan per the vertical's `SEED.md` so the site opens with content — demo content the agent decides on, without being asked — and say in the closing message that it is placeholder content and where the owner edits it. On a site that existed before the run: seed nothing; its content is its own |\n\n   **An existing site has no plan of its own**: when the brief names a site by its id, or the\n   folder's config does, the site holds the content already; the frontend reads what is there\n   (step 3's attach path), and only content the brief supplies or describes is added to it.\n3. **Set up the project, in its folder** — one deterministic call, the same for an empty folder\n   and for a project already on disk; **the folder decides** what it does, from five file facts:\n   `wix.config.json`, its `site.outputDirectory`, the migration variables in `.env.local`,\n   `package.json`, `index.html`. `node <SKILL_ROOT>/install/context.mjs` prints the shape it reads\n   and the `next` for it. **The brief is the instruction**: what it asks to switch on is installed\n   on the site the folder names, without asking again. Ask only when acting would create a second\n   site for a folder that already has one, or when a cleanup seems needed.\n\n   ```bash\n   node <SKILL_ROOT>/install/setup.mjs --vertical <vertical>[,<vertical>…] [--plan plan.json] [--business-name \"<Brand>\"] [--stack <stack>]\n   ```\n\n   Name every vertical the brief needs in this one call (a store with member accounts is\n   `storefront,members`): the first one's template scaffolds the project; the others deploy in the\n   same call, so the one install covers them all. A vertical added after the install has started\n   costs a second install.\n\n   | the folder holds | shape | what setup does | seeded by setup |\n   |---|---|---|---|\n   | nothing, or loose files (a CSV, a brief) | **empty** → create | `wix create` with the vertical's composed template, here; `--business-name` names the site | **yes**, from `--plan` |\n   | a frontend, no config (a `package.json`, or `index.html` at the root: someone's Astro, Vite, Next, plain HTML) | **project** → adopt | `init` in place gives it a new, empty site, then deploys; `--stack` from step 1 is required; make the project what that stack needs on Wix hosting (step 1) before or right after | **yes**, from `--plan` |\n   | a config whose `.env.local` declares an active editor migration (`EDITOR_MIGRATION_STATUS=ACTIVE`), with or without the blank Astro starter the download carries | **migration** → migrate | the shipped code into the starter (or the composed template around a bare config), deployed with the migrated site's app as the client, the install starts; `ready_for_brand_layer` says `mode: \"migrate\"`, the parent as `siteId`, the child as `deploySiteId` (`guides/migration.md`) | no, ever |\n   | a config, no frontend | **config-only** → refuses | the site exists and has no frontend yet: `attach.mjs` (below) takes the site from the config, reuses its hosting, scaffolds and deploys. That config is what `init` leaves behind, and `init` always creates a site: this site was made for this run and is empty | **yes**: draft the plan as for create, then `attach.mjs --plan` |\n   | a config and a frontend (a `package.json`, or `index.html` inside the folder `site.outputDirectory` names) | **wix-project** → refuses | iterate: never scaffold, `init` or reseed. `deploy.mjs <vertical…> --stack <stack>` adds a solution (the client id comes from `.env.local`, the config as the fallback), then ONE `npm install`; a change is file edits; then release | no |\n   | a config, `index.html` at the root, no `package.json` (a site published through the drop flow and downloaded) | **published-static** | the config's site, no `init`: `site/` becomes the upload, the REST layer deploys into `site/js/wix/`; the `next` says to move the pages, styles and assets in; release keeps the URL | no |\n\n   **Who decides the seed: where the site came from, never the brief's wording.** A site made\n   for this run is empty by construction, so it is always seeded — with the brief's content when\n   it supplies or describes any, otherwise with demo content the agent drafts per the vertical's\n   `SEED.md`, without being asked, so the site opens with something to see. Made for this run\n   means: setup created it (create, adopt), or the folder held only a `wix.config.json` and no\n   frontend (config-only — the config is what `init` leaves behind, and `init` always creates a\n   site; attach reports `siteOrigin: \"init\"`). A site that existed before the run — named by its\n   id in the brief or by `--site`, a project linked to it, a migration's parent (attach reports\n   `siteOrigin: \"given\"`) — holds content the run did not make: seed only what the brief\n   **supplies or asks to add** (`attach.mjs --plan plan.json`, or the vertical's seed module from\n   the project root: `node <SKILL_ROOT>/templates/<vertical>/seed/seed-<vertical>.mjs plan.json`),\n   and never invent content for it. \"A new storefront for my toy store\" describes the business,\n   not content to add: nothing is seeded. Read an existing site first either way\n   (`seed/read-site.mjs`). Seeds are additive and idempotent by name; nothing on a site is ever\n   deleted or overwritten, and the result's `preexisting[]` names what was already there.\n\n   - The brief names a site by id → not this call: read `<SKILL_ROOT>/guides/existing-site.md`\n     and follow it (read the site, then `attach.mjs`, which does what setup does against the\n     site given and seeds only with `--plan`, which that guide says to pass only for content the\n     brief supplies or asks to add; self-hosting and a project already on disk are in there too).\n\n   `--vertical` is required and picks which shipped code deploys AND which seed runs. The\n   `ready_for_brand_layer` event says `mode` (`create`, `adopt`, `migrate`, `published-static`),\n   `shape`, the stack, and the `next` for that stack, including how it releases.\n\n   setup scaffolds with `--skip-git`: it composes its own steps and leaves version control to\n   you / the enclosing repo, so it does **not** create the scaffold's usual git repo + initial\n   commit (which would otherwise become a nested-repo gitlink if the project lands inside a repo).\n\n   The project is created **in the current directory** — the folder the entry had you work from,\n   which already holds the installed skills — so the project is self-contained and a later session\n   opened in it finds everything. It refuses if the folder already holds a file the scaffold would\n   write. `--subfolder` creates it in a new folder named after the business instead, for a current\n   folder that must stay as it is; the skills then sit one level above the project.\n\n   It emits one JSON event per line and returns in **~35s**: **scaffolds** the project from the\n   vertical's composed template (`wix create` copies it: the code and its lockfile arrive with\n   the scaffold), **deploys** whatever the folder still lacks (patching `package.json` with every\n   dependency the code imports), then **starts two detached background jobs** — the dependency install (`npm ci --ignore-scripts || npm install --ignore-scripts`)\n   and the **seed** — whose logs and completion markers are in the events. The final\n   `ready_for_brand_layer` event carries the project dir, siteId, ready-made dashboard links,\n   and both markers. Relay notable events. On an `error` event, recover just that step via the\n   manual path below, then continue.\n\n   **Recovering one step, or adding a solution later:** the pieces run on their own from the\n   project root — `node <SKILL_ROOT>/install/deploy.mjs <vertical…> --stack <stack>` (the client\n   id is read from `wix.config.json`), ONE `npm ci --ignore-scripts || npm install\n   --ignore-scripts` (**never a second npm install concurrently**: two npms in one\n   `node_modules` race and redo each other's work; setup already started one — wait on its\n   marker), the vertical's seed module per its `seed/SEED.md`.\n   A code change on an existing project is done when it is **released** (step 5) and the live\n   URL shows it — not when a dev server or a local build shows it. A management change (a\n   recipe against the site) needs no release; the frontend reads it live.\n\n4. **Design and build the presentation while the install finishes** — in the project dir from\n   the `ready_for_brand_layer` event, per the vertical's `INSTRUCTIONS.md`: set the `@theme`\n   tokens, brand the chrome, and implement the vertical's creative surfaces yourself on the\n   shipped hooks (for storefront: your product card + grid, shop surface, PDP surface, and the\n   home page) — designed to fit the brief, not copied from the reference components. Read the\n   INSTRUCTIONS and the shared floors — `templates/shared/DESIGN.md` +\n   `templates/shared/CONTENT.md` — now (not earlier — their contracts matter only from this\n   step on); the hook/DTO\n   contracts are inlined there, so don't open the shipped files themselves.\n   If the brief needs a core operation that shipped code does not cover, read\n   `templates/shared/CUSTOM_OPERATIONS.md` before writing it. Use one documented path and\n   implement it; do not reverse-engineer SDK internals.\n5. **When both background jobs have completed** — the install's marker\n   (`node_modules/.package-lock.json`) and the seed's (`.seed-exit`) both exist — **verify the\n   seed succeeded** (`.seed-exit` contains `0`; `seed-result.json` has the created counts for\n   your summary — if non-zero, read `seed.log` and re-run the seed module manually). Those two\n   seed files exist **only when setup started the seed** (attach runs none: only the install\n   marker is waited on). When you ran `seed-store.mjs`\n   yourself (adopt, iterate and published-static runs, reference mode), there is no marker to wait for: the process's\n   exit code is the result and its stdout is the JSON — wait on the process (a foreground run,\n   or `wait` on its pid), not on a file. Then\n   **build & release once** (managed), as the `next` of the `ready_for_brand_layer` event says\n   for the stack: Astro → `npx @wix/cli@latest build` then `npx @wix/cli@latest release`;\n   React or another bundler → the project's own build, then `npx @wix/cli@latest release` of\n   the build folder named in `wix.config.json` (deep URLs must answer 200 directly, step 1);\n   static → `release` alone. If the install failed, run it once more and then build. Don't\n   build+release mid-flow; backend content is fetched at\n   runtime, so a re-release never \"refreshes\" seeded data. The run is complete only when the\n   site is released — close with the live URL and the dashboard link\n   `https://manage.wix.com/dashboard/<siteId>` (the `siteId` of the `ready_for_brand_layer`\n   event: on a migration preview that is the migrated site's dashboard, the release URL is the\n   preview's, the original site is unchanged, and completing the migration is the user's next\n   step in the Wix CLI once they approve — say all three). When the site takes money through\n   hosted checkout (a cart, a paid booking or rental, tickets, plans, donations) and nothing says\n   payments are already set up, say what a visitor meets at checkout until they are — \"We\n   can't accept online payments. Contact us for help with your order.\" — and hand the two links\n   that fix it: **Accept payments** `https://manage.wix.com/dashboard/<siteId>/wix-cashier/payments`\n   (connect a payment method; \"manual payments\" is enough for free and pay-in-person flows) and\n   **Upgrade the plan** `https://www.wix.com/upgrade/website?metaSiteId=<siteId>` (online payments\n   need a premium plan). Both are the owner's steps, not a defect in the site. When the run started\n   from the owner's own pages, name what those pages promised that the released site does not do.\n   **Copy the live URL verbatim from the\n   `wix release` output — never retype it from memory** (a mistyped subdomain hands the user\n   a 404). Before you sign off, run the feedback self-check over the whole session\n   (`guides/feedback.md`): anything that cost more turns than it should have, including what you\n   recovered from silently, is signal; if anything qualifies, offer to relay it as you deliver the\n   links, and send only after an explicit yes.\n\n## Reference mode — a static site, or a server-rendered app in another language\n\nThe shipped data layer exists a second time as a **REST layer** over `fetch`, for the stacks that\ncannot run `app/`: a static site with no bundler, or a server-rendered app in another language\n(Flask, Laravel, Rails). The REST layer deploys for the browser side; the server side ports its\nreads. When step 1 resolves to one of these stacks, read `<SKILL_ROOT>/guides/reference-mode.md`\nbefore step 3: it holds the mechanics (the `site/` layout and setup's part in it, what runs in the\nbrowser versus the server, the OAuth allow-list for a self-hosted origin, pre-rendered output) and\nhow to close such a run. A public site is still better served by managed Astro; say so when you\nclose.\n\nWithout a machine at all, or when the install, the CLI or the login is blocked where you are,\nread `<SKILL_ROOT>/guides/api-run.md`: the same run, step by step, as the Wix API calls the\nscripts make and the files beside this skill that carry the contracts.\n\n## Verticals\n\nThe shortlist. Match the brief against the first column; when it names a Wix product or a\nfeature not here, when two rows could fit, or when the request sounds like something this skill\ndoes not ship (meetings, gift cards, loyalty, groups), read\n`<SKILL_ROOT>/guides/capabilities.md`: every Wix product, what it covers, which vertical here\nships it and what is not shipped.\n\n| The user wants…                                                                              | Vertical          | Playbook                                   |\n| -------------------------------------------------------------------------------------------- | ----------------- | ------------------------------------------ |\n| Online store: products, categories, variants, cart, checkout                                 | **storefront**    | `templates/storefront/INSTRUCTIONS.md`    |\n| Appointments/classes: services, time slots, staff, booking, checkout                         | **bookings**      | `templates/bookings/INSTRUCTIONS.md`      |\n| Rentals: rooms, vehicles, gear rented by the hour or the day, customer-picked length, checkout | **rentals**       | `templates/rentals/INSTRUCTIONS.md`       |\n| Blog: post feed, categories/tags, rich-content post pages                                    | **blog**          | `templates/blog/INSTRUCTIONS.md`          |\n| Structured content collections (directory, recipes, listings) with pages designed per schema | **cms**           | `templates/cms/INSTRUCTIONS.md`           |\n| Any visitor-fillable form: contact/enquiry, signup, application, survey — rendered from the live schema | **forms**         | `templates/forms/INSTRUCTIONS.md`         |\n| Events: listing, event pages, free RSVP, ticket sales via hosted checkout                    | **events**        | `templates/events/INSTRUCTIONS.md`        |\n| Member accounts: custom in-app login/sign-up, gated pages, account page                      | **members**       | `templates/members/INSTRUCTIONS.md`       |\n| Portfolio/showcase: collections of projects, project pages with media galleries              | **portfolio**     | `templates/portfolio/INSTRUCTIONS.md`     |\n| Membership/subscription plans: pricing page, plan detail, hosted purchase                    | **pricing-plans** | `templates/pricing-plans/INSTRUCTIONS.md` |\n| Restaurant: menu with photos, online ordering, table reservations                            | **restaurants**   | `templates/restaurants/INSTRUCTIONS.md`   |\n| FAQ: questions grouped by category, search, expandable answers, a link per question         | **faq**           | `templates/faq/INSTRUCTIONS.md`           |\n| Donations: campaign pages, goal progress, one-time and recurring giving via hosted checkout   | **donations**     | `templates/donations/INSTRUCTIONS.md`     |\n\nVerticals compose: a brief that spans several (a restaurant with a blog, a store with member\naccounts) names them all in the setup call (`--vertical restaurants,blog`), so one install covers\nthem; each vertical's seed runs with its own plan. On a project already built,\n`node <SKILL_ROOT>/install/deploy.mjs <vertical…>` from the project root adds one, then one\n`npm install`, then its seed. A request that matches no shipped vertical has no shipped\ncode: say so in one line, then build it from the Wix API reference through `wix-docs` (search,\nthen the method page), with the same rule as every other call, on the same project and stack,\nstarting from the closest shipped vertical when one exists (`guides/capabilities.md` says which).\n"
}

SHA-256 of public snapshot: da4820b253144b9402224a8867cae0a4666d86461c8fafcb5fca2829fd52cfd2