I wanted clouds made of punctuation. Not a photograph with a text-like filter, but actual characters: dots in the dark parts, denser marks where the clouds catch the light. And I wanted them to move.
The first versions had the right general shape, but something was missing. Edges were muddy. Faint parts disappeared. A moving cloud could still look like a cloud while losing the details that had made me want to recreate it.
A video of letters is still a video
This turned out to be the useful distinction. A video can contain pictures of characters. Native text gives the browser the characters themselves. From a distance the two might look similar; up close, the letter shapes and sharpness can feel quite different.
There was another wrinkle: the source animation already contained ASCII characters. Treating it as an ordinary image and averaging its brightness again was throwing away information. Instead of recovering a mark, the conversion was averaging the mark together with the empty space around it.
Comparing individual frames made that easier to see. I needed to recover the existing character pattern, preserve the faint regions, and follow the timing of the original loop. Making a vaguely cloud-shaped replacement was answering a different question.
A dot is part of the picture
I kept coming back to the darkest areas. Leaving them empty made the clouds stand out, but scattered dots gave the whole image a texture. The background mattered too.
The choice of characters became a small palette. A dot leaves most of its cell open. A heavier symbol fills more of it. The font changes those shapes again. There is no single perfect brightness ramp: the result depends on which marks you choose and how they are drawn.
The small animation above is a new procedural illustration of that idea. It draws its own drifting cloud shapes with a handful of characters. It is not the recovered source animation, and it is not a weather simulation.
Keeping the motion light
Once the detail was there, I wanted the browser to do less work. The renderer could reuse its text buffer, skip cells outside the visible area, and update only when another frame was due. That made the animation less wasteful without replacing the characters with a video.
For this little illustration, motion starts only when you choose it. Pausing leaves a complete frame to inspect. That feels appropriate for a picture made of writing: you should be able to stop and look at the marks.
What interested me most was how much survived the translation. A few repeated symbols can suggest softness, depth, and movement. Then you look closer and the sky becomes punctuation again.
A personal observation, and a question to come back to.