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 grown by ports of vanilla's own generators — trees, huge mushrooms, bee nests and their bees — plus 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. The Bedrock gateway is the younger of the two: terrain, entities, movement and chat are live, while inventory screens and the survival HUD are still on their way.

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.

Seeing is believing

The world, live in a browser

This is tachyne-map rendering a real running world — tiles meshed in Go on the server, streamed into a WebGL viewer as you fly. No Java renderer, no world export, and it keeps up as players build.

tachyne-map — live viewer
The tachyne-map 3D viewer showing a live world: a player-built castle with twin spires above formal gardens and farm plots, a beach and ocean to the west, forest to the east and snow-capped peaks behind — with the viewer's HUD reporting resident tiles, streaming radius and live mob counts.

// a real capture of the live viewer — spawn castle, streaming HUD and all. Run one against your world →

Vanilla parity

It doesn't approximate the game — it re-implements it

Mechanics are ported from the real thing, system by system, and graded against it — 38 tracked feature areas, from advancements to raids, with an honest matrix and a running changelog.

Trees grow the way vanilla grows them

Every trunk placer and foliage shape is a port of the originals, odds included: a third of plains trees come up large oaks, mega jungle trees tower over their bushes, old-growth pines podzol their own feet — and a planted sapling grows the identical tree the terrain does. Fell a trunk and the canopy rots outward from the cut, by the real distance rule.

// feature matrix: Terrain ✅ · Growth 🟡

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.

tachyne-map

service

A native-Go 3D web map with its own tile format and a streaming viewer — no Java, no world export. It renders straight off the engine's world data and keeps up as the world changes.

deploy github.com/tachyne/tachyne-map
View source

plugin-manager

daemon

Pulls, builds, boots and supervises out-of-process plugins while the server runs — the control plane behind /plugin, with progressive fleet-wide upgrades off the registry.

run github.com/tachyne/tachyne-plugin-manager
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 github.com/tachyne/tachyne-world/plugin
Read the plugin docs

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

Beyond vanilla

Worlds you can't run anywhere else

A from-scratch engine means the world itself is programmable — not just the rules on top of it.

Walk the real Cape Town

earth mode

Swap the generator for Copernicus GLO-30 elevation data: greater Cape Town at true 1:1 scale, horizontally and vertically — the world ceiling is raised so Table Mountain's plateau stands at its real ~1,060 m. You spawn in the city bowl, looking up at it.

compose -f docker-compose.yml -f docker-compose.earth.yml up
How earth mode works

Villagers that think

llm npcs

Point the engine at any OpenAI-compatible endpoint and NPC villagers run a perceive → decide → act loop — they walk the village, talk back in chat, and remember you between sessions with per-NPC persistent memory.

flag -llm http://…/v1
Read about the engine

One world, many pods

sharding

The engine is built to split a single world into physical regions served by separate pods — cross-pod handover works today as a hard-border prototype, and the whole front tier already scales by replica. Single-pod remains the production default.

read docs/SHARDING.md
The sharding design

Feature breakdown

38 areas, graded in public

Parity is tracked area by area and published as it stands — complete, in progress, or not started. Nothing here is aspirational; the full matrix spells out exactly what each status means, down to the caveats.

21 complete 16 in progress, playable 1 not started

World & terrain

  • Terrain, biomes, caves, lighting
  • Structures
  • Growth
  • Fluids
  • Explosions & sponges
  • The Nether / The End
  • Trial chambers
  • World border

Play & creatures

  • Mobs
  • Combat
  • PvP
  • Survival loop
  • Villages & trading
  • Raids
  • Fishing
  • Vehicles
  • Mount inventories

Blocks & machines

  • Mining, crafting, smelting
  • Enchanting / anvil / brewing
  • Redstone
  • Block support
  • Loom & banners
  • Smithing table
  • Beacon
  • Note blocks & jukebox
  • Signs

Progression & UI

  • Advancements
  • Statistics
  • Scoreboard & teams
  • Filled maps
  • Locator bar
  • Books, lectern, bookshelf
  • Item frames
  • Paintings
  • Armor stands

Server & ops

  • Plugins
  • Commands & gamerules
  • Online-mode auth / chat signing

How it compares

A different point in the design space

tachyne isn't a faster Paper. It trades a mature ecosystem for an architecture built around multi-version support and horizontal scale — here's the honest trade.

Conventional Java server
tachyne
Process model
One monolithic JVM process
Distributed pods: engine, per-version gateways, ingress, authz
Multi-version
Proxy or plugin layers bolted on
Native: a versionless engine plus per-version render gateways
Concurrency
One main game thread; plugins compete for it
A goroutine per connection; simulation isolated per world pod
Scaling
Vertical only — a bigger machine
Horizontal: the front tier replicates freely today; world sharding is prototyped (single-pod in production for now)
Footprint
JVM heap, GC tuning, warmup
Small static Go binaries; containers measured in tens of MB
Gameplay
Complete vanilla
Vanilla parity in progress — 21 of 38 areas complete, graded above
Ecosystem
Massive, mature plugin ecosystem
Young, but the plumbing is complete: a Bukkit-shaped Go API, an event bus, a registry, and fleet-wide rollouts

Pick a conventional server if you want the complete game and its ecosystem today. Pick tachyne if you want a multi-version, cloud-native world built to scale horizontally — and can live with the matrix as it stands. On numbers: the ~150 concurrent sessions this project has quoted were measured on the pre-split engine, before the gateway architecture existed — the pod stack has not been re-measured, so we claim no figure for it. We publish what we've measured, not what we hope.

The parts

Eleven small repos, one system

Each piece deploys on its own and does one job; the wire format lives in a single shared library, so a new Minecraft version is a translation step at the edge — never an engine change.

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

# …or walk the real Cape Town at true 1:1 scale
TACHYNE_OPS=YourName docker compose -f docker-compose.yml -f docker-compose.earth.yml 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.