- Go 98.7%
- Dockerfile 1.3%
Leashes are METADATA here, not an actor link. Bedrock's EntityLink models only riding — Remove, Rider, Passenger — while a lead is the leashed entity's LeashHolder key together with the Leashed flag. The plan this started from said to send SetActorLink, which would have done nothing. The flags word is rebuilt from baseMetadata rather than written bare: SetActorData merges by KEY, not by bit, so a flags value carrying only the leash bit would have cleared the mob's gravity, collision and breathing along with it. Bundle contents are still not shown to a Bedrock player, and that is not a gap in an item encoder — this gateway renders no inventory at all. Items, windows and slots are a whole family it has never had; bundles are one item inside it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E3k8GjiCuFcFEFmBiXorba |
||
|---|---|---|
| .github/workflows | ||
| cmd | ||
| deploy | ||
| internal/gw | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| NOTICE | ||
| README.md | ||
tachyne-gw-bedrock
tachyne is an unofficial fan project, not affiliated with Mojang, Microsoft, or Minecraft's developer/publisher in any way. See the Disclaimer at the bottom.
Project status
Work in progress. tachyne is young and moving fast: a full survival game runs today, but expect rough edges, missing vanilla features, and breaking changes between updates. Bug reports are genuinely useful — please open a GitHub Issue with your client version/edition and what you saw. Contributions are welcome too: see CONTRIBUTING.md.
Just want to run a server? The quickstart repo brings up the whole stack in one command — Docker Compose or Kubernetes, classic infinite survival by default, real-Cape-Town earth mode as a variant.
What's implemented? Gameplay features live in the world engine, not the gateways — see tachyne-world's feature matrix for what to expect (implemented / partial / missing) as a player.
The tachyne gateway for Minecraft Bedrock edition (latest — currently 1.26.30 / protocol 1001 via gophertunnel): terminates Bedrock clients (RakNet + encryption + XBL login handled by gophertunnel), authorizes them via tachyne-access, and renders a tachyne-world — consumed over the domain attach protocol — into Bedrock wire format.
Unlike the Java fleet (per-protocol pods gw-java-770/gw-java-776), Bedrock runs ONE versionless gateway tracking the latest release: Bedrock clients auto-update, so the fleet doesn't fragment. Keeping current = bump the gophertunnel dep and rebuild; the engine never changes.
This gateway is internal-only — clients reach it through tachyne-ingress,
which owns the public <server-ip>:19132/udp and forwards RakNet datagrams to
this ClusterIP service (per-client UDP session). One hardened entrypoint; the
gateway pods aren't publicly exposed.
How it renders
- Blocks: canonical Java 1.21.11 state IDs → hashed Bedrock network
IDs (StartGame
UseBlockNetworkIDHashes=true; fnv1a-32 of the{name,states}LE NBT, dragonfly'snetwork_block_hash.goalgorithm) via the generatedbedrockBlockRIDstable — no dependency on Bedrock palette order across versions. Chunks re-encode through dragonfly'sworld/chunkpackage (sub-chunk v9, classic full-payload LevelChunk, cache off). - Items: full Bedrock item registry (
runtime_item_states) in StartGame; Java item ID → Bedrock identifier+aux viajavaItemBedrock. - Entities: canonical entity type → Bedrock actor identifier
(
bedrockEntityIDs, Geyser's mapping incl. the boat/villager_v2/etc exceptions);entity_identifiers.datsent verbatim as AvailableActorIdentifiers. Types with no Bedrock form (item frames, displays, mannequin) are skipped. - Biomes: Java biome name → Bedrock numeric ID (
bedrockBiomeIDs).
All tables are generated by scripts/gen_bedrock.py in tachyne-world from
GeyserMC/mappings (pinned at the last Java-1.21.11 commit), Geyser core's
bedrock/ resources (1.26.30) and mcmeta — MIT-licensed data consumed as
facts, algorithms reimplemented.
Run
TACHYNE_XBL_AUTH=off TACHYNE_ATTACH_TOKEN=dev \
TACHYNE_BACKEND=127.0.0.1:25500 TACHYNE_LISTEN=:19132 go run ./cmd/gw
Env: TACHYNE_LISTEN (udp :19132), TACHYNE_BACKEND (world attach addr),
TACHYNE_ATTACH_TOKEN, TACHYNE_ACCESS_URL/TACHYNE_ACCESS_TOKEN (door
policy; unset = OPEN, dev only), TACHYNE_XBL_AUTH=off (disable XBL
authentication — offline probes; NEVER in production), TACHYNE_MOTD.
Headless smoke
cmd/bedrockprobe is an offline Bedrock client: joins, spawns, decodes every
LevelChunk with dragonfly's NetworkDecode (what a real client does), asserts
terrain is present, prints a packet histogram.
go run ./cmd/bedrockprobe -addr 127.0.0.1:19132 -name probe1 -t 10s
Status / debt
- WORKING: login (XBL or off), StartGame, chunk streaming (terrain verified by probe), block updates, entity add/move/remove incl. other players (placeholder skin), player list, chat + commands + HUD text, movement (PlayerAuthInput → engine, absolute renders back), time, teleport, and the interaction bridge (melee/dig/place/use-item/hotbar/sneak via InventoryTransaction + PlayerAuthInput BlockActions).
- NOT YET: Java advancement toasts/screen (completions reach Bedrock players as chat announcements only), hurt/death animations, inventory/windows rendering, equipment/metadata rendering, health/hunger/XP (UpdateAttributes), sounds/particles, death/respawn flow, nether/end (ChangeDimension + per-dimension chunk ranges — engine chunks are 24 sections everywhere; Bedrock nether is 8), item entities (AddItemActor), boat wood variants, real Java skin → Bedrock skin conversion, on_ground derivation (a Y-stability heuristic rather than real ground detection, so Bedrock fall damage is unreliable).
Deployment
Dockerfile builds a static Go binary into a minimal image. deploy/ holds
working Kubernetes manifests (the ones this project actually runs) — treat
them as examples: substitute your own image registry, hostnames, namespaces
and secrets before applying them to your cluster.
Credits
- gophertunnel (© Sandertv) — RakNet transport, encryption, and Bedrock login/packet handling (MIT).
- dragonfly — Bedrock chunk encoding and biome definitions (MIT).
- GeyserMC — Java↔Bedrock block/item/ entity/biome mapping data and protocol resources (MIT); the generated tables in this repo are built from their published mappings.
- go-gl/mathgl (BSD-3) and google/uuid (BSD-3).
- Protocol rendering facts come via the shared
tachyne-commonlibrary — see its credits.
Development transparency
tachyne is built by its maintainer working with an AI coding agent (Anthropic's Claude): substantial portions of the implementation were written by the model under human direction, and every change is reviewed, tested and deployed by the maintainer. The project's engineering discipline is designed for exactly this workflow — byte-oracle tests pin the wire format, full test suites gate every image build, and real-client verification signs off gameplay. Disclosed here for transparency; judge the code on its behavior.
License
Licensed under the Apache License, Version 2.0 — see LICENSE and NOTICE. Note §6: the license grants no rights to the tachyne name or any trademarks.
Disclaimer
tachyne is an unofficial, independent project. It is not affiliated with, endorsed, sponsored, or approved by Mojang Studios, Mojang Synergies AB, Microsoft Corporation, or any of their subsidiaries — the developer and publisher of Minecraft have no involvement with this project. "Minecraft" is a trademark of Mojang Synergies AB. This project contains no Minecraft game code; all game behavior is independently reimplemented, and data tables are built from openly licensed community datasets (see Credits).