Landing page creation
Open-source AI front office for local service businesses: AI receptionist (voice/SMS/chat) + website + CRM + booking. Self-hostable or $29/mo flat. The open-source GoHighLevel alternative.
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
- 16 stars16 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
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).
SKILL.md
10.7 KB, 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.