A .png stores pixels. An .hmml stores the scene that draws them — SVG, images and a 3D space in motion. One small binary file.
Image formats freeze the result of drawing. HMML keeps the source: declarative layout, vectors, raster, a 3D space, motion — and stays smaller doing it.
Don’t store the frame. Store the program that paints it — text the browser already knows how to run.
SVG sharpness, real images as raw bytes, and a matrix3d universe, together in one binary document.
A 4×4 matrix per element; the browser does the projection. Built for generative, living media.
.hmml.Decoded in your browser right now — vector, raster, 3D, and text that rewrites itself. No network, no dependency.
A PNG-style signature, then self-describing chunks. Markup stays text; images stay raw. Unknown chunks are skipped — it grows without breaking. Full spec →
// pack any HTML — data: images become raw bytes, gzip by default const bytes = await pack(`<div style="transform:matrix3d(…)">…</div>`) // …store / send the .hmml … then, anywhere a browser runs: const doc = await unpack(bytes) el.innerHTML = doc.toHTML()