A Minecraft server, from scratch in Go
tachyne is a Minecraft-compatible server with a versionless core. The game is a database of simulation events; every version-specific concern lives at the edge. Java 1.21.5–1.21.8, Java 26.2, and Bedrock all join the same world — no client mods, no proxy bolted on after the fact.
architecturedomain events →
Why it's different
Cross-version support isn't bolted on — it's the shape of the system. The engine owns all game state and simulation; gateways at the edge turn typed events into whatever bytes a client speaks.
The engine targets a single canonical version and speaks only domain events. Clients spanning many versions read the same world through per-version renderers.
Terrain, caves & biomes, the complete mob roster, enchanting, brewing, anvils, villages, the Nether, and the End with the dragon. A published feature matrix tracks what's done.
An ingress routes each client to the right gateway by protocol. Java and Bedrock players share the same blocks, mobs, and chat — with no client mods.
Tiers 1–2 with vanilla timing: pistons, comparators, observers, the auto-crafter, target blocks, and quirks like quasi-connectivity and the dispenser's 4-tick delay.
A compiled-in plugin API with Bukkit-shaped events, an out-of-process message bus, a registry, and a manager that installs plugins by module path while the server runs.
Ships as container images built on every push, runs on Kubernetes, and scales at the edge — or comes up locally with a single Docker command.
Modules
A module is an ordinary git repo installed by its module path — the go-get model applied to a running server. The registry indexes, it never hosts: code always flows git → you. Here's the curated first-party set.
A live 2D web map of the running world — players in real time, mobs, weather, and the in-game clock, streamed off the message bus.
A full 3D web map via BlueMap: exports the world to the vanilla format on a timer, supervises the renderer and webserver, and drops in live player markers.
Compile a plugin into the engine with a Bukkit-shaped Go API, or run one out-of-process on the bus. List it in the registry with a tachyne-plugin.json.
// Built a module? List it in the registry →
Get started
The quickstart ships a Docker Compose stack and Kubernetes manifests. Classic infinite survival by default — or walk a true-scale, real-elevation Cape Town.
# clone the quickstart, then bring it up
git clone https://github.com/tachyne/tachyne
cd tachyne
# one container, procedurally generated, full survival
TACHYNE_OPS=YourName docker compose up -d
# now connect a client ↓
A fresh server is open by default (anyone can join under any name). Don't expose it to the internet as-is — see the quickstart's security note.