Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add devinilabs/pro-skill --skill threejs-weathergit clone --depth 1 https://github.com/devinilabs/pro-skillWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/devinilabs/pro-skill/threejs-weather)<a href="https://agentmods.dev/skills/devinilabs/pro-skill/threejs-weather"><img src="https://agentmods.dev/badge/skills/devinilabs/pro-skill/threejs-weather/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/devinilabs/pro-skill/threejs-weather"><img src="https://agentmods.dev/badge/skills/devinilabs/pro-skill/threejs-weather.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00115 | $0.02088 |
| Opus 5 | $0.00057 | $0.01044 |
| Sonnet 5 | $0.00023 | $0.00418 |
| Haiku 4.5 | $0.00012 | $0.00209 |
Grade A, and why
threejs-weather scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
This is a copy
100% identical to threejs-weather — 0 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 171 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Three.js Weather
Weather fails in two ways: the particles miss the camera entirely, or every state is a separate system that shares nothing. Both are avoidable.
Pairs with threejs-landscape for the ground it falls on, and threejs-towers for something to fall against.
Anchor the volume in the frustum
The first version of any rain system puts a world-sized box of particles around the origin and looks empty. With a long lens the camera sees a narrow cone, so almost every drop is off-camera.
Build a small volume and carry it in front of the camera, facing the way the camera faces:
const WX_W = 17, WX_D = 50, WX_TOP = 40; // narrow, deep, tall
function anchor(o) {
const fx = -Math.sin(camAz), fz = -Math.cos(camAz);
o.position.set(cam.position.x + fx * 46, 0, cam.position.z + fz * 46);
o.rotation.y = camAz;
}
Set frustumCulled = false on it — you are moving it every frame and the bounding sphere will fight you.
Float32BufferAttribute copies your array
This one costs an afternoon. The attribute takes a copy of whatever you hand it, so the array you kept a reference to is not the one the GPU reads:
const attr = new THREE.Float32BufferAttribute(pos, 3);
attr.setUsage(THREE.DynamicDrawUsage);
geo.setAttribute('position', attr);
return { pts, pos: attr.array, n }; // keep the attribute's array
Symptom: everything is correct, nothing moves, no error anywhere.
Density is a draw range, not a new buffer
Allocate the worst case once — a full storm, a full blizzard — and thin it by drawing less:
RAIN.geo.setDrawRange(0, Math.round(RAIN.n * density));
A storm then costs no more memory than drizzle; it just stops hiding most of the drops. Reallocating buffers when weather changes causes a hitch exactly when the viewer is watching.
A storm is the rain leaned on
Do not write a second particle system. Take the rain state and push every dial:
| rain | storm | |
|---|---|---|
| drops drawn | 60% of pool | 100% |
| fall speed | ×1.0 | ×1.42 |
| slant | 2.4 | scales with speed² |
| sun | 30% | 14% |
| fog far | ×0.52 | ×0.38 |
What ships with it
5 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 171 lines · 115 tokens per session scan A c87f93d71894
threejs-weather is a skill published in the GitHub repository devinilabs/pro-skill (23 stars, last pushed 26d ago), licensed MIT. It adds 115 tokens to every session and 2,088 once invoked, about $0.0006 per session on Opus 5. A static security scan graded it A with 0 findings. It is 100% identical to threejs-weather, differing in 0 lines, and is treated as a copy.
Other skills, from other repositories
p5js
Use when users request: p5.js sketches, creative coding, generative art, interactive visualizations, canvas animations, browser-based visual art, data viz, shader effects, or any p5.js project.
webgl-particle-galaxy
A real-time particle galaxy — tens of thousands of additive-blended GPU points spiraling around a bright core, their orbits solved entirely in the vertex shader (from glVertexID), so the whole cloud draws in one call. Rendered as a single self-contained index.html. Use when the brief asks for a "particle field"…
webgl-liquid-metal
A real-time liquid-metal shader — a domain-warped noise field shaded as molten chrome, with a sweeping specular highlight over an iridescent thin-film (cosine-palette) sheen. No textures. Rendered as a single self-contained index.html. Use when the brief asks for "liquid metal", "molten chrome", "iridescent"…
webgl-aurora-veil
A self-contained WebGL2 hero: layered aurora light curtains warped over a night sky scattered with stars; move the cursor to sway the veil.
webgl-horizontal-parallax
A horizontal-scroll WebGL gallery (Three.js): frames glide sideways with lerp smoothing and each image parallaxes its texture (UV shift) by its position in the viewport.
remotion-to-hyperframes
Port an existing Remotion (React) composition's source to HyperFrames HTML. Use ONLY on an explicit ask to port/convert/migrate/translate a Remotion source — one-way, Remotion-only. A passing Remotion mention, reference-only code, or "make something like my Remotion video" is a fresh build (/general-video). Unclear →…