OniT Enterprises · Games & Culture
Mikrolet Bulak
Crazy Taxi, rebuilt around a Timorese mikrolet, on roads that actually exist. You work a 105-second shift — spot a fare, stop for them, carry them, deliver — in Tetun, in the browser, with nothing to install.

105s
Shift clock
5
Real OSM routes
3.2×
Delivery rate after the fixes
Tetun
Default language
Why build a game at all
Almost nothing made for Timorese phones is made in Timor-Leste, and almost nothing made here is made to be enjoyed. Mikrolet Bulak is the counter-example: a game whose default language is Tetun, whose setting is the road you took to work this morning, and whose joke is one a Dili passenger gets before a foreigner does. It is also a hard technical exercise in the constraint that governs every product we ship for this market — a cheap Android phone on a slow connection.
The roads are the product
The engine originally invented its road from a seeded random walk. Everything downstream — the road ribbon, the terrain, the obstacle streaming, the collision, the physics — reads from a single array of road samples, which meant the whole port to real geography was replacing what fills that array.
Five routes ship, traced from OpenStreetMap road centrelines and routed between the settlements each road really runs through, then graded against a ~30m digital elevation model sampled along that line. They are ordinary Timorese journeys rather than race courses, from a 30km run to the 122km highway to Baucau. Road surface comes from the OSM surface tag where OSM has one — it covers 12–53% of each route — and falls back to road class rather than to dirt, which is what once rendered the entire Dili–Baucau highway as a gravel track.
The cross-check that validates the pipeline: our OSM + DEM Dili → Aileu route finishes at 935m and peaks at 1330m, where the recorded 2018 GPS trace over the same terrain says 947m and 1342m.
What we shipped
Roads that exist
Five routes traced from OpenStreetMap road centrelines and graded against a ~30m digital elevation model — from a short Dili run to the 122km highway to Baucau. Road surface comes from the OSM surface tag, not a guess.
Tetun is the default, not a translation
The UI ships in Tetun with English as the fallback. bulak is Tetun for crazy — checked three ways in the Tulun glossary — so the title is the genre naming itself in Tetun. It replaced a working title that turned out to be an Indonesian province.
No download, no build step
Every texture is drawn on a canvas at runtime, so there is no image pipeline, no bundler, and nothing to install. It opens from a Facebook link on an entry-level Android phone.
Two games, one engine
The whole world reads one array of road samples, so swapping what fills it swaps the game. The same engine runs the cycling game on the recorded 2018 Tour de Timor GPS stages.
Instrumented from the first build
The nginx access log is the analytics store — no third-party SDK, no cookie banner, no added payload. Every funnel stage from index load to delivered fare is countable per build.
Budgeted for real hardware
A performance tier is selected from device memory, and boot cost is profiled rather than eyeballed — 47% of it turned out to be shader compilation, which is now a merge target rather than a mystery.
Local detail, done properly
The parts that make it feel Timorese are the parts that cost nothing to download. At 80m and 30m from a drop-off the passengers tap coins on the metal and the HUD echoes TOK TOK — the real request-stop, doing tutorial work and local recognition at once, synthesised in code with zero downloaded bytes. Chickens scatter rather than get hit. Every delivery milestone freezes the bus and moves it to a genuinely different district, chosen by scoring named-place change, settlement density, relief and altitude — not by picking the furthest point on the road.
Provenance is a rule, not a preference. The 2018 race sponsor banners are transcribed from the event's own printed vinyl, so they are suppressed on the public routes: putting one on the road to Baucau would assert a sponsorship of an event that never happened there.
What the instruments say
The access log is the analytics store. Every build is countable from index load through boot, start, and delivered fare, which means a design change can be tested rather than argued about. After a run of fixes aimed squarely at the first minute of play — a tutorial fare that eases the bus up to its first passenger, and an instruction cue big enough to read on a phone — deliveries per boot went from 2.07% to 6.62% pooled over 287 boots (z = +2.03, p = 0.042).
The same instrumentation is equally clear about what did not move: the rate at which people press START is statistically unchanged, so the gain is entirely downstream of that button and the gate cannot be credited for it. It also surfaced something no amount of playtesting would have: 6.6% of loads are on Chrome versions older than 80, which download the entire engine and then fail to parse two modern operators — a hard zero that had been misread as players losing patience.
The honest current position is that the loop works and the spread does not yet: measured virality is far below self-sustaining, and the bottleneck is that most players never earn a score worth sharing. That is the next thing to fix, and it is the number we are working against.
Why this matters beyond the game
Everything here is the discipline we apply to client work, in a setting where the constraints are unforgiving and the feedback is immediate: real geographic data with a documented provenance chain, Tetun as a first-class language rather than a translation pass, a payload that respects a $40 phone, and a measurement habit strict enough to kill our own theories.
Stack