asciify
2026 · Tool in production
I watched Acerola’s video on his ASCII shader and wanted to run my photos through it. You could not: the shader lives inside ReShade and expects a game rendering live, not a JPEG. So I ported it to Go, on the CPU, with no dependencies, and put a web page in front of it.
The interesting part came with the photos. The shader assumes a well-lit game frame, and on an ordinary photo almost every pixel lands in two or three of its ten luminance bands: you see two or three glyphs and the rest of the scale never shows up. In colour mode it tints every glyph with the exact colour of its cell on black, so even a bright photo comes out as dark specks. Two new options, off by default to stay faithful to the shader, fix that: glyphs at full brightness over a wash of the cell’s colour, and a luminance equalization that spreads the ten glyphs.
It is a toy, but it is built like a service: the API on Cloud Run behind a key, the web on another Cloud Run with a proxy that holds that key, and a gallery of photos chosen by looking at renders at real size, because at eight pixels per glyph the only way to know what looks good is to look.
Part by part
Port the shader
AcerolaFX is a shader pack for ReShade: the ASCII effect is a chain of HLSL passes meant to run over a live game, not a photo. I rewrote it in Go on the CPU, with the standard library and nothing else: difference of Gaussians for the edges, luminance quantized into ten bands, and the two original glyph atlases embedded in the binary. The same chain serves a CLI, a terminal app and the API, and the same configuration produces the same PNG byte for byte through all three.
Serve it through an API
One endpoint takes the image as base64 and the configuration as JSON and returns the PNG. It runs on Cloud Run behind a key: the server stores only its hash and compares in constant time, like the micropodcast's aggregator. Another endpoint publishes what the engine can do, the fonts, the defaults and the limits, so a frontend can build its controls without knowing them in advance.
The web
A page where you drop a photo and move the controls: the render follows every change with a short delay, and the last one wins. The browser never sees the key; a proxy on the web's own server adds it. And a gallery of twelve photos with the settings that make them look right, to start from a result instead of from the defaults.