Skip to content

Name the macOS helpers after the app (obs-rust/obs-studio#2386) - #9

Merged
zackees merged 1 commit into
obs-rust:masterfrom
vpacher:fix/2386-macos-helper-names
Oct 25, 2026
Merged

zackees merged 1 commit into
obs-rust:masterfrom
vpacher:fix/2386-macos-helper-names

Conversation

@vpacher

@vpacher vpacher commented Oct 25, 2026

Copy link
Copy Markdown
Member

Refs obs-rust/obs-studio#2386

What and why

Chromium finds its helper apps on macOS by the main executable's name: <app> Helper, <app> Helper (GPU), (Plugin) and (Renderer) in Contents/Frameworks. The helpers were always named OBS Helper, but the Rust brand's app is OBS-Studio-Rust. So the GPU process failed to launch (GPU process launch failed: error_code=1003, then FATAL ... GPU process isn't usable. Goodbye.), and adding a browser source crashed OBS.

cmake/os-macos.cmake now names the helpers and their bundle IDs after obs-studio's app identity (cmake/common/app-identity.cmake): "${OBS_MACOS_BUNDLE_NAME} Helper" and ${OBS_MACOS_BUNDLE_ID}.helper<suffix>. Upstream these are OBS and com.obsproject.obs-studio, so the names stay OBS Helper and com.obsproject.obs-studio.helper there.

Testing

  • The check is in obs-studio: ci/test_macos_browser_helpers.py (RED with the old names, GREEN with this commit) and the helper check in ci/app_identity_check.py that the release workflow runs on every macOS app. The 2026-10-23 release app fails it; a local build with this commit passes.
  • Real app (macOS 26.7.1, Apple Silicon, CEF 7871): before, adding a browser source in the UI crashed OBS at once. With this commit it does not crash, https://example.com renders, and the GPU, two utility and two renderer processes start.
  • A first browser source created through obs-websocket still does not render: that is macOS: the first browser source created off the main thread (obs-websocket) never renders: CEF initializes on that thread obs-studio#2387, a separate problem.

AI note: Claude Code (Claude Opus 5.5) wrote the change, the tests and this text under the submitter's direction, and ran the tests above on the submitter's machine.

Chromium finds its helper apps by the main executable's name: "<app>
Helper", "<app> Helper (GPU)", "(Plugin)" and "(Renderer)". The helpers
were always "OBS Helper", but the Rust brand's app is "OBS-Studio-Rust",
so the GPU process failed to launch (error_code=1003, "GPU process isn't
usable") and adding a browser source crashed OBS on macOS.

The helper names and bundle IDs now follow obs-studio's app identity
(cmake/common/app-identity.cmake): OBS_MACOS_BUNDLE_NAME and
OBS_MACOS_BUNDLE_ID. Upstream they are "OBS" and
com.obsproject.obs-studio, so the names stay "OBS Helper" and
com.obsproject.obs-studio.helper there.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

@zackees zackees left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coordinator review: approved. Chromium finds its helpers by <executable> Helper ..., so the names have to follow the app identity. OBS_MACOS_BUNDLE_NAME and OBS_MACOS_BUNDLE_ID are set by cmake/common/app-identity.cmake, which obs-studio's top-level CMakeLists.txt includes (line 25) before any plugin, so they're always defined here. Upstream values give the old names (OBS Helper, com.obsproject.obs-studio.helper), so nothing changes there. The RED/GREEN check lives in obs-studio (ci/test_macos_browser_helpers.py, ci/app_identity_check.py), and it's verified in the real app on macOS 26.7.1 (a browser source renders, and the GPU and renderer processes start). The obs-websocket first-source issue is tracked separately in #2387.

@zackees
zackees merged commit 1412f26 into obs-rust:master Oct 25, 2026
1 check passed
vpacher added a commit to vpacher/obs-studio that referenced this pull request Oct 25, 2026
…hread)

Moves plugins/obs-browser from the head of obs-rust/obs-browser#9
(e513629, the same tree as its merge 1412f26) to master 9aa4a60, which
adds obs-rust/obs-browser#10: with the Qt loop (macOS),
obs_browser_initialize() runs BrowserInit() on the Qt main thread when it
is called from another thread, so a first browser source created by
obs-websocket renders (obs-rust#2387).

9aa4a60 has the tree of the branch tested on macOS 26.7.1 (first source
through obs-websocket renders 3 of 3, the scene-collection control too).
docs/features.md gets the obs-rust#2387 line (fixed upstream bugs, sources) and
the PR links for both.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@vpacher
vpacher deleted the fix/2386-macos-helper-names branch October 25, 2026 12:50
MCPVOT pushed a commit to MCPVOT/obs-studio that referenced this pull request Oct 25, 2026
…thread (obs-rust#2386, obs-rust#2387) (obs-rust#2390)

* ci: RED the macOS browser helpers follow the app identity (obs-rust#2386)

Chromium finds its helper apps by the main executable's name ("<app>
Helper", "(GPU)", "(Plugin)", "(Renderer)"). obs-browser names them "OBS
Helper" while the Rust brand's app is "OBS-Studio-Rust", so the GPU
process fails to launch (error_code=1003) and adding a browser source
crashes OBS.

test_macos_browser_helpers.py checks that obs-browser's macOS CMake
resolves the helpers to "<OBS_MACOS_BUNDLE_NAME> Helper" and
"<OBS_MACOS_BUNDLE_ID>.helper<suffix>" for both brands (upstream keeps
"OBS Helper" and com.obsproject.obs-studio.helper), and that
app_identity_check.py's bundle check, which the release workflow runs on
every macOS app, rejects helpers named otherwise.

Two of four fail: the pinned obs-browser hard-codes the upstream names,
and the bundle check does not look at the helpers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* macos: Name the browser helpers after the app (obs-rust#2386)

app_identity_check.py's bundle check, which the release workflow runs on
every macOS app, now checks the browser source's helper apps: when the
app has any, they must be "<CFBundleExecutable> Helper", "(GPU)",
"(Plugin)" and "(Renderer)", with the bundle IDs "<app id>.helper",
".gpu", ".plugin" and ".renderer". The 2026-10-23 release fails it with
its "OBS Helper" apps.

plugins/obs-browser moves to obs-rust/obs-browser e513629, which names
the helpers and their bundle IDs after obs-studio's app identity
(OBS_MACOS_BUNDLE_NAME, OBS_MACOS_BUNDLE_ID). With it, Chromium finds the
GPU helper and adding a browser source no longer crashes OBS on macOS.
The source still stays black until obs-rust#2387 is fixed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* ci: Skip the obs-browser source checks without the submodule (obs-rust#2386)

The Format job checks out no submodules, so test_macos_browser_helpers.py
failed there with FileNotFoundError on plugins/obs-browser/cmake/
os-macos.cmake. The two checks that read that file now skip with the
reason when the submodule is not checked out. The two bundle checks
still run there, and the release workflow runs app_identity_check.py on
every built macOS app.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* obs-browser: Update to 9aa4a60 (macOS helper names, CEF on the main thread)

Moves plugins/obs-browser from the head of obs-rust/obs-browser#9
(e513629, the same tree as its merge 1412f26) to master 9aa4a60, which
adds obs-rust/obs-browser#10: with the Qt loop (macOS),
obs_browser_initialize() runs BrowserInit() on the Qt main thread when it
is called from another thread, so a first browser source created by
obs-websocket renders (obs-rust#2387).

9aa4a60 has the tree of the branch tested on macOS 26.7.1 (first source
through obs-websocket renders 3 of 3, the scene-collection control too).
docs/features.md gets the obs-rust#2387 line (fixed upstream bugs, sources) and
the PR links for both.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants