feat(server): enable Bedrock Edition support via Geyser plugin - #2
Merged
Merged
Conversation
Wire up Bedrock cross-play by having itzg/minecraft-server auto-install the Geyser-Spigot plugin from Modrinth on boot. Geyser binds UDP/19132 in-process and responds to RakNet unconnected pings, so Bedrock clients on the LAN auto-discover the server with no extra broadcaster. Chose plugin-mode (single container) over a sibling Geyser-standalone service to preserve the project's "one docker compose up" UX. Floodgate is intentionally skipped: the Java side runs ONLINE_MODE=false and Geyser's auth-type=offline matches (server/geyser/config.yml). Trade-off: Bedrock and Java users with the same name share a UUID — acceptable for a dev server, can be revisited with Floodgate later. Changes: - docker-compose.yml: add MODRINTH_PROJECTS=geyser and MODRINTH_ALLOWED_VERSION_TYPE=beta (Geyser only ships beta-tagged continuous builds); mount server/geyser as the plugin's config dir so the pre-existing config.yml is picked up. - start-dev.sh: remove the stale `docker compose logs -f geyser` line (Geyser runs in-process, no separate service); restore the Bedrock endpoint advertisement now that it's real. - .gitignore: ignore Geyser runtime artifacts (key.pem, dumps/, packs/, saved-refresh-tokens.json) and the local .env file. Verified locally: Geyser 2.9.5-b1130 downloaded, plugin enabled, UDP/19132 bound by the server JVM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8 tasks
Owner
Review — Bedrock/Geyser supportOverall: clean, minimal change. One merge note. Merge conflict heads-upPR #3 (Server Setup Overhaul) also touches
Minor note
No blockers from my side once the merge order is coordinated. |
nicoechaniz
pushed a commit
that referenced
this pull request
May 3, 2026
…lty=easy Phase 0 stabilization for the Server Setup Overhaul (epic DC-124). Locks the moving pieces so subsequent phases land on a deterministic base. PR-A of the 5-PR overhaul series. Changes: - docker-compose.yml: pin itzg/minecraft-server to digest sha256:629762aaf864e109a35e00b11d701cfc6b2bddca4331944aefde0a352ebb9fd4 (captured 2026-05-03 from a known-good running container). No more silent forward-rolls; bumps are deliberate after smoke test. - docker-compose.yml: DIFFICULTY peaceful -> easy. Permits hostile mob spawns for rolemaster narrative tension while keeping kid-friendly damage scaling. Pamplinas can override per-scene via /difficulty through mc_command. - agents/casts/rolemaster.yaml: model field corrected from kimi-k2.6 / kimi-coding to MiniMax-M2.7 / minimax to match the runtime (other casts already use this). - docs/server-overhaul.md (new): operator runbook with the pinned versions table and the upgrade procedure. Companion to plans/DC-124.md and the verbatim plan in vault. Geyser version pin deferred to a follow-up. The MODRINTH_PROJECTS line lives on feat/bedrock-geyser-support (upstream PR #2 to nicoechaniz). After that PR merges, a small follow-up replaces "geyser" with "geyser:R7DKgZlt" (Geyser-Spigot 2.9.5-b1130). Verified locally: container restarts cleanly with the pinned digest; rcon-cli confirms difficulty=Easy applied to the live world (existing worlds need a one-shot /difficulty to overwrite level.dat — documented in the runbook). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fede654
added a commit
to Fede654/DaemonCraft
that referenced
this pull request
May 7, 2026
Fede654
added a commit
to Fede654/DaemonCraft
that referenced
this pull request
May 7, 2026
…lty=easy Phase 0 stabilization for the Server Setup Overhaul (epic DC-124). Locks the moving pieces so subsequent phases land on a deterministic base. PR-A of the 5-PR overhaul series. Changes: - docker-compose.yml: pin itzg/minecraft-server to digest sha256:629762aaf864e109a35e00b11d701cfc6b2bddca4331944aefde0a352ebb9fd4 (captured 2026-05-03 from a known-good running container). No more silent forward-rolls; bumps are deliberate after smoke test. - docker-compose.yml: DIFFICULTY peaceful -> easy. Permits hostile mob spawns for rolemaster narrative tension while keeping kid-friendly damage scaling. Pamplinas can override per-scene via /difficulty through mc_command. - agents/casts/rolemaster.yaml: model field corrected from kimi-k2.6 / kimi-coding to MiniMax-M2.7 / minimax to match the runtime (other casts already use this). - docs/server-overhaul.md (new): operator runbook with the pinned versions table and the upgrade procedure. Companion to plans/DC-124.md and the verbatim plan in vault. Geyser version pin deferred to a follow-up. The MODRINTH_PROJECTS line lives on feat/bedrock-geyser-support (upstream PR nicoechaniz#2 to nicoechaniz). After that PR merges, a small follow-up replaces "geyser" with "geyser:R7DKgZlt" (Geyser-Spigot 2.9.5-b1130). Verified locally: container restarts cleanly with the pinned digest; rcon-cli confirms difficulty=Easy applied to the live world (existing worlds need a one-shot /difficulty to overwrite level.dat — documented in the runbook). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 9, 2026
nicoechaniz
added a commit
that referenced
this pull request
May 31, 2026
…te, interoception Implements all 4 priority fixes from the Claude+Grok forum review (2026-05-31): 1. GAP #5 — L4 judge verdict feedback into next heartbeat - agent_loop.py: extract l4_verdict from /judge/pending, compact format - daemoncraft.py: inject [L4 last] line into heartbeat prompt - server.js: judgeAction sets initiator='l4_agent' + ts for seconds_ago 2. GAP #1+#2 — Registry normalization + real cancellation - action-registry.js: REG_KEY alias helper + direct aliases for dig/place/collect/place_fill - mutex.js: stopDigging() + ON_ABORT dispatch with 750ms timeout + performance.now() - server.js: REG_KEY in /action wrapper, ON_ABORT in /action/stop finally block 3. GAP #3+#4 — Auto-eat gated behind ENABLE_AUTO_EAT_PLUGIN env var - server.js: plugin load + config wrapped in feature flag (default: disabled) - runner/thread.py: ensure eat path works with plugin disabled 4. Interoception enrichment — body_activity block in heartbeat - agent_loop.py: compact body_activity string from runner + action data - daemoncraft.py: [Body] line in prompt Tests: registry-normalization.test.js (10 tests), test_l4_verdict_injection.py Co-authored-by: Grok Build <grok@x.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Wire up Bedrock Edition cross-play by having
itzg/minecraft-serverauto-install the Geyser-Spigot plugin from Modrinth on boot. Geyser binds UDP/19132 in-process and responds to RakNet unconnected pings, so Bedrock clients on the LAN auto-discover the server with no extra broadcaster.The repo already contained
server/geyser/config.yml(a leftover from a prior standalone-Geyser setup) but no service or plugin actually loaded it —start-dev.sheven advertised ageysercompose service that didn't exist. This PR closes that gap with the smallest viable change.Design choice — plugin-mode (one container) vs sibling Geyser-standalone container
Picked plugin-mode to preserve the project's "one
docker compose up" UX. Trade-offs:server/geyser/server/geyser/Floodgate intentionally skipped
The Java side runs
ONLINE_MODE=falseand the existingserver/geyser/config.ymlalready hasauth-type: offline, so Floodgate's keypair-sharing complexity is not needed. Trade-off: Bedrock and Java users sharing a name share a UUID. Acceptable for a dev server; can be revisited (Floodgate is not on Modrinth for paper/spigot — would need direct-URL install via itzgPLUGINS:).Notes
MODRINTH_ALLOWED_VERSION_TYPE: betais required because Geyser only ships beta-tagged continuous builds on Modrinth (their normal release cadence — not a stability signal).broadcast-port: 0(already set in the existing config) makes it respond to RakNet unconnected pings on its bound port, which is exactly the Bedrock LAN discovery mechanism. No companion tolan-broadcastis needed..gitignoreadditions cover Geyser runtime artifacts (key.pem,dumps/,packs/,saved-refresh-tokens.json) and the local.envfile.Verified locally
Geyser-Spigot v2.9.5-SNAPSHOTenabled inside Purpur 1.21.11.Started Geyser on UDP port 19132.ss -ulnconfirms UDP/19132 bound by the JVM.Test plan
docker compose up -d minecraft; wait for healthy.docker compose logs minecraft | grep Geysershows the plugin loaded and listening on UDP/19132.<host>:25565— works as before.<host>:19132from a remote Bedrock client — connects.