Repository navigation
Description
The gap
docs/architecture/local-models/runtime.md lists this under Known gaps:
The Linux
.debdeclares no dependency on the Vulkan loader (electron-builder.ymlhas nodebsection), thoughlibggml-vulkan.soneedslibvulkan.so.1from 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
surfsense_local/electron/electron-builder.yml— thelinux:block. It setstarget: [AppImage, deb]and there is nodeb:section anywhere in the file. Adding that section is the whole change.- electron-builder (
^26.16.1, insurfsense_local/electron/package.json) supplies its own defaultdependslist when the key is absent, and setting the key replaces that list rather than adding to it. Check what your version defaults to and keep what is still needed, or the fix for one dependency drops several others. surfsense_local/electron/scripts/fetch-llamacpp.mjs— what is actually staged intollamacpp/, so you can confirm which file carries the link rather than taking the doc's word for it..github/workflows/build-sdcpp.yml's Linux gate already encodes the rule that onlylibggml-vulkan.somay need the loader.
What done looks like
- The built
.debnames the Vulkan loader in its control metadata, and the rest of electron-builder's dependency list is intact. - Whether that is
dependsorrecommendsis the one real decision and it is yours.dependsmakes apt refuse the install without the loader, which is strong given the app does run without it, just on the processor;recommendsis 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 Recommendspnpm 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 typecheckBefore 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
Cedric921 commentedon Sep 30, 2026
I'd like to take this one. Plan: a guard test in
scripts/first that fails untilelectron-builder.ymlnames the Vulkan loader, then adeb:section that keeps electron-builder's default depends list and addslibvulkan1underrecommends(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.fix(desktop): recommend the Vulkan loader in the Linux deb
MODSetter commentedon Sep 30, 2026
Fixed by #2090, merged into
dev, by @Cedric921.electron-builder.ymlnow has adeb:section that recommendslibvulkan1and keeps electron-builder's ownlibappindicator3-1first, since settingrecommendsreplaces 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.dependsis left unset, so electron-builder's GTK, NSS and X libraries stay as they were, andscripts/deb-control.test.mjspins all three. The No Vulkan loader entry inruntime.mdnow 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.