Agent skill

Pointer Trail Emitter

by nirholas in nirholas/three.ws

Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl…

Apache-2.0Auto-check passedGame Development

Install Pointer Trail Emitter

skills CLI
$ npx skills add nirholas/three.ws --skill pointer-trail-emitter -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install nirholas/three.ws pointer-trail-emitter --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/nirholas/three.ws.git skills-src && mkdir -p .claude/skills && cp -r skills-src/third_party/designcode-agent-skills/agent-skills/web-design/pointer-trail-emitter .claude/skills/pointer-trail-emitter && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
pointer-trail-emitter
GitHub stars
227
Used in
1 other repo
Token cost
~2.6k tokens
SKILL.md length
1,545 words
Files
5
Skills in repo
92
Repo updated
First seen
Licence
Apache-2.0

At a glance

Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl…

  • Any mote trail that must stay legible however fast the hand moves
  • SKILL.md covers Emit by distance, not by time, Place each mote where it is owed, Take the ring-buffer slot… and Lag the emitter behind the…, plus 10 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Pointer Trail Emitter is an agent skill from nirholas/three.ws. Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl instead of breaking into scattered dots. Covers sub-segment placement, the ring-buffer ordering trap, the idle breath a distance emitter needs, anchoring the trail to the screen in a 3-D scene, scaling scatter against the plane it hangs on, coasting instead of stopping dead, touch and reduced-motion fallbacks, and why…

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files (for example `agents/openai.yaml` and `demo/PROMPT.md`).

It sits in Game Development. The repository describes itself as: Open-source platform for 3D AI agents. Turn text or a photo into a rigged, animated GLB avatar, give it an LLM brain, memory and a wallet, and embed it anywhere with one web… The licence is Apache-2.0.

When your agent uses it

  • Any mote trail that must stay legible however fast the hand moves

Example prompts

  • “/pointer-trail-emitter”

What it can do on your machine

Read from SKILL.md and the folder at commit ddf6e49. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Pointer Trail Emitter loads about 2.6k tokens when it runs. Until then it costs about 195 tokens; SKILL.md has 1,545 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~195
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from nirholas/three.ws at commit ddf6e49, republished under its Apache-2.0 licence (© nirholas). 1,545 words, ~2,623 tokens.

Download SKILL.mdSave it as .claude/skills/pointer-trail-emitter/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
pointer-trail-emitter
description
Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl instead of breaking into scattered dots. Covers sub-segment placement, the ring-buffer ordering trap, the idle breath a distance emitter needs, anchoring the trail to the screen in a 3-D scene, scaling scatter against the plane it hangs on, coasting instead of stopping dead, touch and reduced-motion fallbacks, and why moving the emitter to a DOM overlay to raise its z-index costs more than it buys. Use for cursor wisps, pointer sparks, embers, magic trails, comet tails, plankton, dust, or any mote trail that must stay legible however fast the hand moves.

Pointer Trail Emitter

Build the emitter yourself when the trail's density has to respond to how fast the hand is moving.

Reach for add-shader-cursor-trail or shaders-cursor-ripples when you want the packaged WebGPU looks from the Shaders library. Reach for reveal-hover-effect when the cursor exposes a second image through a mask. Reach for ambient-section-particles when motes fill a section and the pointer only disturbs them. Reach for this when the pointer lays them.

The bundled demo keeps the stage intentionally neutral. A plain dark field makes spacing, scatter, and coast easy to judge without a background image competing with the trail. The wisps are dependency-free Vanilla JavaScript rendered through the Canvas 2D API; CSS styles the interface only. There are no shaders, WebGL, or Three.js. Keep the live canvas separate from the interface so the emitter stays testable rather than baked into a composition.

Emit by distance, not by time

This is the whole mechanism. Accumulate the distance the emitter has moved and spend it in fixed steps:

js
E.acc += moved;
let guard = 0;
while (E.acc >= STEP && guard++ < 14) {
  E.acc -= STEP;
  spawn(/* … */);
}

Spacing along the path is then STEP, whatever the hand is doing, so the trail reads as one continuous ribbon at a crawl and at a flick alike.

Tie emission to a timer instead and spacing becomes proportional to speed — the pointer covers speed × interval between spawns. A flick breaks the line into scattered dots, and a resting hand piles every mote on one spot. That is the failure this prevents, and it is worth building the toggle to see it once.

Measured over one fixed path: distance emission laid 1885 motes slowly and 1738 quickly, a 1.08× spread — the count follows the path. The same two sweeps on a timer laid 2537 and 1545, a 1.64× spread — the count follows the clock.

Cap the loop. A window blur, a tab restore, or a teleporting pointer can hand you a single enormous moved, and without the guard that one frame spawns thousands of motes and stalls.

Place each mote where it is owed

Spawning every mote of a frame at the pointer's current position clumps them at one end of the segment. A flick then reads as a blob with a gap behind it. Lay each at its own distance along the segment:

js
const t = moved > 1e-6 ? Math.min(1, guard * STEP / moved) : 0;
spawn(E.lx + dx * t, E.ly + dy * t, ang);

Take the ring-buffer slot before advancing it

js
const i = E.i; E.i = (i + 1) % N;   // correct

Advancing first writes the position into the next slot and the life into this one, so every mote appears where the previous one started. Dense trails hide it; sparse ones show it on every spawn. Symptom to recognise: motes that look one step behind the cursor and pop rather than fade in.

Lag the emitter behind the pointer

Damp the emitter toward the pointer instead of pinning it:

js
E.x = damp(E.x, px, 16, dt);

A rigidly pinned emitter makes a fast flick look like the trail is welded to the cursor. The lag is what gives the drift its slack.

Anchor the trail to the screen, not the world

For an in-scene 3-D trail, parent the points to the camera and work in camera space. Map the pointer through the frustum's own half-height:

js
const hh = Math.tan(camera.fov * Math.PI / 360) * D;
const x = nx * hh * camera.aspect, y = ny * hh;

Unprojecting to a world plane instead pins the trail to the set: the moment the rig drifts or parallaxes, the trail swims across the screen rather than staying under the hand.

Use quads or points that ignore depth (depthTest:false, depthWrite:false) and give them their own render order. If the scene has secondary passes — a mirror, a reflection probe — put the trail on its own layer so it never appears in them.

Scale the scatter against the plane it hangs on

Spread is meaningless as an absolute. At a distance of 3.4 units with a 36° camera, the plane the trail hangs on is only about 2.2 units tall — so ±0.03 units of jitter is a thread stitched to the cursor, not a drift.

Compute the plane extent, then express scatter as a fraction of it. The same number that reads as a soft cloud on one camera is a hard line on another.

Let them coast

Damping matters more than initial velocity. At 1 - 1.1 * dt every mote stops within a tenth of a unit of where it spawned and the trail never opens out; halve it and the scatter carries.

Add a slow curl so the drift frays instead of blowing along one straight line, and a small constant rise so it behaves like something buoyant rather than something thrown.

Drop what round motes do not need

A round sprite has no orientation. Remove the per-particle angle attribute and the rotated gl_PointCoord lookup entirely rather than leaving them at zero — that is one attribute, one upload, and several instructions per fragment for a rotation nobody can see.

Keep the motes small: a few pixels of core inside a faint halo. Small sprites are what let the count go up without paying the additive fill a screenful of large ones costs.

Keep a breath when the hand is still

Distance emission means a stationary pointer travels nothing and therefore emits nothing — the trail dies under a resting hand. So add a slow idle emission on a timer purely for that case.

Rarely is the operative word: one every ~0.4s. Emit often from a stationary pointer and it grows a permanent column of smoke up the middle of the frame — which is the timer failure the mechanism exists to avoid, reintroduced by hand.

Show full SKILL.md (659 more words)Show less

Numbers

Tuned on a trail hanging 3.4 units from a 36° camera, on a plane ≈2.2 units tall. Scale the spatial values by your own plane extent.

parametervaluenote
emission step0.030 unitsdistance between spawns
spawns per frame cap14the teleport guard
emitter dampingdamp(…, 16, dt)the lag behind the pointer
scatter±0.30 units≈13% of the plane height
depth jitter±0.45 unitsbreaks the flat sheet
life1.45–2.75 sidle motes 2.1–3.4 s
launch velocity−0.09 along travel, ±0.19 lateralagainst the direction of motion
coast damping1 − 0.5 * dthalved from 1.1; see above
buoyancy+0.022 · dt
curlsin(t·1.3 + φ)·0.17, cos(t·1.1 + 1.7φ)·0.14per-mote phase φ
size0.018–0.050, ×(1 + 0.55u)a mote softens, it does not swell
opacityin over u 0–0.12, out over 0.22–1, ×0.9
count190 desktop, 90 on a low tier
idle emissionevery 0.42 s

Do not move it to a DOM overlay to raise its z-index

Nothing inside the WebGL canvas can rise above the page — the canvas is one element at its own stacking tier — so a 2-D overlay canvas looks like the only way to get the layer. It is, and it still is not worth it.

The port costs the post chain: the motes come out as hard points with no bloom, and a wider fainter second copy is not the same thing. Every constant also has to be converted rather than re-picked — px_per_unit = (innerHeight / 2) / (tan(fov / 2) * D), sprite diameter innerHeight * size / D — and rebuilding the look by eye instead of translating it produces a different effect that has to be re-approved.

If the layer is genuinely required, port it as a pure translation and diff the frames against the old build before showing anyone.

State the cost from a profile

The per-mote update is free. A CPU profile of a 190-mote trail showed the update at 0.00% of samples — below the profiler's sampling floor. The cost is entirely additive fill, so the levers are sprite size and count, in that order.

Measure before reporting a regression. A frame-time comparison on this trail once showed a 20–30% p90 rise that turned out to be noise: three runs of identical code gave 226 / 374 / 243 ms. Run it more than once before you believe it.

Lifecycle and reduced motion

  • Gate on matchMedia('(hover: none)'). On touch there is no hover position to follow; park the emitter or drive it from pointermove during a drag only, or a stationary emitter grows a permanent plume.
  • Under prefers-reduced-motion: reduce, render a designed still frame — a composed trail already laid across the frame — rather than hiding it. Keep controls live so they redraw that frame.
  • Pause on document.hidden, reset the time base on resume, clamp dt to ≈1/30 s, and cap DPR at 2.
  • Nothing may depend on the pointer alone. Give the emitter a keyboard path so the effect is complete and operable without a mouse.

Verify

  • The trail is legible on a neutral field before the pointer moves
  • The demo does not rely on background imagery to make the effect look complete
  • Spacing along the path is constant; a flick and a crawl draw the same ribbon
  • Measured, not assumed: mote count over a fixed path barely moves with speed
  • A flick lays motes along the whole segment, not clumped at one end
  • Ring-buffer slot is taken before the index advances
  • 3-D: parented to the camera, and the trail stays under the hand while the rig drifts
  • Scatter is expressed against the plane extent, not as an absolute
  • Motes coast rather than stopping within a fraction of their spawn point
  • A stationary pointer keeps an aura without growing a column
  • No per-particle angle attribute on round sprites
  • Spawn loop is capped against a teleporting pointer
  • Operable from the keyboard; touch path does not plume
  • Reduced motion renders a designed still, not a hidden layer
  • Cost claims came from a profile, and any regression was re-run before it was reported

© nirholas, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files in third_party/designcode-agent-skills/agent-skills/web-design/pointer-trail-emitter of nirholas/three.ws.

  • SKILL.md
  • agents/openai.yaml
  • demo/PROMPT.md
  • demo/index.html
  • demo/preview.jpg

Open the folder on GitHubat commit ddf6e49

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in nirholas/three.ws, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Pointer Trail Emitter next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Pointer Trail Emitter compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pointer Trail Emitter this skillnirholas/three.ws2271 repos~2.6kAutomated safety check: PassApache-2.0
Remix Sitecth9191/site-clone133—~2.6kAutomated safety check: PassMIT
Aholo Viewer Integrationmanycoretech/aholo-viewer1.1k—~2.2kAutomated safety check: PassMIT
3D Web Experiencesmadebyaris/advance-minimax-m3-cursor-rules126—~3kAutomated safety check: PassMIT
Godot Animation Tree Masterythedivergentai/GD-Agentic-Skills809—~3.6kAutomated safety check: PassLGPL-3.0
Defold Assets Searchselimanac/defold-astar111—~1.3kAutomated safety check: PassNone

Similar skills

  • Remix Site

    cth9191/site-clone

    Turn a cloned (or any measured) website into YOUR site: re-skin it with your brand, copy, and assets; generate three deliberately different design directions as token/motion/shader overrides and…

    133 GitHub stars~2.6k tokensUpdated 1 mo ago
    Game DevelopmentAuto-check passed
  • Aholo Viewer Integration

    manycoretech/aholo-viewer

    Guides building browser apps with the @manycore/aholo-viewer npm package to render 3D Gaussian Splatting and mesh content from TypeScript.

    1.1k GitHub stars~2.2k tokensUpdated today
    Game DevelopmentAuto-check passed
  • 3D Web Experiences

    madebyaris/advance-minimax-m3-cursor-rules

    Builds 3D web scenes with Three.js and React Three Fiber, with attention to art direction, a performance budget, mobile behavior and fallbacks.

    126 GitHub stars~3k tokensUpdated 3 mo ago
    Game DevelopmentAuto-check passed
  • Godot Animation Tree Mastery

    thedivergentai/GD-Agentic-Skills

    Expert patterns for AnimationTree including StateMachine transitions, BlendSpace2D for directional movement, BlendTree for layered animations, root motion, transition conditions, advance…

    809 GitHub stars~3.6k tokensUpdated 29 days ago
    Game DevelopmentAuto-check passed
  • Defold Assets Search

    selimanac/defold-astar

    Searches the Defold Asset Store for community libraries and extensions.

    111 GitHub stars~1.3k tokensUpdated 5 mo ago
    Game DevelopmentAuto-check passed
  • Compose Graphics

    AThevon/genjutsu

    Advanced Compose visuals - Material 3 Expressive motion physics, AGSL shaders (Android 13+), Canvas/DrawScope generative, graphicsLayer effects.

    424 GitHub starsUsed in 1 repo~5.1k tokens
    Game DevelopmentAuto-check passed

More from nirholas/three.ws

All 92 skills in this repo
  • Add Shader Cursor Trail

    nirholas/three.ws

    Add the Shaders WebGPU mouse effect used for the Tidal Commons hero: a white twinkling halftone cursor trail driven by ChromaFlow, masked through a DotGrid, finished with chromatic ripples and film…

    227 GitHub starsUsed in 1 repo~760 tokens
    Auto-check passed
  • Publish Project To GitHub

    nirholas/three.ws

    Package a finished local project into an intentional GitHub repository, create a strong README and visual preview, push it safely, configure a public GitHub Pages URL when the project is compatible…

    227 GitHub starsUsed in 1 repo~2.2k tokens
    Auto-check: notes
  • Audit a website or digital experience against its supplied source references for originality and plagiarism risk.

    227 GitHub starsUsed in 1 repo~1.8k tokens
    Auto-check passed
  • Turn a completed daily UI inspiration capture into exactly five original landing-page builds, one per separate Codex task, using Sites.

    227 GitHub starsUsed in 1 repo~1.9k tokens
    Auto-check passed
  • Write Like Meng On X

    nirholas/three.ws

    Write, rewrite, review, or continuously refine X/Twitter posts in Meng To's current voice using his deduplicated authored-post corpus, personal and product context, shared resources, and Content…

    227 GitHub starsUsed in 1 repo~2k tokens
    Auto-check passed
  • Browser Video Recording

    nirholas/three.ws

    Create polished 60 fps 4:3 4K browser screen-recording style videos from Codex in-app browser captures, with browser-only crop, natural macOS cursor styling, deliberate click choreography…

    227 GitHub starsUsed in 1 repo~1.5k tokens
    Auto-check passed

Questions about Pointer Trail Emitter

What does Pointer Trail Emitter do?

Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl…. ws. Build a cursor trail whose spacing stays constant at any hand speed, by emitting motes per unit of distance travelled rather than on a timer, so a flick draws the same continuous ribbon as a crawl instead of breaking into scattered dots.

When should I use Pointer Trail Emitter?

Pointer Trail Emitter fits situations like: any mote trail that must stay legible however fast the hand moves.

How do I install Pointer Trail Emitter in Claude Code?

Run `npx skills add nirholas/three.ws --skill pointer-trail-emitter -a claude-code`. Or copy the skill folder (third_party/designcode-agent-skills/agent-skills/web-design/pointer-trail-emitter in nirholas/three.ws) into .claude/skills/pointer-trail-emitter in your project. Claude Code loads it when a task matches its description.

How do I install Pointer Trail Emitter in Codex?

Run `npx skills add nirholas/three.ws --skill pointer-trail-emitter -a codex`. Or copy the skill folder (third_party/designcode-agent-skills/agent-skills/web-design/pointer-trail-emitter in nirholas/three.ws) into .agents/skills/pointer-trail-emitter in your project. Codex loads it when a task matches its description.

Can I use Pointer Trail Emitter in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nirholas/three.ws --skill pointer-trail-emitter -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pointer-trail-emitter, .gemini/skills/pointer-trail-emitter, .github/skills/pointer-trail-emitter and .opencode/skills/pointer-trail-emitter in your project.

What does Pointer Trail Emitter need to run?

SKILL.md names no scripts, command-line tools or credentials: Pointer Trail Emitter is instructions for the agent only.

Does Pointer Trail Emitter access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Pointer Trail Emitter safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Pointer Trail Emitter use?

Pointer Trail Emitter is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Pointer Trail Emitter use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Pointer Trail Emitter?

Skills that share tags, products or a category with Pointer Trail Emitter: Remix Site (cth9191/site-clone, 133 stars), Aholo Viewer Integration (manycoretech/aholo-viewer, 1.1k stars), 3D Web Experiences (madebyaris/advance-minimax-m3-cursor-rules, 126 stars) and Godot Animation Tree Mastery (thedivergentai/GD-Agentic-Skills, 809 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Pointer Trail Emitter?

nirholas (a GitHub user) maintains it in nirholas/three.ws, which has 227 GitHub stars. The repository holds 92 skills in this directory. The repository was last updated on October 8, 2026.

Source: nirholas/three.ws on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.