recreate
Recreate a website from a link with the awwwards MCP. Use when the user says to recreate a site, clone a page, rebuild a URL, or gives a URL and asks to build it. Produces a hand-built implementation, checks it against the live site, then can convert it into a Vite, Astro, or Next project.
Install
npx skills add https://github.com/INSANE0777/awwwards-skills --skill recreateRecreate a website from a link
Input: one URL ($ARGUMENTS). Follow the phases in order; do not skip the evidence steps.
Profile note: this skill's tools are
search_sites,get_site_details,capture_live_site,analyze_page_structure,analyze_stack,capture_component,analyze_scroll_map,analyze_hover_census,get_motion_dna,capture_pose_3d,build_pose_stub,export_design_tokens,analyze_images,analyze_bundleand retainedanalyze_network_capture/verify_flow. Examples below use 1.x names (defaultfull). OnAWWWARDS_MCP_PROFILE=v2, usesearch_references {request:{kind:"sites", ...}},get_reference {request:{kind:"site_details", slug}},capture_page {request:{kind:"screenshot", url}},inspect_page {request:{kind:"structure", url}},inspect_page {request:{kind:"stack", url}},capture_page {request:{kind:"component", url}},analyze_motion {request:{kind:"scroll", url}},analyze_motion {request:{kind:"hover", url}},analyze_motion {request:{kind:"dna", url}},capture_page {request:{kind:"pose", url}},build_motion {request:{kind:"pose_stub", poseGrid}},inspect_page {request:{kind:"tokens", url}},audit_page {request:{kind:"images", url}}andaudit_page {request:{kind:"bundle", url}};analyze_network_captureandverify_flowstay flat. Full mapping: v2-routing.md [blocked].
Phase 0 — Study-build terms (mandatory, every run)
This is a local study build: recreate the reference exactly — layout, text, images, fonts, audio, motion. In exchange, every output MUST ship the disclaimer:
- README.md in the build must state, prominently: the design, copy, images, fonts and audio belong to the original owners; this build is a private study/reference recreation; it must not be deployed, published, sold, or presented as your own work; publishing requires replacing every borrowed asset (list them) and obtaining licenses.
- Header comment in the HTML repeats the same notice in one line.
- Provenance list: every borrowed asset path + source URL enumerated in the README.
- If the user later wants to publish, that is a separate brief: replace assets → publish. Never quietly drop the disclaimer.
Scope: whole page or specific sections? A continuous scroll-narrative (fixed stage + long spacer) is one unit — do not force per-section pages onto it. Target: single-file build by default; conversion is offered after QA, never assumed (see Phase 4).
Phase 1 — Evidence (free MCP, all read-only)
Any URL works, but check Awwwards first. Step 1 is always
search_siteswith the site's domain/name. If the site is listed →get_site_detailsfor its recorded DNA (palette, tech, elements, awards) and carry that into the report. If no match → say so once and continue: only the search/index tools are Awwwards-sourced; every capture tool below runs on any public link, and the live evidence still gives you everything.
analyze_stack <url>→ framework + CSS + libs (tells you whether the reference is Webflow/Next/static and which motion libs matter).analyze_page_structure <url>→ bands (section order + heights). If bands collapse into a giant,capture_componentwith explicit id/class selectors instead.- Per section:
capture_component <url>withselector(id/class),maxNodesup to 2000 → geometry, 44 computed style keys, pseudo-elements, inline SVG, text, imgSrc, fonts, colors. - Motion:
analyze_scroll_map <url>(keyframes +gsapTriggersnumerics;scrubProbeon for scrubbed narratives),analyze_hover_census <url>(during-hoveractiveAnims),get_motion_dna <url>. - Canvas/WebGL hero:
capture_pose_3d→ frames/grid;build_pose_stubturns them into a scroll stub whose camera anchors are synthesized guidance (the pose grid holds frames and scroll ratios, not camera transforms). Its frame loader dedupes same-index requests and discards stale decodes, so scrubbing cannot flash an older frame. For Three.js pages,capture_scene_3dwithadapters:["three"]adds reachable nodes/cameras/lights/controls toevidence.three;build_scene_stubreconstructs only Box/Plane/Sphere/Cylinder primitives with captured dimensions, standard/basic materials and a perspective camera from its exact matrix. Controls are never recreated, module-local scenes and parent transforms are not recovered, and unbound textures stay flat.scene.jsonframe references are basenames extracted from either Windows or POSIX paths. - Shader inspection:
capture_scene_3dwithadapters:["spector"](optionalspectorjs@0.9.33) captures one WebGL frame with command names/counts, statuses, context attributes and capped shader source. It needs a frame that actually draws; command arguments, results, state and raw capture are never transferred, and shader source is untrusted page text, not code to run. - Screenshots:
capture_live_siteon a document-scrolling page returns one full-page PNG + inline preview (your QA ground truth, not decoration); it waits out full-screen preloaders by default. Ifanalyze_page_structurereturnsscrollRoot, the page scrolls an inner container:capture_live_sitereturnsmode:"anchors"— six ordered viewport shots down that container (anchors[].scrollTop+file, JSON only, no inline image) — so read the six files, and drive the container'sscrollTopyourself for positions between them.scrollCapture:"viewport"forces a single viewport shot; never describe an anchors payload as one full-page image. - Tokens before build:
export_design_tokens <url>(optionalselector,viewport,maxNodesup to 2000,includecategories) → ordinal CSS variables + a Tailwind theme map derived from computed styles. Feed that CSS/Tailwind into the build instead of hand-guessing the palette and type scale;truncated/notessay when a cap was hit. - Image delivery:
analyze_images <url>→ format mix, lazy/eager/srcsetcoverage, broken/oversized/tiny images, alt coverage and samples (query strings stripped; no downloads). Use it to decide which reference images to copy, how to size them, and which need responsive variants. - Mechanism unknown after all evidence?
analyze_bundle <url>(≤40 chunks, 1 req/s, keyword grep, optional webcrack) — understand how, still write your own code. - API shape: export the network log as a HAR and run
analyze_network_capture <path>— grouped endpoints and path templates only, no bodies/headers/secrets. Already have the page open in Chrome?analyze_page_structurewithcdpEndpointscans it without driving it (requiresAWWWARDS_MCP_ATTACH=1; never navigates, scrolls, clicks or creates tabs).
Phase 2 — Build
- One HTML file + CSS + JS matching the reference's own approach: vanilla for static sites; GSAP + ScrollTrigger + Lenis when the DNA shows them.
- Wire motion from the measured values: census durations/easings/triggers,
gsapTriggerspixel start/end, keyframe from/to values, scrub curves. Do not invent easings the census didn't show. - Continuous-scroll narratives: fixed viewport-size stage + long invisible spacer + one scrubbed master timeline; layer switching and
--bgcustom property tweens; reduced-motion mode collapses to a calm stacked document (always ship it). - Three.js hero from
evidence.three: start frombuild_scene_stuband treatunresolved/authoredDefaultsas the work list. Only Box/Plane/Sphere/Cylinder meshes, standard/basic materials and a validated perspective camera from its exact matrix are recreated; captured controls are never recreated and stay unresolved, captured lights are recorded but not applied, unsupported types stay unresolved, and parent transforms are lost. A captured camera is static; the idle orbit is used only when the pack has no usable adapter scene. - Structure: semantic ids per section (
#hero,#work), localvendor/for libs (strict load order: gsap → ScrollTrigger → lenis → app.js), localassets/for fonts/audio/covers/images — exact assets, copied in. - All links
target="_blank" rel="noopener", metadata + OG + JSON-LD updated.
Phase 3 — QA gate (do not declare done without it)
- Playwright: 390, 768, 1024, 1440, 1728 widths; screenshot every scroll anchor (match the reference capture); compare compositions side by side. For inner-scroll pages (
scrollRoot), drive the container'sscrollTopat each anchor — the reference side is the sixcapture_live_sitemode:"anchors"files (or your own anchored shots); there is no single full-page image to compare against. - Zero console errors, zero 404s, zero horizontal overflow; assert element bounds (name width, card count/hrefs, contact block) at 1440 and 390.
- Reduced-motion pass at 1440: stacked layout, no overflow.
- Interaction parity:
verify_flow { buildUrl, referenceUrl, steps }replays the same 1–6 scroll/click/wait steps and reports per-stepsame/changed/unknown— use it when a menu, accordion, modal or hover-revealed panel is part of the reference; treatunknownas unverified, not as a pass. - 3D canvas:
verify_build { buildUrl, referenceUrl, scene3d: { referenceCaptureId, buildSelector } }replays the capture pack's checkpoints and compares clipped canvas frames. It preflights both URLs on one shared DNS/private-IP guard before the legacy scans (private/loopback is refused with zero requests, and the legacy acquisitions run behind the same proxy), and its deadline is the replayed checkpoint waits + 10 s headroom, floored at 15 s and capped at 45 s. Supply bothpixelThresholdandmaxChangedFractionfor a within/outside verdict; otherwise it reports metrics asinconclusive. The gate tags the canvas with a per-run random marker, so duplicate or pre-marked decoys are refused. The legacy band pass never certifies the canvas. - If anything drifts from the evidence, fix and re-shoot — one anchor at a time (section-loop discipline).
Phase 4 — Optional project conversion (ask first)
The rebuild is a valid deliverable on its own. After Phase 3 passes, ask the user:
Keep it as a single-file build, or convert it to a project — Vite (plain HTML/CSS/JS, no components), Astro (HTML components), or Next.js (React components)? And if converted, keep the original scripts or switch to authored motion (
--authored)?
Do not convert unprompted. Do not pick a framework for them. If they say "just build it", stop at Phase 3 + handoff.
When they choose:
awwwards-build-project <file.html> --target vite|astro|next --out <dir>→ native structure: real section components, shell chrome, split CSS (tokens.css+site.css), ordered libs, head metadata/boot replayed.- If they chose authored motion:
--authored --motion <census.json>— site logic scripts dropped, head boot + animation libs kept,motion.manifest.jsoncarries measured per-section + page triggers. Then author the motion (seemotion-authoring), recording any authored rows explicitly. - Gate:
npm install && npm run buildper target, serve, re-run Phase 3 anchors plus a 390×844 mobile smoke and reduced-motion; zero errors/404s.
Phase 5 — Handoff
Always deliver a reference report — even if the user only asked for information and no build: detected stack + libs (analyze_stack, get_motion_dna), section map with heights/backgrounds (bands), motion summary (triggers, easings, durations, scrub/pin), asset inventory (fonts, images, audio), and bundle notes when analyze_bundle ran. For non-Awwwards links this report is the value when a build is out of scope.
If a build was produced: README with run instructions, the mandatory study-build disclaimer (copyright belongs to the original owners; no deploy/publish/production use; not presented as your own), full provenance list of borrowed assets, and the replace-before-publish plan if the user later wants to ship. Report: reference URL, evidence tools used, section map, QA matrix results, residual gaps.
Known limits (say them out loud)
- Passive canvas capture is frames only.
capture_scene_3dwithadapters:["three"]reads only reachable globals; module-local scenes are invisible,build_scene_stubflattens meshes at the root so parent transforms are lost, and textures bind only when you hold a local file. Absence is not evidence of absence.adapters:["spector"]needs a frame that draws and reports only bounded command summaries plus capped shader text — no arguments, results, state, stack or raw capture. - Webflow IX2 / JS-driven initial states are recoverable as behavior evidence but not as their runtime — re-implement with your own JS (N2 authored mode proves the shape; vendor-bundle interpretation stays manual).
--authoredkeeps head inline scripts even if they may be site logic (warned when >2 KB or animation-looking) — verify before shipping.- Generator
pageTriggerscover unattributed census rows; a page-level hook still needs authoring before it animates. - Fonts: only ship if owned → self-host; otherwise match the closest licensed face.