mirror of
https://github.com/different-ai/openwork
synced 2026-04-25 17:15:34 +02:00
* feat(desktop): migration engine for Tauri → Electron handoff
Implements the infrastructure needed to move users from Tauri to Electron
without losing state or Launchpad/Dock presence. Zero user impact on its
own — this becomes live only when paired with a final Tauri release that
calls the snapshot writer and installs Electron.
What lands here:
- Unify app identity with Tauri. electron-builder appId goes from
com.differentai.openwork.electron → com.differentai.openwork so macOS
reuses the same bundle identifier (no duplicate Dock icon, no new
Gatekeeper prompt, same TCC permissions).
- Unify userData path. Electron's app.setPath("userData", ...) now points
at the exact folder Tauri uses (~/Library/Application Support/com.differentai.openwork
on macOS, %APPDATA%/com.differentai.openwork on Windows, ~/.config/
com.differentai.openwork on Linux). An OPENWORK_ELECTRON_USERDATA env
var override is available for dogfooders who want isolation.
- Filename compat. On first launch, Electron copies Tauri's
openwork-workspaces.json → workspace-state.json (leaves the legacy
file in place for rollback safety).
- electron-updater wiring. New deps + IPC handlers
(openwork:updater:check / download / installAndRestart). Packaged-only.
Publish config points at the same GitHub release as Tauri.
- Migration snapshot plumbing.
* Tauri Rust command `write_migration_snapshot` serializes an
allowlist of localStorage keys to app_data_dir/migration-snapshot.v1.json.
* `apps/app/src/app/lib/migration.ts` has matching
writeMigrationSnapshotFromTauri() / ingestMigrationSnapshotOnElectronBoot().
* Scope: workspace list + selection only
(openwork.react.activeWorkspace, .sessionByWorkspace,
openwork.server.list/active/urlOverride/token). Everything else is
cheap to redo.
* Electron main exposes openwork:migration:read / ack IPC; preload
bridges them under window.__OPENWORK_ELECTRON__.migration.
* desktop-runtime-boot.ts ingests the snapshot once on first launch,
hydrates empty localStorage keys, then acks.
- Updated prds/electron-migration-plan.md with the localStorage scope
decision and the remaining work (last Tauri release ships the UI
prompt + installer downloader).
Verified: `pnpm --filter @openwork/app typecheck` ✓,
`pnpm --filter @openwork/desktop build:electron` ✓, `cargo check`
against src-tauri ✓.
* fix(desktop): emit relative asset paths for Electron packaged builds
Packaged Electron loads index.html via file:// (Contents/Resources/app-dist/
index.html inside the .app bundle), but Vite was building with the default
base: '/' which resolves /assets/*.js to the filesystem root. Result: a
working dev experience (Vite dev server on localhost:5173) and a broken
packaged .app that renders an empty <div id="root"></div>.
The Tauri shell doesn't hit this because Tauri serves the built HTML
through its own tauri:// protocol which rewrites paths. Electron's
file:// loader has no such rewriter.
Fix: electron-build.mjs sets OPENWORK_ELECTRON_BUILD=1 when invoking
vite build, and vite.config.ts flips base to './' only when that env
var is set. Dev server and Tauri builds unchanged.
Discovered while manually exercising the Electron prod-build migration
flow (packaged app launch, snapshot ingest, idempotency, updater IPC).
Latent since PR #1522 landed the packaged build path; never caught
because dogfood ran via dev:electron which uses the Vite dev server.
---------
Co-authored-by: Benjamin Shafii <benjamin@openworklabs.com>
46 lines
1.2 KiB
YAML
46 lines
1.2 KiB
YAML
# IMPORTANT: appId intentionally matches the Tauri shell so both builds share
|
|
# the same macOS bundle identifier, keychain entries, Launchpad slot, and TCC
|
|
# permissions. In-place migration from Tauri to Electron depends on this.
|
|
appId: com.differentai.openwork
|
|
productName: OpenWork
|
|
directories:
|
|
output: dist-electron
|
|
files:
|
|
- electron/**/*
|
|
- package.json
|
|
extraResources:
|
|
- from: ../app/dist
|
|
to: app-dist
|
|
- from: src-tauri/sidecars
|
|
to: sidecars
|
|
asar: true
|
|
npmRebuild: false
|
|
# electron-updater feed. Matches the existing release workflow's GitHub target
|
|
# so both Tauri (latest.json) and Electron (latest*.yml) can live on the same
|
|
# release assets during the migration window.
|
|
publish:
|
|
- provider: github
|
|
owner: different-ai
|
|
repo: openwork
|
|
releaseType: release
|
|
mac:
|
|
icon: src-tauri/icons/icon.icns
|
|
category: public.app-category.developer-tools
|
|
hardenedRuntime: true
|
|
gatekeeperAssess: false
|
|
target:
|
|
- target: dmg
|
|
arch: [x64, arm64]
|
|
- target: zip
|
|
arch: [x64, arm64]
|
|
linux:
|
|
icon: src-tauri/icons/icon.png
|
|
target:
|
|
- AppImage
|
|
- tar.gz
|
|
win:
|
|
icon: src-tauri/icons/icon.ico
|
|
target:
|
|
- nsis
|
|
artifactName: openwork-${os}-${arch}-${version}.${ext}
|