Hey folks!
I was busy last 15 months(building roblox-like in the browser with three, bun and postgres), but now I’m back to BJS and my indie games!
This time I decided to make MMO!
My first game was Village Craft ( [Game] Village Craft )
Second game Kingdom Heroes ( [Web, Poki] Kingdom Heroes )
I’ve already made a simple server for 2d game(pixi) which I recently made with my friend so i got something that i can reuse.
The idea of my game is simple: you are working at delivery company and you have to deliver things. Your first car is pretty old so you need to earn some money to upgrade it to make more money on the job.
I actively use Poki playtest feature to test concepts and iterations. This feature doesn’t serve well for A/B testing, its more for vibe checking.
So here is a todo list:
setup project: Vite, TypeScript, BabylonJS, Bun, WebSockets, SQLite. Unity as a Level Editor.
utils/libs: mathcat for math, crashcat for physics (check it out https://crashcat.dev ), pixijs for UI, oxlint/oxfmt for formatting/linting, sharp+draco for images/models compression
add camera, input system, resources loading, rendering, simple sky
simple character, simple vehicles, simple test world
run playtest on poki to get first feedback
gameplay loop iteration 1: basic game level(POIs, roads, buildings) , basic delivery feature
TBD
I already implemented a basic “empty” game and it can be played on both pc/mobile.
So the next goal is to develop interesting gameplay - picking up orders and delivering.
Some technical tricks/decisions
- VAT for characters to be able to render 100s of citizens
- ThinInstances for props/buildings. Gonna use simple low poly style. Maybe will replace it with Solid Particle System to reduce draw calls.
- PixiJS for UI. It has amazing performance, support ktx2 and texture atlases. I haven’t tried BJS’s UI yet.
- server is a single thread app! I found it pretty simple to develop and improve. SQLite works good even for 1000s transactions per second. This article inspired me to try single-write connection approach 6IT
- I chose CrashCat (made by @isaac-mason ) because of small size, zero allocations and pure JavaScript. I don’t want bloated WASM bundles with wasm<->js overhead. It has less features, less performant, but for my use case it is perfect fit!
- Vehicles are raycast-based! Check out this example from crashcat: crashcat examples

