Grow Now! Games has released a playable ASCII cyberpunk city demo in the browser. The visible city is made of text characters, but the machinery beneath it is conventional GPU work: Rust-generated city data, JavaScript transfer code, a WebGL renderer and a texture atlas full of cached glyphs. That distinction is the interesting bit, not the terminal cosplay.
Tom’s Hardware reports that the build loads a 283KB WebAssembly module, ascii-city-engine_bg-DqjAhqbp.wasm. The module reserves 1,152KB of linear memory at launch, a separate measurement from its download size. Its reported exports include functions to initialize and advance the game and generate a local map; debug paths in the binary point to Rust files for the city, world, population, interiors and rendering.
How does the ASCII cyberpunk city render 3D scenes?
According to Tom’s Hardware’s inspection, Rust handles world generation and sends JavaScript base64-packed byte arrays describing the scene. Those arrays include building heights, tile types, surface information, hue and saturation values, window styles, lighting flags and floor-plan IDs. In other words, the WebAssembly code provides structured attributes for the city rather than a finished image.
The renderer then turns character-and-color combinations into reusable graphics. It draws each combination into a canvas with fillText, stores those glyphs in an atlas, and uploads the atlas to the GPU with one texImage2D call. Each on-screen text cell becomes a textured quad made from six vertices. Tom’s Hardware says the WebGL path compiles vertex and fragment shaders, with the fragment shader performing a single texture lookup.
This is how a scene can look like pure ASCII while avoiding a separate canvas text operation for each cell in the main GPU path. The character grid is the visual language; it is not a claim that the underlying renderer is only text.
What scale does the browser build target?
Desktop sessions render 180 columns by 80 rows, or 14,400 character cells, using 10px Consolas and nine pixels of vertical space per row, Tom’s Hardware reports. The renderer puts all visible cells into one buffer upload and issues one drawArrays call per frame. Its vertex buffer begins at 2.76MB and doubles if a frame needs more capacity.
Touch configurations use 48 rows and 96 to 168 columns, while the Rust engine has a separate 160-by-112 profile. The build also retains two alternate rendering routes: a Canvas 2D drawImage path when WebGL is unavailable, and a per-cell fillText route accessible through the ?direct URL parameter.
The browser release followed Grow Now! Games’ earlier video and arrived alongside a new video focused on interiors, elevation and skyscrapers, according to Tom’s Hardware. The project’s compact Wasm module is a concrete implementation choice, not proof that every browser game should be built this way. It does show that thousands of character cells can be treated as GPU sprites when the renderer quits pretending every letter needs its own ceremony.
This story draws on original reporting from Tom's Hardware.