Lumen Nothing is uploaded

About This Animated Text Maker

Lumen turns a line of text into a looping GIF, MP4, or WebM. Everything happens in your browser tab. This page explains how, and names the libraries and specifications the code actually uses.

What it does

You type up to 80 characters, pick one of six styles (neon, typewriter, glitch, fire, 3D, rainbow), set font, size, colors, background, canvas size, length, and frame rate, and download the result. Export is free, has no watermark, and needs no account.

Lumen is a small tool with a narrow job: one line of animated type. It does not edit video, lay out multiple lines, or save projects.

Your text is never uploaded

The preview and every export run on your device. The site has no endpoint that accepts text, frames, or files, so there is nothing for your copy to be sent to. The page, its scripts, and its fonts are downloaded from the host like any website; the clip you make is not.

The privacy page covers what the host may log.

How a frame is made

Each style is a function, renderFrame in src/lib/render/draw.ts, that paints one frame onto a 2D canvas given a loop phase t between 0 and 1. The live preview calls it with t from the clock. Export calls it with t = i / N for each frame i, where N is duration times frame rate. Because the preview and the export share that one function, the file matches what you saw.

Everything that moves is a repeating function of t with whole cycles per loop, so the last frame leads back into the first.

GIF

GIF files are written by gifenc, an MIT-licensed JavaScript encoder, running in a Web Worker so the page stays responsive. It produces GIF89a. The palette is a single 256-color table built from six frames spread across the loop, with no dithering, so smooth glows can show banding. Transparency in GIF is on or off per pixel, which is why soft edges can look fringed on a light page.

MP4

The first choice is the browser's own H.264 encoder through WebCodecs (VideoEncoder), with mp4-muxer packaging the encoded frames into an MP4 file. If the browser has no H.264 encoder, or it fails partway, Lumen switches to h264-mp4-encoder, a software encoder built on minih264 and compiled to WebAssembly. It is loaded only when needed and does not use SharedArrayBuffer, so it needs no special cross-origin headers. Lumen does not use ffmpeg.wasm.

MP4 cannot carry transparency, so a transparent clip is flattened onto the matte color you choose.

WebM

WebM is recorded with MediaRecorder from canvas.captureStream(), using VP9 where the browser supports it and VP8 otherwise. MediaRecorder stamps frames with the wall clock, so Lumen draws each frame on a fixed schedule and the export takes about as long as the clip. Keep the tab visible while it records, because browsers slow timers in background tabs. Chromium-based browsers keep transparency in WebM; others are flattened onto the matte color.

Limits

Canvas size is capped at 2160 pixels per side and 3,000,000 pixels in total so a tab cannot be frozen by a huge request. Fonts are Latin subsets of open-licensed families. Results depend on the browser: encoder support, speed, and memory differ between devices.