Skip to content

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

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

feat(studio-bridge): add Linux/Wine support for headless Studio#672
Quenty wants to merge 18 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
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.
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.
When `process run` detects Linux without Wine but with Docker available,
it transparently delegates to the pre-built container image. Cookie
validation runs before delegation to fail fast on bad credentials.

Also adds environment guards to linux auth/setup/status commands with
clear error messages, bakes aftman/rojo into the Docker image, and
moves validateCookieAsync to nevermore-cli-helpers for shared use.
Non-main branches now build canary images tagged as
canary-<branch-name> instead of :latest. Use
STUDIO_BRIDGE_DOCKER_TAG=canary-feat-my-branch to test with a
canary image locally.
@Quenty Quenty force-pushed the feat/studio-bridge-linux branch from c45ce08 to 23c26b0 Compare March 6, 2026 18:52
The Wine prefix init step starts Xvfb on :99 and kills it, but leaves
/tmp/.X99-lock baked into the image. This causes the entrypoint to
fail when starting Xvfb at runtime. Also adds concurrency groups and
continue-on-error for the cleanup step.
@Quenty Quenty deployed to integration March 6, 2026 19:39 — with GitHub Actions Active
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