Loading...
Loading...
Use when designing or redesigning a landing page with waitlist for an app launch. Auto-detects brand identity from the project, adapts sections by app type (SaaS, mobile, dev tool), and outputs a complete design spec with copy framework. Works with any AI coding tool.
npx skill4agent add 2002bishwajeet/app-launch-page app-launch-pagemockup.pngandroid.pngPOST /api/waitlist{ "email": "user@example.com" }/api/waitlistcolorstypographyspacingassets/static/public/web/static/package.jsonpubspec.yamlCargo.tomlpyproject.tomlsetup.pyApp Name: [detected]
Tagline: [detected or "needs input"]
App Icon: [path to highest quality PNG/SVG — will be used in header + footer]
Primary Color: [hex + human-readable name, e.g. #9B1B30 "wine"]
Color Palette: [full palette with shade scale if available]
Typography: [heading font + body font, e.g. "Lora (headings) + Open Sans (body)"]
Design Tokens: [radius, shadows, spacing scale — whatever exists]
App Type: [SaaS | Mobile App | Desktop App | Dev Tool | API/Platform]
Target Audience: [detected or "needs input"]
Key Features: [top 3-5 from docs/code]
Tone: [derived from existing copy — professional, playful, technical, warm, minimal]
Platforms: [iOS | Android | Both | Web | Desktop]theme.darttailwind.configpreconnectdisplay=swapdesign-patterns.md| Signal | App Type |
|---|---|
| Mobile App |
| SaaS |
| Dev Tool / Desktop |
| API/Platform |
Electron, Tauri, SwiftUI | Desktop App |
| Multiple signals present | Ask user to clarify primary |
| User provided | Mockup used |
|---|---|
| iOS screenshots only | |
| Android screenshots only | |
| Both iOS + Android | Both frames — hero uses primary platform, features alternate |
IntersectionObserver| Need | Use |
|---|---|
| Scroll reveals (fade-in, slide-up), hover effects, transitions | CSS transitions + IntersectionObserver — zero dependencies, best Lighthouse score |
| Complex orchestration the user explicitly requests (parallax, scrub, staggered timelines, text splitting) | GSAP + ScrollTrigger — |
| Spring physics, layout animations (React only) | Framer Motion — only if the user asks for it |
transition@keyframesIntersectionObserver/* Scroll reveal base */
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.7s ease-out, transform 0.7s ease-out;
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* Respect reduced motion */
@media (prefers-reduced-motion: reduce) {
.reveal { opacity: 1; transform: none; transition: none; }
}// IntersectionObserver for scroll triggers
const observer = new IntersectionObserver(
(entries) => entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add('visible');
observer.unobserve(e.target);
}
}),
{ threshold: 0.15 }
);
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));letter-spacingonce: trueprefers-reduced-motiongsap.context(callback, scope)ctx.revert()gsap.registerPlugin(ScrollTrigger)transformopacitywidthheighttopleftwill-change: transform, opacityonce: truedesign-patterns.mdh-fullbg-gray-100bg-white/5aria-hidden="true"mockup.pngFrame: 1022 × 2082 px
Screen area: left 52px, top 46px, width 918px, height 1990px
Border radius: 126px on both axes
MK_W = 1022; MK_H = 2082;
SC_L = (52 / MK_W) * 100; // screen left %
SC_T = (46 / MK_H) * 100; // screen top %
SC_W = (918 / MK_W) * 100; // screen width %
SC_H = (1990/ MK_H) * 100; // screen height %
SC_RX = (126 / 918) * 100; // border-radius x %
SC_RY = (126 / 1990) * 100; // border-radius y %android-mockup.pngFrame: 978 × 2100 px
Screen area: left 33px, top 49px, width 902px, height 2002px
Border radius: 40px on both axes
AMK_W = 978; AMK_H = 2100;
ASC_L = (33 / AMK_W) * 100; // screen left %
ASC_T = (49 / AMK_H) * 100; // screen top %
ASC_W = (902 / AMK_W) * 100; // screen width %
ASC_H = (2002/ AMK_H) * 100; // screen height %
ASC_RX= (40 / 902) * 100; // border-radius x %
ASC_RY= (40 / 2002) * 100; // border-radius y %<div style="position: relative; aspect-ratio: {FRAME_W}/{FRAME_H};">
<!-- Device frame -->
<img src="/mockup.png" alt="" style="display: block; width: 100%; height: 100%;" />
<!-- Screenshot overlay -->
<div style="
position: absolute; z-index: 10; overflow: hidden;
left: {SC_L}%; top: {SC_T}%; width: {SC_W}%; height: {SC_H}%;
border-radius: {SC_RX}% / {SC_RY}%;
">
<img src="{screenshot}" alt="{description}" style="display: block; width: 100%; height: 100%; object-fit: fill;" />
</div>
</div>object-fit: fillcoverIntersectionObserverletter-spacingprefers-reduced-motionwill-changedesign-patterns.mdanimate-*## [Section Name]
### Overline (optional)
[category label, e.g. "PRODUCTIVITY" or "HOW IT WORKS"]
### Headline
[draft headline]
### Subheadline
[draft subheadline — if applicable]
### Body
[draft body copy — if applicable]
### CTA
Primary: [button text]
Secondary: [link text — if applicable]
Microcopy: [text below button — if applicable]
### Visual Notes
[what visual/screenshot/mockup appears alongside this copy]
[specify: mockup.png (iOS) or android.png (Android) with which screenshot]design-patterns.md/api/waitlistPOST /api/waitlist
Body: { "email": "user@example.com" }
200: { "position": 42, "message": "You're on the list!" }
409: { "message": "You're already on the list!" }
400: { "message": "Please enter a valid email" }docs/specs/landing-page-spec.md# [App Name] — Landing Page Design Specification
> Auto-generated from project brand identity on [date].
> Review and adjust before implementation.
## 1. Brand Profile
[from Phase 2 — the confirmed brand profile]
## 2. Pages
[list of pages from Phase 1 question 4, with brief purpose]
- Home (landing page) — this spec
- Privacy Policy — legal requirement
- Terms of Service — legal requirement
- [other pages selected by user]
## 3. Page Structure
[ordered section list from Phase 3, with brief purpose for each]
## 4. Visual Direction
### Layout
[spacing, grid, content width]
### Color Map
[primary, backgrounds, text hierarchy, contrast sections]
### Typography
[heading/body specs with exact sizes, weights, line-heights]
### Components
[buttons, cards, inputs, badges — with exact specs]
### Device Mockups
[which mockup frames, how screenshots map to them]
- iOS: mockup.png frame + [list of screenshots and where they appear]
- Android: android.png frame + [list of screenshots and where they appear]
### Motion
[CSS-only or Framer Motion — with specific animation specs]
### Responsive
[breakpoints, reflow behavior]
## 5. Section-by-Section Content
### 5.1 Hero
[copy + visual notes + mockup assignment]
### 5.2 [Next Section]
[copy + visual notes]
... [one subsection per selected section]
## 6. Waitlist Component (or Download CTA)
[full spec from Phase 6]
## 7. Implementation Notes
### Stack
- **Framework:** TanStack Start + React 19 + TypeScript
- **Rendering:** SSR with static prerendering (SSG) for landing pages — full HTML in initial response for crawlers
- **Routing:** TanStack Router (file-based, type-safe)
- **Styling:** [Tailwind CSS | CSS Modules — match project convention]
- **Animations:** CSS transitions + IntersectionObserver (default) | GSAP + ScrollTrigger (if user requested) | Framer Motion (if user requested, React only)
- **Device mockups:** mockup.png (iOS) + android.png (Android) from skill assets
### Additional Pages
[brief structural note for each non-landing page selected in Phase 1]
### Assets Required
- mockup.png — iPhone device frame (included with skill)
- android.png — Android device frame (included with skill)
- App icon PNG
- iOS screenshots: [list with filenames]
- Android screenshots: [list with filenames]
- OG image (1200x630) — to be generated
## 8. SEO, Accessibility & Web Crawlers
### SEO (Search Engine Optimization)
**Critical: Canonical URL consistency.** Choose ONE primary domain (e.g., `https://thedeadliner.app`) and use it everywhere — canonical tags, sitemap, robots.txt, OG URLs, JSON-LD. Mixed domains (`deadliner.app` vs `thedeadliner.app`) confuse search engines about which domain is authoritative. Audit every file before shipping.
**SEO component pattern — create a reusable component with these defaults:**
- Accept per-page props: `title`, `description`, `canonical`, `image`, `noindex`, `jsonLd`
- Set sensible defaults (app name, default description, primary domain, OG image path)
- Render ALL meta tags from one component so nothing is missed
**Meta tags (server-rendered in `<head>`):**
- `<title>` — "[App Name] — [Tagline]" (max 60 chars)
- `<meta name="description">` — value proposition summary (max 155 chars)
- `<link rel="canonical">` — canonical URL (MUST match primary domain exactly)
- `<meta name="robots" content="index, follow">` for public pages
- `<meta name="robots" content="noindex, follow">` for private pages (payment success/cancel, reset, delete-account, verify-email)
- `<meta name="author">` — app name or company
- `<meta name="theme-color">` — brand primary color
**Open Graph (social sharing):**
- `og:title`, `og:description`, `og:image` (1200x630 PNG), `og:image:alt`, `og:image:width` (1200), `og:image:height` (630)
- `og:type` = "website"
- `og:url` = canonical URL
- `og:site_name` = app name
- `og:locale` = "en_US"
**Twitter Card:**
- `twitter:card` = "summary_large_image"
- `twitter:title`, `twitter:description`, `twitter:image`, `twitter:image:alt`
**Structured Data (JSON-LD in `<head>`):**
Default (every page):
```json
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "[App Name]",
"url": "[canonical URL]",
"publisher": { "@type": "Organization", "name": "[App Name]", "logo": { "@type": "ImageObject", "url": "[logo URL]" } }
}{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "[App Name]",
"description": "[tagline]",
"applicationCategory": "[category]",
"operatingSystem": "[iOS, Android, etc.]",
"offers": { "@type": "AggregateOffer", "lowPrice": "0", "highPrice": "[price]", "priceCurrency": "USD" }
}aggregateRatingreviewfavicon-16x16.pngfavicon-32x32.pngapple-touch-icon.pngsite.webmanifestsitemap.xmllastmod/reset/payment-success/payment-cancel/delete-account/verify-emailSitemap: https://[domain]/sitemap.xml<meta><title><head><img>altwidthheight<a href>robots.txtsitemap.xml.htmlcurl -s [URL]<div id="root"><h1><h2><h3><header><nav><main><section><footer><section>aria-labelaria-labelledby<button><a><div onClick><input><label>aria-label:focus-visible@media (prefers-reduced-motion: no-preference)prefers-reduced-motion: reducealtalt=""aria-hidden="true"altaria-livearia-describedbyaria-busydeferasync
### Phase 8: User Review
Present a summary of the assembled spec — section list, key visual decisions, and sample copy — directly in the conversation.
Ask the user to review the full spec document. Iterate on any feedback.
The spec is the deliverable of the design phase.
### Phase 9: Implementation Planning
After the spec is approved, transition to implementation using subagent-driven development:
1. **Create implementation plan** — Break the spec into discrete, parallelizable tasks:
- Project scaffolding (TanStack Start + React 19 + TypeScript)
- SSR/SSG configuration (prerender landing + legal pages)
- Component hierarchy (layout, sections, shared components)
- Each section as an independent task
- Waitlist integration
- SEO setup (meta tags, OG, JSON-LD, sitemap, robots.txt)
- Accessibility pass
- Responsive polish
- Animation pass
2. **Dispatch subagents** — Use parallel subagents for independent sections:
- Each subagent gets: the full spec, its assigned section(s), brand profile, and asset paths
- Subagents work in isolated worktrees to avoid conflicts
- Shared components (Header, Footer, Button, device mockup components) are built first in the main branch
3. **Integration** — Merge subagent work, resolve any conflicts, verify the full page
### Phase 10: Review & QA
After implementation is complete, run a structured review:
1. **Code review** — Use the code-reviewer agent to verify:
- React 19 + TanStack Start best practices
- TypeScript strictness (no `any`, proper typing)
- Accessibility compliance (WCAG 2.1 AA)
- Performance (no unnecessary re-renders, optimized images)
- Responsive behavior across breakpoints
2. **SEO & crawler review** — Verify:
- `curl` the page and confirm HTML contains all text content (not empty shell)
- All meta tags, OG tags, and JSON-LD present in `<head>` of server response
- **Canonical URL audit**: grep all `.svelte` and `.ts` files for the domain — every occurrence must use the same primary domain. Mixed domains is a critical SEO bug.
- `robots.txt` blocks private pages, references sitemap with correct domain
- `sitemap.xml` lists only public pages, uses correct domain, has realistic priorities
- Private pages have `noindex={true}` prop on SEO component
- OG image loads at the URL specified in meta tags (test with `curl -I [og:image URL]`)
- Disable JavaScript in browser — all content still visible
- No social proof, ratings, or testimonials unless real data was provided
3. **Visual review** — Compare implementation against spec:
- Colors match brand profile
- Typography matches scale
- Spacing matches rhythm
- Device mockups render correctly with screenshots
- Animations are smooth and respect reduced motion
4. **Accessibility review** — Verify:
- Keyboard navigation works end-to-end (Tab through entire page)
- Focus indicators visible on all interactive elements
- Screen reader announces content in logical order
- Color contrast passes WCAG AA on all text
- `prefers-reduced-motion` disables animations
5. **Functional review** — Verify:
- Waitlist form submits correctly (all states work)
- All links and CTAs work
- Navigation works on all breakpoints
- No console errors
6. **Bug squash** — Fix any issues found in review before marking complete
---
## Quality Checklist
Before marking the spec or implementation as complete, every item must pass:
### Spec Quality
- [ ] Brand profile confirmed by user — no assumed values
- [ ] Every section has a clear purpose tied to conversion
- [ ] All copy passes the "one second test" — readable at a glance
- [ ] No two adjacent sections share the same layout pattern
- [ ] Device mockups show real app screenshots, never placeholders
- [ ] Social proof uses ONLY real metrics — or is absent entirely
- [ ] Waitlist/CTA appears 2-3 times (hero, mid-page, final) without feeling repetitive
### Visual Quality
- [ ] Color usage matches the brand profile — no invented palette
- [ ] Typography hierarchy is clear: h1 > h2 > h3 > body > muted
- [ ] Generous whitespace between sections (120-200px)
- [ ] At least one contrast section for visual rhythm
- [ ] Decorative elements (if any) support the message, don't block content
- [ ] Responsive behavior defined for all three breakpoints
- [ ] Card grids have equal-height cards across each row
- [ ] No emoji characters anywhere — all icons are inline SVGs in fixed-size containers
### Technical Quality
- [ ] `curl` returns full HTML with all content (not empty shell)
- [ ] All meta tags, OG, and JSON-LD present in server-rendered `<head>`
- [ ] **Canonical URL consistency** — every canonical, sitemap URL, robots.txt sitemap reference, OG url, and JSON-LD url uses the SAME domain. No mixed `app.com` vs `theapp.com`.
- [ ] `robots.txt` blocks private pages and references sitemap with correct domain
- [ ] `sitemap.xml` lists only public indexable pages with realistic priorities
- [ ] Private pages (payment, reset, delete-account) have `noindex` meta tag
- [ ] OG image exists at 1200x630, referenced correctly in meta tags
- [ ] Favicons (16px, 32px), apple-touch-icon (180px), and web manifest with 192/512px icons
- [ ] WCAG 2.1 AA: contrast ratios, keyboard nav, focus indicators, semantic HTML
- [ ] `prefers-reduced-motion` disables all animations and shows content immediately
- [ ] All images have `alt`, `width`, `height` attributes
- [ ] No console errors, no layout shift on load
- [ ] Lighthouse Performance score 90+ — animations use only `transform`/`opacity`, no layout-triggering properties
- [ ] No animation library in bundle unless user explicitly requested complex animations
- [ ] Animations don't increase TBT (Total Blocking Time) or cause CLS > 0.1
### Copy Quality
- [ ] Hero headline: 8-10 words max, benefit-first
- [ ] Each feature headline sells an outcome, not a feature name
- [ ] CTAs are action-oriented and specific
- [ ] Microcopy reduces anxiety (no spam, free tier, cancel anytime)
- [ ] No marketing buzzwords unless they're genuinely accurate
- [ ] No two headlines use the same formula
---
## Key Principles
- **Never assume — detect.** Read the project first. Fill gaps with questions, don't start from scratch.
- **Ask first, then detect.** Get user requirements (pages, screenshots, preferences) before diving into code.
- **Brand coherence.** The landing page must feel like it belongs to the same product. Same fonts, same icon, same color palette. The header must show the app's actual icon next to the wordmark — never a text-only logo.
- **No generic AI aesthetics.** No gratuitous gradients on white backgrounds, no stock-photo heroes, no "revolutionize your workflow" copy. Every choice derives from the actual brand and app type.
- **Product is the hero.** Show the real product in real device frames — `mockup.png` for iOS, `android.png` for Android. Never illustrations of what the product "might look like."
- **Fewer sections, more space.** Pre-launch pages need 3-4 sections max (Hero, Features, Secondary Features, CTA). Every additional section dilutes the conversion funnel. Generous whitespace (150-200px between sections) signals premium quality. Don't fill space with "How It Works" or "Problem/Solution" unless they add information the features don't already cover.
- **Conversion-focused.** Every section exists to move the visitor toward the waitlist/download. If a section doesn't serve that goal, remove it. Pricing, FAQ, and testimonials belong on post-launch pages — not pre-launch waitlist pages.
- **Spec is the design deliverable.** Detailed enough that any developer or AI tool can implement faithfully. No ambiguity in spacing, colors, or typography.
- **TanStack Start + React 19 + TypeScript for implementation.** SSR/SSG for full crawlability. Landing pages must serve complete HTML — no empty shells. CSS transitions + IntersectionObserver for animations by default — zero bundle cost, Lighthouse-friendly. Only add GSAP or Framer Motion when the user explicitly requests complex animations.
- **Crawlable by default.** Every piece of content must be in the server-rendered HTML. If `curl` returns an empty `<div>`, the implementation is wrong. Search engines, social media scrapers, and link previews depend on real HTML content.
- **Subagent-driven development.** Parallelize independent sections for faster implementation.
- **Review before shipping.** Code review, visual review, and functional review are mandatory before marking complete.
- **Real metrics or none.** Never fabricate social proof, reviews, testimonials, user counts, or awards. Fake data destroys trust faster than no data at all. If the user has no metrics, focus on features, product screenshots, and the value proposition instead. A minimalist page with real content always beats a busy page with invented credibility.
- **Accessible by default.** WCAG 2.1 AA is the floor, not the ceiling.
- **No emoji, ever.** Emoji characters render inconsistently across platforms, look unprofessional, and can't be styled. Use inline SVGs (Heroicons, Lucide, or custom) inside fixed-size containers with a subtle background tint. SVGs scale cleanly, match the brand palette via `currentColor`, and support `aria-hidden` for accessibility.