Install any skill in seconds. Free to start, no credit card required.
Get Started Free →A full-screen, real-time WebGL/WebGL2 experience — animated shaders, 3D scenes, generative visuals, particle fields — rendered live on the GPU with a typographic overlay. Produced as a single self-contained `index.html`. Use when the brief asks for a "WebGL", "shader", "3D", "generative", "GPU", "interactive canvas", "hero animation", or "real-time visual" experience. Open Design serves this in powered-preview mode so the GPU stack actually runs.
.claude/skills/nexu-io-webgl-experience/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✓→✗ | ▼ Worse | 62% | 0% |
| case-06 | ✓→✗ | ▼ Worse | 9% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 9% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 9% | 0% |
| case-01 | ✗→✗ | = Same ✗ | 9% | 0% |
Produce a single self-contained index.html that renders a real-time WebGL (or WebGL2) visual full-screen, with a clean typographic overlay on top.
OpenDesign detects getContext('webgl2') / new Worker / SharedArrayBuffer and renders this file in powered preview — a cross-origin-isolated iframe with allow-same-origin. That means real Web Workers, SharedArrayBuffer, WASM, and the full GPU pipeline are available. You do not need to work around the opaque sandbox. Prefer webgl2 for modern features; fall back to webgl when the effect allows.
webgl-experience/
├── SKILL.md ← you're reading this
└── example.html ← a working WebGL2 aurora-field reference (READ FIRST)Read example.html end to end. Note the shape: one full-viewport <canvas>, a fragment-shader draw loop on a fullscreen triangle, a DPR-aware resize, and a requestAnimationFrame tick. The overlay (kicker → h1 → sub) is pure HTML/CSS layered above the canvas via z-index.
Pick ONE technique that fits the brief:
index.htmldata: URI). Powered mode allows CDN loads, but self-contained previews are faster and portable.alpha:false, DPR clamped to 2, viewport on resize, and a guard that shows a graceful message if the context is null.getShaderInfoLog) so a typo fails loudly, not silently black.:root-level accent colors to the active DESIGN.md when one is present; otherwise use a restrained dark palette with a single vivid accent (the reference uses lime #63fe13).getError() clean after first frame.webgl2 is unavailable.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 39,266 | 53,769 | +37% | 1 | 1 | 0% | 8,263 | 8,966 | +9% | 0 | 0 | — |
case-02 | fail→fail | 54,940 | 41,371 | -25% | 1 | 1 | 0% | 8,245 | 8,954 | +9% | 0 | 0 | — |
case-03 | fail→fail | 22,758 | 44,064 | +94% | 1 | 1 | 0% | 5,022 | 8,943 | +78% | 0 | 0 | — |
case-04 | pass→fail | 26,020 | 54,896 | +111% | 1 | 1 | 0% | 5,513 | 8,932 | +62% | 0 | 0 | — |
case-05 | pass→pass | 42,841 | 53,195 | +24% | 1 | 1 | 0% | 8,221 | 8,924 | +9% | 0 | 0 | — |
case-06 | pass→fail | 50,100 | 88,091 | +76% | 1 | 1 | 0% | 8,212 | 8,915 | +9% | 0 | 0 | — |
case-07 | pass→pass | 51,458 | 40,125 | -22% | 1 | 1 | 0% | 8,215 | 8,918 | +9% | 0 | 0 | — |
case-08 | fail→fail | 54,871 | 55,232 | +1% | 1 | 1 | 0% | 8,236 | 8,939 | +9% | 0 | 0 | — |
case-09 | fail→fail | 39,573 | 51,649 | +31% | 1 | 1 | 0% | 3,309 | 8,928 | +170% | 0 | 0 | — |
case-10 | fail→fail | 15,516 | 47,998 | +209% | 1 | 1 | 0% | 2,741 | 8,138 | +197% | 0 | 0 | — |
case-11 | fail→fail | 49,841 | 44,263 | -11% | 1 | 1 | 0% | 8,231 | 8,934 | +9% | 0 | 0 | — |
case-12 | fail→fail | 52,007 | 54,180 | +4% | 1 | 1 | 0% | 8,226 | 8,929 | +9% | 0 | 0 | — |
case-13 | fail→fail | 18,000 | 53,197 | +196% | 1 | 1 | 0% | 3,287 | 8,933 | +172% | 0 | 0 | — |
case-14 | fail→fail | 36,134 | 37,650 | +4% | 1 | 1 | 0% | 8,223 | 8,926 | +9% | 0 | 0 | — |
case-15 | fail→fail | 27,285 | 39,736 | +46% | 1 | 1 | 0% | 4,232 | 8,920 | +111% | 0 | 0 | — |
case-16 | fail→fail | 17,318 | 37,523 | +117% | 1 | 1 | 0% | 3,505 | 8,927 | +155% | 0 | 0 | — |
case-17 | fail→fail | 22,370 | 37,456 | +67% | 1 | 1 | 0% | 3,460 | 8,921 | +158% | 0 | 0 | — |
case-18 | fail→fail | 18,168 | 48,921 | +169% | 1 | 1 | 0% | 2,388 | 8,922 | +274% | 0 | 0 | — |
case-19 | fail→fail | 17,323 | 37,398 | +116% | 1 | 1 | 0% | 2,601 | 8,924 | +243% | 0 | 0 | — |
case-20 | fail→fail | 21,863 | 52,616 | +141% | 1 | 1 | 0% | 3,593 | 8,929 | +149% | 0 | 0 | — |
case-21 | fail→fail | 5,876 | 49,818 | +748% | 1 | 1 | 0% | 1,059 | 8,921 | +742% | 0 | 0 | — |
case-22 | fail→fail | 48,637 | 37,106 | -24% | 1 | 1 | 0% | 8,225 | 8,928 | +9% | 0 | 0 | — |
case-23 | fail→fail | 30,969 | 50,020 | +62% | 1 | 1 | 0% | 7,027 | 8,919 | +27% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of -100 percentage points is the difference between those two pass rates over the 23 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Other measured skills in the registry, with their headline benchmark lift.