# Flatpak manifest for monocoque -- NOT submitted anywhere (Flathub or # otherwise) yet. Built 2026-08-30 on the patterns proven working for the # sibling typiql-tauri/typiql project's own Flatpak pipeline (see this # repo's .github/workflows/flatpak.yml header for the full list of bugs # found and fixed here, monocoque-specific beyond what that sibling project # already covered). VERIFIED LOCALLY end-to-end: built, installed, and ran # both `monocoque --help` and `gmonocoque` from the resulting bundle. Not # yet verified against real CI or real hardware (HID/serial/USB device # access under the sandbox). # # org.freedesktop.Platform, not org.gnome.Platform: monocoque's GUI # (gmonocoque) only needs GTK3, which freedesktop.Platform//25.08 already # ships -- no need for the heavier GNOME runtime typiql needs for WebKitGTK. # simd is NOT bundled. It is a separate daemon with its own packaging, and # monocoque does not need it inside the sandbox to use it: simapi_get_sim() # checks /dev/shm/SIMAPI.DAT before it ever scans /proc, so a simd running on # the host -- however it was installed -- publishes telemetry this sandbox # reads directly. That is what --device=shm below is for, and it is the only # thing this manifest needs in order to work with simd. # # simapi itself is still present, but only as monocoque's own statically # linked submodule, exactly as upstream's CMakeLists builds it. There is no # separate simapi module here. app-id: io.github.spacefreak18.monocoque runtime: org.freedesktop.Platform runtime-version: '25.08' sdk: org.freedesktop.Sdk command: gmonocoque finish-args: # --socket=x11, not fallback-x11: nappgui (the GUI toolkit gmonocoque uses) # goes to X11 even when a Wayland display is available. fallback-x11 is # deliberately inactive whenever Wayland works, so under a Wayland session # DISPLAY stayed empty and gmonocoque died with `cannot open display` -- # confirmed on a real launch, with WAYLAND_DISPLAY=wayland-0 present and the # socket visible inside the sandbox. Granting real X11 routes it through # XWayland instead. --socket=wayland is kept so the toolkit can use it # directly if that ever changes. - --socket=x11 - --socket=wayland # Standard companion to X11 access: without it MIT-SHM is unavailable and # some toolkits fall over. - --share=ipc - --socket=pulseaudio # HID/serial/USB access for wheels, pedals, shifters, and shaker/LED # devices -- known risk area, Flatpak's sandboxing of raw device nodes is # not always well-behaved; needs real hardware testing, not just a # successful build. - --device=all # Retained, but not for the reason first written here: the GraphQL API on # port 9000 is served by typiql's own Rust backend, not by monocoque -- # monocoque has no network code of its own, and the only libcurl in the # binary is vendored nappgui's HTTP module, which nothing here calls. The # two programs talk through ~/.config/monocoque and the process table, not # a socket. This flag can probably be dropped. - --share=network # monocoque builds its paths from $HOME directly (e.g. # "%s/.config/monocoque/diameters.config" in monocoque-cli.c), not from # XDG_CONFIG_HOME, so it reads and writes the host's real directories. # Without these grants a real launch failed with # Failed to read config file '/home/david/.config/monocoque/monocoque.config' # slog_open_file: Failed to open file: /home/david/.cache/monocoque/...log # -- the manifest previously granted no filesystem access at all. Sharing # the real config directory is also what makes a Flatpak monocoque and a # native one agree, and what lets typiql configure it. - --filesystem=xdg-config/monocoque:create - --filesystem=xdg-cache/monocoque:create # Host /dev/shm, where a host simd publishes telemetry as POSIX shared memory # (/dev/shm/SIMAPI.DAT, mapped in simapi's simmapper.c). This is the flag # that makes a Flatpak monocoque work with a simd installed on the host, so # it matters more now that simd is not bundled, not less. # # shm is its own device option and is NOT implied by --device=all above -- # measured, with simd running: `ls /dev/shm` inside this sandbox returned 0 # entries against 18 on the host. The failure it caused is silent rather # than loud: `monocoque play` started, read its config, connected # pulseaudio, and then sat at "setting initial app state" forever, never # logging "Opening universal shared memory api", because simd looked absent. # The identical run with this flag reached that line one second in. - --device=shm modules: - name: libconfig buildsystem: cmake-ninja config-opts: - -DBUILD_TESTS=OFF # libconfig 1.7.3's CMakeLists.txt predates CMake 3.5's minimum # version policy; confirmed via a failed local build. - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/libconfig/$(basename "$f"); else echo "WARNING: no licence file found for libconfig"; fi' sources: - type: archive url: https://github.com/hyperrealm/libconfig/archive/refs/tags/v1.7.3.tar.gz sha256: 68757e37c567fd026330c8a8449aa5f9cac08a642f213f2687186b903bd7e94e - name: argtable2 buildsystem: cmake-ninja config-opts: # Same CMake-minimum-version issue as libconfig -- this one's # CMakeLists.txt is even older (2011). - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 # 2011-era code missing / includes for # isspace/toupper/bzero; GCC 14+ made implicit-function-declaration a # hard error by default where it used to just warn. Confirmed via a # failed local build. - -DCMAKE_C_FLAGS=-Wno-error=implicit-function-declaration # add_library(argtable2 ...) has no explicit STATIC/SHARED, so it # defaults to CMake's global BUILD_SHARED_LIBS (off by default -> a # static .a). monocoque's own target_link_libraries() lists argtable2 # before helper (which needs its symbols, e.g. arg_end/arg_parse in # parameters.c) -- fine for a shared library (all symbols always # available regardless of link-line position, which is what real # distro packages of this ship), but a static archive only pulls # symbols already needed by things linked *before* it, so helper's # later reference to argtable2's symbols never resolves. Confirmed # via a failed local build ("undefined reference to arg_end" etc. # from helper's parameters.c, even though libargtable2.a genuinely # contained those symbols). Building shared instead matches how this # dependency normally ships and avoids the link-order sensitivity # entirely, rather than reordering every target_link_libraries() call # in CMakeLists.txt. - -DBUILD_SHARED_LIBS=ON # This CMake port has no install() rules at all (confirmed: no # CMakeLists.txt in the tree calls install()), so the default # cmake-ninja `ninja install` step silently does nothing -- monocoque's # own build then fails on a missing argtable2.h. build-commands here # replace the default install step: `ninja` still does the real # compile, then copy the header and whatever library form actually got # built (glob rather than a fixed versioned filename, since the exact # .so version suffix isn't predictable without a build). build-commands: - ninja - install -Dm644 src/argtable2.h /app/include/argtable2.h - | for f in src/libargtable2.so* src/libargtable2.a; do if [ -e "$f" ]; then cp -P "$f" /app/lib/; fi done true post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/argtable2/$(basename "$f"); else echo "WARNING: no licence file found for argtable2"; fi' sources: - type: archive url: https://sourceforge.net/projects/argtable/files/argtable/argtable-2.13/argtable2-13.tar.gz/download sha256: 8f77e8a7ced5301af6e22f47302fdbc3b1ff41f2b83c43c77ae5ca041771ddbf dest-filename: argtable2-13.tar.gz - name: lua5.4 # Lua's own Makefile, not CMake/autotools. `posix` (not `linux`) avoids # a readline dependency only needed for the interactive REPL binary, # which monocoque doesn't use -- only the library. buildsystem: simple build-commands: - make posix MYCFLAGS=-fPIC - make install INSTALL_TOP=/app sources: - type: archive url: https://www.lua.org/ftp/lua-5.4.7.tar.gz sha256: 9fbf5e28ef86c69858f6d3d34eccc32e911c1a28b4120ff3e84aaa70cfbf1e30 - name: libserialport buildsystem: autotools # No pre-generated configure script in the git-archive tarball, only # autogen.sh. build-commands: - ./autogen.sh post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/libserialport/$(basename "$f"); else echo "WARNING: no licence file found for libserialport"; fi' sources: - type: archive url: https://github.com/sigrokproject/libserialport/archive/refs/tags/libserialport-0.1.2.tar.gz sha256: cbb1192a09ff31d34e7efdb17a2f50d9d1974461c0b81c29bb449515d78d8950 - name: libxdg-basedir buildsystem: autotools build-commands: - ./autogen.sh post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/libxdg-basedir/$(basename "$f"); else echo "WARNING: no licence file found for libxdg-basedir"; fi' sources: - type: archive url: https://github.com/devnev/libxdg-basedir/archive/refs/tags/libxdg-basedir-1.2.3.tar.gz sha256: ff30c60161f7043df4dcc6e7cdea8e064e382aa06c73dcc3d1885c7d2c77451d - name: hidapi buildsystem: cmake-ninja config-opts: # Same CMake-minimum-version issue as libconfig/argtable2, despite # this otherwise being a current, actively maintained release. - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 # monocoque links hidapi-hidraw specifically -- no need for the # libusb-backed variant, which would pull in an extra dependency. - -DHIDAPI_WITH_LIBUSB=OFF - -DHIDAPI_WITH_HIDRAW=ON post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/hidapi/$(basename "$f"); else echo "WARNING: no licence file found for hidapi"; fi' sources: - type: archive url: https://github.com/libusb/hidapi/archive/refs/tags/hidapi-0.14.0.tar.gz sha256: a5714234abe6e1f53647dd8cba7d69f65f71c558b7896ed218864ffcf405bcbd - name: glu buildsystem: meson sources: - type: archive url: https://gitlab.freedesktop.org/mesa/glu/-/archive/glu-9.0.3/glu-glu-9.0.3.tar.gz sha256: 7e919cbc1b2677b01d65fc28fd36a19d1f3e23d76663020e0f3b82b991475e8b - name: libuv buildsystem: cmake-ninja config-opts: - -DBUILD_TESTING=OFF post-install: - sh -c 'f=$(ls -1 COPYING COPYING.txt COPYING.LIB LICENSE LICENSE.txt LICENSE.md LICENCE licence.txt 2>/dev/null | head -1); if [ -n "$f" ]; then install -Dm644 "$f" /app/share/licenses/libuv/$(basename "$f"); else echo "WARNING: no licence file found for libuv"; fi' sources: - type: archive url: https://github.com/libuv/libuv/archive/refs/tags/v1.49.2.tar.gz sha256: 388ffcf3370d4cf7c4b3a3205504eea06c4be5f9e80d2ab32d19f8235accc1cf - name: monocoque buildsystem: cmake-ninja config-opts: - -DBUILD_GUI=on - -DCMAKE_BUILD_TYPE=Release # CMakeLists.txt links most of the dependencies built as separate # flatpak modules above (hidapi-hidraw, serialport, argtable2, config, # uv, xdg-basedir) by bare library name with no explicit -L, relying on # the linker's default search path -- fine on a real system where these # install to /usr/lib, but /app/lib isn't in that default path. # -DCMAKE_EXE_LINKER_FLAGS=-L/app/lib didn't work: CMake appends # EXE_LINKER_FLAGS at the *end* of the link command, after the -l # flags that need it, and ld resolves -l against -L directories seen # so far, left to right -- confirmed via a failed local build showing # the exact same missing-library set with that flag present but # useless. LIBRARY_PATH is a GCC driver environment variable, applied # to its search regardless of where in the command line things land. build-options: env: LIBRARY_PATH: /app/lib sources: # One level up from flatpak/manifest.yml is the repo root -- unlike # typiql-tauri/typiql's dual-checkout ($GITHUB_WORKSPACE containing # two separate repos side by side, needing an extra level), monocoque # is checked out on its own with the standard single-repo layout, so # this doesn't need the same `../..`/`../../..` juggling that session # got wrong twice before finding the right depth for that project. - type: dir path: .. # Skip the submodule paths. If the tree being built has them checked # out, the copy brings along a real `.git` *file* at each path, and the # git sources below then fail to clone into the same spot: "cannot # overwrite non-directory .git with directory". Without this the # manifest only builds from a checkout that deliberately omits # submodules -- which is why CI's flatpak job checks out without them, # and why a local build right after `git submodule update --init` # breaks. Skipping makes it work either way. skip: - src/monocoque/simulatorapi/simapi - src/monocoque/mgui/nappgui_src # Two git submodules, each pinned to the exact commit .gitmodules/the # tree tracks -- confirmed via a failed local build that the `dir` # source above doesn't pull submodule content in (same class of issue # as typiql-tauri/typiql's own submodules, src/lib/per-form etc.). - type: git url: https://github.com/spacefreak18/simapi commit: 50fd181681862256780b2a0f74ef4bc459ed631a dest: src/monocoque/simulatorapi/simapi # nappgui_src is add_subdirectory()'d directly into monocoque's own # CMake tree (src/monocoque/mgui/CMakeLists.txt), not a separately # installed library -- so it's a source here, not its own flatpak # module. - type: git url: https://github.com/frang75/nappgui_src commit: 29c7bd3e0243eb38aa9a7e2eafe6cf74830c4ee8 dest: src/monocoque/mgui/nappgui_src - type: file path: io.github.spacefreak18.monocoque.desktop - type: file path: io.github.spacefreak18.monocoque.metainfo.xml # Icon comes from tools/monocoque.svg via the `dir` source above (no # separate file source needed). That file is a square 100x100 copy of # the upstream artwork -- the published monocoque.svg the deb job # downloads is 100x50, which Flatpak's export rejects outright, while # appstreamcli separately hard-requires any desktop-application to # have an icon at all (both confirmed via failed real CI runs). It is # padded via a , not stretched. Shared # with the AppImage job, which has the same square-icon need. post-install: # This package's own licence, the vendored nappgui's (a source rather # than a module, so the per-module collection above misses it), and the # notices file naming every bundled dependency's origin. - install -Dm644 LICENSE.rst /app/share/licenses/monocoque/LICENSE.rst # The Debian copyright file is upstream's own account of what is in this # source tree and under what terms -- slog (MIT), nappgui (MIT), simapi # (LGPL) -- which a bundle has to carry because it distributes all of # them, unlike a .deb whose dependencies are separate packages. Shipped # verbatim rather than restated. - install -Dm644 tools/distro/debian/dpkg/copyright /app/share/licenses/monocoque/copyright # lua and glu ship no licence file in their tarballs -- Lua's MIT text # lives in doc/readme.html, glu's SGI Free B only in source headers -- so # checked-in copies are installed from here, where the repo is the build # directory. (Doing it in their own modules fails: those build # out-of-tree, so their source directory is not the working directory.) - install -Dm644 packaging/licenses/lua-5.4-LICENSE.txt /app/share/licenses/lua5.4/LICENSE - install -Dm644 packaging/licenses/glu-LICENSE.txt /app/share/licenses/glu/LICENSE - install -Dm644 src/monocoque/mgui/nappgui_src/LICENSE /app/share/licenses/nappgui/LICENSE - sh -c 'python3 tools/generate-third-party-notices.py flatpak/io.github.spacefreak18.monocoque.yml > /tmp/notices.md && install -Dm644 /tmp/notices.md /app/share/licenses/THIRD-PARTY-NOTICES.md' # Confirmed via a failed local build that flatpak-builder's cmake-ninja # buildsystem runs the automatic build+install step regardless of # whether build-commands are also given -- these run in *addition*, # not instead. So the fix for simlighttest (a stray, always-on scratch # test executable that failed to link -lserialport, a pre-existing # CMakeLists.txt bug unrelated to Flatpak) had to be commenting it out # at the source, not overriding the build here. With that gone, the # automatic build+install (using this repo's own new install() rules) # already installs monocoque/gmonocoque correctly; these build-commands # only need to add the extra files CMake doesn't know about. build-commands: - install -Dm644 io.github.spacefreak18.monocoque.desktop /app/share/applications/io.github.spacefreak18.monocoque.desktop - install -Dm644 io.github.spacefreak18.monocoque.metainfo.xml /app/share/metainfo/io.github.spacefreak18.monocoque.metainfo.xml - install -Dm644 tools/monocoque.svg /app/share/icons/hicolor/scalable/apps/io.github.spacefreak18.monocoque.svg