Spar v0.1.1
v0.1.0 could not start. Installing it and opening it produced "Spar could not
start — Spar must run inside its Electron desktop shell", on every platform. This
release fixes that. If you downloaded 0.1.0, replace it with this build; there is
nothing to migrate.
Downloads
| Your machine | File |
|---|---|
| Mac, Apple silicon | Spar-0.1.1-arm64.dmg |
| Mac, Intel | Spar-0.1.1.dmg |
| Windows | Spar-0.1.1-x64.exe |
| Linux | Spar-0.1.1-x86_64.AppImage or Spar-0.1.1-amd64.deb |
These builds are not code-signed. On a Mac, right-click the app and choose
Open the first time, or run xattr -d com.apple.quarantine /Applications/Spar.app.
On Windows, choose More info → Run anyway.
What was broken
Two separate faults, both of which only appeared in a packaged build.
The preload bridge was never built for release. Development bundles the
preload to CommonJS with esbuild, because a sandboxed renderer will not load an
ESM preload. The production build used tsc, which — in a "type": "module"
package — emits only ESM, and no index.cjs for the main process to load. So the
window opened, the renderer ran, and the API bridge it needs was absent.
It survived review because every development machine had a stale index.cjs left
over from a dev run, so the packaged app worked everywhere except on a clean
checkout — which is to say, everywhere it actually shipped from. Both paths now
build the preload from one shared configuration, and the build asserts the
artifact exists and exposes a context bridge instead of trusting that it does.
Assets were requested from the filesystem root. Vite's default base is
absolute, so the built HTML asked for /assets/index-*.js. Loaded over file://
that resolves against the root of the disk rather than the app, every script and
stylesheet 404'd, and the window came up blank. Dev never showed it, because there
the same paths are served over http.
Also in this release
- The API can be hosted. The Fastify app now deploys as a Vercel function,
the database client caps itself at one connection on a serverless runtime, and a
release is stamped with the origin it should talk to. See
docs/hosting.md. - A build with nowhere to sign in says so. Rather than reporting a refused
connection to localhost, which reads as the app being broken. - Waiting states are the logo. The app icon's dot grid runs a diagonal wave
while a test run or a page is producing something, and breathes while evidence is
being read. - Linux builds at all. The AppImage and deb targets had never once run;
between them they needed a legal executable name, package metadata, and an
import of a macOS-only module that no longer fails the build on Linux.
Known limits
- JavaScript, TypeScript, and C++ only.
- Builds are unsigned and not notarized.
- macOS is the platform the chrome has been tuned on.
- Auto-update is opt-in via
SPAR_ENABLE_UPDATES=1.