No description
  • Go 95.2%
  • Dockerfile 4.8%
Find a file
Wesley Channon 4f591c429e
All checks were successful
build / image (push) Successful in 31s
NOTICE: name the copyright owner
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:40:54 +02:00
.forgejo/workflows ci: push with the org REGISTRY_TOKEN secret (actions token cannot write packages) 2026-07-06 13:39:12 +02:00
cmd Shrink to a main.go: the whole gateway now lives in gwsession 2026-07-10 10:05:33 +02:00
deploy deploy: TACHYNE_WORLD_PATTERN for shard-handover resume 2026-07-09 16:10:26 +02:00
.dockerignore feat: milestone 1 — version-pinned front door for Java protocol 776 (26.2) 2026-07-06 13:21:04 +02:00
.gitignore feat: milestone 1 — version-pinned front door for Java protocol 776 (26.2) 2026-07-06 13:21:04 +02:00
CLAUDE.md Shrink to a main.go: the whole gateway now lives in gwsession 2026-07-10 10:05:33 +02:00
Dockerfile feat: real client IPs via PROXY protocol from dispatch 2026-07-06 15:42:23 +02:00
go.mod Pin common 0d71595: server brand gomc -> tachyne 2026-07-10 13:23:48 +02:00
go.sum Pin common 0d71595: server brand gomc -> tachyne 2026-07-10 13:23:48 +02:00
LICENSE License under Apache-2.0 2026-07-10 14:10:10 +02:00
NOTICE NOTICE: name the copyright owner 2026-07-10 14:40:54 +02:00
README.md README: AI-assisted development disclosure 2026-07-10 14:32:45 +02:00

tachyne-gw-java-776

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.

Gateway for Java protocol 776 (Minecraft "26.2"): terminates real clients, authorizes logins via tachyne-access (fail closed, 30 s cache), attaches each session to a tachyne-world pod over the domain attach protocol, and renders the typed event stream into wire format. Structurally it is gw-770's session code plus a translation boundary: every clientbound packet is composed as canonical 770 via tachyne-common/render770, then rewritten by protocol.TranslatorFor(776) (the chained 770→…→776 translation from tachyne-common) at the client edge; serverbound packets are back-translated 776→770 before the shared parsers lift them into typed attach actions.

The 776 config phase is fully version-native: 26.x registries, the complete UpdateTagsPacket(776) tag data, brand + feature flags — all from the shared tachyne-common/protocol composition (generated tags26x/protomap_26x data; generators live in tachyne-world's scripts/).

Clients arrive via tachyne-ingress on <server-ip>:25565 (handshake protocol routing + PROXY protocol v1 for real client IPs); this pod's service is cluster-internal.

Layout

cmd/gw/            entrypoint (env-first config, SIGTERM shutdown)
internal/gw/       gateway: status | login(access) → configuration(26.x) →
                   play (attach session pump ⇄ render770 + TranslatorFor(776))
internal/access/   thin wrapper over tachyne-common/access
internal/wire/     minimal pre-play framing helpers (handshake/status)
deploy/            k8s manifests (StatefulSet + cluster-internal service)
.forgejo/workflows CI: docker build (vet+test inside) + registry push

Configuration (env)

env meaning
TACHYNE_LISTEN client listen address (default :25565)
TACHYNE_BACKEND world attach address (tachyne-world-0.…:25500)
TACHYNE_ATTACH_TOKEN attach shared secret (secret tachyne-attach-token)
TACHYNE_ACCESS_URL / TACHYNE_ACCESS_TOKEN tachyne-access (unset = checks off, dev only)
TACHYNE_MOTD server-list description
POD_NAME downward API; trailing ordinal = SID

Build / test / deploy

GOPRIVATE=<your-git-host> go build ./... && go test ./...
go run ./cmd/gw

CI builds + tags the image on push to main; kubectl rollout restart on the StatefulSet. When a tachyne-common change is involved, pin the new sha in go.mod and deploy the world pod first. CI module fetches occasionally time out ("dial :443 i/o timeout") — an empty-commit retry works.

Design notes

  • One gateway build = one client protocol family. Other versions get sibling deployments; ingress routes by handshake protocol. 773775 are currently unserved (deprioritized).
  • Adding a future protocol 77x = a new translation step in tachyne-common (ID remap + body rewriters for changed packets), a sibling repo copy, and an ingress route — the world engine never changes ("worlds are versionless").
  • See tachyne-world/docs/SHARDING.md for the multi-world-pod plan this gateway will implement the client half of (upstream set, rehome).

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

All protocol rendering comes from the shared tachyne-common library — see its credits (PrismarineJS/minecraft-data, misode/mcmeta, the Minecraft Wiki, ViaVersion as factual references). This repo itself has no third-party dependencies beyond that library.

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).