# Soulcraft — agent reference > Full ground truth for building on this venue: the section/item model, every block the composer can place, the stations the kit enables, and the machine doors. Generated from the live registries — never hand-maintained. ## Venue - Name: Soulcraft - Slug: `soulcraft` - Origin: https://soulcraft.com - Kit: `marketing-site` - Enabled features: analytics, apps, blog, cms, customerAccounts, documents, notifications, subscriptions, support, website ## Pages - `workshop` — Workshop (published, in nav) → https://soulcraft.com/workshop - `venue` — Venue (published, in nav) → https://soulcraft.com/venue - `platform` — Platform (published, in nav) → https://soulcraft.com/platform - `product` — Pricing (published, in nav) → https://soulcraft.com/product - `team` — Team (published, in nav) → https://soulcraft.com/team - `promise` — Promise (published, in nav) → https://soulcraft.com/promise - `blog` — Notes (published, in nav) → https://soulcraft.com/blog ## The page model A page is a manifest (`slug`, `label`, `navOrder`, `showInNav`, `published`, `seo`, `sections[]`) plus one WDOC body per editorial section. Each section has a `key` (unique within the page), a `type` (`editorial` or `dynamic`), and a `layout` — one of the block keys below. Array layouts read `items[]`; each item is a SectionItem. Section-level fields (beyond `key`/`type`/`layout`): - `title` — Display heading rendered above or within the section. - `subtitle` — Small-caps kicker/eyebrow line above the heading (read by chapter, hero, text-only, card-grid, doors, team). - `imageUrl` — Section image — hero background or the text-image picture pane. - `imageFocal` — Normalized [x, y] focal point (0-1) for imageUrl. - `items` — Repeatable item list for array layouts; each entry is a SectionItem (see the block's itemFields). - `source` — Dynamic sections only: which live data source fills the block. - `limit` — Data-bound sections only: maximum number of entities to render. - `glyph` — chapter only: emoji or symbol rendered under the chapter name. - `mark` — hero + chapter: a named platform mark — 'brainy' (hero: the crest beside the text; chapter: beside the name). - `goldLine` — chapter only: italic gold pull-line closing the chapter. - `proofs` — chapter only: quiet proof lines after the gold line — each a string or { text, links: [{ label, href }] }. - `dataCard` — chapter only: hairline data card { title, lines[] } rendered after the proofs. - `formName` — contact-form only: the Inbox tag for submissions (threads read " FORM"); defaults to "Website". - `submitLabel` — contact-form only: submit-button label; defaults to "Send". - `successMessage` — contact-form only: confirmation message shown after a successful submission. - `mapMode` — text-image only: 'static' (default — the imageUrl photo) or 'live' (a self-hosted map snapshot centered on the venue's address, paired with a get-directions link that opens the visitor's maps app — a static image, not a pannable embed). - `mapQuery` — text-image live map only: override of what the map shows (place name, address, or search phrase); absent = the venue's own address. - `roomSlug` — community realtime layouts only (live-room, chat-channel, on-air-banner, watch-together, live-transcript): the Hall room/channel slug this block binds to within the tenant's namespace; absent = the section's own key. Blocks sharing one room declare the same roomSlug. - `calculator` — comparison-calculator only: the complete calculator payload — checklist groups/rows with prices, the Roundtable sizes + advisor seats, rates, phrase templates, and every visible sentence (see ComparisonCalculatorData in comparison-calculator.ts). Every string on the block is authored here. Item fields (`items[]` entries): - `title` — Item heading. - `body` — Short HTML/text body. - `imageUrl` — Image URL — use managed media-item URLs (/media/...). - `focal` — Normalized [x, y] focal point (0-1) for imageUrl; keeps the subject framed at any crop. - `icon` — Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'. - `meta` — Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'. - `href` — Link target for the item. - `tags` — Short badge strings rendered as hairline chips (team layout). ## Block catalog ### Bring people together #### Live Room (`live-room`) A video room living inside the page — members join right where they are, mic and camera off until they say so. - Also answers to: video call, meeting, conference, zoom, video room - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `roomSlug` #### Chat Channel (`chat-channel`) A persistent conversation with history — the community's kitchen table, always live. - Also answers to: chat, messages, conversation - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `roomSlug` #### Presence Strip (`presence-strip`) A quiet ribbon of who's around right now — the site starts feeling like a place. - Also answers to: who is here, online now, active members - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). #### Community Calendar (`community-calendar`) Everything coming up in one warm list — each row is a real bookable experience; RSVP is the booking. - Also answers to: events, meetups, schedule, upcoming - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) - Data source `experiences`: fills itself — from your Experiences #### Member Directory (`member-directory`) The faces of the community — opt-in member cards, consent-first: members choose exactly what shows. - Also answers to: members, community faces, profiles - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) - Data source `members`: fills itself — from your opted-in Members #### Sessions Gallery (`sessions-gallery`) The moments that keep — recorded classes and events as a browsable library. - Also answers to: recordings, replays, video library, past sessions - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `href` (Link target for the item.) #### On-Air Banner (`on-air-banner`) When a room goes live, the whole site knows — a gentle banner appears, one tap and they are in. - Also answers to: live now, going live, live banner - Item fields: `title` (Item heading.) · `href` (Link target for the item.) - Section-level fields: `roomSlug` #### Discussion Threads (`discussion-threads`) Slow conversation for things worth keeping — async, searchable, and calm. - Also answers to: forum, discussions, topics, board - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `body` (Short HTML/text body.) - Data source `community-threads`: fills itself — from your community discussions #### Member Resources (`member-resources`) The people behind your community, and what they've shared with it — approved links and guides, plus a card for signed-in members to add their own. - Also answers to: resources, links, guides, shared files, circle, ambassador - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `href` (Link target for the item.) - Data source `member-resources`: fills itself — from resources your members share #### Watch Together (`watch-together`) One-to-many, beautifully — a class or event streams to any number of watchers with live chat beside it. - Also answers to: livestream, broadcast, stream, watch party - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `roomSlug` #### Live Transcript (`live-transcript`) The room writes itself down as it happens — accessibility for every live moment. - Also answers to: captions, subtitles, notes, transcription - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `roomSlug` ### Tell your story #### Hero (`hero`) Big welcome banner — a headline, short blurb, button, and optional background photo. - Also answers to: mark, banner, header, welcome, splash - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `subtitle`, `imageUrl`, `imageFocal` #### Text (`text-only`) A simple block of formatted text — a paragraph or two. - Also answers to: paragraph, writing, copy - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `subtitle` #### Text + Image (`text-image`) A paragraph beside a photo, side by side. - Also answers to: photo and text, side by side - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `imageUrl`, `imageFocal`, `mapMode`, `mapQuery` #### Gallery (`gallery`) A clean grid of photos. - Also answers to: photos, pictures, images - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) #### Storyboard (`storyboard`) Numbered steps that walk visitors through a process — a photo (or an emoji) per step. Great for “how it works”. - Also answers to: steps, how it works, process - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) #### Zigzag (`zigzag`) Alternating image-and-text rows flowing down the page. - Also answers to: alternating, feature rows - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) #### Bento (`bento`) A mosaic of mixed-size tiles. - Also answers to: mosaic, tiles - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) #### Polaroids (`polaroids`) Playful, slightly-tilted photo cards. - Also answers to: photos, snapshots - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) #### Statement (`statement`) A centered display-type claim band. Body paragraphs render as big statement lines; bold text wears the accent color; an italic paragraph becomes the quiet fine-print line. - Also answers to: hero claim, big line, manifesto, headline band - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `hero claim`, `big line`, `manifesto`, `headline band` #### Video (`video`) An embedded video with a play button. - Also answers to: youtube, embed, movie - Item fields: `href` (Link target for the item.) · `imageUrl` (Image URL — use managed media-item URLs (/media/...).) #### Chapter (`chapter`) A full-width story chapter — a small kicker, an oversized name, a lede paragraph, hairline feature rows, and an italic gold closing line. - Also answers to: story section, long read - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) - Section-level fields: `subtitle`, `glyph`, `mark`, `goldLine`, `proofs`, `dataCard` #### Moments (`moments`) Two to four short italic vignettes — what it feels like, each a quiet centered line with room to breathe. - Also answers to: vignettes, feelings - Item fields: `body` (Short HTML/text body.) ### Show what you offer #### Card Grid (`card-grid`) A grid of cards — features, experiences, or anything you list. - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) · `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) - Data source `experiences`: fills itself — from your Experiences - Section-level fields: `subtitle` #### Do-the-math calculator (`comparison-calculator`) An interactive cost calculator — visitors tap the tools they pay for today, drag a sales slider, and watch both all-in totals move live. - Also answers to: calculator, pricing calculator, savings, compare, comparison, stack, do the math, switching, cost of tools - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Section-level fields: `calculator` #### Price Cards (`price-cards`) A one-row sheet of pricing cards — small-caps label, the price large, a short note; one card can be highlighted. - Also answers to: pricing sheet, price list, plans, tiers - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `body` (Short HTML/text body.) - Section-level fields: `pricing sheet`, `price list`, `plans`, `tiers` #### Featured Rail (`featured-rail`) A horizontal scroll of featured cards. - Also answers to: carousel, slider, scroller - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) - Data source `experiences`: fills itself — from your Experiences #### Pricing (`pricing`) Your experiences shown as pricing cards. - Also answers to: prices, cost, tiers, packages - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `body` (Short HTML/text body.) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `href` (Link target for the item.) - Data source `experiences`: fills itself — from your Experiences #### Product Grid (`product-grid`) Shop products with images and prices. - Also answers to: shop, store, merchandise - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) - Data source `products`: fills itself — from your Shop #### Entity Spotlight (`entity-detail`) A spotlight on one experience or item, in detail. - Also answers to: spotlight, feature one - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `title` (Item heading.) · `body` (Short HTML/text body.) · `href` (Link target for the item.) - Data source `experiences`: fills itself — from your Experiences ### Build trust #### Stats (`stats`) A row of big headline numbers. - Also answers to: numbers, metrics, counters - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) #### Logo Strip (`logo-strip`) A row of partner or press logos. - Also answers to: partners, press, brands - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `title` (Item heading.) · `href` (Link target for the item.) #### Team (`team`) A grid of people with photos and roles. - Also answers to: staff, people, about us - Item fields: `imageUrl` (Image URL — use managed media-item URLs (/media/...).) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `body` (Short HTML/text body.) · `href` (Link target for the item.) - Section-level fields: `subtitle` #### Timeline (`timeline`) A dated journey of a subject's history — milestones, updates, and photos. - Also answers to: history, journey, milestones - Item fields: `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `title` (Item heading.) · `body` (Short HTML/text body.) - Data source `subject`: fills itself — from the subject you pick #### Legal Document (`legal-document`) Your current liability waiver text, live from the Documents station — never a copy that can go stale. - Also answers to: waiver, terms, policy - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). - Data source `legal-document`: always current — live from your Documents ### Hear from visitors #### FAQ (`faq-accordion`) Expandable question-and-answer list. - Also answers to: questions, answers, help - Items: none — a single-body layout (`title`/`body`/`imageUrl` on the section itself). #### Quote (`quote`) A pulled quote or single testimonial. - Also answers to: testimonial, pull quote - Item fields: `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `imageUrl` (Image URL — use managed media-item URLs (/media/...).) #### Reviews (`reviews`) Recent customer reviews with star ratings. - Also answers to: testimonials, stars, ratings - Item fields: `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) - Data source `reviews`: fills itself — from your Reviews #### Form (`contact-form`) A form you compose field by field — every submission opens a tagged thread in your Inbox. - Also answers to: form, contact, email us, message - Item fields: `title` (Item heading.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) - Section-level fields: `formName`, `submitLabel`, `successMessage` ### Wayfinding #### Call to Action (`cta`) A focused band with a headline and one button. - Also answers to: button, call to action, signup - Item fields: `title` (Item heading.) · `href` (Link target for the item.) #### Connect Your AI (`connect-card`) A calm card that connects a visitor's AI to your platform — alone, or as a two-door fork beside your sign-up button. - Also answers to: connect, ai, claude, agent, two-door, get-started-fork - Item fields: `title` (Item heading.) · `href` (Link target for the item.) #### Announcement (`announcement`) A slim attention bar with a short message and link. - Also answers to: banner, notice, alert - Item fields: `title` (Item heading.) · `href` (Link target for the item.) #### Location (`location`) Your address and hours with nearby highlights. - Also answers to: map, address, hours, directions - Item fields: `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `title` (Item heading.) · `body` (Short HTML/text body.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `href` (Link target for the item.) - Data source `nearby`: fills itself — nearby places around you #### Doors (`doors`) Hairline rows that each open a destination — a glyph, a small kicker, a serif line, a description, and a trailing arrow. - Also answers to: links, navigation, menu of pages - Item fields: `icon` (Emoji or glyph. The contact-form block repurposes this as the field's input type: 'text' | 'email' | 'phone' | 'textarea'.) · `meta` (Small label — duration, price, kicker. The contact-form block repurposes this as the field's requiredness: 'required' | 'optional'.) · `title` (Item heading.) · `body` (Short HTML/text body.) · `href` (Link target for the item.) - Section-level fields: `subtitle` #### Invite (`invite`) A plain closing invitation — one big centered line, a button or two, and a quiet footnote. No card, no border; the calm end of a story page. - Also answers to: closing, footer invite, sign-off - Item fields: `title` (Item heading.) · `body` (Short HTML/text body.) · `href` (Link target for the item.) ## Manage stations - Today (`/manage/dashboard`) - Pulse (`/manage/pulse`) - Messages (`/manage/inbox`) - Media Rooms (`/manage/rooms`) - The Roundtable (`/manage/round-table`) - Team (`/manage/staff`) - Pages (`/manage/content`) — requires the `cms` feature - Customers (`/manage/customers`) - Promotions (`/manage/marketing`) - Community (`/manage/community`) - Reviews (`/manage/reviews`) - Google (`/manage/google`) - Brand & Theme (`/manage/brand`) - Media (`/manage/media`) - The Street (`/manage/street`) - Reports (`/manage/reports`) - Cameras (`/manage/cameras`) - Payments & Billing (`/manage/payments`) - Memberships (`/manage/memberships`) — requires the `subscriptions` feature - Invoices & Quotes (`/manage/invoices`) - Settings (`/manage/settings`) - Sidebar (`/manage/navigation`) - Activity Log (`/manage/audit`) - News & Support (`/manage/the-loop`) - Integrations (`/manage/webhooks`) - Apps (`/manage/app-console`) - Domains (`/manage/domains`) ## Agent doors - [Full agent reference](https://soulcraft.com/llms-full.txt): every block's fields, the section model, and the door contracts in one file. - `GET https://soulcraft.com/api/agent/catalog`: this catalog as JSON (blocks, shelves, stations, pages, features). Auth: `x-service-secret` header, or a staff session holding the content.edit capability. - `GET/POST https://soulcraft.com/api/pages/ingest`: read and write complete CMS pages (manifest + section bodies). Auth: `x-service-secret`. - `POST https://soulcraft.com/api/docs/ingest`: push Markdown docs, served under /docs/{slug}. Auth: `x-service-secret`. - `POST https://soulcraft.com/api/upload`: upload images through the managed media pipeline. Auth: `x-service-secret` (or staff credentials). ### Pages ingest (`/api/pages/ingest`) `POST` upserts a full page: `{ slug, label, navOrder, showInNav, published, seo?, sections: [{ key, type, layout, ... }], bodies: { [sectionKey]: wdocDocument } }`. Batch with `{ pages: [...] }` (max 20, deletes `{ delete: true, slug }` mix freely). `GET ?slug={slug}` returns `{ manifest, bodies }` in exactly the POST shape for read-modify-write. Re-pushing a slug is idempotent; bodies write first, the manifest last. ### Docs ingest (`/api/docs/ingest`) `POST` with `{ slug, title, markdown, nav?: { order, section } }` (batch `{ docs: [...] }`, max 50) converts Markdown to a CMS page at `/docs/{slug}`. Slugs may nest (`guides/quick-start`). ### Agent catalog (`/api/agent/catalog`) `GET` returns this reference as JSON: `{ tenant, features, shelves, blocks, itemFieldMeanings, sectionFields, stations, pages }`. Read it before every editing session.