Skip to content

fix(linux): isolate AppImage GStreamer plugins to prevent ABI mismatch#444

Merged
koala73 merged 1 commit intomainfrom
fix/gstreamer-abi-isolation
Feb 26, 2026
Merged

fix(linux): isolate AppImage GStreamer plugins to prevent ABI mismatch#444
koala73 merged 1 commit intomainfrom
fix/gstreamer-abi-isolation

Conversation

@koala73
Copy link
Owner

@koala73 koala73 commented Feb 26, 2026

Summary

Problem

Users on various Linux distros reported GStreamer errors and no YouTube playback:

Failed to load plugin '/usr/lib/gstreamer-1.0/libgstcodecparsers-1.0.so.0': undefined symbol: gst_util_floor_log2
GStreamer element vp9parse not found
GStreamer element h264parse not found
GStreamer element opusparse not found

Root cause: The AppImage bundles GStreamer 1.24 from CI (Ubuntu 24.04), but the code appended host plugin directories as fallback. Host plugins compiled against a different GStreamer version (older or newer) fail with undefined symbol errors due to ABI mismatch. This left WebKit with zero usable codec plugins.

Why this is safe now

PR #434 added the full GStreamer codec suite (base, good, bad, ugly, libav, gl) to CI. With bundleMediaFramework: true, the AppImage bundles all necessary plugins. No host fallback needed.

Separate issue: Exec format error (aarch64 on x86_64)

One user also reported Exec format error when running an aarch64 AppImage — this is an architecture mismatch (wrong download), not a code bug.

Test plan

  • Run AppImage on distro with GStreamer 1.22 (Ubuntu 22.04/Debian 12) — no undefined symbol errors
  • Run AppImage on distro with GStreamer 1.28 (Arch) — no ABI conflicts
  • YouTube Live News plays correctly
  • Check stderr for absence of Failed to load plugin GStreamer warnings from host paths

…plugins

The AppImage bundles GStreamer from CI (Ubuntu 24.04, GStreamer 1.24).
Previously, host plugin directories (/usr/lib/gstreamer-1.0/) were
appended as fallback. This caused ABI version mismatches — host plugins
compiled against a different GStreamer version fail with undefined symbol
errors (gst_util_floor_log2, mpg123_open_handle64, etc.), leaving WebKit
without usable codecs for YouTube playback.

Since PR #434 installs the full GStreamer codec suite on CI, the AppImage
is fully self-contained. Remove the host fallback and block host plugin
scanning to prevent ABI conflicts across distro GStreamer versions.
@vercel
Copy link

vercel bot commented Feb 26, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
worldmonitor Building Building Preview, Comment Feb 26, 2026 7:55pm
worldmonitor-finance Building Building Preview, Comment Feb 26, 2026 7:55pm
worldmonitor-happy Building Building Preview, Comment Feb 26, 2026 7:55pm
worldmonitor-startup Building Building Preview, Comment Feb 26, 2026 7:55pm

Request Review

@chatgpt-codex-connector
Copy link

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@koala73 koala73 merged commit df03693 into main Feb 26, 2026
6 checks passed
@koala73 koala73 deleted the fix/gstreamer-abi-isolation branch February 26, 2026 19:56
@koala73 koala73 mentioned this pull request Feb 26, 2026
facusturla pushed a commit to facusturla/worldmonitor that referenced this pull request Feb 27, 2026
…plugins (koala73#444)

The AppImage bundles GStreamer from CI (Ubuntu 24.04, GStreamer 1.24).
Previously, host plugin directories (/usr/lib/gstreamer-1.0/) were
appended as fallback. This caused ABI version mismatches — host plugins
compiled against a different GStreamer version fail with undefined symbol
errors (gst_util_floor_log2, mpg123_open_handle64, etc.), leaving WebKit
without usable codecs for YouTube playback.

Since PR koala73#434 installs the full GStreamer codec suite on CI, the AppImage
is fully self-contained. Remove the host fallback and block host plugin
scanning to prevent ABI conflicts across distro GStreamer versions.
markewicz pushed a commit to markewicz/worldmonitor that referenced this pull request Feb 27, 2026
CSS changes (main.css, settings-window.css):
- Add @media (prefers-reduced-motion: reduce) — kills all 60+ infinite
  CSS animations for users who opt in, saves battery on low-end devices
- Raise --text-faint #555→#777, --text-ghost koala73#444→#666 for WCAG-passing
  contrast on dark background (~3:1 from <2:1)
- Remove max-height: 400px on mobile panels — content was silently
  clipped; panels now scroll internally with overflow-y: auto
- Constrain .intel-findings-dropdown to min(380px, 92vw) on ≤480px
  screens — previously overflowed off right edge on narrow phones
- Bump header height 40px→48px on mobile for comfortable touch target
- Raise .variant-option, .findings-badge, .layer-toggle font-size from
  9px to 11px on mobile for readability on high-DPI screens
- Add min-height: 44px to settings tabs and runtime pills (WCAG 2.5.5)

JS changes (CountersPanel, DeckGLMap, 4 data panels, badge):
- CountersPanel: gate 60fps RAF loop via IntersectionObserver + document
  visibilitychange — loop pauses when panel is off-screen or tab hidden,
  resumes automatically; add matching cleanup in destroy()
- DeckGLMap: replace 500ms setInterval news-pulse with a RAF loop that
  checks elapsed time (same 500ms cadence) — cooperates with browser
  frame scheduling, skips work when tab is hidden or render is paused
- MacroSignalsPanel, StablecoinPanel, ETFFlowsPanel, ServiceStatusPanel:
  add !document.hidden && !this.element.classList.contains('hidden') guard
  so background-tab and off-screen panels skip their periodic fetches
- IntelligenceGapBadge: skip 10s refresh when tab is hidden; clamp
  context menu coordinates to viewport bounds (prevents off-screen menu)

https://claude.ai/code/session_01PgapzQLrB8RisivM6WvCz7
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