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:
|
|
188
|
+
## Built with awwwards-mcp: four real sites
|
|
189
189
|
|
|
190
|
-
|
|
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. [
|
|
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
|
+
|  |  |  |
|
|
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
|
-
**
|
|
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
|

|
|
244
251
|
|
|
245
|
-
**
|
|
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.
|
|
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 -->
|