launchframe 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,8 @@ invokable: true
11
11
 
12
12
  You are about to reverse-engineer and rebuild a website as a pixel-perfect clone, then re-skin the copy/branding for the user's SaaS idea.
13
13
 
14
+ **Launchframe shorthand:** If the user only says **Build it**, **Go**, **Ship it**, **Clone the site**, or **Run launchframe** with no URL in the message, treat that as an invocation of this skill with empty `$ARGUMENTS` — **`launchframe.config.json` alone** supplies `url` and `idea`. Proceed without asking them to repeat those values unless the file is missing or invalid.
15
+
14
16
  ## Step 0: Read `launchframe.config.json`
15
17
 
16
18
  **Before doing anything else**, read `launchframe.config.json` at the project root. This file was written by the `launchframe` CLI when the project was scaffolded and is the authoritative source of:
@@ -38,17 +40,23 @@ If the user provides additional instructions (specific fidelity level, deeper cu
38
40
 
39
41
  ## Pre-Flight
40
42
 
41
- 1. **Read `launchframe.config.json`** (see Step 0 above). Echo back the `url` and `idea` to the user so they can confirm before the run starts.
43
+ 1. **Read `launchframe.config.json`** (see Step 0 above). After a fresh `npx launchframe` scaffold, proceed immediately — only echo `url`/`idea` for confirmation if the config looks wrong or the user asked to verify.
42
44
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
43
45
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
44
46
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
45
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
47
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
46
48
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
47
49
 
48
50
  ## Guiding Principles
49
51
 
50
52
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
51
53
 
54
+ ### 0. Launchframe priorities: media & motion (do not defer)
55
+
56
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
57
+
58
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
59
+
52
60
  ### 1. Completeness Beats Speed
53
61
 
54
62
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -193,11 +201,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
193
201
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
194
202
 
195
203
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
196
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
197
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
198
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
199
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
200
- 6. Verify: `npm run build` passes
204
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
205
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
206
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
207
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
208
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
209
+ 7. Verify: `npm run build` passes
201
210
 
202
211
  ### Asset Discovery Script Pattern
203
212
 
@@ -354,11 +363,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
354
363
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
355
364
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
356
365
  - **Transition:** transition: all 0.3s ease
357
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
366
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
358
367
 
359
368
  ### Hover states
360
369
  - **<Element>:** <property>: <before> → <after>, transition: <value>
361
370
 
371
+ ## Motion (Framer Motion vs CSS)
372
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
373
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
374
+ - **Keyframes / springs:** <if any — match target curve>
375
+
362
376
  ## Per-State Content (if applicable)
363
377
 
364
378
  ### State: "Featured"
@@ -370,9 +384,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
370
384
  - Title: "..."
371
385
  - Cards: [...]
372
386
 
373
- ## Assets
374
- - Background image: `public/images/<file>.webp`
375
- - Overlay image: `public/images/<file>.png`
387
+ ## Assets (images & video — required detail)
388
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
389
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
390
+ - Background layers: which div uses `background-image` and resolved URL → local path
376
391
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
377
392
 
378
393
  ## Text Content (verbatim)
@@ -446,7 +461,7 @@ For every section, replace:
446
461
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
447
462
 
448
463
  What you must NOT change in this pass:
449
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
464
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
450
465
  - Section order, section count, component structure
451
466
  - Interaction models (scroll-driven stays scroll-driven, etc.)
452
467
  - Any computed-style value extracted in Phase 3
@@ -480,6 +495,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
480
495
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
481
496
  - [ ] For hover states: before/after values and transition timing are recorded
482
497
  - [ ] All images in the section are identified (including overlays and layered compositions)
498
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
499
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
483
500
  - [ ] Responsive behavior is documented for at least desktop and mobile
484
501
  - [ ] Text content is verbatim from the site, not paraphrased
485
502
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -496,6 +513,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
496
513
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
497
514
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
498
515
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
516
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
517
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
499
518
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
500
519
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
501
520
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -510,7 +529,7 @@ When done, report:
510
529
  - Total sections built
511
530
  - Total components created
512
531
  - Total spec files written (should match components)
513
- - Total assets downloaded (images, videos, SVGs, fonts)
532
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
514
533
  - Rebrand summary (path to `docs/research/REBRAND.md`)
515
534
  - Build status (`npm run build` result)
516
535
  - Visual QA results (any remaining discrepancies)
@@ -23,13 +23,26 @@ At the project root there is a `launchframe.config.json` containing:
23
23
 
24
24
  **Always read this file first** at the start of any cloning or build task. The `/clone-website` skill depends on it.
25
25
 
26
+ ## What the user says (zero-setup flow)
27
+ Users scaffold with `npx launchframe@latest <url> "<saas idea>"` — `npm install` already ran — then they open this folder and say **Build it** (or **Go**, **Ship it**, **Clone the site**).
28
+
29
+ When you see that with no other instructions, **start the full clone-website pipeline immediately** using only `launchframe.config.json` for `url` and `idea`. Do not ask them to repeat the URL unless the config is missing or invalid. `/clone-website` is an alias for the same work.
30
+
26
31
  ## Tech Stack
27
32
  - **Framework:** Next.js 16 (App Router, React 19, TypeScript strict)
28
33
  - **UI:** shadcn/ui (Radix primitives, Tailwind CSS v4, `cn()` utility)
34
+ - **Motion:** **Framer Motion** (`framer-motion`) — **default for non-trivial animation** (scroll reveals, staggers, layout, gestures). Use CSS `transition` / `@keyframes` only when they reproduce the target exactly without JS.
29
35
  - **Icons:** Lucide React (default — will be replaced/supplemented by extracted SVGs)
30
36
  - **Styling:** Tailwind CSS v4 with oklch design tokens
37
+ - **Media:** Real **images & videos** from the target URL, saved under `public/images/` and `public/videos/` (see `.claude/skills/clone-website/SKILL.md` and `docs/research/INSPECTION_GUIDE.md`). Do not ship a “pretty shell” with missing raster/video unless extraction is **blocked** and documented in `docs/research/EXTRACTION_LIMITATIONS.md`.
31
38
  - **Deployment:** Vercel
32
39
 
40
+ ## Priority: images, videos & motion
41
+ Treat these as **first-class deliverables**, not polish at the end.
42
+
43
+ 1. **Raster & video** — Early in recon, inventory every `<img>`, `<picture>` / `<source>`, `<video>`, poster image, and meaningful `background-image` URL. Download into `public/` and reference **local paths** in specs and components. Hero bands and marketing sections often fail visually when a single layer is skipped.
44
+ 2. **Motion** — Match the target’s feel: easing, duration, stagger, scroll triggers. Prefer **`motion` from `framer-motion`** for entrance sequences, viewport-driven animations, shared-layout-style transitions, and anything beyond a one-off CSS transition. Note in each component spec whether behavior is **CSS-only** vs **Framer Motion**.
45
+
33
46
  ## Commands
34
47
  - `npm run dev` — Start dev server
35
48
  - `npm run build` — Production build
@@ -45,6 +58,8 @@ At the project root there is a `launchframe.config.json` containing:
45
58
  - Responsive: mobile-first
46
59
 
47
60
  ## Design Principles
61
+ - **Images & video fidelity** — prefer real downloaded assets; preserve aspect ratio, `object-fit`, layering, and poster frames. Rebrand pass may **swap** URLs for IP-safe alternates but must keep layout identical.
62
+ - **Motion fidelity** — timing and easing matter as much as color; use Framer Motion when CSS alone cannot match staggered or scroll-driven behavior.
48
63
  - **Pixel-perfect emulation** — match the target's spacing, colors, typography exactly
49
64
  - **No personal aesthetic changes during emulation phase** — match 1:1 first, rebrand later
50
65
  - **Real content during extraction** — use actual text and assets from the target site so the clone scaffolds against real shapes
@@ -80,6 +95,31 @@ scripts/ # Asset download scripts
80
95
 
81
96
  # Website Inspection Guide
82
97
 
98
+ ## Priority (read first): media & motion
99
+
100
+ Launchframe clones live pages for a **visual** result. Two things most often separate a convincing build from a hollow one:
101
+
102
+ ### 1. Images & video (do this before obsessing over utility classes)
103
+
104
+ - [ ] **Every `<img>`** — `src` / `srcset` / `currentSrc`, `sizes`, `loading`, `decoding`, `alt`, intrinsic dimensions
105
+ - [ ] **`<picture>` / `<source>`** — resolution switches, art direction, `type` (WebP/AVIF)
106
+ - [ ] **Every `<video>`** — `src` + nested `<source>`, **poster**, `autoplay`, `loop`, `muted`, `playsinline`, `controls`
107
+ - [ ] **Background images** — `background-image` on ancestors (hero stacks are often **layers** of img + gradient + PNG mockup)
108
+ - [ ] **Lazy / below-fold** — scroll the page once before asset discovery so `data-src` / lazy-loaded URLs resolve if the site uses them
109
+ - [ ] **Download** — mirror into `public/images/` and `public/videos/` with stable paths; list failures in `docs/research/EXTRACTION_LIMITATIONS.md`
110
+
111
+ If automation hits a bot wall, **do not pretend extraction succeeded** — capture what you can from successful fetches and document gaps.
112
+
113
+ ### 2. Motion (prefer Framer Motion in this repo)
114
+
115
+ - [ ] **Entrance** — fade/slide/scale on mount or on **scroll into view** (note threshold / `margin`)
116
+ - [ ] **Stagger** — children animating in sequence (hero bullets, card grids)
117
+ - [ ] **Scroll-linked** — progress, parallax, pinned sections (may combine with CSS `animation-timeline` or libs)
118
+ - [ ] **Gestures** — drag, pan, hover follow (often Framer Motion)
119
+ - [ ] **Implementation rule** — use **`framer-motion`** for anything beyond trivial single-property CSS `transition`. Record **duration, easing, delay, stagger**, and **trigger** (scroll, hover, tap) in specs.
120
+
121
+ ---
122
+
83
123
  ## How to Reverse-Engineer Any Website
84
124
 
85
125
  This guide outlines what to capture when inspecting a target website via Chrome MCP or browser DevTools.
@@ -94,6 +134,8 @@ This guide outlines what to capture when inspecting a target website via Chrome
94
134
  - [ ] Loading/skeleton states
95
135
  - [ ] Empty states
96
136
  - [ ] Error states
137
+ - [ ] **Video frames** — capture a frame mid-play for reference if motion is subtle
138
+ - [ ] **Hero / full-bleed** — wide crops where raster layers are easy to miss
97
139
 
98
140
  ### Design Tokens to Extract
99
141
  - [ ] **Colors** — background, text (primary/secondary/muted), accent, border, hover, error, success, warning
@@ -116,7 +158,7 @@ For each distinct UI component, document:
116
158
  4. **States** — default, hover, active, disabled, loading, error, empty
117
159
  5. **Responsive behavior** — how does it change at different breakpoints?
118
160
  6. **Interactions** — click, hover, focus, keyboard navigation
119
- 7. **Animations** — transitions, entrance/exit animations, micro-interactions
161
+ 7. **Animations** — transitions, entrance/exit, micro-interactions — **`framer-motion` vs CSS** and exact timing
120
162
 
121
163
  ### Common Components to Look For
122
164
  - Navigation (top bar, sidebar, bottom bar)
@@ -130,6 +172,7 @@ For each distinct UI component, document:
130
172
  - Loading skeletons
131
173
  - Toast notifications
132
174
  - Tooltips and popovers
175
+ - **Video / Lottie / canvas** blocks (do not substitute with static mockups without documenting why)
133
176
 
134
177
  ## Phase 3: Layout Architecture
135
178
 
@@ -147,14 +190,15 @@ For each distinct UI component, document:
147
190
  - [ ] **State management** — Redux (check DevTools), React Query, Zustand, Pinia
148
191
  - [ ] **API patterns** — REST, GraphQL (check network tab for `/graphql` requests)
149
192
  - [ ] **Font loading** — Google Fonts, self-hosted, system fonts
150
- - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF
151
- - [ ] **Animation library** — Framer Motion, GSAP, CSS transitions only
193
+ - [ ] **Image strategy** — CDN, lazy loading, srcset, WebP/AVIF — **mirror URLs you are allowed to fetch**
194
+ - [ ] **Animation library** — site may use GSAP, Lottie, Rive, or CSS only — **in the Next.js clone, default to Framer Motion** unless a different lib is required for parity
152
195
 
153
196
  ## Phase 5: Documentation Output
154
197
 
155
198
  After inspection, create these files in `docs/research/`:
156
199
  1. `DESIGN_TOKENS.md` — All extracted colors, typography, spacing
157
200
  2. `COMPONENT_INVENTORY.md` — Every component with structure notes
158
- 3. `LAYOUT_ARCHITECTURE.md`Page layouts, grid system, responsive behavior
159
- 4. `INTERACTION_PATTERNS.md` — Animations, transitions, hover states
160
- 5. `TECH_STACK_ANALYSIS.md` — What the site uses and our chosen equivalents
201
+ 3. **`MEDIA_MANIFEST.md`**(recommended) Table of every image/video/poster URL → local `public/` path or “blocked”
202
+ 4. `LAYOUT_ARCHITECTURE.md` — Page layouts, grid system, responsive behavior
203
+ 5. `INTERACTION_PATTERNS.md` — Animations: **CSS vs Framer Motion**, transitions, hover states
204
+ 6. `TECH_STACK_ANALYSIS.md` — What the site uses and our chosen equivalents (Framer Motion for React animation)
@@ -6,6 +6,8 @@
6
6
 
7
7
  You are about to reverse-engineer and rebuild a website as a pixel-perfect clone, then re-skin the copy/branding for the user's SaaS idea.
8
8
 
9
+ **Launchframe shorthand:** If the user only says **Build it**, **Go**, **Ship it**, **Clone the site**, or **Run launchframe** with no URL in the message, treat that as an invocation of this skill with empty `the target URL provided by the user` — **`launchframe.config.json` alone** supplies `url` and `idea`. Proceed without asking them to repeat those values unless the file is missing or invalid.
10
+
9
11
  ## Step 0: Read `launchframe.config.json`
10
12
 
11
13
  **Before doing anything else**, read `launchframe.config.json` at the project root. This file was written by the `launchframe` CLI when the project was scaffolded and is the authoritative source of:
@@ -33,17 +35,23 @@ If the user provides additional instructions (specific fidelity level, deeper cu
33
35
 
34
36
  ## Pre-Flight
35
37
 
36
- 1. **Read `launchframe.config.json`** (see Step 0 above). Echo back the `url` and `idea` to the user so they can confirm before the run starts.
38
+ 1. **Read `launchframe.config.json`** (see Step 0 above). After a fresh `npx launchframe` scaffold, proceed immediately — only echo `url`/`idea` for confirmation if the config looks wrong or the user asked to verify.
37
39
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
38
40
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
39
41
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
40
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
42
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
41
43
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
42
44
 
43
45
  ## Guiding Principles
44
46
 
45
47
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
46
48
 
49
+ ### 0. Launchframe priorities: media & motion (do not defer)
50
+
51
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
52
+
53
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
54
+
47
55
  ### 1. Completeness Beats Speed
48
56
 
49
57
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -188,11 +196,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
188
196
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
189
197
 
190
198
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
191
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
192
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
193
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
194
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
195
- 6. Verify: `npm run build` passes
199
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
200
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
201
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
202
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
203
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
204
+ 7. Verify: `npm run build` passes
196
205
 
197
206
  ### Asset Discovery Script Pattern
198
207
 
@@ -349,11 +358,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
349
358
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
350
359
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
351
360
  - **Transition:** transition: all 0.3s ease
352
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
361
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
353
362
 
354
363
  ### Hover states
355
364
  - **<Element>:** <property>: <before> → <after>, transition: <value>
356
365
 
366
+ ## Motion (Framer Motion vs CSS)
367
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
368
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
369
+ - **Keyframes / springs:** <if any — match target curve>
370
+
357
371
  ## Per-State Content (if applicable)
358
372
 
359
373
  ### State: "Featured"
@@ -365,9 +379,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
365
379
  - Title: "..."
366
380
  - Cards: [...]
367
381
 
368
- ## Assets
369
- - Background image: `public/images/<file>.webp`
370
- - Overlay image: `public/images/<file>.png`
382
+ ## Assets (images & video — required detail)
383
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
384
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
385
+ - Background layers: which div uses `background-image` and resolved URL → local path
371
386
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
372
387
 
373
388
  ## Text Content (verbatim)
@@ -441,7 +456,7 @@ For every section, replace:
441
456
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
442
457
 
443
458
  What you must NOT change in this pass:
444
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
459
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
445
460
  - Section order, section count, component structure
446
461
  - Interaction models (scroll-driven stays scroll-driven, etc.)
447
462
  - Any computed-style value extracted in Phase 3
@@ -475,6 +490,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
475
490
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
476
491
  - [ ] For hover states: before/after values and transition timing are recorded
477
492
  - [ ] All images in the section are identified (including overlays and layered compositions)
493
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
494
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
478
495
  - [ ] Responsive behavior is documented for at least desktop and mobile
479
496
  - [ ] Text content is verbatim from the site, not paraphrased
480
497
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -491,6 +508,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
491
508
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
492
509
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
493
510
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
511
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
512
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
494
513
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
495
514
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
496
515
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -505,7 +524,7 @@ When done, report:
505
524
  - Total sections built
506
525
  - Total components created
507
526
  - Total spec files written (should match components)
508
- - Total assets downloaded (images, videos, SVGs, fonts)
527
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
509
528
  - Rebrand summary (path to `docs/research/REBRAND.md`)
510
529
  - Build status (`npm run build` result)
511
530
  - Visual QA results (any remaining discrepancies)
@@ -1,7 +1,20 @@
1
1
  ---
2
- description: Project conventions see AGENTS.md for full details
2
+ description: Launchframeopen folder, say "Build it", full clone + rebrand pipeline
3
3
  alwaysApply: true
4
4
  ---
5
5
 
6
- This project uses AGENTS.md as the single source of truth for all AI agent instructions.
7
- Cursor reads AGENTS.md automatically — see the project root for complete guidelines.
6
+ This is a **Launchframe** project: `launchframe.config.json` holds the target `url` and SaaS `idea`. `AGENTS.md` is the extended source of truth.
7
+
8
+ ## Shorthand (what users actually type)
9
+
10
+ When the user says **Build it**, **Go**, **Ship it**, **Clone the site**, **Run launchframe**, or similar, with **no** new URL or idea in the same message:
11
+
12
+ 1. Read `launchframe.config.json` first (authoritative `url` + `idea`).
13
+ 2. Execute the **full** workflow described in `AGENTS.md` and in `.cursor/commands/clone-website.md` (recon → foundation → component specs → build → SaaS rebrand pass → assembly → QA).
14
+ 3. Continue until `npm run build` passes unless the user stops you.
15
+
16
+ Do **not** ask the user to re-type the URL or idea unless the config is missing or broken. Optional: use **`/clone-website`** as the explicit slash-command alias.
17
+
18
+ ## Browser automation
19
+
20
+ If no Browser MCP is available, use Playwright or another local browser the user has — and document limits (e.g. Cloudflare) in `docs/research/EXTRACTION_LIMITATIONS.md` when the real page is not reachable.
@@ -10,6 +10,8 @@ text = '''
10
10
 
11
11
  You are about to reverse-engineer and rebuild a website as a pixel-perfect clone, then re-skin the copy/branding for the user's SaaS idea.
12
12
 
13
+ **Launchframe shorthand:** If the user only says **Build it**, **Go**, **Ship it**, **Clone the site**, or **Run launchframe** with no URL in the message, treat that as an invocation of this skill with empty `{{args}}` — **`launchframe.config.json` alone** supplies `url` and `idea`. Proceed without asking them to repeat those values unless the file is missing or invalid.
14
+
13
15
  ## Step 0: Read `launchframe.config.json`
14
16
 
15
17
  **Before doing anything else**, read `launchframe.config.json` at the project root. This file was written by the `launchframe` CLI when the project was scaffolded and is the authoritative source of:
@@ -37,17 +39,23 @@ If the user provides additional instructions (specific fidelity level, deeper cu
37
39
 
38
40
  ## Pre-Flight
39
41
 
40
- 1. **Read `launchframe.config.json`** (see Step 0 above). Echo back the `url` and `idea` to the user so they can confirm before the run starts.
42
+ 1. **Read `launchframe.config.json`** (see Step 0 above). After a fresh `npx launchframe` scaffold, proceed immediately — only echo `url`/`idea` for confirmation if the config looks wrong or the user asked to verify.
41
43
  2. **Browser automation is required.** Check for available browser MCP tools (Chrome MCP, Playwright MCP, Browserbase MCP, Puppeteer MCP, etc.). Use whichever is available — if multiple exist, prefer Chrome MCP. If none are detected, ask the user which browser tool they have and how to connect it. This skill cannot work without browser automation.
42
44
  3. Validate the resolved URL(s). Normalize and verify each is accessible via your browser MCP tool. If any are invalid, ask the user to correct `launchframe.config.json` (or pass an override) before proceeding.
43
45
  4. Verify the base project builds: `npm run build`. The Next.js + shadcn/ui + Tailwind v4 scaffold should already be in place. If not, tell the user to run `npm install` first.
44
- 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
46
+ 5. Create the output directories if they don't exist: `docs/research/`, `docs/research/components/`, `docs/design-references/`, `scripts/`. Plan `docs/research/MEDIA_MANIFEST.md` as soon as media is inventoried. For multiple clones, also prepare per-site folders like `docs/research/<hostname>/` and `docs/design-references/<hostname>/`.
45
47
  6. When working with multiple sites in one command, optionally confirm whether to run them in parallel (recommended, if resources allow) or sequentially to avoid overload.
46
48
 
47
49
  ## Guiding Principles
48
50
 
49
51
  These are the truths that separate a successful clone from a "close enough" mess. Internalize them — they should inform every decision you make.
50
52
 
53
+ ### 0. Launchframe priorities: media & motion (do not defer)
54
+
55
+ **Raster & video are first-class.** Before you treat the page as “mostly typography,” run a dedicated **media inventory** (see `@docs/research/INSPECTION_GUIDE.md` Priority section): every `<img>`, `<picture>` / `<source>`, `<video>` (+ poster), and non-trivial `background-image`. Download to `public/images/` and `public/videos/` and write `docs/research/MEDIA_MANIFEST.md` (URL → local path, or `BLOCKED` + reason). Component specs MUST list concrete `public/...` paths; if you use a placeholder, say why in `docs/research/EXTRACTION_LIMITATIONS.md`. Never silently drop a hero layer, reel, or og visual.
56
+
57
+ **Motion defaults to Framer Motion.** This template lists `framer-motion` as a dependency. After foundation tokens, ensure `import { motion } from "framer-motion"` (and related APIs: `useScroll`, `useTransform`, `AnimatePresence`, `LayoutGroup`) for: scroll-triggered reveals, staggered children, layout transitions, and gestures — anything beyond a trivial one-property CSS `transition`. In each spec file, add a **Motion** subsection: trigger, duration, easing, delay/stagger, and **implementation: CSS | framer-motion**. Prefer CSS only when it matches the target exactly without JS.
58
+
51
59
  ### 1. Completeness Beats Speed
52
60
 
53
61
  Every builder agent must receive **everything** it needs to do its job perfectly: screenshot, exact CSS values, downloaded assets with local paths, real text content, component structure. If a builder has to guess anything — a color, a font size, a padding value — you have failed at extraction. Take the extra minute to extract one more property rather than shipping an incomplete brief.
@@ -192,11 +200,12 @@ Save this as `docs/research/PAGE_TOPOLOGY.md` — it becomes your assembly bluep
192
200
  This is sequential. Do it yourself (not delegated to an agent) since it touches many files:
193
201
 
194
202
  1. **Update fonts** in `layout.tsx` to match the target site's actual fonts
195
- 2. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
196
- 3. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
197
- 4. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
198
- 5. **Download global assets** write and run a Node.js script (`scripts/download-assets.mjs`) that downloads all images, videos, and other binary assets from the page to `public/`. Preserve meaningful directory structure.
199
- 6. Verify: `npm run build` passes
203
+ 2. **Confirm Framer Motion** `framer-motion` should already be in `package.json`. If missing, add it (`npm install framer-motion`) so builders can import `motion` without ad-hoc library drift.
204
+ 3. **Update globals.css** with the target's color tokens, spacing values, keyframe animations, utility classes, and any **global scroll behaviors** (Lenis, smooth scroll CSS, scroll-snap on body)
205
+ 4. **Media inventory + download (early, high priority)** — run the asset discovery script (below) via browser MCP, write `docs/research/MEDIA_MANIFEST.md`, then implement **`scripts/download-assets.mjs`** and execute it so **images** land in `public/images/` and **videos** (+ posters) in `public/videos/` (or a clear subdirectory scheme under `public/`). Batch parallel downloads (4 concurrent) with errors logged — do not claim success if URLs failed. This step should complete **before** most section components are built so builders use real paths.
206
+ 5. **Create TypeScript interfaces** in `src/types/` for the content structures you've observed
207
+ 6. **Extract SVG icons** — find all inline `<svg>` elements on the page, deduplicate them, and save as named React components in `src/components/icons.tsx`. Name them by visual function (e.g., `SearchIcon`, `ArrowRightIcon`, `LogoIcon`).
208
+ 7. Verify: `npm run build` passes
200
209
 
201
210
  ### Asset Discovery Script Pattern
202
211
 
@@ -353,11 +362,16 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
353
362
  - **State A (before):** maxWidth: 100vw, boxShadow: none, borderRadius: 0
354
363
  - **State B (after):** maxWidth: 1200px, boxShadow: 0 4px 20px rgba(0,0,0,0.1), borderRadius: 16px
355
364
  - **Transition:** transition: all 0.3s ease
356
- - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | etc.>
365
+ - **Implementation approach:** <CSS transition + scroll listener | IntersectionObserver | CSS animation-timeline | **framer-motion** (`motion`, `whileInView`, stagger container) | etc.>
357
366
 
358
367
  ### Hover states
359
368
  - **<Element>:** <property>: <before> → <after>, transition: <value>
360
369
 
370
+ ## Motion (Framer Motion vs CSS)
371
+ - **Entrance / scroll reveals:** <e.g. fade+translateY, staggerChildren — specify duration, easing, delay, viewport `once`/`margin`>
372
+ - **Library:** <`framer-motion` | CSS-only — justify if CSS-only>
373
+ - **Keyframes / springs:** <if any — match target curve>
374
+
361
375
  ## Per-State Content (if applicable)
362
376
 
363
377
  ### State: "Featured"
@@ -369,9 +383,10 @@ For each section (or sub-component, if you're breaking it up), create a spec fil
369
383
  - Title: "..."
370
384
  - Cards: [...]
371
385
 
372
- ## Assets
373
- - Background image: `public/images/<file>.webp`
374
- - Overlay image: `public/images/<file>.png`
386
+ ## Assets (images & video — required detail)
387
+ - Raster: `public/images/<file>` — dimensions, `object-fit`, lazy if below fold
388
+ - Video: `public/videos/<file>` — poster `public/images/...` or `public/videos/...`, autoplay/muted/loop, controls
389
+ - Background layers: which div uses `background-image` and resolved URL → local path
375
390
  - Icons used: <ArrowIcon>, <SearchIcon> from icons.tsx
376
391
 
377
392
  ## Text Content (verbatim)
@@ -445,7 +460,7 @@ For every section, replace:
445
460
  7. **Metadata** — update `<title>`, meta description, OG tags, and favicon manifest in `src/app/layout.tsx` to reflect the new SaaS. Generate a simple favicon (initial letter on a brand-colored square) if no asset is provided.
446
461
 
447
462
  What you must NOT change in this pass:
448
- - Spacing, padding, typography scale, color tokens, animations, responsive breakpoints — those are still 1:1 to the original
463
+ - Spacing, padding, typography scale, color tokens, **animation timing & motion choreography** (including Framer Motion `variants` / `transition` props), responsive breakpoints — those are still 1:1 to the original
449
464
  - Section order, section count, component structure
450
465
  - Interaction models (scroll-driven stays scroll-driven, etc.)
451
466
  - Any computed-style value extracted in Phase 3
@@ -479,6 +494,8 @@ Before dispatching ANY builder agent, verify you can check every box. If you can
479
494
  - [ ] For scroll-driven components: trigger threshold, before/after styles, and transition are recorded
480
495
  - [ ] For hover states: before/after values and transition timing are recorded
481
496
  - [ ] All images in the section are identified (including overlays and layered compositions)
497
+ - [ ] Any `<video>` (and poster), Lottie, or canvas-driven hero is identified — not approximated as a static div
498
+ - [ ] **Motion** subsection filled: CSS vs **framer-motion**, durations, easings, stagger, scroll triggers
482
499
  - [ ] Responsive behavior is documented for at least desktop and mobile
483
500
  - [ ] Text content is verbatim from the site, not paraphrased
484
501
  - [ ] The builder prompt is under ~150 lines of spec; if over, the section needs to be split
@@ -495,6 +512,8 @@ These are lessons from previous failed clones — each one cost hours of rework:
495
512
  - **Don't build everything in one monolithic commit.** The whole point of this pipeline is incremental progress with verified builds at each step.
496
513
  - **Don't reference docs from builder prompts.** Each builder gets the CSS spec inline in its prompt — never "see DESIGN_TOKENS.md for colors." The builder should have zero need to read external docs.
497
514
  - **Don't skip asset extraction.** Without real images, videos, and fonts, the clone will always look fake regardless of how perfect the CSS is.
515
+ - **Don't defer image/video download to the end.** Run `MEDIA_MANIFEST.md` + `download-assets.mjs` during foundation so components reference real `public/` paths from the first build.
516
+ - **Don't fake complex motion with a single CSS `transition` when the target uses staggered, scroll-scrubbed, or layout-driven animation** — use **`framer-motion`** (`motion`, `whileInView`, `variants`, `staggerChildren`) and match duration/easing from extraction.
498
517
  - **Don't give a builder agent too much scope.** If you're writing a builder prompt and it's getting long because the section is complex, that's a signal to break it into smaller tasks.
499
518
  - **Don't bundle unrelated sections into one agent.** A CTA section and a footer are different components with different designs — don't hand them both to one agent and hope for the best.
500
519
  - **Don't skip responsive extraction.** If you only inspect at desktop width, the clone will break at tablet and mobile. Test at 1440, 768, and 390 during extraction.
@@ -509,7 +528,7 @@ When done, report:
509
528
  - Total sections built
510
529
  - Total components created
511
530
  - Total spec files written (should match components)
512
- - Total assets downloaded (images, videos, SVGs, fonts)
531
+ - Total assets downloaded (images, videos, SVGs, fonts) — path to `docs/research/MEDIA_MANIFEST.md`
513
532
  - Rebrand summary (path to `docs/research/REBRAND.md`)
514
533
  - Build status (`npm run build` result)
515
534
  - Visual QA results (any remaining discrepancies)