AI ranking scroll SEO skill

AI ranking scroll SEO — ai-ranking-scroll-seo — Demo/output image published by the author in the repo (repo README): A 20-second scroll through a site built with this skill: living hero, flight map to Arkansas, the lot, a real-terrain 3D

Illustration · not a resultFrom the NicoSKOOL/ai-ranking-scroll-seo README — shows the whole collection, not only this skill.source ↗

Build premium scroll-driven websites that also rank: dimensional layered heroes, a bespoke signature move, restrained scroll motion, AND hard SEO gates (WebP-only images inside byte budgets, JSON-LD schema, the researched keyword in the title and H1, Lighthouse 95+ on performance, accessibility, best practices and SEO on mobile and desktop, and agentic browsing readiness with llms.txt and WebMCP).

by NicoSKOOL·MIT license·★ 7 Stars on the repo·GitHub ↗

Use now

Files of AI ranking scroll SEO

NicoSKOOL/main1 file shown
SKILL.md
Show the full text517 lines

ai-ranking-scroll-seo

Scroll is the only input every visitor already knows how to use. This skill treats it as a timeline: the wheel is a scrubber, the page is a film with real text on top, and each section behaves differently enough that the visitor keeps going to find out what the next one does.

What you produce: an interview brief, a page grammar, a customer-journey map, a feeling curve with one engineered peak, a scroll score, one signature move, generated assets, one real HTML page on a token-driven design floor, and a strip of screenshots proving it holds up at every scroll position.

The five gates (AI Ranking additions)

A page is not done when it looks good. It is done when these five pass, on every language route, mobile and desktop. Read references/seo-performance.md before Step 1 and plan for them from the start; retrofitting speed onto a finished scroll page is the expensive way.

  1. Speed and images: WebP only, responsive srcset, width/height on every image, phone-size files inside budgets (optimize-images.mjs).
  2. Schema: JSON-LD graph for the business type, nothing claimed that is not visible (references/schema.md).
  3. Keywords: one researched primary keyword per language in the <title> and the single <h1> (verify-seo.mjs).
  4. Lighthouse ≥ 95 on all four categories (lighthouse-gate.mjs).
  5. Agentic browsing: content without JS, real controls, llms.txt, WebMCP on the main action (references/agentic.md).

Multi-language builds use the Astro output mode (references/i18n.md). High-trust businesses run in trust mode (references/trust-mode.md). For land, real estate and construction, the 3D exploded parcel device (real USGS terrain, a lot that lifts out into labelled layers) is in references/exploded-parcel.md with a ready scene in templates/exploded-parcel.ts.

What this is not

It is not "generate a flythrough and drop text on it." That approach produces one device applied to a whole page, and every site built that way is recognisable at a glance: same claymation diorama, same centred copy, same 01 / 06 counter, same "scroll to explore" nudge. Five sections that behave identically are one section shown five times.

Four rules follow from that, and they are the spine of this skill:

  1. Variety is the product. A page uses at least four device families and never the same device twice in a row. Read references/devices.md.
  2. The world is photographic unless the brand is genuinely illustrated. Soft matte low-poly clay diorama is banned as a default. Read references/worlds.md.
  3. No continuous chain. A single unbroken camera flight is the most expensive and most fragile thing you can build, and it exists only to hide cuts between scenes. Vary the device instead and the cut disappears for free, because the visitor is not watching one film. Chain only when the brief is literally "one continuous journey."
  4. A different world is not a different page. The device kit varies how a page looks. Structure is a separate axis, and it has to be decided deliberately or every build inherits the same skeleton. The first four builds did exactly that. Read references/uniqueness.md.

House rule: the layered hero

Dimensional layering is a baseline requirement for a premium marketing hero. Plan independently moving background, subject, foreground, and atmospheric planes before requesting assets. A beautiful single background with text fades does not satisfy this preference. Depth must come from visible separation, occlusion, and controlled differences in movement, while the headline stays readable and the scene tells one clear story.

Read references/hero-depth.md before planning the hero or generating its assets. It covers clean plates, genuine alpha cutouts, shared contact anchors, typography between planes, restrained scroll choreography, mobile art direction, and visual acceptance, with the approved Sonder example. Use the composition that fits the chosen grammar; do not repeat Sonder's scene or impose pinning on a grammar that forbids it. Honor explicit static or simpler directions, and keep depth in the static composition when motion is reduced.

Approved collection standard

Read references/approved-collection.md before planning a premium marketing site. It distills the ten-site reference rebuild approved: real brand research, layer contracts, meaningful pointer/scroll depth, appropriate photographic or 3D rendering, distinct navigation and endings, useful interactions, mobile art direction, and evidence from the final package. These are execution principles and worked examples, not a reusable page skeleton.

Step 0: The brief and creative authority

Establish the brief before generating anything. Reuse answers and assets already provided. When the user explicitly delegates creative direction (for example, "use your judgment" or "I want to get out of your way"), write a Self-authored under explicit creative delegation brief and proceed. Cover the eight topics below, distinguish evidence from assumptions, and do not invent user quotations or force another interview/approval checkpoint.

Otherwise, interview for the missing decisions. Ask actual questions, record the answers, and avoid inferring an entire brand from its name.

The skill is a range instrument, not a house style. The human brings intent and whatever assets they own; the interview is where that turns into the right kind of page: one unbroken world, distinct scenes, printed chapters, a live surface. The skill can do any of them. The interview decides which.

Keep it short. Eight questions, asked in one pass:

  1. Vibe in three to five words, plus up to three references from any medium. A film, an album cover, a shop, a magazine, a game. Not "sites you like": naming sites is how a page ends up looking like an existing site.
  2. The scroll journey, section by section, in their words. What the visitor should hit first, what comes next, what the last thing is. Their sequence, not a menu you offered.
  3. The energy curve. Where it should feel calm, where it should feel intense. A page that is loud the whole way is as flat as one that is quiet the whole way.
  4. How should someone feel while scrolling, stage by stage, and what is the ONE moment they should remember? Energy is loudness. This is emotion, and the two do not line up: on a loud page the quiet act can be the most intense. The stage-by-stage answer becomes the feeling curve, the one moment becomes the peak. Both are required in BRIEF.md. See references/feel.md.
  5. One thing this site should do that no site they have seen does. This is the seed of the signature move. Push for a real answer; "be memorable" is not one.
  6. How far from premium-minimal they want to go. Offer the range in uniqueness.md §5: brutalist, maximalist, playful, retro, dense, editorial, premium-minimal. Their answer governs the aesthetic family, not your taste.
  7. One unbroken world, or distinct scenes? Should the whole page feel like one continuous place the scroll flies through (worldflight, see references/worldflight.md), or like separate scenes, chapters, or cuts? This is the single biggest structural fork, and it is their call, not a device you pick later. Offer both plainly; neither is the default.
  8. What assets do they already have? Footage, photos, product shots, a brand kit, clips of themselves. Real assets anchor the world and cut generation cost; the answer decides what gets graded and encoded versus generated. "Nothing" is a fine answer and means a fully generated world.

Write the answers into <workspace>/builds/<name>/BRIEF.md before any act planning, in their words, not paraphrased into marketing prose. Everything downstream reads from that file.

BRIEF.md must contain, at minimum:

  • The eight topics, with verbatim user answers where supplied and clearly labeled authored decisions where delegated.
  • The feeling curve. One line per act: the emotion, then what on screen causes it. Written before the acts exist, added to as the score fills in.
  • The peak. The one moment, written as the sentence a visitor would say to a friend, plus which act it lives in.
  • The completed tell-someone sentence. "It's the site where ___", filled with an experience, not a device name.
  • Any authored silence, so the verification pass can tell it from dead scroll.

references/feel.md is the spec for all four.

If the human is genuinely unreachable and the run is fully autonomous, write BRIEF.md yourself: answer all eight questions in the brand's voice, mark the file Self-authored, not interviewed at the top, and say so in the final report. A self-authored brief without delegation is a fallback. Explicit delegation above is a normal supported workflow and does not require the human to be unreachable.

Bootstrap

Environment, not a stage of the work. Do it once the interview is answered and before Step 1.

Run the preflight rather than checking by hand. It knows the failure modes that otherwise surface later as misleading errors, chiefly a stripped ffmpeg that reports a missing filter as a syntax error in your command:

node <skill>/scripts/doctor.mjs

It reports node, a full ffmpeg build, playwright and Chrome, the API key, and the resolved workspace. Required failures exit non-zero. Say plainly which items are missing rather than working around them silently.

The workspace

Builds and the fingerprint registry live in one directory, and it is resolved, never assumed:

node <skill>/scripts/workspace.mjs --ensure     # prints it, creates it, seeds the registry

Resolution order, first hit wins:

  1. SCROLLCRAFT_HOME
  2. the nearest .scrollcraft.json walking up from the cwd, { "workspace": "..." }
  3. <project root>/scrollcraft, where the project root is the nearest ancestor holding a .git

So a build folder is <workspace>/builds/<name>/ and the registry is <workspace>/FINGERPRINTS.md. The registry starts empty: the gate exists to stop you repeating yourself, so your first build has nothing to clear.

If you already keep builds somewhere else, drop a .scrollcraft.json at your project root pointing at it and nothing moves.

The rest
  1. KIE_AI_API_KEY, only if you are generating assets. A build from the user's own photos and footage needs no key and no spend, and that is a first-class route, not a fallback. Confirm balance with node <skill>/scripts/kie.mjs probe. A still costs cents and a 5s clip costs more; a six-act page with two clips is a small spend, not a large one.
  2. A brand kit if one exists (colours, logo, type, existing product shots). If the brand has a folder in this repo, read it before generating anything, and obey its hard rules. A brand that forbids invented numbers means no stat counters, however good they look.

Copy engine/scrollcraft.js and engine/scrollcraft.css into the build folder. Never edit the engine per-project; it is the mechanism. Theme it with tokens and write your own markup.

Step 1: The brief, journey first

The subject is the user's to state. Ask it open, in plain prose, never as a fabricated multiple-choice list of industries: a made-up menu biases them and reads as you deciding their business for them.

Step 0 already covered vibe, sequence, energy and range. Do not ask any of it again. Ask only what you cannot sensibly default:

  1. What is this, and who is it for? One or two sentences in their words.
  2. What must the visitor believe by the end? The single sentence the page exists to install. Not a feature list. If they give three, make them pick.
  3. What does the visitor do next? One action. One label for it, used everywhere on the page.
  4. What do you already have? Logo, palette, photography, product shots, footage, a brand doc. Real assets beat generated ones every time.
  5. Art direction: offer the worlds in references/worlds.md as a real choice, and say they can go their own way.

Then write the journey before anything else: four to seven beats, each one a shift in what the visitor knows or feels.

1  Recognition   they see their own morning
2  Tension       the cost of it, named plainly
3  Turn          the thing that changes
4  Substance     why it holds up
5  Range         what they can choose
6  Commitment    the one action

Beats are the spine. Sections serve beats; a section that serves no beat is cut, however nice the shot is. Resolve the journey before generating assets. Show it to the user when their decisions are needed; under explicit creative delegation, record the chosen journey and proceed within the authorized scope.

Step 2: Grammar, gate, then score

Three things in order, and the first two come before any act planning. Full detail in references/uniqueness.md.

Pick a grammar. Start with the eight defined grammars and their constraints. A new grammar is allowed when its navigation, sequence, ending, and explicit bans describe a different structure; a new label alone earns no credit. Filmic one-shot is the one the first four builds all used, so choosing it again means saying in the report why the other seven did not fit the interview. Nav, hero and close all follow from the grammar; they are not decided separately.

Invent the signature move. One bespoke interaction that lives on this site alone, coded in the page, not a parameter change to a kit device. Question 5 of the interview is the seed. The engine stays untouched.

Run the fingerprint gate. Read your registry at <workspace>/FINGERPRINTS.md (see The workspace in Bootstrap; run node <skill>/scripts/workspace.mjs to print the path). The planned build must differ from every existing row on at least 4 of 6 dimensions: grammar, nav treatment, hero device, act-sequence shape, close pattern, signature move. Four against each row individually. If it fails, change the plan, not the log.

Write the feeling curve before the score table. One line per act: the emotion, then what causes it. Curve first, acts second, because a device chosen before the feeling is a device looking for a reason. Two adjacent acts with the same feeling means one is filler, and it is cheaper to cut it here than after the assets exist. Name the peak in the same pass and give it the largest span on the page. Full method in references/feel.md.

Then assign each beat a device. Do it deliberately and write it down as a table:

Beat Device Why this one
Recognition scrub The camera moving under the reader's own hand is the strongest possible open
Tension pin + kinetic Copy assembles line by line while the frame holds still
Turn reveal A wipe is a change of state, which is what this beat is
Substance scrub (macro) Texture at a scale the eye cannot get otherwise
Range pan Lateral travel reads as "options", vertical reads as "argument"
Commitment pin + pointer The page stops moving and starts responding

That table is a filmic score. It is the right shape for one grammar and the wrong shape for the other seven, so read your grammar's leans-on and bans list before filling in a row.

Checks before you build:

  • The grammar's bans hold. A grammar that forbids pin forbids it here too, however well it would have worked.
  • Four or more distinct device families. Fewer means the page has one idea.
  • No device family twice in a row.
  • At most two scrub acts. Video is the heaviest thing on the page, and the third one stops being a surprise.
  • No two adjacent acts carry the same feeling. If they do, one is filler.
  • One act is the peak and it has the largest span by a visible margin. The act before it is quieter than it is.
  • Every act earns its scroll span. Eight to fourteen viewport-heights is a pacing reference for longer cinematic pages, not a quota. Shorter editorial, gallery, or working-surface grammars should stay short when the journey is complete. Never add filler or empty pinning to hit a length target.
  • The act count and total length do not land in the 6-to-7 acts at 13.6-13.8vh band that all four prior builds hit. That band is a fingerprint dimension now.

Step 3: Generate the assets

Full pipeline, prompt scaffolds and model notes: references/assets.md.

fal.ai route (default for this skill): FAL_KEY in the env or a .env. GPT Image 2.5 Flare produces genuine alpha with --transparent, which is what layered hero planes need:

node <skill>/scripts/fal.mjs still "$(cat assets/STYLE.txt)\n\nBACK PLATE ONLY: ..." assets/masters/hero-back.png --size 2048x1152 --manifest /tmp/m/back.json
node <skill>/scripts/fal.mjs still "...ISOLATED MID LAYER ON A TRANSPARENT BACKGROUND..." assets/masters/hero-mid.png --size 2048x1152 --transparent --manifest /tmp/m/mid.json
node <skill>/scripts/fal.mjs still "Same place ... top-down over ONE lot" assets/masters/lot.png --ref assets/masters/aerial.png
node <skill>/scripts/optimize-images.mjs --in assets/masters --out public/img --budgets assets/budgets.json
# 3D props and a living back plate (see exploded-parcel.md and hero-depth.md)
node <skill>/scripts/fal.mjs model assets/models/src/house.png assets/models/raw/house.glb [--endpoint fal-ai/tripo3d/p2/image-to-3d]
node <skill>/scripts/fal.mjs video assets/video/back.jpg assets/video/raw.mp4 "Locked-off tripod shot..." --duration 10 --loop

Give each parallel call its own manifest file and merge afterwards; concurrent writes to one manifest lose entries. Composite the planes over magenta to inspect the alpha before building. Crop portrait -m masters for the phone hero (see seo-performance.md §2).

Short version:

node <skill>/scripts/kie.mjs still "<style preamble>\n\n<scene>" out/01-hero.png --ar 16:9 [--ref brand-can.png]
node <skill>/scripts/kie.mjs shot  "<camera move>" out/01-hero.png out/01.mp4 --dur 5
bash  <skill>/scripts/encode.sh out/01.mp4 assets/01.mp4
bash  <skill>/scripts/encode.sh out/01.mp4 assets/01-m.mp4 mobile

Four things that decide whether this looks premium or generated:

  • One style preamble, reused verbatim in every prompt. This is what makes six separate images look like one shoot. Write it once, never paraphrase it.
  • Look at every asset before you use it. Read the PNG. Generation is cheap and rerolling is cheaper than shipping a bad frame.
  • Encode for scrubbing, not playback. encode.sh sets a dense GOP because seeking walks from the previous keyframe. A normal web encode plays perfectly and scrubs like mud.
  • Layer the hero. Cut the scene into planes that scroll at slightly different rates, with the product parked between the mid and foreground planes. Depth from differential movement is the cheapest premium signal on the page. The recipe and its traps are under parallax in references/devices.md.

Step 4: Build the page

Write real HTML. Real <h1>, real <p>, real links, real reading order. The engine reads data-sc-* attributes off your markup and drives it; it never generates DOM. A runtime that builds the page from a config object is exactly why every site built on one looks the same.

Start from references/template.html. The device patterns are in references/devices.md; the spacing, type, depth and colour rules are in references/taste.md. Read taste.md before writing markup, not after, and build without announcing the checklist.

Theme by overriding tokens, six values and two fonts:

:root {
  --sc-canvas: #0A0806;  --sc-surface: #16110E;
  --sc-ink:    #F5EBDD;  --sc-ink-soft: #A2968A;
  --sc-accent: #FF5A3D;  --sc-accent-ink: #15110F;
  --sc-font-display: "Archivo", system-ui, sans-serif;
  --sc-font-text:    "Geist", system-ui, sans-serif;
}

Step 5: Verify by scrolling it

Apply the final-source and deployment checks in approved-collection.md §7. Use safe headless automation with native pointer lock/capture disabled in every context. Inspect actual pixels, phone compositions, and intermediate states; test useful controls, downloads, and form outcomes in the final package.

Not optional, and not "it should work." A scroll page has no single state: every position is a different frame, and the failures live between the two you happened to look at. Full procedure: references/verify.md.

cd <build project> && npm i playwright-core     # once
node <skill>/scripts/serve.mjs --root . --port 4500 &
node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/shots
node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/mobile --width 390 --height 844
node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/reduced --reduced-motion

The harness walks each act at six positions, waits for the scrub video to actually settle, and reports dead scroll, cues that never reach full opacity, and contrast measured on the composited page at the brightest frame under each line. It writes a contact sheet.

Then do the part the harness cannot: read sheet.png. It proves a clip advances; it cannot tell you the composition is good, the motion is smooth, or the page means anything. Also tab through for focus order.

Then run the feel check (references/feel.md §6). Scroll the page cold, write one word per act for what you felt, and only then open BRIEF.md and diff it against the intended curve. Where they disagree the page is wrong, not the brief. Confirm on the sheet that the peak is the largest visual change and holds the most scroll room, and that the last screen resolves instead of fading to nothing.

And say what a green run does not cover: a real phone. Headless Chrome cannot reproduce an iPhone's video decoder, autoplay policy, Low Power Mode, or touch scrolling; a build once shipped four green rounds while the hero clip sat frozen on the actual device. Mobile is a first-class target throughout, not a pass at the end: portrait phone clips, touch-tuned lerp, grown tap targets are all authored (see assets.md and verify.md). When any mobile defect is reported, deploy references/device-diag.html beside the site on the first round and let the device answer, rather than theorising from a machine that cannot reproduce the failure. The full iOS clip-lifecycle notes live in verify.md, "The phone is a different machine".

Then run the gates (seo-performance.md): verify-seo.mjs on the build, deploy to staging, lighthouse-gate.mjs --staging --runs 3 on every language route. A gate failure is fixed in the page AND, if it was a gap in this skill, in the skill (reference text, script or engine) with a CHANGELOG entry.

shoot.mjs waits for the engine, so it cannot shoot the static mode. Check reduced motion and no-JS with a plain Playwright full-page screenshot (reducedMotion: 'reduce', javaScriptEnabled: false).

Fix what you found and shoot it again. Report what you actually verified and what you did not.

Hard rules

Ship-blockers, not preferences. Each one is a thing that makes a page read as machine-made.

Never Instead
Clay diorama / low-poly / claymation as the default world Photographic. See worlds.md
A "scroll" cue, arrow, or animated mouse icon Nothing. They are looking at the hero; they know
01 / 06 section counters Delete them. Sequence is not information here
An eyebrow above every section heading At most one per three sections. The heading carries itself
Em dash anywhere visible Period, comma, colon, or parentheses
Centred copy in every act Vary the anchor: lead, trail, centre, split
The same device twice in a row Score the journey properly in Step 2
Generating before the brief and creative authority are clear Run Step 0. Record actual answers or explicitly delegated authored decisions in BRIEF.md
A page with no engineered peak, or with three competing ones One peak. It gets the asset budget, the silence before it, and the most scroll room. See feel.md §2
An ending that trails off, fades out, or just becomes a footer The close resolves and holds. The last feeling is the one they carry
Planning acts before the feeling curve exists Curve first, devices second. See feel.md §1
Shipping without one bespoke signature move Invent one. A recoloured spotlight or a retuned tilt is not one. See uniqueness.md §3
A build that clears fewer than 4 of 6 fingerprint dimensions against any existing row Change the plan, not FINGERPRINTS.md
Editing the engine to get a bespoke behaviour Bespoke JS in the page, driven off --sc-p and your own data-sc-*
Reaching for filmic one-shot because it is what the last build did Pick from all eight grammars, and say why the other seven lost
A full-frame dark overlay to fix contrast A scrim only where the text sits
Text baked into a generated image Real markup, always. It is selectable, translatable and sharp
Invented statistics in a counter Only real numbers. No number, no counter
transition: all, or animating width/height/top/left transform and opacity; clip-path for wipes
Gradient text, neon glow, zero-offset coloured halo shadows Weight and size for emphasis; shadows with offset and blur
Autoplaying audio, or any audio at all on a scrub clip Strip the track. encode.sh already does
Shipping without running Step 5 Run Step 5
Content hidden until JS runs, for everyone Gate hiding on html.sc-js; the default CSS is a complete static document
A section class that sets position on a [data-sc-stage] Leave stage positioning to the engine; the page CSS forces position: sticky under .sc-js
A keyword chosen by feel Search volumes per language first, then the H1
A 16:9 hero plane served to a portrait phone <picture> with a portrait -m crop at 640w
Any JPG/PNG in the build WebP via optimize-images.mjs
A generated place/product shown without "illustrative" Trust-mode caption
Lighthouse measured once on a cold cache --runs 3 median after one warming request

Output

The build folder, including BRIEF.md, then a short report: the grammar and why the other seven lost, the signature move, the fingerprint gate result against each existing row, the five gate results (Lighthouse table per route and form factor, verify-seo summary), the journey, the feeling curve and the peak, the feel-check diff (intended curve against felt curve, and what you changed), the score table (device per beat), what you generated, what you verified with screenshots, and anything you could not verify. Say if the brief was self-authored rather than interviewed. Give the local URL. Keep it brief; the page is the deliverable.

Then append the build's row to <workspace>/FINGERPRINTS.md.

Changes to the skill itself, and the build findings that drove them, are logged in CHANGELOG.md.

1---
2name: ai-ranking-scroll-seo
3description: >
4 Build premium scroll-driven websites that also rank: dimensional layered
5 heroes, a bespoke signature move, restrained scroll motion, AND hard SEO gates
6 (WebP-only images inside byte budgets, JSON-LD schema, the researched keyword
7 in the title and H1, Lighthouse 95+ on performance, accessibility, best
8 practices and SEO on mobile and desktop, and agentic browsing readiness with
9 llms.txt and WebMCP). Multi-language via Astro. Generates photoreal assets via
10 fal.ai (GPT Image 2.5) or kie.ai, captioned as illustrative in trust mode.
11 Use for "scroll site", "scroll animation website", "premium hero", "layered
12 hero", "cinematic landing page", "scrollytelling", "Apple-style landing page",
13 "a site that feels like an experience", or any request for a wow website that
14 must also load fast and rank.
15allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion, WebFetch
16---
17 
18# ai-ranking-scroll-seo
19 
20Scroll is the only input every visitor already knows how to use. This skill
21treats it as a timeline: the wheel is a scrubber, the page is a film with real
22text on top, and each section behaves differently enough that the visitor keeps
23going to find out what the next one does.
24 
25**What you produce:** an interview brief, a page grammar, a customer-journey map,
26a feeling curve with one engineered peak, a scroll score, one signature move,
27generated assets, one real HTML page on a token-driven design floor, and a strip
28of screenshots proving it holds up at every scroll position.
29 
30## The five gates (AI Ranking additions)
31 
32A page is not done when it looks good. It is done when these five pass, on every
33language route, mobile and desktop. Read [references/seo-performance.md](references/seo-performance.md)
34before Step 1 and plan for them from the start; retrofitting speed onto a
35finished scroll page is the expensive way.
36 
371. **Speed and images:** WebP only, responsive `srcset`, width/height on every
38 image, phone-size files inside budgets (`optimize-images.mjs`).
392. **Schema:** JSON-LD graph for the business type, nothing claimed that is not
40 visible ([references/schema.md](references/schema.md)).
413. **Keywords:** one researched primary keyword per language in the `<title>`
42 and the single `<h1>` (`verify-seo.mjs`).
434. **Lighthouse ≥ 95** on all four categories (`lighthouse-gate.mjs`).
445. **Agentic browsing:** content without JS, real controls, llms.txt, WebMCP on
45 the main action ([references/agentic.md](references/agentic.md)).
46 
47Multi-language builds use the Astro output mode ([references/i18n.md](references/i18n.md)).
48High-trust businesses run in trust mode ([references/trust-mode.md](references/trust-mode.md)).
49For land, real estate and construction, the 3D **exploded parcel** device (real
50USGS terrain, a lot that lifts out into labelled layers) is in
51[references/exploded-parcel.md](references/exploded-parcel.md) with a ready scene
52in `templates/exploded-parcel.ts`.
53 
54## What this is not
55 
56It is not "generate a flythrough and drop text on it." That approach produces
57one device applied to a whole page, and every site built that way is
58recognisable at a glance: same claymation diorama, same centred copy, same
59`01 / 06` counter, same "scroll to explore" nudge. Five sections that behave
60identically are one section shown five times.
61 
62Four rules follow from that, and they are the spine of this skill:
63 
641. **Variety is the product.** A page uses at least four device families and
65 never the same device twice in a row. Read [references/devices.md](references/devices.md).
662. **The world is photographic unless the brand is genuinely illustrated.**
67 Soft matte low-poly clay diorama is banned as a default. Read
68 [references/worlds.md](references/worlds.md).
693. **No continuous chain.** A single unbroken camera flight is the most
70 expensive and most fragile thing you can build, and it exists only to hide
71 cuts between scenes. Vary the device instead and the cut disappears for free,
72 because the visitor is not watching one film. Chain only when the brief is
73 literally "one continuous journey."
744. **A different world is not a different page.** The device kit varies how a
75 page looks. Structure is a separate axis, and it has to be decided
76 deliberately or every build inherits the same skeleton. The first four builds
77 did exactly that. Read [references/uniqueness.md](references/uniqueness.md).
78 
79## House rule: the layered hero
80 
81**Dimensional layering is a baseline requirement for a premium marketing hero.**
82Plan independently moving background, subject, foreground, and atmospheric
83planes before requesting assets. A beautiful single background with text fades
84does not satisfy this preference. Depth must come from visible separation,
85occlusion, and controlled differences in movement, while the headline stays
86readable and the scene tells one clear story.
87 
88Read [references/hero-depth.md](references/hero-depth.md) before planning the hero
89or generating its assets. It covers clean plates, genuine alpha cutouts, shared
90contact anchors, typography between planes, restrained scroll choreography,
91mobile art direction, and visual acceptance, with the approved Sonder example.
92Use the composition that fits the chosen grammar; do not repeat Sonder's scene
93or impose pinning on a grammar that forbids it. Honor explicit static or simpler
94directions, and keep depth in the static composition when motion is reduced.
95 
96## Approved collection standard
97 
98Read [references/approved-collection.md](references/approved-collection.md)
99before planning a premium marketing site. It distills the ten-site reference rebuild
100approved: real brand research, layer contracts, meaningful pointer/scroll depth,
101appropriate photographic or 3D rendering, distinct navigation and endings,
102useful interactions, mobile art direction, and evidence from the final package.
103These are execution principles and worked examples, not a reusable page skeleton.
104 
105## Step 0: The brief and creative authority
106 
107**Establish the brief before generating anything.** Reuse answers and assets
108already provided. When the user explicitly delegates creative direction (for
109example, "use your judgment" or "I want to get out of your way"), write a
110`Self-authored under explicit creative delegation` brief and proceed. Cover the
111eight topics below, distinguish evidence from assumptions, and do not invent
112user quotations or force another interview/approval checkpoint.
113 
114Otherwise, interview for the missing decisions. Ask actual questions, record
115the answers, and avoid inferring an entire brand from its name.
116 
117The skill is a range instrument, not a house style. The human brings intent and
118whatever assets they own; the interview is where that turns into the right kind
119of page: one unbroken world, distinct scenes, printed chapters, a live surface.
120The skill can do any of them. The interview decides which.
121 
122Keep it short. Eight questions, asked in one pass:
123 
1241. **Vibe in three to five words**, plus up to three references from any medium.
125 A film, an album cover, a shop, a magazine, a game. Not "sites you like":
126 naming sites is how a page ends up looking like an existing site.
1272. **The scroll journey, section by section, in their words.** What the visitor
128 should hit first, what comes next, what the last thing is. Their sequence,
129 not a menu you offered.
1303. **The energy curve.** Where it should feel calm, where it should feel
131 intense. A page that is loud the whole way is as flat as one that is quiet
132 the whole way.
1334. **How should someone feel while scrolling, stage by stage, and what is the
134 ONE moment they should remember?** Energy is loudness. This is emotion, and
135 the two do not line up: on a loud page the quiet act can be the most intense.
136 The stage-by-stage answer becomes the feeling curve, the one moment becomes
137 the peak. Both are required in BRIEF.md. See [references/feel.md](references/feel.md).
1385. **One thing this site should do that no site they have seen does.** This is
139 the seed of the signature move. Push for a real answer; "be memorable" is not
140 one.
1416. **How far from premium-minimal they want to go.** Offer the range in
142 [uniqueness.md §5](references/uniqueness.md): brutalist, maximalist, playful,
143 retro, dense, editorial, premium-minimal. Their answer governs the aesthetic
144 family, not your taste.
1457. **One unbroken world, or distinct scenes?** Should the whole page feel like
146 one continuous place the scroll flies through (worldflight, see
147 [references/worldflight.md](references/worldflight.md)), or like separate
148 scenes, chapters, or cuts? This is the single biggest structural fork, and it
149 is their call, not a device you pick later. Offer both plainly; neither is
150 the default.
1518. **What assets do they already have?** Footage, photos, product shots, a
152 brand kit, clips of themselves. Real assets anchor the world and cut
153 generation cost; the answer decides what gets graded and encoded versus
154 generated. "Nothing" is a fine answer and means a fully generated world.
155 
156Write the answers into `<workspace>/builds/<name>/BRIEF.md` before any act planning, in
157their words, not paraphrased into marketing prose. Everything downstream reads
158from that file.
159 
160BRIEF.md must contain, at minimum:
161 
162- The eight topics, with verbatim user answers where supplied and clearly labeled authored decisions where delegated.
163- **The feeling curve.** One line per act: the emotion, then what on screen
164 causes it. Written before the acts exist, added to as the score fills in.
165- **The peak.** The one moment, written as the sentence a visitor would say to
166 a friend, plus which act it lives in.
167- **The completed tell-someone sentence.** "It's the site where ___", filled
168 with an experience, not a device name.
169- Any authored silence, so the verification pass can tell it from dead scroll.
170 
171[references/feel.md](references/feel.md) is the spec for all four.
172 
173**If the human is genuinely unreachable** and the run is fully autonomous, write
174BRIEF.md yourself: answer all eight questions in the brand's voice, mark the file
175`Self-authored, not interviewed` at the top, and say so in the final report. A
176self-authored brief without delegation is a fallback. Explicit delegation above
177is a normal supported workflow and does not require the human to be unreachable.
178 
179## Bootstrap
180 
181Environment, not a stage of the work. Do it once the interview is answered and
182before Step 1.
183 
184**Run the preflight rather than checking by hand.** It knows the failure modes
185that otherwise surface later as misleading errors, chiefly a stripped ffmpeg
186that reports a missing filter as a syntax error in your command:
187 
188```bash
189node <skill>/scripts/doctor.mjs
190```
191 
192It reports node, a full ffmpeg build, playwright and Chrome, the API key, and
193the resolved workspace. Required failures exit non-zero. Say plainly which items
194are missing rather than working around them silently.
195 
196### The workspace
197 
198Builds and the fingerprint registry live in one directory, and **it is resolved,
199never assumed**:
200 
201```bash
202node <skill>/scripts/workspace.mjs --ensure # prints it, creates it, seeds the registry
203```
204 
205Resolution order, first hit wins:
206 
2071. `SCROLLCRAFT_HOME`
2082. the nearest `.scrollcraft.json` walking up from the cwd, `{ "workspace": "..." }`
2093. `<project root>/scrollcraft`, where the project root is the nearest ancestor
210 holding a `.git`
211 
212So a build folder is `<workspace>/builds/<name>/` and the registry is
213`<workspace>/FINGERPRINTS.md`. The registry starts **empty**: the gate exists to
214stop you repeating yourself, so your first build has nothing to clear.
215 
216If you already keep builds somewhere else, drop a `.scrollcraft.json` at your
217project root pointing at it and nothing moves.
218 
219### The rest
220 
2211. `KIE_AI_API_KEY`, **only if you are generating assets.** A build from the
222 user's own photos and footage needs no key and no spend, and that is a
223 first-class route, not a fallback. Confirm balance with
224 `node <skill>/scripts/kie.mjs probe`. A still costs cents and a 5s clip costs
225 more; a six-act page with two clips is a small spend, not a large one.
2262. A brand kit if one exists (colours, logo, type, existing product shots). If
227 the brand has a folder in this repo, read it before generating anything, and
228 obey its hard rules. A brand that forbids invented numbers means no stat
229 counters, however good they look.
230 
231Copy `engine/scrollcraft.js` and `engine/scrollcraft.css` into the build folder.
232Never edit the engine per-project; it is the mechanism. Theme it with tokens and
233write your own markup.
234 
235## Step 1: The brief, journey first
236 
237The subject is the user's to state. Ask it open, in plain prose, never as a
238fabricated multiple-choice list of industries: a made-up menu biases them and
239reads as you deciding their business for them.
240 
241Step 0 already covered vibe, sequence, energy and range. Do not ask any of it
242again. Ask only what you cannot sensibly default:
243 
2441. **What is this, and who is it for?** One or two sentences in their words.
2452. **What must the visitor believe by the end?** The single sentence the page
246 exists to install. Not a feature list. If they give three, make them pick.
2473. **What does the visitor do next?** One action. One label for it, used
248 everywhere on the page.
2494. **What do you already have?** Logo, palette, photography, product shots,
250 footage, a brand doc. Real assets beat generated ones every time.
2515. **Art direction**: offer the worlds in [references/worlds.md](references/worlds.md)
252 as a real choice, and say they can go their own way.
253 
254Then write the **journey** before anything else: four to seven beats, each one a
255shift in what the visitor knows or feels.
256 
257```
2581 Recognition they see their own morning
2592 Tension the cost of it, named plainly
2603 Turn the thing that changes
2614 Substance why it holds up
2625 Range what they can choose
2636 Commitment the one action
264```
265 
266Beats are the spine. Sections serve beats; a section that serves no beat is cut,
267however nice the shot is. Resolve the journey before generating assets. Show it
268to the user when their decisions are needed; under explicit creative delegation,
269record the chosen journey and proceed within the authorized scope.
270 
271## Step 2: Grammar, gate, then score
272 
273Three things in order, and the first two come before any act planning. Full
274detail in [references/uniqueness.md](references/uniqueness.md).
275 
276**Pick a grammar.** Start with the eight defined grammars and their constraints.
277A new grammar is allowed when its navigation, sequence, ending, and explicit
278bans describe a different structure; a new label alone earns no credit. Filmic one-shot is the one the first four
279builds all used, so choosing it again means saying in the report why the other
280seven did not fit the interview. Nav, hero and close all follow from the
281grammar; they are not decided separately.
282 
283**Invent the signature move.** One bespoke interaction that lives on this site
284alone, coded in the page, not a parameter change to a kit device. Question 5 of
285the interview is the seed. The engine stays untouched.
286 
287**Run the fingerprint gate.** Read your registry at
288`<workspace>/FINGERPRINTS.md` (see **The workspace** in Bootstrap; run
289`node <skill>/scripts/workspace.mjs` to print the path). The planned build must differ
290from **every** existing row on at least 4 of 6 dimensions: grammar, nav
291treatment, hero device, act-sequence shape, close pattern, signature move. Four
292against each row individually. If it fails, change the plan, not the log.
293 
294**Write the feeling curve before the score table.** One line per act: the
295emotion, then what causes it. Curve first, acts second, because a device chosen
296before the feeling is a device looking for a reason. Two adjacent acts with the
297same feeling means one is filler, and it is cheaper to cut it here than after
298the assets exist. Name the peak in the same pass and give it the largest span on
299the page. Full method in [references/feel.md](references/feel.md).
300 
301Then assign each beat a device. Do it deliberately and write it down as a table:
302 
303| Beat | Device | Why this one |
304|---|---|---|
305| Recognition | `scrub` | The camera moving under the reader's own hand is the strongest possible open |
306| Tension | `pin` + kinetic | Copy assembles line by line while the frame holds still |
307| Turn | `reveal` | A wipe is a change of state, which is what this beat is |
308| Substance | `scrub` (macro) | Texture at a scale the eye cannot get otherwise |
309| Range | `pan` | Lateral travel reads as "options", vertical reads as "argument" |
310| Commitment | `pin` + pointer | The page stops moving and starts responding |
311 
312That table is a **filmic** score. It is the right shape for one grammar and the
313wrong shape for the other seven, so read your grammar's leans-on and bans list
314before filling in a row.
315 
316Checks before you build:
317 
318- The grammar's bans hold. A grammar that forbids `pin` forbids it here too,
319 however well it would have worked.
320- Four or more distinct device families. Fewer means the page has one idea.
321- No device family twice in a row.
322- At most two `scrub` acts. Video is the heaviest thing on the page, and the
323 third one stops being a surprise.
324- No two adjacent acts carry the same feeling. If they do, one is filler.
325- One act is the peak and it has the largest span by a visible margin. The act
326 before it is quieter than it is.
327- Every act earns its scroll span. Eight to fourteen viewport-heights is a
328 pacing reference for longer cinematic pages, not a quota. Shorter editorial,
329 gallery, or working-surface grammars should stay short when the journey is
330 complete. Never add filler or empty pinning to hit a length target.
331- The act count and total length do not land in the 6-to-7 acts at 13.6-13.8vh
332 band that all four prior builds hit. That band is a fingerprint dimension now.
333 
334## Step 3: Generate the assets
335 
336Full pipeline, prompt scaffolds and model notes: [references/assets.md](references/assets.md).
337 
338**fal.ai route (default for this skill):** `FAL_KEY` in the env or a `.env`.
339GPT Image 2.5 Flare produces genuine alpha with `--transparent`, which is what
340layered hero planes need:
341 
342```bash
343node <skill>/scripts/fal.mjs still "$(cat assets/STYLE.txt)\n\nBACK PLATE ONLY: ..." assets/masters/hero-back.png --size 2048x1152 --manifest /tmp/m/back.json
344node <skill>/scripts/fal.mjs still "...ISOLATED MID LAYER ON A TRANSPARENT BACKGROUND..." assets/masters/hero-mid.png --size 2048x1152 --transparent --manifest /tmp/m/mid.json
345node <skill>/scripts/fal.mjs still "Same place ... top-down over ONE lot" assets/masters/lot.png --ref assets/masters/aerial.png
346node <skill>/scripts/optimize-images.mjs --in assets/masters --out public/img --budgets assets/budgets.json
347# 3D props and a living back plate (see exploded-parcel.md and hero-depth.md)
348node <skill>/scripts/fal.mjs model assets/models/src/house.png assets/models/raw/house.glb [--endpoint fal-ai/tripo3d/p2/image-to-3d]
349node <skill>/scripts/fal.mjs video assets/video/back.jpg assets/video/raw.mp4 "Locked-off tripod shot..." --duration 10 --loop
350```
351 
352Give each parallel call its own manifest file and merge afterwards; concurrent
353writes to one manifest lose entries. Composite the planes over magenta to
354inspect the alpha before building. Crop portrait `-m` masters for the phone hero
355(see seo-performance.md §2).
356 
357Short version:
358 
359```bash
360node <skill>/scripts/kie.mjs still "<style preamble>\n\n<scene>" out/01-hero.png --ar 16:9 [--ref brand-can.png]
361node <skill>/scripts/kie.mjs shot "<camera move>" out/01-hero.png out/01.mp4 --dur 5
362bash <skill>/scripts/encode.sh out/01.mp4 assets/01.mp4
363bash <skill>/scripts/encode.sh out/01.mp4 assets/01-m.mp4 mobile
364```
365 
366Four things that decide whether this looks premium or generated:
367 
368- **One style preamble, reused verbatim in every prompt.** This is what makes
369 six separate images look like one shoot. Write it once, never paraphrase it.
370- **Look at every asset before you use it.** Read the PNG. Generation is cheap
371 and rerolling is cheaper than shipping a bad frame.
372- **Encode for scrubbing, not playback.** `encode.sh` sets a dense GOP because
373 seeking walks from the previous keyframe. A normal web encode plays perfectly
374 and scrubs like mud.
375- **Layer the hero.** Cut the scene into planes that scroll at slightly
376 different rates, with the product parked between the mid and foreground
377 planes. Depth from differential movement is the cheapest premium signal on
378 the page. The recipe and its traps are under `parallax` in
379 [references/devices.md](references/devices.md).
380 
381## Step 4: Build the page
382 
383Write real HTML. Real `<h1>`, real `<p>`, real links, real reading order. The
384engine reads `data-sc-*` attributes off your markup and drives it; it never
385generates DOM. A runtime that builds the page from a config object is exactly
386why every site built on one looks the same.
387 
388Start from `references/template.html`. The device patterns are in
389[references/devices.md](references/devices.md); the spacing, type, depth and
390colour rules are in [references/taste.md](references/taste.md). Read taste.md
391before writing markup, not after, and build without announcing the checklist.
392 
393Theme by overriding tokens, six values and two fonts:
394 
395```css
396:root {
397 --sc-canvas: #0A0806; --sc-surface: #16110E;
398 --sc-ink: #F5EBDD; --sc-ink-soft: #A2968A;
399 --sc-accent: #FF5A3D; --sc-accent-ink: #15110F;
400 --sc-font-display: "Archivo", system-ui, sans-serif;
401 --sc-font-text: "Geist", system-ui, sans-serif;
402}
403```
404 
405## Step 5: Verify by scrolling it
406 
407Apply the final-source and deployment checks in
408[approved-collection.md §7](references/approved-collection.md#7-require-visual-and-functional-evidence-before-delivery).
409Use safe headless automation with native pointer lock/capture disabled in every
410context. Inspect actual pixels, phone compositions, and intermediate states;
411test useful controls, downloads, and form outcomes in the final package.
412 
413Not optional, and not "it should work." A scroll page has no single state:
414every position is a different frame, and the failures live between the two you
415happened to look at. Full procedure: [references/verify.md](references/verify.md).
416 
417```bash
418cd <build project> && npm i playwright-core # once
419node <skill>/scripts/serve.mjs --root . --port 4500 &
420node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/shots
421node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/mobile --width 390 --height 844
422node <skill>/scripts/shoot.mjs --url http://localhost:4500 --out lab/reduced --reduced-motion
423```
424 
425The harness walks each act at six positions, waits for the scrub video to
426actually settle, and reports **dead scroll**, **cues that never reach full
427opacity**, and **contrast measured on the composited page at the brightest
428frame under each line**. It writes a contact sheet.
429 
430Then do the part the harness cannot: **read `sheet.png`.** It proves a clip
431advances; it cannot tell you the composition is good, the motion is smooth, or
432the page means anything. Also tab through for focus order.
433 
434**Then run the feel check** ([references/feel.md §6](references/feel.md)). Scroll
435the page cold, write one word per act for what you felt, and only then open
436BRIEF.md and diff it against the intended curve. Where they disagree the page is
437wrong, not the brief. Confirm on the sheet that the peak is the largest visual
438change and holds the most scroll room, and that the last screen resolves instead
439of fading to nothing.
440 
441**And say what a green run does not cover: a real phone.** Headless Chrome
442cannot reproduce an iPhone's video decoder, autoplay policy, Low Power Mode,
443or touch scrolling; a build once shipped four green rounds while the hero clip
444sat frozen on the actual device. Mobile is a first-class target throughout,
445not a pass at the end: portrait phone clips, touch-tuned lerp, grown tap
446targets are all authored (see assets.md and verify.md). When any mobile defect
447is reported, deploy `references/device-diag.html` beside the site on the
448**first** round and let the device answer, rather than theorising from a
449machine that cannot reproduce the failure. The full iOS clip-lifecycle notes
450live in verify.md, "The phone is a different machine".
451 
452Then run the gates (seo-performance.md): `verify-seo.mjs` on the build,
453deploy to staging, `lighthouse-gate.mjs --staging --runs 3` on every language
454route. A gate failure is fixed in the page AND, if it was a gap in this skill,
455in the skill (reference text, script or engine) with a CHANGELOG entry.
456 
457`shoot.mjs` waits for the engine, so it cannot shoot the static mode. Check
458reduced motion and no-JS with a plain Playwright full-page screenshot
459(`reducedMotion: 'reduce'`, `javaScriptEnabled: false`).
460 
461Fix what you found and shoot it again. Report what you actually verified and
462what you did not.
463 
464## Hard rules
465 
466Ship-blockers, not preferences. Each one is a thing that makes a page read as
467machine-made.
468 
469| Never | Instead |
470|---|---|
471| Clay diorama / low-poly / claymation as the default world | Photographic. See worlds.md |
472| A "scroll" cue, arrow, or animated mouse icon | Nothing. They are looking at the hero; they know |
473| `01 / 06` section counters | Delete them. Sequence is not information here |
474| An eyebrow above every section heading | At most one per three sections. The heading carries itself |
475| Em dash anywhere visible | Period, comma, colon, or parentheses |
476| Centred copy in every act | Vary the anchor: lead, trail, centre, split |
477| The same device twice in a row | Score the journey properly in Step 2 |
478| Generating before the brief and creative authority are clear | Run Step 0. Record actual answers or explicitly delegated authored decisions in `BRIEF.md` |
479| A page with no engineered peak, or with three competing ones | One peak. It gets the asset budget, the silence before it, and the most scroll room. See feel.md §2 |
480| An ending that trails off, fades out, or just becomes a footer | The close resolves and holds. The last feeling is the one they carry |
481| Planning acts before the feeling curve exists | Curve first, devices second. See feel.md §1 |
482| Shipping without one bespoke signature move | Invent one. A recoloured spotlight or a retuned tilt is not one. See uniqueness.md §3 |
483| A build that clears fewer than 4 of 6 fingerprint dimensions against any existing row | Change the plan, not `FINGERPRINTS.md` |
484| Editing the engine to get a bespoke behaviour | Bespoke JS in the page, driven off `--sc-p` and your own `data-sc-*` |
485| Reaching for filmic one-shot because it is what the last build did | Pick from all eight grammars, and say why the other seven lost |
486| A full-frame dark overlay to fix contrast | A scrim only where the text sits |
487| Text baked into a generated image | Real markup, always. It is selectable, translatable and sharp |
488| Invented statistics in a counter | Only real numbers. No number, no counter |
489| `transition: all`, or animating width/height/top/left | `transform` and `opacity`; `clip-path` for wipes |
490| Gradient text, neon glow, zero-offset coloured halo shadows | Weight and size for emphasis; shadows with offset and blur |
491| Autoplaying audio, or any audio at all on a scrub clip | Strip the track. `encode.sh` already does |
492| Shipping without running Step 5 | Run Step 5 |
493| Content hidden until JS runs, for everyone | Gate hiding on `html.sc-js`; the default CSS is a complete static document |
494| A section class that sets `position` on a `[data-sc-stage]` | Leave stage positioning to the engine; the page CSS forces `position: sticky` under `.sc-js` |
495| A keyword chosen by feel | Search volumes per language first, then the H1 |
496| A 16:9 hero plane served to a portrait phone | `<picture>` with a portrait `-m` crop at 640w |
497| Any JPG/PNG in the build | WebP via `optimize-images.mjs` |
498| A generated place/product shown without "illustrative" | Trust-mode caption |
499| Lighthouse measured once on a cold cache | `--runs 3` median after one warming request |
500 
501## Output
502 
503The build folder, including `BRIEF.md`, then a short report: the grammar and why
504the other seven lost, the signature move, the fingerprint gate result against
505each existing row, the five gate results (Lighthouse table per route and form
506factor, verify-seo summary), the journey, the feeling curve and the peak, the feel-check
507diff (intended curve against felt curve, and what you changed), the score table
508(device per beat), what you
509generated, what you verified with screenshots, and anything you could not
510verify. Say if the brief was self-authored rather than interviewed. Give the
511local URL. Keep it brief; the page is the deliverable.
512 
513Then append the build's row to `<workspace>/FINGERPRINTS.md`.
514 
515Changes to the skill itself, and the build findings that drove them, are logged
516in [CHANGELOG.md](CHANGELOG.md).
517 

Discussion

Alternatives

Agentic Browsing ReadinessAudit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).Marketing · MITBacklink Profile AnalysisBacklink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit.Marketing · MIT/setup-cmsConnect a CMS to notfair SEO tools. Guides users through configuring WordPress, Strapi, Contentful, or Ghost — tests the connection, and writes credentials to .env.local. Once set up, seo-analysis automatically cross- references CMS content against Google Search Console data. Use whenever the user says "connect my CMS", "set up WordPress", "configure Strapi", "add Contentful", "connect Ghost", or "CMS setup". Also trigger if the user asks why no CMS data appears in a seo-analysis report. · MITBacklink checkBacklink profile for any domain — referring domains, authority, anchors, new/lost links, and a side-by-side vs a competitor. Use when asked "check my backlinks", "backlink profile of X", "who links to them", or "link gap vs competitor".Marketing · MIT