skills/landing-page-designer/SKILL.md
Senior landing page designer specializing in high-converting pages for SaaS, apps, and services. Use when building landing pages, hero sections, pricing pages, or any conversion-focused marketing page. Always researches current best practices via Perplexity before designing. Includes AI slop detection and cleaning.
npx skillsauth add jmsktm/claude-settings landing-page-designerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill transforms you into a senior landing page designer who combines conversion psychology, current industry research, and proven patterns to create high-converting landing pages.
Two Critical Rules:
AI slop is generic, interchangeable content that signals "a robot wrote this" to visitors. It kills conversion because it feels hollow, untrustworthy, and forgettable.
NEVER use these words/phrases in landing page copy:
revolutionize / revolutionary
cutting-edge / state-of-the-art / next-generation
seamless / frictionless / streamlined
leverage / harness / utilize
unlock / unleash / tap into
empower / enable
game-changing / paradigm shift / disruptive
unprecedented / unparalleled / unmatched
holistic approach / end-to-end platform
scalable solutions
innovative solutions / powerful solutions
tailored to your needs / customized solutions
drive growth / maximize efficiency / boost productivity
at the forefront of / at the heart of
in today's fast-paced world / digital landscape
navigate the complexities
transform your business
delve into / explore the possibilities
supercharge your workflow
robust platform
- "In today's [adjective] world/landscape, businesses must..."
- Three identical paragraph lengths in a row
- "Moreover," "Furthermore," "Additionally" every few sentences
- Vague claims with no numbers or specifics
- Copy that works for ANY product (logo-swap test fails)
When you catch slop, apply this transformation:
| AI Slop | Clean Replacement | |---------|-------------------| | "Revolutionize your workflow" | "Cut reporting time from 2 hours to 10 minutes" | | "Cutting-edge platform" | "Built on [specific tech] with [specific capability]" | | "Seamless integration" | "Connects to Slack in 2 clicks. No code." | | "Leverage AI to unlock insights" | "See which deals will close this quarter" | | "Empower your team" | "Your team ships 3x faster" | | "Scalable solution" | "Handles 10 users or 10,000. Same price." | | "In today's fast-paced world" | [DELETE ENTIRELY - start with the point] | | "Innovative approach" | [Show, don't tell - describe what's different] |
The Fix Formula:
SLOP: [Abstract verb] + [Buzzword noun]
CLEAN: [Specific number] + [Concrete outcome] + [Timeframe or context]
❌ Abstract dashboards floating in space
❌ 3D blobs/orbs with random charts
❌ Faceless "productivity" scenes with laptops
❌ Flat SaaS characters with round heads, pastel limbs
❌ Vector people high-fiving or launching rockets
❌ Blue-purple / pink-purple / cyan-indigo gradients everywhere
❌ Full-bleed gradient backgrounds with white cards
❌ Three identical feature cards with generic icons
❌ Perfectly symmetrical, emotionally cold layouts
❌ Stock photography that could be any company
Ask: "Could I swap in any other SaaS logo and this page still makes sense?"
| Design Slop | Clean Replacement | |-------------|-------------------| | Floating dashboard mockup | Real product UI, one focused screen | | Generic illustration characters | Your actual users/team photos, or no illustrations | | Blue-purple gradient hero | Solid brand color + subtle texture/noise | | Three identical feature cards | Information hierarchy with varied layouts | | Stock "team collaboration" photo | Real screenshot of the thing working | | Perfect 8px spacing everywhere | Intentional asymmetry, bold section intros | | Default Inter/Outfit/DM Sans | One distinctive display font choice | | Generic icon set | Custom icons or text-only (icons that mean nothing = slop) |
Before delivering ANY landing page, run this audit:
Copy Audit:
Design Audit:
The Ultimate Test: Read the page aloud. Does it sound like a human who's genuinely excited about THIS specific product? Or does it sound like a press release from any company?
Before starting any landing page, gather these essentials:
MANDATORY: Use mcp__perplexity__search or mcp__perplexity__reason to research:
Query Template:
"Best practices for [PRODUCT_TYPE] landing page conversion 2024-2025.
Hero section patterns, social proof placement, pricing layouts,
and CTA strategies with highest conversion for [TARGET_AUDIENCE]."
Additional queries:
After research:
HERO SECTION → Attention (5 seconds to hook)
PROBLEM/SOLUTION → Interest (they feel understood)
BENEFITS/FEATURES → Desire (they want the outcome)
SOCIAL PROOF → Trust (others succeeded)
CTA SECTIONS → Action (clear next step)
Goal: Hook in 5 seconds. Value prop + primary CTA.
interface HeroProps {
headline: string // Specific benefit, 6-10 words
subheadline: string // Who it's for + what they get
primaryCTA: string // Action verb + outcome
secondaryCTA?: string // Lower commitment option
socialProof?: string // Specific number: "10,847 teams"
heroVisual: 'product-screenshot' | 'demo-video' | 'result-visual'
}
export function Hero({ headline, subheadline, primaryCTA, secondaryCTA, socialProof }: HeroProps) {
return (
<section className="min-h-[90vh] flex items-center">
<div className="container mx-auto px-4 grid lg:grid-cols-2 gap-12 items-center">
<div className="max-w-xl">
{/* Headline - NO SLOP */}
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight">
{headline}
</h1>
{/* Subheadline - Specific audience + outcome */}
<p className="mt-6 text-xl text-gray-600 leading-relaxed">
{subheadline}
</p>
{/* CTA Group */}
<div className="mt-10 flex flex-col sm:flex-row gap-4">
<button className="px-8 py-4 bg-brand-600 text-white font-semibold rounded-lg hover:bg-brand-700 transition-colors text-lg">
{primaryCTA}
</button>
{secondaryCTA && (
<button className="px-8 py-4 border-2 border-gray-300 font-semibold rounded-lg hover:border-gray-400 transition-colors text-lg">
{secondaryCTA}
</button>
)}
</div>
{/* Social Proof - SPECIFIC numbers */}
{socialProof && (
<p className="mt-6 text-sm text-gray-500">
{socialProof}
</p>
)}
</div>
{/* Visual - REAL product, not abstract */}
<div className="relative">
{/* Product screenshot with subtle shadow, not floating 3D mockup */}
</div>
</div>
</section>
)
}
Headline Formulas (Slop-Free):
❌ "Revolutionize Your Workflow"
✅ "Close Deals 40% Faster"
❌ "The Cutting-Edge Platform for Modern Teams"
✅ "Notion + Slack + Docs in One Tab"
❌ "Unlock Your Business Potential"
✅ "Find Your Next 10 Customers This Week"
❌ "Seamless Integration for Growth"
✅ "Connects to Stripe in 2 Minutes. No Code."
export function LogoBar({ logos, metric }: {
logos: { name: string; src: string }[]
metric?: string // "Trusted by 2,847 companies" - SPECIFIC number
}) {
return (
<section className="py-12 border-y border-gray-100">
<div className="container mx-auto px-4">
{metric && (
<p className="text-center text-sm text-gray-500 mb-8">{metric}</p>
)}
<div className="flex flex-wrap justify-center items-center gap-8 md:gap-12">
{logos.map((logo) => (
<img
key={logo.name}
src={logo.src}
alt={logo.name}
className="h-8 opacity-70 grayscale hover:opacity-100 hover:grayscale-0 transition-all"
/>
))}
</div>
</div>
</section>
)
}
Goal: Make visitors feel understood. Be specific about THEIR pain.
// ❌ SLOP VERSION:
// "In today's fast-paced business environment, teams struggle with inefficiencies"
// ✅ CLEAN VERSION:
// "Your team wastes 6 hours/week switching between 12 different tools"
export function ProblemSection({ problems }: {
problems: { stat: string; pain: string; consequence: string }[]
}) {
return (
<section className="py-24 bg-gray-900 text-white">
<div className="container mx-auto px-4">
<h2 className="text-3xl md:text-4xl font-bold text-center">
Sound familiar?
</h2>
<div className="mt-16 grid md:grid-cols-3 gap-8">
{problems.map((problem, i) => (
<div key={i} className="text-center">
<div className="text-4xl font-bold text-red-400">
{problem.stat}
</div>
<h3 className="mt-4 text-xl font-semibold">{problem.pain}</h3>
<p className="mt-2 text-gray-400">{problem.consequence}</p>
</div>
))}
</div>
</div>
</section>
)
}
// ❌ Feature (boring): "Real-time collaboration"
// ✅ Benefit (compelling): "See your teammate's cursor. Ship together, not separately."
export function BenefitsSection({ benefits }: {
benefits: {
before: string // The old way (pain)
after: string // The new way (outcome)
proof: string // Specific result
visual: string // Real screenshot
}[]
}) {
return (
<section className="py-24">
<div className="container mx-auto px-4">
<div className="space-y-24">
{benefits.map((benefit, i) => (
<div key={i} className="grid lg:grid-cols-2 gap-12 items-center">
<div className={i % 2 === 1 ? 'lg:order-2' : ''}>
<div className="text-sm font-medium text-gray-500 uppercase tracking-wide">
Before: {benefit.before}
</div>
<h3 className="mt-2 text-2xl font-bold">
Now: {benefit.after}
</h3>
<p className="mt-4 text-lg text-gray-600">
{benefit.proof}
</p>
</div>
<div className={i % 2 === 1 ? 'lg:order-1' : ''}>
<img src={benefit.visual} alt="" className="rounded-xl shadow-lg" />
</div>
</div>
))}
</div>
</div>
</section>
)
}
// ❌ SLOP: "Great product! Really helped our team."
// ✅ CLEAN: "We closed $847K in Q3 directly from leads Acme surfaced. ROI was 47x."
interface Testimonial {
quote: string // Specific outcome with numbers
metric?: string // "47x ROI" / "+340% leads"
author: string
role: string
company: string
avatar: string // REAL photo, not stock
}
export function TestimonialsSection({ testimonials }: { testimonials: Testimonial[] }) {
return (
<section className="py-24 bg-gray-50">
<div className="container mx-auto px-4">
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{testimonials.map((t, i) => (
<div key={i} className="bg-white p-8 rounded-xl shadow-sm">
{t.metric && (
<div className="text-3xl font-bold text-green-600 mb-4">
{t.metric}
</div>
)}
<blockquote className="text-gray-700 leading-relaxed">
"{t.quote}"
</blockquote>
<div className="mt-6 flex items-center gap-4">
<img src={t.avatar} alt={t.author} className="w-12 h-12 rounded-full" />
<div>
<div className="font-semibold">{t.author}</div>
<div className="text-sm text-gray-500">{t.role}, {t.company}</div>
</div>
</div>
</div>
))}
</div>
</div>
</section>
)
}
interface PricingTier {
name: string
price: string
period: string
description: string // WHO this is for, specifically
features: string[] // What they GET, not vague capabilities
cta: string
highlighted?: boolean
}
export function PricingSection({ tiers }: { tiers: PricingTier[] }) {
return (
<section className="py-24">
<div className="container mx-auto px-4">
<div className="text-center">
<h2 className="text-3xl md:text-4xl font-bold">
Simple pricing. No surprises.
</h2>
{/* ❌ SLOP: "Flexible plans tailored to your needs" */}
{/* ✅ CLEAN: Specific guarantee */}
<p className="mt-4 text-xl text-gray-600">
Cancel anytime. No questions asked.
</p>
</div>
<div className="mt-16 grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
{tiers.map((tier, i) => (
<div
key={i}
className={`bg-white rounded-2xl p-8 ${
tier.highlighted ? 'ring-2 ring-brand-600 shadow-xl' : 'shadow-sm border'
}`}
>
<h3 className="text-xl font-semibold">{tier.name}</h3>
<p className="mt-2 text-gray-600">{tier.description}</p>
<div className="mt-6">
<span className="text-4xl font-bold">{tier.price}</span>
<span className="text-gray-500">/{tier.period}</span>
</div>
<ul className="mt-8 space-y-3">
{tier.features.map((feature, j) => (
<li key={j} className="flex items-start gap-3">
<svg className="w-5 h-5 text-green-500 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
</svg>
<span>{feature}</span>
</li>
))}
</ul>
<button className={`mt-8 w-full py-3 rounded-lg font-semibold transition-colors ${
tier.highlighted
? 'bg-brand-600 text-white hover:bg-brand-700'
: 'bg-gray-100 text-gray-900 hover:bg-gray-200'
}`}>
{tier.cta}
</button>
</div>
))}
</div>
</div>
</section>
)
}
// FAQ answers should handle REAL objections, not softballs
// ❌ SLOP Q: "What makes your platform unique?"
// ✅ REAL Q: "What if I've already tried 3 other tools and they all failed?"
export function FAQSection({ faqs }: { faqs: { question: string; answer: string }[] }) {
const [openIndex, setOpenIndex] = useState<number | null>(0)
return (
<section className="py-24">
<div className="container mx-auto px-4 max-w-3xl">
<h2 className="text-3xl font-bold text-center">
Questions? Answers.
</h2>
<div className="mt-12 space-y-4">
{faqs.map((faq, i) => (
<div key={i} className="border rounded-lg overflow-hidden">
<button
onClick={() => setOpenIndex(openIndex === i ? null : i)}
className="w-full px-6 py-4 flex items-center justify-between text-left font-medium"
>
{faq.question}
<ChevronDown className={`w-5 h-5 transition-transform ${openIndex === i ? 'rotate-180' : ''}`} />
</button>
{openIndex === i && (
<div className="px-6 pb-4 text-gray-600">{faq.answer}</div>
)}
</div>
))}
</div>
</div>
</section>
)
}
export function FinalCTA({
headline,
subheadline,
cta,
guarantee
}: {
headline: string // Restate the core promise
subheadline: string // Handle final objection
cta: string // Same as primary CTA
guarantee?: string // Risk reversal
}) {
return (
<section className="py-24 bg-brand-600 text-white">
<div className="container mx-auto px-4 text-center">
<h2 className="text-3xl md:text-4xl font-bold">{headline}</h2>
<p className="mt-4 text-xl opacity-90 max-w-2xl mx-auto">{subheadline}</p>
<button className="mt-10 px-8 py-4 bg-white text-brand-600 font-semibold rounded-lg hover:bg-gray-100 transition-colors text-lg">
{cta}
</button>
{guarantee && (
<p className="mt-6 text-sm opacity-75">{guarantee}</p>
)}
</div>
</section>
)
}
Invoke this skill when:
Remember:
data-ai
Optimize YouTube videos for SEO, thumbnails, descriptions, and audience retention
testing
Design and facilitate effective workshops with agendas, activities, and outcomes
data-ai
Design and optimize AI-powered workflows for complex tasks
data-ai
Design and implement automated workflows to eliminate repetitive tasks and streamline processes