awwwards-mcp 1.4.0 → 1.6.0

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.
package/README.md CHANGED
@@ -185,9 +185,9 @@ and content remain the property of Awwwards and the credited creators — don't
185
185
  bulk-scrape, redistribute, or republish them. If you use this commercially,
186
186
  review awwwards.com's terms yourself.
187
187
 
188
- ## Built with awwwards-mcp: three real sites
188
+ ## Built with awwwards-mcp: four real sites
189
189
 
190
- Three complete sites were built through the full inspiration loop this MCP
190
+ Four complete sites were built through the full inspiration loop this MCP
191
191
  enables, using nothing but the server's tools plus the shipped
192
192
  `awwwards-inspiration` skill. Each one exercised a different corner of the
193
193
  loop — and every correction the loop caught on the way became doctrine in the
@@ -203,7 +203,14 @@ skill.
203
203
  > results would be better still. The skill's frame-tile doctrine is what
204
204
  > closes that gap today.
205
205
 
206
- **1. [Fallow Press](fallow-press/index.html)**
206
+ **1. [Ridge](showcase/ridge/index.html)**
207
+ ([source](showcase/ridge/)) — a Swiss-minimal single-page showcase for a fictional engineering-talent studio, direction **Aspen Search** (SOTD + Developer Award, jury 7.48): monochrome `#FAFAF8`/`#1A1A1A` + mint, giant grotesque section markers, halftone grain, asymmetric panel grid, dark discipline panels in an interior **horizontal pin passage**, count-up stats, client rows, theme toggle, cursor-follower. Built with the v1.4.0 toolkit: FTS5-ranked direction search, **both-viewports** reference captures and QA (desktop 7,849px + mobile 390×844), overflow audit (0px both), pin-center shots, film verification — and the skill-memory flywheel recorded the findings. QA evidence: `showcase/ridge/_qa/`.
208
+
209
+ | Panel grid (desktop) | Horizontal discipline passage | Mobile 390×844 |
210
+ |---|---|---|
211
+ | ![Ridge desktop — Swiss panel grid with mint and grain](assets/ridge-home.jpg) | ![Ridge disciplines — pinned horizontal passage mid-slide](assets/ridge-disciplines.jpg) | ![Ridge mobile — stacked grid, zero overflow](assets/ridge-mobile.jpg) |
212
+
213
+ **2. [Fallow Press](fallow-press/index.html)**
207
214
  ([source](fallow-press/)) — a flat-2D editorial journal, direction
208
215
  **Emergence Magazine** (SOTD): pink `#FF9398` on cream and black, torn-paper
209
216
  masthead (pure CSS `clip-path`, zero WebGL), giant grotesque display over
@@ -232,7 +239,7 @@ The loop as it ran:
232
239
  one-shot entrances**; QA pin shots land at panel **centers**, not uniform
233
240
  fractions, or you photograph empty transition zones.
234
241
 
235
- **2. Cerebrium recreation** (`C:/Users/Afjal/cerebrium-recreation/`) — a
242
+ **3. Cerebrium recreation** (`C:/Users/Afjal/cerebrium-recreation/`) — a
236
243
  fidelity-first recreation of cerebrium.ai, pixel-checked against the live
237
244
  reference: full-page captures of both sides, `analyze_page_structure` band
238
245
  compare, and SVG icon/legend fixes until the build matched the reference to
@@ -242,7 +249,7 @@ never just totals.
242
249
 
243
250
  ![Cerebrium recreation — full-page build capture](assets/cerebrium-build.jpg)
244
251
 
245
- **3. The Meridian** (`C:/Users/Afjal/editorial-site/`) — an editorial journal
252
+ **4. The Meridian** (`C:/Users/Afjal/editorial-site/`) — an editorial journal
246
253
  built from ORDR/Hearst references: the first build to run the whole loop
247
254
  end-to-end. `analyze_page_structure` caught a masthead band bug by comparing
248
255
  the build's band map against the reference's; the reference captures,
@@ -264,6 +271,8 @@ motion film, and the reusable pre-scroll capture script live in
264
271
  | `lenis` (library, via skill guidance) | smooth scrolling synced to ScrollTrigger on the Fallow Press home page. |
265
272
  | `tailwindcss` / plain CSS | All builds are plain hand-rolled CSS — flat 2D, no frameworks needed. |
266
273
 
274
+ **The skills self-improve:** every loop pass records what verification caught (`scripts/skill-memory.mjs record`), and a deterministic distiller folds rules seen 2+ times into your installed skill copy — while the shipped copies only change via human PR. A techniques registry (`skills/_memory/techniques.json`) catalogs researched how-tos per domain (video understanding, motion detection, UI structure, micro-interactions, images).
275
+
267
276
  Reduced-motion, JS-less visits, and capture tools all get graceful fallbacks
268
277
  (vertical stacks; progressive-enhancement reveals).
269
278
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awwwards-mcp",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Free MCP server giving AI agents design inspiration from Awwwards: search award-winning sites with inline screenshots and extract design DNA.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,161 @@
1
+ {
2
+ "version": 1,
3
+ "updated": "2026-09-19",
4
+ "description": "Techniques the awwwards skill loop can use to understand websites — per domain. Grown by the skill-memory flywheel: a finding that proposes a better technique gets promoted here by a human PR. Each entry: id, domain, when (when to use it), how (concrete steps/commands), source (where it came from).",
5
+ "domains": {
6
+ "video-understanding": {
7
+ "summary": "From recording to model-ready motion context. Field consensus 2025-2026: scene detection FIRST, keyframes per scene, adaptive any-k budget, then structured context to the model. Our tile-per-element doctrine is the special case for short UI loops.",
8
+ "techniques": [
9
+ {
10
+ "id": "scene-detect-first",
11
+ "when": "Before tiling any recording longer than ~20s or with multiple distinct animations (preloader → scroll → transition).",
12
+ "how": [
13
+ "ffmpeg -i ref.webm -vf \"select='gt(scene,0.3)',showinfo\" -vsync vfr keyframes/%03d.png # scene-change keyframes",
14
+ "Alternative low-threshold pass for UI micro-motion: select='gt(scene,0.08)' (UI cuts are subtle vs film cuts)",
15
+ "Segment the recording at scene boundaries, then treat each segment as its own study passage"
16
+ ],
17
+ "source": "arXiv scene-detection survey (2025); Mixpeek production pipeline (2026); K-frames any-k selection (OpenReview)"
18
+ },
19
+ {
20
+ "id": "anyk-keyframe-budget",
21
+ "when": "Long recordings that exceed the tile budget — decide WHICH frames deserve model context instead of uniform sampling.",
22
+ "how": [
23
+ "One keyframe per detected scene (the scene's first stable frame)",
24
+ "Spend the remaining frame budget on scenes that contain the element under study",
25
+ "Feed keyframes WITH timestamps — timing is the data for easing inference"
26
+ ],
27
+ "source": "K-frames (OpenReview); TwelveLabs context engineering (2025)"
28
+ },
29
+ {
30
+ "id": "tile-within-scene",
31
+ "when": "Easing/overlap matters inside one scene (the existing 2-6fps tile rule, now scoped to the scene segment).",
32
+ "how": [
33
+ "ffmpeg -ss <scene-start> -to <scene-end> -i ref.webm -vf \"fps=6,scale=480:-1,tile=6x4\" scene-tile.jpg",
34
+ "Re-tile finer only for the frames where motion actually changes"
35
+ ],
36
+ "source": "awwwards-inspiration step 6 doctrine (ours), now scene-scoped"
37
+ }
38
+ ]
39
+ },
40
+ "motion-detection": {
41
+ "summary": "What a live site tells you about its motion stack BEFORE recording — fingerprint the libraries, diff the computed styles, poll the transforms.",
42
+ "techniques": [
43
+ {
44
+ "id": "library-fingerprint",
45
+ "when": "Capture phase, before recording — know which animation stack you are studying so build-side patterns match (GSAP vs Motion vs CSS scroll-timeline).",
46
+ "how": [
47
+ "In captured HTML: script srcs matching /gsap|ScrollTrigger|ScrollMagic|locomotive|motion|lenis|barba/i",
48
+ "Inline transforms set by GSAP (style=\"transform: translate(...) matrix(...)\") on scroll-coupled elements",
49
+ "CSS scroll-timeline / animation-timeline / scroll() functions → native CSS scroll-driven animation (uneven browser support — annnimate 2026)"
50
+ ],
51
+ "source": "Blink.new clone-from-URL approach; annnimate GSAP-vs-CSS 2026; motion.dev comparisons"
52
+ },
53
+ {
54
+ "id": "hover-pair-style-diff",
55
+ "when": "Micro-interactions: hover states that a screenshot cannot show. Captures the EXACT style delta instead of eyeballing film frames.",
56
+ "how": [
57
+ "For each interactive element (cursor:pointer discovery, as in record-scrollthrough.mjs):",
58
+ " const rest = getComputedStyle(el); el.dispatchEvent(new MouseEvent('mouseover', {bubbles:true}));",
59
+ " await new Promise(r => setTimeout(r, 700)); const hover = getComputedStyle(el);",
60
+ " diff rest vs hover on: transform, opacity, color, background, box-shadow, letter-spacing, filter, clip-path",
61
+ "Record the diff per element — this IS the micro-interaction inventory"
62
+ ],
63
+ "source": "record-scrollthrough.mjs virtual-cursor pattern (ours) + computed-style diffing standard practice"
64
+ },
65
+ {
66
+ "id": "transform-polling",
67
+ "when": "Scroll-scrubbed animations where per-frame tiles cannot separate scroll-position coupling from time-based easing.",
68
+ "how": [
69
+ "During the stepped scroll, rAF-poll target elements: getComputedStyle(el).transform sampled per step",
70
+ "A transform that changes ONLY with scroll = scrub-coupled; one that keeps changing after scroll stops = time-based tween",
71
+ "This distinguishes ScrollTrigger scrub:true from scrub-timeline + toggleActions — the #1 rebuild mistake"
72
+ ],
73
+ "source": "GSAP ScrollTrigger docs pattern (ours, gsap-scrolltrigger skill)"
74
+ }
75
+ ]
76
+ },
77
+ "ui-structure": {
78
+ "summary": "Structure before pixels. Band maps exist (analyze_page_structure); these extend structure understanding to tokens, rhythm, and overflow.",
79
+ "techniques": [
80
+ {
81
+ "id": "band-map-compare",
82
+ "when": "Every build, before pixel polish.",
83
+ "how": ["analyze_page_structure on reference AND build; compare count/order/backgrounds/heights; never pad spacer bands"],
84
+ "source": "awwwards-inspiration step 8 doctrine (ours)"
85
+ },
86
+ {
87
+ "id": "design-token-extraction",
88
+ "when": "Recreating a reference faithfully — extract the tokens before writing CSS.",
89
+ "how": [
90
+ "Palette: sample band backgrounds + dominant colors (ffmpeg palettegen on hero capture, or canvas sampling in page.evaluate)",
91
+ "Type scale: histogram of computed font-sizes + families across headings/body (page.evaluate document.querySelectorAll('*') sample)",
92
+ "Spacing rhythm: computed margins/paddings of section boundaries → find the multiple (8/12/16 grid)"
93
+ ],
94
+ "source": "design-token standard practice; cerebrium 1px-fidelity loop (ours)"
95
+ },
96
+ {
97
+ "id": "overflow-audit",
98
+ "when": "After any responsive build — horizontal overflow at any breakpoint is a structural bug.",
99
+ "how": [
100
+ "For each viewport (desktop 1440, mobile 390): document.scrollWidth > window.innerWidth → report offending elements (walk tree for el.getBoundingClientRect().right > innerWidth)",
101
+ "Record the offender + the px — pin shots will show it as asymmetric whitespace"
102
+ ],
103
+ "source": "v1.3.0 mobile smoke lesson (fallow-press 43px overflow)"
104
+ }
105
+ ]
106
+ },
107
+ "micro-interactions": {
108
+ "summary": "Small feedback animations — capture the state PAIRS, not just the motion.",
109
+ "techniques": [
110
+ {
111
+ "id": "hover-pair-capture",
112
+ "when": "Any build with interactive cards/nav/buttons.",
113
+ "how": [
114
+ "Screenshot element bounding-box at rest AND at hover (elementHandle.screenshot()), pair them in the inventory",
115
+ "Pair with hover-pair-style-diff for the CSS-level truth"
116
+ ],
117
+ "source": "Meridian validation loop (ours)"
118
+ },
119
+ {
120
+ "id": "cursor-follower-detection",
121
+ "when": "Award sites with custom cursors — invisible in screenshots, disruptive if uncloned.",
122
+ "how": [
123
+ "mousemove listener audit: elements moved by rAF against mouse position (transform updated within 50ms of mousemove)",
124
+ "Detect mix-blend-mode: difference / exclusion overlays — the classic custom-cursor signature"
125
+ ],
126
+ "source": "fallow-press + showcase builds (ours)"
127
+ }
128
+ ]
129
+ },
130
+ "images": {
131
+ "summary": "Image evidence discipline — the doctrine that findings carry proof extends to capture sets.",
132
+ "techniques": [
133
+ {
134
+ "id": "palette-extraction",
135
+ "when": "Design DNA from a hero image when the site's own palette metadata is absent.",
136
+ "how": ["ffmpeg -i hero.png -vf palettegen=max_colors=8 - > palette.png; sample the PNG"],
137
+ "source": "ffmpeg standard; awwwards palette field gaps"
138
+ },
139
+ {
140
+ "id": "capture-set-dedupe",
141
+ "when": "QA sets with 13+ pin shots — near-duplicates waste context when reviewing.",
142
+ "how": [
143
+ "Perceptual hash (block-mean 8x8 grayscale) per frame; drop frames with hamming distance < 4 from a kept neighbor",
144
+ "Node implementation is ~30 lines, no deps"
145
+ ],
146
+ "source": "perceptual hashing standard practice; our QA shot review overhead"
147
+ }
148
+ ]
149
+ }
150
+ },
151
+ "webSources": [
152
+ "https://arxiv.org (Scene Detection Policies and Keyframe Extraction, 2025)",
153
+ "https://openreview.net (K-frames: Scene-Driven Any-k Keyframe Selection)",
154
+ "https://www.twelvelabs.io/blog (Context Engineering for Video Understanding, 2025)",
155
+ "https://blink.new (Interactive Web Animation Cloner)",
156
+ "https://annnimate.com/blog (GSAP vs CSS animations 2026 — scroll-timeline support)",
157
+ "https://www.mindstudio.ai (The Learnings Loop)",
158
+ "https://ryandoser.com (Claude Code skills auto-update, 2026)",
159
+ "https://creatoreconomy.so (Self-improving skills: eval + memory)"
160
+ ]
161
+ }
@@ -88,6 +88,11 @@ The user's build/research doesn't wait for the repair. Degrade gracefully:
88
88
  - After the MCP is healthy again, **re-run the failed calls** and reconcile
89
89
  with whatever the fallback produced.
90
90
 
91
+ ## Close the flywheel
92
+
93
+ Repairs are the highest-value lessons — they were expensive to learn. After a successful diagnosis + fix:
94
+ `node scripts/skill-memory.mjs record --skill awwwards-doctor --phase repair --symptom "..." --rule "..." [--evidence <report path>]`. Distill folds recurring failure signatures into this installed copy so the next repair starts knowing them. When a rule proves out, `promote --skill awwwards-doctor` outputs it cleaned (no machine-local evidence paths) for the shipped-copy PR.
95
+
91
96
  ## Anti-patterns
92
97
 
93
98
  - Retrying blocked requests in a loop — politeness rules and block
@@ -98,3 +103,6 @@ The user's build/research doesn't wait for the repair. Degrade gracefully:
98
103
  parse that can't find its anchors must error loudly (that is the drift
99
104
  signal).
100
105
  - Treating the doctor's UNHEALTHY verdict as done because one check passed.
106
+
107
+ <!-- skill-memory:start -->
108
+ <!-- skill-memory:end -->
@@ -34,6 +34,7 @@ Run this loop before building anything visual:
34
34
  Free-text queries are porter-stem + prefix-matched and BM25-ranked
35
35
  (`"magazines"` finds Magazine-tagged sites, best matches first); multi-word
36
36
  queries keep AND semantics — both tokens must hit the same site.
37
+ 3b. **Techniques registry:** `skills/_memory/techniques.json` catalogs researched how-tos per domain (video-understanding, motion-detection, ui-structure, micro-interactions, images). Consult it when a step needs a method — it grows via the flywheel.
37
38
  4. **Live reference URL named? Capture it full-page first.** (and later capture
38
39
  your own build the same way — compare both against each other) If the user
39
40
  points at a specific live site (e.g. "recreate cerebrium.ai"), call
@@ -80,6 +81,8 @@ Run this loop before building anything visual:
80
81
  is a structural bug no amount of pixel polish fixes. Match the reference's
81
82
  band structure, never just its total height.
82
83
 
84
+ 9. **Close the flywheel:** end every loop pass by recording what the verification caught — `node scripts/skill-memory.mjs record --skill awwwards-inspiration --phase <phase> --symptom "..." --rule "..." [--evidence path]`. "Nothing new learned" is a recorded negative. Then `distill` folds rules seen ≥2× into your installed copy’s managed section; `recall` prints them at loop start. When promoting a confirmed rule into the shipped copy (human PR), `promote --skill awwwards-inspiration` prints it with machine-local evidence paths stripped.
85
+
83
86
  ### Anti-patterns
84
87
 
85
88
  - **Vague single-word searches** ("modern", "nice") — use concrete color/tag/
@@ -160,3 +163,6 @@ input", extract the filmstrip and Read the frames instead. A ready-made
160
163
  recorder ships in this repo at
161
164
  `scripts/record-scrollthrough.mjs` (run it from the repo root; playwright
162
165
  and ffmpeg-static are devDependencies).
166
+
167
+ <!-- skill-memory:start -->
168
+ <!-- skill-memory:end -->
@@ -48,6 +48,8 @@ Three animation classes must all be on camera:
48
48
  (keep them in `ref-motion/` or `_qa/`). Awwwards content and site media
49
49
  belong to their creators — study them, don't republish them.
50
50
 
51
+ Before recording, fingerprint the motion stack (techniques registry `skills/_memory/techniques.json` → motion-detection): library fingerprints in the captured HTML, hover-pair style diffs, transform-polling — the site names its own animation stack, and scene-detect-first (video-understanding domain) scopes your tiles.
52
+
51
53
  ## 2. How to capture
52
54
 
53
55
  Fast path first, fall back when it can't:
@@ -148,6 +150,11 @@ Verification is the same skill pointed at yourself:
148
150
  transition zones and look broken when they aren't.
149
151
  4. Fix what mismatches, re-record, repeat — one loop, not ten.
150
152
 
153
+ ## Close the flywheel
154
+
155
+ End every capture/study pass by recording what verification caught:
156
+ `node scripts/skill-memory.mjs record --skill awwwards-motion-study --phase motion-study --symptom "..." --rule "..." [--evidence tile.jpg]`. Distill folds rules seen ≥2× into your installed copy; recall prints them at the next study. The techniques registry (`skills/_memory/techniques.json`) grows from promoted findings — propose better methods by recording them. For the human PR that promotes a rule into the shipped copy, `promote --skill awwwards-motion-study` strips machine-local evidence paths.
157
+
151
158
  ## Anti-patterns
152
159
 
153
160
  - **Designing from posters or thumbnails** — posters are single frames; the
@@ -161,3 +168,6 @@ Verification is the same skill pointed at yourself:
161
168
  - **Studying nothing, animating from vibes** — "it probably fades in" is
162
169
  how builds drift from references.
163
170
  - **Republishing recordings** — captures are local study evidence.
171
+
172
+ <!-- skill-memory:start -->
173
+ <!-- skill-memory:end -->