w/04 · game engine · chuggie.dev
Chuggie
game boy advance games, written in tish.
what
a game boy advance engine
codebase
67k lines of tish · 34k of rust
language
tish → rust → thumbv4t
output
standard .gba roms
space / tap to jump
overview
Homebrew for the Game Boy Advance usually means C, linker scripts and a lot of pain. Chuggie makes it a modern dev experience: write the game in Tish, run tish build --target gba, get a real ROM.
Under it sits a full game-making framework — an ECS, scenes from Tiled, a chiptune engine and nearly twenty genre kits — and every example game builds in CI and is checked in a headless emulator.
90
playable example games
51
authoring packages
32
ecs components
the challenge
A GBA has 256KB of work RAM, no FPU, no atomics and four background layers. The usual Rust ECS didn't even compile for it.
Chuggie had to give game makers high-level tools — genres, dialog, save files, music — while compiling down to code that fits a 2001 handheld.
01 · the engine
an ecs that fits in a cartridge.
A structure-of-arrays ECS with component columns, a presence bitmask and generational ids, run through a fixed per-frame pipeline of 32 native systems — built from scratch after hecs failed on no_std, no-atomics thumbv4t.
- →32 components: Body, Platformer, Shooter, Chase, Vision…
- →FxHash instead of std hashing
- →stack-overflow guard on device
02 · genres
pick a genre, start playing.
51 Tish packages — shmup, platformer, top-down, isometric, fighter, beat-em-up, kart with mode 7, RTS with fog of war, rhythm, deckbuilder, dialog, cutscenes, shops, saves, link cable.
03 · worlds
draw it in tiled, bake it into the rom.
Tiled .tmj maps import through the scene: scheme with per-layer priority, parallax backdrops, collision and spawn layers — baked at build time, with the GBA's four-layer budget managed automatically.
04 · deck
a chiptune engine that compiles.
Songs are .deck text files with tracks bound to the real sound hardware — two pulse, one wave, one noise and up to six direct-sound PCM voices — baked into compact songs. Go over the voice budget and it's a compile error, not a glitch. Intensity layers give adaptive music.
05 · proof
every example, every commit.
CI builds ROMs for thumbv4t and runs examples headlessly against libmgba built from source, with scripted inputs. The same tooling produced every ROM capture on this page.
architecture
from typescript-ish to thumb.
Tish compiles to Rust, which builds against agb for the GBA's ARM7TDMI. The engine never touches agb directly — hardware goes through the tish-agb bindings.
01
game
your .tish files + Tiled maps, sprite sheets, .deck songs
02
packages
51 authoring modules: genres, ui, dialog, save, link
03
engine
SoA ECS + fixed system pipeline (tish-gba-game-engine)
04
bindings
tish-agb: sprites, backgrounds, input, audio, timers
05
runtime
tish_runtime_gba — the boundary runtime: values, fixed-point, asset arenas
06
rom
nightly Rust → thumbv4t → .gba, verified in libmgba
the developer experience
a shmup, in brief.
an excerpt adapted from examples/shmup and creature-rpg — assets and songs import straight from files.
1import { ships } from 'sheet:../assets/ships16.png'2import { theme } from 'deck:../assets/theme.deck'34backdrop(0x05060f)5shmupInit({ sheet: ships })6spawnPlayer(120, 135, {})7deckPlay(theme)
brand & design system
An arcade identity on a night-black screen: cream text, a gold crest and pixel fonts that would feel at home on the hardware.
night
#050508
crest
#2a1848
gold
#ffd24a
arcade red
#e85d04
red
#ff4d6d
cream
#f0e6d8
- ·in-browser mGBA player on the site
- ·examples ship a preview gif or still made by the engine's tools
- ·trailer cut to a 150bpm deck cue
by the numbers
125
examples
90
roms built & verified in ci
67k
lines of tish
34k
lines of rust
84
recorded previews
6
pcm voices / 4 dmg
counted from the source repositories






what we did
development
- engine, ECS and genre kits
- Tish GBA target
- headless libmgba capture & CI
design
- 90 example games
- authoring APIs
brand
- arcade identity & crest
- chuggie.dev with in-browser player
- trailer
next world
Dunean ai-first desktop ide. →