Skip to content

SurfSense.deb declares no dependency on the Vulkan loader #1984

Closed

Description

@MODSetter

The gap

docs/architecture/local-models/runtime.md lists this under Known gaps:

The Linux .deb declares no dependency on the Vulkan loader (electron-builder.yml has no deb section), though libggml-vulkan.so needs libvulkan.so.1 from the host; without it the app runs on the CPU.

Why it matters

Vulkan is the only GPU backend off Apple Silicon, so the loader is not an optional extra — it is the whole graphics path. It ships with the GPU driver on an ordinary desktop, but it is a separate package on a minimal or server install, and when it is missing dlopen fails and ggml skips the backend without a word. Exit 0, no error, every model on the processor. That is the exact class of failure this runtime is shaped around, because it looks like success.

The user does not even get the app's own name for it. With the loader absent ggml lists no GPU while the operating system still sees the card, which is the broken_install status — a state the app has copy for and a deb could have prevented at install time. The AppImage cannot declare dependencies at all, but the deb can, and does not.

Where

What done looks like

  • The built .deb names the Vulkan loader in its control metadata, and the rest of electron-builder's dependency list is intact.
  • Whether that is depends or recommends is the one real decision and it is yours. depends makes apt refuse the install without the loader, which is strong given the app does run without it, just on the processor; recommends is installed by default on Debian and Ubuntu and can be declined. Say which you chose and why in the PR.
  • The AppImage is left alone. Its format carries no dependency metadata, so there is nothing to declare; if you think it should warn at runtime instead, that is a separate issue.
  • If your change alters what a deb user actually experiences, update the Failure behavior entry for "No Vulkan loader" in the runtime doc, and delete the Known gaps line in the same PR.

What not to change

Nothing about Windows. vulkan-1.dll is in System32 on a stock install, which is why nothing is bundled or declared for it. And leave extraResources and linux.target as they are — this is a metadata addition, not a repackaging.

How to verify

Nothing reads electron-builder.yml in a test today, so the real check is the package itself:

cd surfsense_local/electron
pnpm exec electron-builder --linux deb
dpkg-deb -f release/SurfSense.deb Depends Recommends

pnpm test already collects scripts/**/*.test.mjs — see scripts/sdcpp/recipe.test.mjs — so if you want a guard that runs in CI rather than only on your machine, a check that the YAML still names the loader belongs there. Write it first and watch it fail. Then:

python scripts/check_docs.py          # from the repo root, for the doc edit
cd surfsense_local/electron && pnpm test && pnpm typecheck

Before you start

Read CONTRIBUTING.md, the runtime doc and ADR 0012, which is why Vulkan is the only backend to declare. Open your PR against dev, not main. Comment here to claim this.

Activity

  1. added
    help wantedExtra attention is needed
    desktopSurfSense desktop app (surfsense_local)
    on Sep 28, 2026
  2. Cedric921 commented on Sep 30, 2026

    @Cedric921
    Contributor

    I'd like to take this one. Plan: a guard test in scripts/ first that fails until electron-builder.yml names the Vulkan loader, then a deb: section that keeps electron-builder's default depends list and adds libvulkan1 under recommends (the app runs without it, on the CPU), with the reasoning and the runtime doc's "No Vulkan loader" entry updated in the same PR.

  3. added a commit that references this issue on Sep 30, 2026
    ed910b2
  4. MODSetter commented on Sep 30, 2026

    @MODSetter
    OwnerAuthor

    Fixed by #2090, merged into dev, by @Cedric921.

    electron-builder.yml now has a deb: section that recommends libvulkan1 and keeps electron-builder's own libappindicator3-1 first, since setting recommends replaces its default list. It is a recommendation rather than a dependency because the app still works without the loader, only on the CPU: apt installs recommends by default on Debian and Ubuntu, and a minimal install can still decline it. depends is left unset, so electron-builder's GTK, NSS and X libraries stay as they were, and scripts/deb-control.test.mjs pins all three. The No Vulkan loader entry in runtime.md now says who still gets the CPU fallback: someone who declines recommends, or runs the AppImage.

    The Known gaps line this issue quoted is deleted in the same PR. Closing by hand: GitHub only auto-closes on a merge to the default branch, and we merge through dev.

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

    desktopSurfSense desktop app (surfsense_local)help wantedExtra attention is needed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions