ASCII animation for the web
Pictures and 3D shapes drawn entirely in text characters, moving live. How brightness becomes letters, a starter that turns any image, video or canvas into ASCII, and a skill for an ASCII hero with a typed-on headline.
Free skills to start. Pro is $79 a year for every skill, or $9.99 a month for 10. See pricing
What is a ascii animation?
ASCII art draws a picture with characters: dense ones like @ and # for bright areas, sparse ones like . and : for dark. ASCII animation does it every frame, so a spinning object, a video or a webcam feed plays as a grid of text.
It signals developer tools, terminals, AI, retro computing and hacker culture. Because each cell is a glyph, it also looks crisp at any size and compresses beautifully in video.
How the effect works
Shrink the source to one pixel per character cell. A character is about twice as tall as it is wide, so use half as many rows as the aspect ratio suggests. For each pixel, compute its brightness and pick a character from a ramp ordered from least to most ink.
For a live effect, redraw every animation frame from a video or from a canvas you render a 3D shape into. Shader versions do the same lookup on the GPU, drawing glyphs from a small font texture, which keeps thousands of cells smooth at 60 frames a second.
01
Pick a ramp
A short string from light to heavy, such as " .:-=+*#%@". Shorter ramps look bolder.
02
Downsample the source
Draw it into a canvas of columns × rows, halving the rows for the tall character cell.
03
Map brightness to glyphs
Luminance × ramp length picks the character for each cell.
04
Redraw each frame
For video or 3D, repeat on requestAnimationFrame, and stop when it is off screen.
JS
Turn any image, video or canvas into ASCII
Returns text for a <pre>. Bright pixels get dense characters, which suits light text on a dark page; reverse RAMP for dark text on light.
const RAMP = ' .:-=+*#%@'
const cells = document.createElement('canvas')
const g = cells.getContext('2d', { willReadFrequently: true })
// source: an <img>, a playing <video> or a <canvas>
function toAscii(source, cols = 96) {
const sw = source.videoWidth || source.naturalWidth || source.width
const sh = source.videoHeight || source.naturalHeight || source.height
const rows = Math.max(1, Math.round((cols * sh) / sw / 2)) // cells are about twice as tall as wide
cells.width = cols
cells.height = rows
g.drawImage(source, 0, 0, cols, rows)
const d = g.getImageData(0, 0, cols, rows).data
let out = ''
for (let y = 0; y < rows; y++) {
for (let x = 0; x < cols; x++) {
const i = (y * cols + x) * 4
const light = (0.2126 * d[i] + 0.7152 * d[i + 1] + 0.0722 * d[i + 2]) / 255
out += RAMP[Math.min(RAMP.length - 1, Math.floor(light * RAMP.length))]
}
out += '\n'
}
return out
}
// Live: const pre = document.querySelector('pre'), video = document.querySelector('video')
// ;(function tick() { pre.textContent = toAscii(video); requestAnimationFrame(tick) })()A starting point written for this page, free to use in your own projects. The skills below build the finished version with checks, fallbacks and a recorded video.
What to get right on a real page
01
Use a monospace font with tight leading
line-height: 1 and a monospace face keep the grid square. Proportional fonts break the picture apart.
02
Hide it from screen readers
A wall of characters is noise when read aloud. Mark the art aria-hidden and keep your real headline as normal text.
03
Size the grid to the screen
Fewer columns on phones keep each glyph legible and the frame rate up.
04
Show a still when motion is off
Respect prefers-reduced-motion: show one finished frame instead of the loop. A visitor who turned motion off still gets the look.
Skills that build a ascii animation
A finished hero that renders a 3D object or your picture as live glyphs, with a 1080p video for launch posts.
- ASCII Signal HeroClaude CodeCodexCursor+3 more agents
Motion Heroes · Pro
ASCII Signal Hero
WebGL2 glyph hero · page + embed · 1080p MP4
A 3D object built in code, or your own picture, rendered live as animated ASCII glyphs or dither dots beside a headline that types itself on. Six built-in objects and six glyph sets or your own ramp, with the headline kept as real, selectable HTML text.
Worth knowing: Objects are built-in shapes, not your own 3D files, and visitors need WebGL2 for the live effect.
Needs: Node.js 18+, Chrome (or Chromium/Edge) and ffmpeg; visitors need WebGL2 for the live effect
See what ASCII Signal Hero makes
Install
Build a ascii animation with your agent
Each skill is a SKILL.md folder, so it installs the same way in Claude Code, Codex, Cursor and other agents. The example below uses ASCII Signal Hero; each skill page has its own prompt.
1. Paste the install prompt
Your agent runs the installer. The first time, it shows a sign-in link so you can approve it in the browser.
Install the "ASCII Signal Hero" skill from Lookbk (https://lookbk.dev/skills/ascii-signal-hero). 1. Run: curl -fsSL https://lookbk.dev/cli.js | node - add ascii-signal-hero 2. If it prints a sign-in link, show it to me. When I say I approved it, run the same command again. 3. When the install finishes, read the SKILL.md it installed and tell me what you need from me to make the first result.
Or run it in a terminal
curl -fsSL https://lookbk.dev/cli.js | node - add ascii-signal-hero2. Start a new session
Agents load skills when a session starts. The installer writes the folder where your agent looks:
- Claude Code
- ~/.claude/skills/ascii-signal-hero
- Codex
- ~/.agents/skills/ascii-signal-hero
- Cursor
- ~/.agents/skills/ascii-signal-hero
3. Ask for the result
Describe it in plain words, for example:
Make an ASCII signal hero for our launch: a torus knot drawn in glyphs in our orange palette, the headline typed on with a block caret, our logo, nav and two buttons, plus a 12-second video for socials.
Another agent? Install a skill in any agent
FAQ
Questions
Still stuck? The guides cover installing, agents and licensing in more detail.
Read the guidesHow does ASCII animation work?
Each frame is shrunk to one pixel per character cell, and each pixel’s brightness picks a character from a ramp ordered by how much ink it has. Repeating that every frame animates it.
How do I convert a video to ASCII in the browser?
Play the video, draw each frame into a small canvas, read the pixels and map them to characters, as in the starter on this page. Put the result in a <pre> with a monospace font.
Which characters make the best ASCII ramp?
Short ramps such as " .:-=+*#%@" look bold and clean. Long ramps with 60 or more characters show more tones but look busier.
Is ASCII art bad for SEO or accessibility?
Only if it replaces your words. Keep the headline as real text and mark the art aria-hidden, so search engines and screen readers read your copy, not the glyphs.
