Skip to content

feat(studio-bridge): add Linux/Wine support for headless Studio#672

Open
Quenty wants to merge 14 commits intofeat/studio-bridgefrom
feat/studio-bridge-linux
Open

feat(studio-bridge): add Linux/Wine support for headless Studio#672
Quenty wants to merge 14 commits intofeat/studio-bridgefrom
feat/studio-bridge-linux

Conversation

@Quenty
Copy link
Owner

@Quenty Quenty commented Mar 2, 2026

Adds Linux/Wine support for running Roblox Studio headlessly, with a pre-built Docker image for fast CI. The linux setup, linux auth, and linux status commands handle Wine + Studio installation, credential injection, and health checks. A nightly Docker build workflow bakes everything into a container image so the E2E workflow starts in seconds instead of re-installing from scratch each run.

Shared auth code (cookie resolution, CSRF handling) moved from nevermore-cli to nevermore-cli-helpers so both CLIs can use it. The process manager gained a Linux/Wine launch path using Xvfb + D3D11 rendering, and the bridge server now syncs dynamic action modules (like execute.luau) to the plugin before first use, fixing UNKNOWN_REQUEST errors on the v2 protocol path.

image

@github-actions
Copy link

github-actions bot commented Mar 2, 2026

Deploy Results

ℹ️ No tests to run

No changed packages with deploy targets were discovered for this PR.

View logs

Test Results

ℹ️ No tests to run

No changed packages with test targets were discovered for this PR.

View logs

@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 045302e to 2073c26 Compare March 2, 2026 19:01
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 2073c26 to cad437e Compare March 2, 2026 20:58
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from cad437e to 6b4733f Compare March 2, 2026 21:04
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 6b4733f to e67f532 Compare March 2, 2026 21:32
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 796ac70 to 0f6ff94 Compare March 2, 2026 21:52
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 0f6ff94 to a6ed2fc Compare March 3, 2026 00:39
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from a6ed2fc to cdf2030 Compare March 3, 2026 00:41
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from cdf2030 to d3d3b04 Compare March 3, 2026 00:55
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from d3d3b04 to 7a03ca0 Compare March 3, 2026 01:44
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 7a03ca0 to 89adb59 Compare March 3, 2026 01:50
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 89adb59 to c980e52 Compare March 3, 2026 02:00
Adds the linux/ module tree for running Roblox Studio under Wine on
Linux, including virtual display management, shader patching, FFlag
configuration, credential injection, and headless launch. Pre-registers
ExecuteAction in the plugin at boot so execute messages work without
needing registerAction. Accepts empty heartbeat payloads with defaults,
surfaces plugin errors in the script execution listener, and extracts
captured output from scriptComplete responses.
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from c980e52 to f05fcd2 Compare March 3, 2026 02:31
Pre-build a Docker image with Wine, Roblox Studio, and studio-bridge
baked in. Eliminates fragile 5-10 min CI setup that re-installs
everything each run.

- Dockerfile uses studio-bridge's own `linux setup` command (no logic
  duplication) and pnpm deploy for self-contained runtime
- Nightly build workflow pushes to ghcr.io with version tags
- E2E workflow runs inside the container, skipping setup steps
- devcontainer gains docker-in-docker for local image building
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 62add87 to 989e484 Compare March 4, 2026 01:20
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 989e484 to f5792f7 Compare March 4, 2026 01:30
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from f5792f7 to fdc5396 Compare March 4, 2026 01:32
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from fdc5396 to 2920879 Compare March 4, 2026 02:03
StudioBridgeServer.executeAsync() sent the execute message without first
registering the execute.luau action handler with the plugin, causing
UNKNOWN_REQUEST errors. Add _ensureActionsAsync() to sync dynamic action
modules (via syncActions + registerAction) before the first execute call,
matching the pattern already used by BridgeSession.
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 2920879 to 3e307f2 Compare March 4, 2026 02:12
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 25b9c8d to ebdb4ee Compare March 4, 2026 19:13
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from ebdb4ee to a8149db Compare March 4, 2026 19:18
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from a8149db to 9e35dfb Compare March 4, 2026 19:58
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from 9e35dfb to bf3d66f Compare March 4, 2026 20:07
- write-cred.exe now accepts multiple target/value pairs in one invocation,
  eliminating 2 extra Wine process startups (~8s saved)
- Dockerfile pre-runs wineboot -i and compiles write-cred.exe at build time,
  so auth skips the ~30s Wine prefix initialization at runtime
- Skip wineboot -i when prefix already exists (system.reg present)
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from bf3d66f to fb84921 Compare March 4, 2026 20:16
…de code

The Docker image contains an old single-pair write-cred.exe that silently
ignores extra arguments. When the batch credential writer passes 3 pairs,
only the first (userid) is written — Studio launches without cookie
credentials and hangs on a login dialog.
@Quenty Quenty deployed to integration March 4, 2026 20:57 — with GitHub Actions Active
The cookie may be invalidated between credential writes and the OAuth2
CSRF request. Since cookie-based credentials alone are sufficient for
the Studio version in the Docker image, treat OAuth2 failure as a
warning rather than crashing the entire auth step.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant