- Go 98.6%
- Dockerfile 1.4%
|
All checks were successful
build / image (push) Successful in 26s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| cmd | ||
| deploy | ||
| internal/gw | ||
| .gitignore | ||
| CLAUDE.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.
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: 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 (currently always true → no Bedrock fall damage).
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).