Build2 publishersIndependently confirmed3 min readPublished
283KB on the wire, close to four megabytes in RAM: an ASCII city's real budget
A solo developer's walkable ASCII cyberpunk city ships as a 283KB Rust WebAssembly module. The numbers underneath that headline figure are the ones worth reading.
The Engineer · Build desk
Drafted by a language model from the sources cited here and checked against its claim ledger before publication. How we use AISend a correction

What happened
- Rhys Gronow of Grow Now! Games put ASCII City Prototype 1 online this week, a walkable browser city with interiors, elevation and multiple floors.
- The page fetches a 283KB Rust WebAssembly module that reports engine version 0.1.0 when instantiated outside the browser.
- World generation runs in Rust, which passes packed byte arrays to JavaScript for display.
- The whole visible grid reaches the GPU as one buffer upload and one drawArrays call per frame.
- Access is being offered through Ko-fi, with no monetization plan, release date or final scope disclosed.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost The saving lands on the wire, not in RAM: whoever loads the page pays multi-megabyte residency for a sub-300KB fetch, which is why the touch profile cuts the grid instead of the detail.
- capability With glyphs generated on the client, extra city costs generation time and code rather than download, so scope can grow while the fetch stays flat.
- constraint Caching per character-and-colour combination means visual variety, not map size, is what inflates the atlas and the upload, so the cheap axis to expand is the world.
- contradiction The no-shaders, no-textures framing that carried the original video does not describe the build now on offer, which changes what the achievement should be credited for.
The download figure is the smallest number in this build, and the file listing invites you to mistake it for the size of the thing. The module reserves 1,152KB of linear memory the moment it instantiates [2], roughly four times its weight on the wire [21]. The renderer then preallocates a 2.76MB vertex buffer and doubles it when a frame overruns [16]. Before you count the JavaScript, the shader pair or the atlas canvas, resident cost is already about fourteen times the fetch [22].
Divide the buffer by the grid and the geometry becomes legible. Desktop draws 180 columns by 80 rows, 14,400 cells [6], at six vertices apiece [4], which puts the preallocation at roughly 192 bytes per cell, near 32 bytes per vertex [26]. That is eight floats: a position, an atlas coordinate and not much else. All 86,400 vertices ride in the single upload [23]. Every cell is the same quad with a different lookup and the fragment stage is one texture2D call [15], so the batching costs nothing to arrange. Perspective comes from a custom ray-caster that fires rays from the camera each frame and uses first-hit distance for depth and occlusion, according to PC Gamer [20].
What the character grid buys is the absence of an asset pipeline. Nothing ships as a model or a texture; glyphs are drawn on the client with fillText, cached per character-and-colour combination, and uploaded once [4]. Download size therefore tracks code, and the code is generation: debug paths name city.rs, world.rs, population.rs, interiors.rs and rendering.rs [14], and the data crossing into JavaScript goes down to window styles, lit flags and floor plan IDs [3]. The corollary is that atlas growth is priced in palette rather than in city. More blocks cost nothing there. More hues do.
The engine also carries a separate 160 by 112 profile [7], 17,920 cells, a quarter more than the desktop display shows [24]; Tom's Hardware's inspection does not say what the surplus serves. Touch sessions drop to 48 rows and 96 to 168 columns [7], 32 to 56 percent of the desktop cell count [25], and two fallbacks sit beneath WebGL, a Canvas 2D drawImage path and a per-cell fillText path reachable with a ?direct parameter [8].
Grow Now! Games described the original demo to PC Gamer as having "no Unity, there's no Unreal, there's no 3D models, textures, or shaders" [9]. The build now playable compiles a shader pair and uploads a texture atlas [15][4]. Runtimewire's reading is that the ASCII presentation survives regardless, since what the browser draws underneath is GPU-backed textured geometry [12]. The video version filled 120 by 56 characters [17]; the playable one fills a little over twice as many cells [27]. Behind it is an audience of more than a million video views and 9,000 comments [11], and a studio that has disclosed no outside investors or funding [13]. PC Gamer reported Gronow is weighing dialogue and a fuller game [19]. On the evidence in the binary, the world can get much larger before the wire cost moves; the visual vocabulary is the part that has a price.
What to watch
- Whether the 2.76MB vertex buffer actually doubles in the field on mid-range phones running the narrow touch profile.
- Whether the atlas moves from runtime fillText to a prebuilt asset, which would put download size back in play.
- A named price or platform for the prototype, which would say whether the Ko-fi page is a tip jar or a storefront.