Landing page creation
Build a SeldonFrame workspace's marketing landing page using the existing block primitives (get_block_skill + persist_block). Use when the operator asks to "build a landing page", "make a website", "design the home page", "redo the landing", or similar. Triggers AFTER workspace has been created via create_workspace_from_url (which by default creates only a chatbot- preview demo page — this skill replaces it with a marketing landing page).From its SKILL.md
npx -y skills add seldonframe/seldonframe --skill landing-page-creationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- runs commandsInstructs the agent to run 6 commands, including `get_workspace_state(workspace_id)` and 5 more.
SKILL.md
10.7 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Landing-page creation
You are building a marketing landing page for a SeldonFrame workspace.
The workspace already exists (created by create_workspace_from_url),
already has a CRM, booking page, intake form, and AI chatbot. Today its
public surface is a chatbot-only preview page. The operator has asked
you to replace that with a full marketing landing.
Mental model
SeldonFrame's pitch is "ops stack first, marketing optional." The operator already has the ops stack live. A landing page is opt-in — some clients have great existing sites and only need the chatbot+CRM bolted on; others have outdated sites and want SF to render a new one.
When you build a landing page, the operator is in the second bucket. Your job is to produce a page that's better than what their client currently has — premium, niche-specific, archetype-correct.
Process
Step 1 — Understand the workspace
Call get_workspace_state(workspace_id) to load:
- The soul (business name, vertical, services, voice, certifications, reviews, emergency-service flag, same-day flag, business description)
- The classified
aesthetic_archetype(one of 7: bold-urgency, clinical-trust, cinematic-aspirational, editorial-warm, technical-restrained, soft-residential, brutalist) - The theme (palette, fonts) — already archetype-correct from v1.40
- Active integrations (so you don't reference an API the workspace doesn't have configured yet — e.g. don't promise SMS booking confirmations in copy if Twilio isn't connected)
If aesthetic_archetype is null (pre-v1.54 workspace), pick one
yourself from the vertical + business description, then proceed.
Step 2 — Optionally consult external design skills
If the user has installed claude-code/frontend-design/SKILL.md (the
Anthropic frontend-design plugin), read it for Tailwind / Framer Motion
patterns and component composition guidance. It pairs with this skill:
frontend-design gives you the HOW (components, motion, layout); this
skill gives you the WHAT (which SF blocks, what order, what voice).
If google-labs-code/design.md is available, optionally invoke it for
design-language generation. It produces a design.md you can fold into
the block prompts as additional constraints.
Step 3 — Decide the block sequence
Pick from available blocks. The default sequence for most service businesses:
hero— primary headline + CTA + supporting visualservicesGrid— what they do (cards, pricing optional)- (optional)
projectGallery— visual proof of work - (optional)
testimonials— social proof faq— top objections answered- (optional)
emergencyStrip— only for bold-urgency archetypes cta— closing call-to-action
Per-archetype adjustments
| archetype | adjustments |
|---|---|
bold-urgency | add emergencyStrip after hero; skip testimonials if reviews < 50; add stickyMobileCTA for one-thumb booking |
clinical-trust | add benefits block listing credentials; lengthen faq with insurance/financing questions; consider process block |
cinematic-aspirational | lead with projectGallery immediately after hero; soften faq to "what to expect" tone |
editorial-warm | longer whoitsfor / process blocks; more whitespace; skip emergencyStrip |
technical-restrained | structured features block with bullet metrics; precise pricing; skip stickyMobileCTA |
soft-residential | warm benefits block; visible serviceArea (zip codes covered); friendly cta |
brutalist | minimal block count (hero + servicesGrid + cta); raw layouts, no soft easing |
Step 4 — Generate and persist each block
For each block in the sequence:
a. Call get_block_skill(block_name) — returns the block's SKILL.md
with its prop schema, voice rules, validators, and worked examples.
b. Generate props following the SKILL.md AND the archetype voice
(leanInto / avoid lists from the archetype registry — accessed
via the v1.54 theme.aestheticArchetype value).
c. Call persist_block(workspace_id, block_name, prompt, props) —
v1.54's server enforcement WILL override your template and
variant fields if they don't match the archetype's defaults. This
is intentional — trust the server-side enforcement. Don't second-
guess archetype defaults.
d. Note validator warnings in the response. If a validator flagged
headline_quantified, no_throat_clearing, or similar, FIX YOUR
PROPS AND CALL persist_block AGAIN. Don't ship past validators —
they catch the patterns operators have explicitly told us look bad.
Step 5 — Verify and report
After all blocks land:
a. Call get_workspace_snapshot(workspace_id) to confirm the landing
page rendered (landing_pages.sections now has hero / services /
etc instead of the original chatbot-preview).
b. Report the public URL back to the operator with a brief summary of what you placed and which archetype voice you used.
c. Offer concrete next steps:
- "Want a different hero photo? Tell me what to search for."
- "Want a softer voice? I can rerun in editorial-warm."
- "Want to add a testimonials block? Share the testimonials."
- "Want to publish the chatbot to LIVE now that the page exists? Just say so."
Anti-patterns — DO NOT DO
- Don't skip
get_workspace_state. You need the archetype, soul, and theme. Guessing wastes round-trips when the server overrides your picks anyway. - Don't write throat-clearing copy. "Welcome to" / "Your trusted" / "Professional X services" are banned per every block's validator.
- Don't propose templates outside the registry. Templates are
cinematic-aura | viktor-light | velorah-editorial | nexora-light | securify-bold | stellar-tabs-white. Picking anything else gets overridden server-side. Bold-urgency archetypes intentionally use empty template (the legacy variant renderer). - Don't generate Unsplash queries longer than 4 words. Long queries zero-result. The server has archetype-curated fallbacks but those defeat your intent. Stick to 2-4 word queries.
- Don't add features the workspace can't support. If
integrations.twilio.configuredis false, don't promise SMS in copy. If Stripe isn't connected, don't say "pay deposit online." - Don't reorder blocks across persist calls. Each
persist_blockcall REPLACES that block type — order is determined at first persist. If you change your mind on order, callupdate_landing_contentwith the full new sequence.
Worked example — bold-urgency (HVAC plumbing)
Operator: "build a landing page for ignitify in bold-urgency style"
-
get_workspace_state(ws-1)→ archetype: bold-urgency, vertical: hvac, business_name: Ignitify Cooling, services: [AC Repair, AC Install, Furnace Repair, Maintenance], reviews: 13, emergency_service: true -
Block sequence: hero → emergencyStrip → servicesGrid → faq → cta (skip testimonials since reviews < 50; add emergencyStrip per bold-urgency rule; add stickyMobileCTA)
-
get_block_skill("hero")→ load voice rules (Hormozi-style, quantified, urgent), prop schema (headline / subhead / ctaPrimary / background_image_query / variant / template) -
Generate hero props:
{ "headline": "Same-Day AC & Furnace Repair Across El Paso", "subhead": "Ignitify Cooling — BBB-accredited, SuperPros 2024 Gold technicians who fix it right the first time. Honest pricing, financing available.", "ctaPrimary": { "label": "Get Service Today", "href": "/book" }, "ctaSecondary": { "label": "Free Estimate", "href": "/intake" }, "background_image_query": "hvac technician outdoor", "variant": "split-screen-50-50" }(Server will override variant to "split-screen-50-50" anyway since archetype is bold-urgency — your pick happens to match.)
-
persist_block(ws-1, "hero", "...", props)→ returns ok + no warnings → continue to emergencyStrip -
Repeat steps 3-5 for each subsequent block.
-
get_workspace_snapshot(ws-1)→ confirm 5 sections rendered. -
Report:
Landing page is live at https://ignitify-cooling.app.seldonframe.com. Rendered in bold-urgency voice with 5 sections: hero, emergency strip, services grid, FAQ, closing CTA. Hero uses split-screen-50-50 layout with service-truck imagery. Want to tweak anything?
Worked example — clinical-trust (dental practice)
Skip emergencyStrip. Lead with credentials in the hero subhead. Use
nexora-light template (archetype default). Lengthen FAQ with insurance
- financing + "do you accept Medicare" type questions.
[Full prop JSON for each block omitted for brevity — follow the same pattern as the bold-urgency example with the clinical-trust voice: calm, authoritative, precise.]
Worked example — cinematic-aspirational (medspa)
Lead with projectGallery immediately after hero. Hero uses
cinematic-aura template (archetype default) with a Pexels video
background. Soften FAQ to "what to expect" / "is it painful" tone.
[Full prop JSON for each block omitted for brevity — follow the same pattern with the cinematic-aspirational voice: sensory, restorative, intentional.]
Integration notes
- v1.54 archetype enforcement still fires. Don't worry about picking the exact right template — the server overrides if you're off. Just match your COPY to the archetype voice.
- Brain v2: before generating, optionally call
list_brain_patterns(workspace_id)to see what's worked for similar verticals. If brain patterns exist for "vertical=plumbing" (e.g., "service-truck hero photos performed best"), fold them into your block generation. - Validator gates are real. If
persist_blockreturns warnings, fix props and call again. Don't ship past validators.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most design frontend skills give in ~2.4k tokens
Counted across 1,179 of the 2,086 authors here whose files we hold, read 2026-09-06
- Commit to a bold aesthetic directionin 31 of 1179, across 24 files
- Prefer component composition over inheritancein 28 of 1179, across 14 files
- Animate only transform and opacity propertiesin 27 of 1179, across 22 files
- Memoize expensive computations with useMemoin 26 of 1179, across 13 files
- Use semantic HTML elementsin 24 of 1179, across 23 files
- Virtualize long lists for performancein 21 of 1179, across 10 files
- Use CSS variables for design tokensin 20 of 1179, across 14 files
- Implement loading, empty, and error statesin 20 of 1179
- Lazy load heavy components with Suspensein 19 of 1179, across 8 files
- Respect prefers-reduced-motion media queriesin 18 of 1179, across 10 files
- Prioritize CSS-only animations for HTMLin 18 of 1179, across 16 files
- Use compound components for related UI elementsin 18 of 1179, across 7 files
Said here and by no other author read
- Call get_workspace_state to load workspace details
- Pick an aesthetic archetype if none is defined
- Consult frontend-design skill for component guidance
- Select block sequence based on business archetype
- Call get_block_skill for each block in sequence
- Generate props following archetype voice rules
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.