Skip to content

Spar v0.1.1

Choose a tag to compare

@github-actions github-actions released this 04 Aug 14:04
· 82 commits to main since this release

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 infoRun 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.