Roves
Integrations

Diagnostics

What tools Roves gives you for figuring out what went wrong, in general.

Edit on GitHub

A double-clicked Roves build has no console — Windows builds set #![windows_subsystem = "windows"] specifically so it never flashes one — so failures don't show up the way a terminal app's would. Whatever you're actually debugging (a silent launch, a crash mid-game, a rendering glitch, a Steam integration that isn't responding), the same handful of tools below are where to start.

Check roves.log first

Every launch writes a fresh log (truncated on each run, so you're never looking at stale output from a previous launch) to the same per-game directory content extraction uses:

  • Windows: %LOCALAPPDATA%\<game name>\roves.log
  • macOS: ~/Library/Caches/<game name>/roves.log
  • Linux: ~/.cache/<game name>/roves.log

It captures the engine's own logging, your game's console.log/warn/error output, and any panic — all in one place, from the very first line of startup. RUST_LOG=debug (or trace) before launching raises the verbosity if the default level doesn't show enough.

Only one line in the log, then nothing?

That's consistent with either a hang, or a native crash (a GPU/driver issue, or a missing system DLL) that happens before the point your build actually reached — not a Rust panic, which would always add at least one more line. Check which milestone was logged last to narrow down where.

A real incident: mach bundle's own flags leaking into the game's args

Early on, a build reported "nothing happens" with roves.log showing the resolved launch args including --package-name/--package-version — flags meant for mach bundle itself (naming a --msi/--deb/--dmg output), not for the running game. Roves' own CLI parser rejects unrecognized flags outright and exits immediately, before a window ever exists — exactly matching "nothing happens."

A first fix attempted to stop this at the source: mach bundle cross-checking every passthrough token against its own registered flags and dropping any match before writing launch.json. Real testing (downloading and running an actual CI-built bundle) showed this didn't actually work — the exact mechanism still isn't pinned down; a byte-faithful reconstruction of mach's own argument-parsing logic, fed the exact failing invocation, parses cleanly in isolation, so the leak only manifests somewhere in the full mach environment.

Given that, the actual fix stopped trying to guarantee launch.json is clean and made a broken one non-fatal instead: if the bundled launch args fail to parse, the engine now logs the failure and retries once with just the content URL, dropping every extra arg, rather than exiting before a window ever appears. Worst case you lose that launch.json's window-size/ title customization — the game still starts. A real CLI invocation with a typo'd flag is unaffected and still errors normally; this retry only applies to a bundled (double-click) launch. If you're building at an older revision than this fix, launch.json next to your bundle's executable is still worth checking for anything that looks like it belongs to mach bundle rather than your game — it explains the shape of the failure even if your build predates the retry logic that survives it.

A faster way to check: --diagnostic-script

mach bundle --diagnostic-script ships a diagnose.bat (Windows) / diagnose.sh (macOS/Linux) right next to the game binary — including inside the --msi/--dmg installer outputs, since they wrap the same staged files (not --deb, where a terminal already shows output directly). Running it instead of the game launches the exact same binary from a console that stays open afterward, printing the exit code and the newest roves.log's contents inline. It exists specifically so a non-technical tester who hits "I double-clicked it and nothing happened" can run one script and paste back something useful, instead of being walked through finding %LOCALAPPDATA% by hand. Off by default — add the flag when building a test/debug bundle you expect to hand to testers.

CI catches this now too

.github/workflows/test.yml used to only confirm mach bundle succeeds — which is exactly how the incident above went unnoticed through several green CI runs: every real launch of the resulting bundle crashed instantly while CI stayed green throughout, because nothing there had ever actually run the binary. CI now launches each bundle it builds for a few seconds and fails the job if the process doesn't stay up, on every platform (Linux runs under xvfb-run; Windows and macOS have a real window server already). A build succeeding and a build launching are different claims — if you're setting up your own CI around mach bundle (or roves-action), consider adding an equivalent check rather than treating a successful bundle step as proof the game runs.

Still stuck?

Open an issue on the repo with roves.log's contents attached — the exact last line logged is the single most useful piece of information for narrowing down where to look next.

On this page