Skip to content

Replace the local web dashboard with a native GTK4 OpenFrag app #48

Description

@NtrpyDev

Goal

Replace the local browser dashboard with an installed native GTK4 desktop client before v1. Keep the daemon and recorder as background processes so capture and Game State Integration continue when the window is closed.

Settled architecture

One OpenFrag installation ships:

  • openfrag, the GTK4 desktop client for stats, setup, Doctor, Match evidence, Clip review, settings, and status.
  • openfragd, the private background service that owns SQLite, files, capture coordination, Game State Integration, imports, and mutations.
  • openfrag-recorder, the pinned supervised capture helper.

The desktop client communicates with the daemon through a private Unix domain socket. It never opens SQLite directly. Remove the browser launcher, embedded dashboard HTML, loopback TCP listener, and public HTTP-shaped product language.

Five-round decision: GTK4 versus Tauri

  1. Product fit: GTK4 wins because the requested product is genuinely native; Tauri remains a webview.
  2. Existing UI reuse: Tauri wins because it could reuse HTML, CSS, and JavaScript.
  3. Linux integration and accessibility: GTK4 wins through native widgets and desktop integration.
  4. Security boundary: GTK4 wins because it removes the browser renderer and localhost transport from the trusted UI path.
  5. Packaging and long-term ownership: GTK4 wins because OpenFrag is Linux-first and Rust-based, while Tauri adds a frontend toolchain plus a system webview dependency.

Winner: GTK4, four rounds to one. The short-term rewrite cost is accepted to avoid shipping a v1 interface already marked for replacement.

Required implementation

  1. Add a Rust GTK4 desktop binary with canonical application identity and one main window.
  2. Preserve domain logic below the UI. Expose typed daemon operations over a private, permission-restricted Unix socket.
  3. Implement setup, Doctor, Match and Rating evidence, stats, Clip preview/review/trim/export, Manual Flag status, capture status, errors, and empty/loading states.
  4. Keep capture and Game State Integration alive when the window closes. The app may activate or focus an existing window without starting a second daemon.
  5. Remove the embedded HTML dashboard, JavaScript, browser launch path, localhost API listener, and their packaging/runtime dependencies.
  6. Make every state keyboard accessible, screen-reader legible, deterministic under test, and safe with untrusted file names and imported content.
  7. Package the client, daemon, service, launcher, icons, desktop metadata, and recorder as one product in AUR, Fedora 43, and Fedora 44 channels. The removed generic binary tar channel is not a v1 target.
  8. Add focused widget/presenter tests, typed transport contract tests, accessibility-tree assertions, headless native journeys, and installed desktop smoke checks.
  9. Update the support matrix with real KDE Wayland and GNOME Wayland results.

Acceptance criteria

  • Launching OpenFrag opens a native desktop window, not a browser.
  • No shipped process listens on TCP for the UI.
  • Closing the window does not stop an enabled replay buffer or Game State Integration.
  • The client cannot mutate SQLite or media outside the daemon contract.
  • Every dashboard capability represented in v1 has an equal or stronger native workflow and automated proof.
  • Installed AUR, Fedora 43, and Fedora 44 packages contain and launch the same application identity.
  • PC1 and PC2 complete the native installed journey with explicit human observation.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    wayfinder:claimedA session is working this ticket nowwayfinder:taskTask ticket: manual work that unblocks the discussion

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions