A Minecraft server, from scratch in Go

One world.
Every client.

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.

Java 1.21.5–1.21.8 Java 26.2 Bedrock latest Pure Go · no JVM Apache-2.0

architecturedomain events →

Java 1.21.5–.8 proto 770–772 Java 26.2 proto 776 Bedrock RakNet / UDP gw-java-770 gw-java-776 gw-bedrock render per version · translate wire tachyne-world ONE versionless engine · 20 TPS canonical 1.21.11 · speaks no wire protocol a new version = a new gateway step — the engine never changes

Why it's different

A versionless engine, not a patched-up proxy

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.

One canonical world

The engine targets a single canonical version and speaks only domain events. Clients spanning many versions read the same world through per-version renderers.

Full survival, honestly

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.

Java & Bedrock, one server

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.

Redstone that behaves

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.

Extend it in Go

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.

Cluster-native

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

Bolt on what you need

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.

webmap

daemon

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.

run …/tachyne-world/daemons/webmap
View source

bluemap

daemon

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.

run …/tachyne-world/daemons/bluemap
View source

Build your own

plugin api

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.

import tachyne-world/plugin
Read the plugin docs

// Built a module? List it in the registry →

Get started

Playable in one command

The quickstart ships a Docker Compose stack and Kubernetes manifests. Classic infinite survival by default — or walk a true-scale, real-elevation Cape Town.

terminal
# 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 ↓
  • Java — point 1.21.5–1.21.8 or 26.2 at <host>:25565
  • Bedrock — point the latest client at <host>:19132
  • No whitelist, offline-mode by default — perfect for a LAN
  • Add tachyne-access for real whitelist / ban / IP policy

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.