Case study · Personal project · 2026
KilobyteLive
A browser game launcher. Press Play and it runs in this tab.
The shelf opens on Cinder Field, a first-person WebGL2 match. Behind it are HTML games, Kiln Rally (C++ compiled to WebAssembly), and tiny JSON carts. Publish by uploading a build, connecting a GitHub repo, or prompting a cart. This copy ships without a cloud account, so play stays in the browser.
01Try it
Play it right here.
This is the real app, not a recording. Load it below or open it full-screen. Uploads and saves stay in your browser.

Runs entirely in your browser · about 100 KB
02Tour
Five screens, one launcher.





03The idea
Launch it here. Store a pointer.
A full engine export is heavy. One WebGL build can weigh 40 MB, so a site that stored every upload would turn into a hosting bill fast.
Kilobyte plays that build in the tab and keeps the listing: title, genre, rating, and a pointer. Creator files stay on GitHub or on that person’s machine. A few small house games ship with the site, including the WebGL match and one WebAssembly demo. A free Supabase project can hold accounts and uploads later. This demo does not include those keys, so the bill stays at a static frontend.
- 19games in the house library
- 3ways to publish a game
- 1C++ game compiled to WebAssembly
- 0 Bof a GitHub game on the server
04Publishing
Three ways to get a game on the shelf.
- Path 1
Connect a GitHub repo
Paste owner/repo. Kilobyte reads the public GitHub API, finds the game’s index.html, and plays a Unity, Godot, or custom export through jsDelivr or GitHub Pages. It never receives a zip.
Kilobyte storesA pointer to the repo
- Path 2
Upload a build
Drop in a zip, an index.html, or a folder, including a WebAssembly build. fflate unpacks it in the browser, the files go into IndexedDB, and a service worker serves them. A cloud copy is optional and stays off until a Supabase project is configured.
Kilobyte storesNothing, on this demo. It stays on the device
- Path 3
Prompt a JSON cart
Describe a game in a line. A seeded generator writes a tiny recipe on the device, and a canvas engine runs it. The house carts are the small end of the shelf.
Kilobyte storesThe cart itself, under 2 KB
05Under the hood
Small pieces, carefully joined.
Static by design
React 19 and TypeScript on Vite, with a hash router, so the whole app runs from any static host. That’s how it lives inside this site at /kilobyte/.
WebGL in the tab
Cinder Field is its own chunk and draws on a canvas in the page. Versus bots needs no account. A second player would use an optional lobby, and the page says so when that is not configured.
One C++ game, as WebAssembly
Kiln Rally is SDL2 compiled with Emscripten. The player opens index.html, index.js, and index.wasm in an iframe, and uploaded .wasm files are served as application/wasm.
Games in a URL
Share links gzip a cart with the browser’s CompressionStream and pack it into the hash (#/c/…). The link is the game, so nothing has to be saved anywhere.
This demo stays local
Cloud accounts, uploaded copies, and online lobbies need a free Supabase project. Those keys are not in this build, so play, saves, and uploads stay in the browser.
Checked on every push
GitHub Actions installs Emscripten, runs oxlint and Vitest, rebuilds the WebAssembly game, and builds the site. The job fails if a secret lands in the browser bundle.
06Run it yourself
Clone it, run it, remix it.
Kilobyte is open source. You need Node.js and about thirty seconds.
$ git clone https://github.com/michaelnjoku347/KiloByte.git
$ cd KiloByte
$ npm install
$ npm run dev