Skip to content

Feat/desktop polish - #249

Merged
robdmac merged 11 commits into
mainfrom
feat/desktop-polish
Jul 5, 2026
Merged

robdmac merged 11 commits into
mainfrom
feat/desktop-polish

Conversation

@robdmac

@robdmac robdmac commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

No description provided.

robdmac and others added 11 commits June 23, 2026 01:05
Replace the ad-hoc "-" signing identity with the real Developer ID
Application identity so `tauri build` produces a signable/notarizable
DMG. Notarization credentials (App Store Connect API key) are supplied
at build time via env, never committed.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
Wire tauri-plugin-updater for signed, self-hosted auto-updates:
- tauri.conf.json: createUpdaterArtifacts + plugins.updater (minisign
  pubkey + GitHub Releases endpoint at Hyper-Int/OrcaBot).
- main.rs: register the plugin + a GUI-only background check on startup
  (check -> download -> install -> relaunch); skipped in the headless
  CLI backend so `orcabot` sessions don't trigger updates.
- Realign the Tauri stack (tauri 2.11.3 / wry 0.55.1) so the plugin's
  deps resolve consistently (now needs rustc >= 1.88).
- gitignore *.p12/*.p8 alongside existing *.key/*.pem.

Update artifacts are minisign-signed at build time via TAURI_SIGNING_*
env (never committed). REVISION: main-v7-updater

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
Notarization rejected the bundled resource executables (workerd,
vz-helper, d1-shim) — Tauri signs the app shell but not these, so they
lacked Developer ID, hardened runtime, and a secure timestamp.

Sign them in build-desktop-resources.sh (runs as beforeBuildCommand,
before Tauri seals/notarizes the bundle), gated on APPLE_SIGNING_IDENTITY
so dev builds are unaffected. Per-binary entitlements:
- workerd: allow-jit + allow-unsigned-executable-memory (V8)
- vz-helper: com.apple.security.virtualization (calls VZ.framework)
- d1-shim: hardened runtime only

Result: app notarized + stapled, deep verify clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
Replace the bare "Loading Orcabot..." redirect (which fired immediately
at :8788 and hung silently if a service wasn't up) with a staged loader:
- polls each local service (d1-shim, web :8788, control plane :8787,
  sandbox VM :8080) and shows the current boot stage, so a stuck launch
  is diagnosable at a glance;
- lighthearted KSP-style flavor per stage, with the real stage label
  always shown;
- only redirects once the required services (web + control plane) are
  actually reachable; VM boots in the background;
- "Open the dashboard anyway" escape hatch appears after 8s so it can
  never be more stuck than before.

loading.html is a committed source file, copied into dist/ by
build-desktop-resources.sh (with orca.png for the logo).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
- Loading screen now shows a clear failure state if the required services
  (web + control plane) aren't up after 60s: error heading, the stuck
  stage marked red, a selectable diagnostics block (per-service up/down +
  elapsed), and Retry / Open anyway / Quit actions.
- Add a `quit_app` Tauri command (app.exit -> clean service shutdown) so
  the loading screen can close a stuck launch.
- Rename productName + window title "Orcabot Desktop" -> "Orcabot"
  (bundle identifier com.orcabot.desktop unchanged).

REVISION: main-v8-loading-quit

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
…ld box

resolve_resource_root() checked resource_dir() (Contents/Resources) for
workerd/d1-shim, but the bundle stages them one level deeper at
Contents/Resources/resources/ (tauri.conf resource paths are prefixed
"resources/"). That check failed, so an installed .app only resolved via
the compile-time CARGO_MANIFEST_DIR/resources path — which exists only on
the build machine. On any other Mac, resources weren't found and service
autostart was skipped (all services down; the staged loader now surfaces
this).

Fix: check resource_dir()/resources first, then resource_dir() itself.

REVISION: main-v9-resource-root-fix

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
publish-release.sh uploads the DMG + updater artifacts (.app.tar.gz,
.sig) and generates/uploads latest.json (the updater manifest) to a
GitHub Release tagged v<version>, so the updater endpoint
(/releases/latest/download/latest.json) resolves. Requires gh auth and a
prior signed `cargo tauri build`.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
cargo tauri icon generated Square*Logo.png + StoreLogo.png (Windows MSIX
tiles), but we only bundle macOS and nothing references them. Keep just
the icons bundle.icon uses (.icns, .ico, 32/64/128/128@2x PNGs) + the
icon.png source master.
…ion)

The updater checked, downloaded (~1GB), installed, and restarted silently
on launch. restart() triggers RunEvent::Exit, which shuts down the VM /
terminals / agents — so an update landing mid-session would kill the
user's work with no warning.

Now: check automatically (cheap), but gate the download + install +
restart behind an explicit "Update & restart / Later" dialog that spells
out that running sessions will stop. "Later" defers to a future launch.

REVISION: main-v10-updater-prompt

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
Tauri doesn't clean bundle/dmg between builds, so a bare *.dmg glob could
publish a stale previous-version (or pre-rename "Orcabot Desktop_...") DMG
while latest.json points at the current tarball — and the space-vs-
underscore sort even makes head -1 prefer the stale name.

Match Orcabot_${VERSION}_*.dmg and fail if it isn't exactly one.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_014t8Ukp4NPWtqJ55X261wMZ
@robdmac
robdmac merged commit a803d27 into main Jul 5, 2026
1 check passed
@robdmac
robdmac deleted the feat/desktop-polish branch July 5, 2026 21:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant