Skip to content

DebugBridge v2.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 12 Jun 10:26
· 2 commits to main since this release

DebugBridge v2.0.0

Groovy-Java bridge for Minecraft: a WebSocket REPL into the running client.

Installation

  1. Install Fabric Loader for your Minecraft version
  2. Drop the appropriate JAR into your mods folder
  3. Launch the game — you'll see a developer warning on first run
  4. After accepting, the bundled web UI is at http://localhost:9976
    (the in-game startup message prints the exact URL)

New: bundled web UI

The Vue inspection app (dashboard, entity/block browsers, screen
inspector, object browser, Groovy console) now ships inside the
jar and is served at http://localhost:<bridge port + 100>
no repo checkout or Node toolchain needed. Loopback-only and
static-assets-only, same posture as the bridge itself; each game
instance serves its own UI and the page connects back to the
instance that served it. Disable with "web_ui_enabled": false
in config/debugbridge.json. The status endpoint reports the
port as webUiPort, and the join-time chat message prints the
URL as a clickable link.

New: record_video endpoint

Captures N frames of the main framebuffer (every frame or at a
fixed interval) and writes a single JPEG contact-sheet grid or
per-frame JPEGs under <gameDir>/debugbridge-recordings/
enough to check an animation or camera path without a screen
recorder. Concurrent recordings (and screenshots taken
mid-recording) return BUSY.

Breaking: the scripting runtime is now Apache Groovy 5

The execute endpoint runs Groovy 5.0.6 (the LuaJ runtime is
removed). The wire contract is unchanged — {code, timeoutMs?} in,
returnValue/output/error out — but scripts themselves must
migrate:

Lua (old) Groovy (new)
obj:method(args) obj.method(args)
java.import(name) java.type(name)
java.new(Cls, ...) Cls(args) or Cls.create(args)
java.iter(x) / java.array(x) java.list(x)
java.typeof(x) java.typeName(x)
java.cast(x, name) removed — dispatch walks the runtime hierarchy
io.open(...) new File(...)
os.time() System.currentTimeMillis()
print(x) / pcall / local x println x / try/catch / def x

mc / player / level stay pre-bound, the binding persists
across calls, and field-vs-method is by syntax: obj.foo reads a
field (JavaBean getter fallback), obj.foo(args) calls a method.
New sync { ... } runs a closure on the game thread in one hop —
bulk loops over hundreds of entities finish in milliseconds where
the per-call bridge used to time out at ~100 items. Sandbox:
Runtime/ProcessBuilder/java.net.* blocked, file I/O allowed.
The legacy "lua" block in debugbridge.json still parses as an
alias for "script".

New: session-control endpoints (off by default)

  • disconnect / joinServer / quit, gated by
    session_control_enabled in debugbridge.json; status reports
    the capability as sessionControlEnabled.
  • disconnect/quit are fire-and-acknowledge: poll snapshot /
    screenInspect for the outcome. joinServer pre-accepts the
    server resource pack and defers the connect until the client
    has settled (no loading overlay) — joining during the startup
    resource reload would silently drop the server pack — so its
    ack means the connect attempt actually started (bounded at
    60 s; a never-settling client gets an error response). Safe to
    fire the moment the bridge port answers after a launch.
  • Lets an MCP orchestrator drive the full rebuild → relaunch →
    rejoin dev loop (see mcdev-mcp ≥ 2.1.0 for the client tools).

Fixed (caught by live in-game testing)

  • Overloaded methods now dispatch correctly on obfuscated
    builds.
    Each Mojang overload maps to its own runtime name;
    resolution used to collapse them to one, making calls like
    vec.add(otherVec) fail with argument type mismatch and
    decimal-literal args (Groovy BigDecimal) unable to reach
    double overloads. Constructors also select by argument types,
    not just arity.
  • Wrapped objects delegate toString/equals/hashCode, so
    string interpolation shows real values and == compares values.
  • Missing-method errors speak Mojang names with did-you-mean
    suggestions instead of leaking class_NNNN.
  • execute object results show Mojang field names in their
    fields summary ({x, y, z}, not {field_1352, ...}).
  • Web UI inventory panel migrated to Groovy (was still sending
    Lua) and batches its slot/component scans in sync { }.

Supported Versions

  • Minecraft 1.19 (Fabric Loader >= 0.14.0)
  • Minecraft 1.21.11 (Fabric Loader >= 0.16.0)
  • Minecraft 26.2 development snapshots (Fabric Loader >= 0.19.2;
    the jar targets 26.2-pre-2 specifically)