by yusen-dev
Bring a still image to life as a seamless ASCII loop — hundreds of thousands of strands swaying like a school of fish, with ASCII glyphs that turn with them. three.js + custom shaders.
# Add to your Claude Code skills
git clone https://github.com/yusen-dev/living-asciiGuides for using ai agents skills like living-ascii.
See how living-ascii compares with popular alternatives.
living-ascii is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by yusen-dev. Bring a still image to life as a seamless ASCII loop — hundreds of thousands of strands swaying like a school of fish, with ASCII glyphs that turn with them. three.js + custom shaders. It has 50 GitHub stars.
living-ascii's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/yusen-dev/living-ascii" and add it to your Claude Code skills directory (see the Installation section above). living-ascii ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
living-ascii is primarily written in JavaScript. It is open-source under yusen-dev on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh living-ascii against similar tools.
No comments yet. Be the first to share your thoughts!
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Turns one image into a seamless loop: strands that sway like a school of fish, plus an ASCII layer whose stroke glyphs follow each strand's heading. Output is an MP4 (ASCII, and optionally the strands without ASCII).
npm install.input/. Read it first and say whether it suits the effect: best are images of many fine strokes with a clear direction (grass, fur, hair, wheat, reeds, painterly brushwork, wind-swept water). Hard-edged subjects (buildings, faces, text) smear; say so before spending a render.npm start (port 5177; set PORT to change it). Run it in the background.http://localhost:5177/?img=input/NAME&t=0.25, plus &mode=flow for the strands alone. Check:
wind): default auto follows the texture. If strands run against the obvious flow, set degrees (0 = right, 90 = up).light): set to where the light in the image comes from (130 = upper left, 45 = upper right, 270 = below).density.?img=input/NAME&export=ascii,flow (add any tuning parameters). Keep the tab in front until the title reads done (or failed). A 12 s loop at 1080 px wide takes about 10 minutes. Results: out/NAME-ascii.mp4, out/NAME-flow.mp4.img (default: the sample), mode ascii|flow, width (default 1080), height (default: follows the image; with width set, the image is cropped to that shape), focus x,y 0–1 (which part to keep when cropping, default 0.5,0.5), wind auto|degrees, light degrees (default 130), amp sway (default 1), density (default 1), loop seconds (default 12), fps (default 30), t 0–1 freeze, export ascii,flow.
Wallpapers. Set width and height to the screen's native resolution (e.g. 3840×2160 desktop, 1290×2796 phone) and choose focus from stills. Never render small and upscale: glyphs are 5×7 px and blur. A longer loop adds no variety: every motion term repeats a whole number of times per loop, so it only slows the motion down.
Run these on every export:
npm run check -- out/NAME-ascii.mp4 must print ✓ seamless (last→first change no bigger than an ordinary frame step).amp (try 1.3–1.5). Users judge this on a phone, where small sway disappears.pow() of a negative is NaN, which mipmapping spreads into black squares. Clamp before pow. Guard atan(0, 0).pfbm with an integer period on the drift axis.half is reserved in GLSL — don't use it as a name.STRAND_VS in src/field.js (amp, the wave/sub/lean mix, own).sunDir, sunPool, poolTint in src/field.js.WEIGHTS and the colour solve in src/ascii.js; the dot ramp in src/font5x7.js.| Download | Size |
|---|---|
| Desktop | 3840×2160 (4K, 16:9) |
| Phone | 1290×2796 |
Each is a 12-second loop at 30 fps. The last frame flows straight back into the first, so it repeats without a jump. To set it:
For your own image or your screen's exact size, see Make a wallpaper below.
Requires Node.js 18+.
git clone https://github.com/yusen-dev/living-ascii.git
cd living-ascii
npm install
npm start
Open http://localhost:5177 to see the sample. To use your own image, put it in input/ and open http://localhost:5177/?img=input/your-image.jpg.
Export a video. Add &export=ascii,flow to the URL and keep the tab in front until it says done. You get out/your-image-ascii.mp4 and out/your-image-flow.mp4 (the strands without the ASCII layer). Then check the loop has no visible jump:
npm run check -- out/your-image-ascii.mp4
Make a wallpaper. Set width and height to your screen's resolution, e.g. &width=2560&height=1600. The image is cropped to that shape, and focus=0.5,0.3 picks which part to keep (0–1 across, 0–1 down). Render at the screen's full resolution: the characters are 5×7 pixels, so they blur if the video is scaled up.
Install the repo as a skill:
git clone https://github.com/yusen-dev/living-ascii.git ~/.claude/skills/living-ascii
Then give Claude Code your image and say:
Use living-ascii to bring this image to life as an ASCII loop
SKILL.md walks it through the whole job: judging whether the image suits the effect, tuning wind and light, exporting, then checking the loop, the motion and the colour.
Anything made of many fine strokes running in a direction: grass, wheat, fur, hair, reeds, brush-stroke paintings, wind-swept water. Hard-edged subjects (buildings, faces, text) work less well, because the strands smear their outlines.
All set in the URL, e.g. ?img=input/x.jpg&wind=20&=1.3.
| Parameter | Default | What it does |
|---|---|---|
img |
the sample | Image to bring to life (path inside the repo) |
mode |
ascii |
ascii or flow (strands only). Press M to switch |
width |
1080 |
Output width in px |
height |
follows the image | Output height in px. With width also set, the image is cropped to that shape |
focus |
0.5,0.5 |
Which part of the image to keep when cropping (0–1 across, 0–1 down) |
wind |
auto |
Wind direction in degrees (0 = right, 90 = up). auto follows the texture's own direction |
light |
130 |
Where the light in your image comes from, in degrees (130 = upper left) |
amp |
1 |
Sway amount |
density |
1 |
Strand count multiplier |
loop |
12 |
Loop length in seconds |
fps |
30 |
Export frame rate |
t |
— | Freeze at a point in the loop (0–1), for stills |
export |
— | ascii, flow or both: render one loop and encode MP4s |
Space pauses.
src/maps.js image → height and strand-direction maps
src/field.js strands, motion and light (vertex + fragment shaders)
src/ascii.js the ASCII layer: stroke atlas and per-cell colour solve
src/post.js render targets, flow grade, mode switch
src/main.js URL options, live preview, frame export
server.mjs local server + ffmpeg encoding
scripts/check-loop.mjs seamless-loop check
SKILL.md instructions for Claude Code / AI agents