# Flatpak manifest for Couchcast (C++ / CMake port). # # Runtime/SDK versions were current as of mid-2026 — verify against what is on # Flathub (`flatpak remote-info flathub org.gnome.Platform`) before submitting. # # Build & test locally: # 1. flatpak install flathub org.gnome.Platform//49 org.gnome.Sdk//49 \ # org.freedesktop.Platform.ffmpeg-full//25.08 # 2. flatpak run org.flatpak.Builder --user --install --force-clean \ # build-dir flatpak/io.github.gehhilfe.Couchcast.yml # 3. flatpak run org.flatpak.Builder --user --lint manifest \ # flatpak/io.github.gehhilfe.Couchcast.yml app-id: io.github.gehhilfe.Couchcast runtime: org.gnome.Platform runtime-version: '49' sdk: org.gnome.Sdk command: couchcast build-options: env: # H.264/H.265/AAC decoders come from the ffmpeg-full extension below. GST_PLUGIN_SYSTEM_PATH: /app/lib/gstreamer-1.0:/usr/lib/gstreamer-1.0 # Extra (patented) codecs for cheap HDMI dongles that emit H.264. add-extensions: org.freedesktop.Platform.ffmpeg-full: directory: lib/ffmpeg add-ld-path: '.' version: '25.08' autodelete: false finish-args: # Windowing + GPU (GL / Vulkan) — a single fullscreen Wayland client under gamescope. - --socket=wayland - --socket=fallback-x11 - --share=ipc - --device=dri # Audio + camera nodes over PipeWire (this also grants the native PipeWire socket). - --socket=pulseaudio - --socket=pipewire # V4L2 capture nodes AND controllers/USB. There is no granular --device=v4l flag # in 2026, so raw /dev/video* access requires --device=all. This draws Flathub # reviewer scrutiny; see docs/PACKAGING.md for the justification and the Camera # portal alternative. - --device=all # ADB / adb-connect to the target device over the network. - --share=network # Read-only access to the host's ADB auth key so the sandboxed `adb` presents # the key the target already paired with, instead of generating an # unauthorized one. The app exports ANDROID_VENDOR_KEYS to point here even # though the sandbox remaps $HOME. See docs/PACKAGING.md. - --filesystem=~/.android:ro # Bluetooth-HID backend (deferred) talks to BlueZ on the SYSTEM bus. - --system-talk-name=org.bluez modules: - name: ffmpeg-extension-point buildsystem: simple build-commands: - mkdir -p /app/lib/ffmpeg # Bundle Google's prebuilt `adb` so end users don't need a system # android-tools. The ADB backend shells out to `adb` from PATH (/app/bin is on # PATH inside the sandbox); without this the transport silently fails to spawn. # Building AOSP platform-tools from source in Flatpak is impractical, so the # official prebuilt binary is used (a recognized exception for adb). It is a # single, self-contained x86_64 ELF linking only the runtime's glibc/libgcc — # no extra shared objects ship alongside it. Bump `url` + `sha256` together to # update; `strip-components` (default 1) drops the leading platform-tools/ dir. - name: android-platform-tools buildsystem: simple only-arches: - x86_64 # Google ships platform-tools for linux x86_64 only (covers Steam Deck/PC). sources: - type: archive url: https://dl.google.com/android/repository/platform-tools_r35.0.2-linux.zip sha256: acfdcccb123a8718c46c46c059b2f621140194e5ec1ac9d81715be3d6ab6cd0a build-commands: - install -Dm755 adb /app/bin/adb # --- C/C++ dependencies not provided by org.gnome.Platform ------------------ # GStreamer core, GLib, and Mesa's Vulkan ICD come from the runtime and must # NOT be bundled (symbol clashes). Everything below is a build dependency the # runtime does not ship. Verify each `tag`/version before submitting. # shaderc's `glslc` compiles GLSL -> SPIR-V at build time (embedded as C headers # via `glslc -mfmt=c`; see CMakeLists.txt). Bundled third-party sources are # fetched by git-sync-deps; it is a build-only tool and is cleaned out. - name: shaderc buildsystem: cmake-ninja config-opts: - -DCMAKE_BUILD_TYPE=Release - -DSHADERC_SKIP_TESTS=ON - -DSHADERC_SKIP_EXAMPLES=ON - -DSHADERC_SKIP_COPYRIGHT_CHECK=ON cleanup: - '*' # build-time only; nothing from shaderc ships in the app. sources: - type: git url: https://github.com/google/shaderc.git tag: v2024.1 - type: shell commands: - ./utils/git-sync-deps # SDL3: windowing + gamepad input (the Steam Virtual Gamepad). Not in the runtime. - name: sdl3 buildsystem: cmake-ninja config-opts: - -DCMAKE_BUILD_TYPE=Release - -DSDL_TEST_LIBRARY=OFF sources: - type: git url: https://github.com/libsdl-org/SDL.git tag: release-3.2.0 # toml++ (header-only) — config parsing. - name: tomlplusplus buildsystem: meson sources: - type: git url: https://github.com/marzer/tomlplusplus.git tag: v3.4.0 # ASIO standalone (header-only) — the transport worker's I/O context. - name: asio buildsystem: simple build-commands: - cp -r asio/include/* /app/include/ sources: - type: git url: https://github.com/chriskohlhoff/asio.git tag: asio-1-30-2 - name: couchcast buildsystem: cmake-ninja config-opts: - -DCMAKE_BUILD_TYPE=RelWithDebInfo # CMake installs the binary, desktop entry, and icon into /app (the prefix). sources: # For a Flathub submission this is the tagged release tarball/commit: - type: git url: https://github.com/gehhilfe/Couchcast.git tag: v0.1.0 # Dear ImGui is vendored under third_party/imgui (gitignored, absent from the # release tarball), so fetch it here into that path. - type: git url: https://github.com/ocornut/imgui.git tag: v1.92.1 dest: third_party/imgui # For LOCAL builds, comment out the git source above and use: # - type: dir # path: ..