@@ -11,41 +11,60 @@ experience for end users on macOS, Windows and Linux.
1111┌──────────────────────────────────────────┐
1212│ Tauri shell (Rust) │
1313│ ├── splash WebView (src/index.html) │
14+ │ ├── system tray (open / restart / data │
15+ │ │ folder / quit) │
1416│ ├── waits for sidecar port │
1517│ └── navigates to http://localhost:N │
1618│ │
1719│ Sidecar: bundled Node runs │
1820│ apps/objectos/desktop.mjs │
1921│ → objectstack serve --port N │
22+ │ → SQLite + uploads under │
23+ │ $OBJECTOS_HOME │
2024└──────────────────────────────────────────┘
2125```
2226
2327The Node tree is staged under ` runtime/ ` by
2428` scripts/stage-runtime.mjs ` (called automatically by ` dev ` / ` build ` )
25- and bundled by Tauri as resources.
29+ and bundled by Tauri as resources. The staging step also slims the
30+ tree (~ 50 MB of source maps, markdown, and test fixtures removed).
31+
32+ ## Per-user data
33+
34+ | OS | Path |
35+ | ---------| ----------------------------------------------|
36+ | macOS / Linux / Windows | ` ~/.objectstack ` |
37+
38+ (Override with ` OBJECTOS_HOME=/some/path ` .)
39+
40+ The sidecar receives ` OBJECTOS_HOME ` , ` OS_DATABASE_URL ` ,
41+ ` OS_STORAGE_ROOT ` , and ` OS_CACHE_DIR ` pointed inside that folder, so a
42+ clean uninstall is just deleting that directory.
2643
2744## Prerequisites
2845
2946- Node ≥ 20 + pnpm 10
3047- Rust (stable) — ` curl https://sh.rustup.rs -sSf | sh `
3148- macOS: Xcode Command Line Tools
3249- Windows: WebView2 (preinstalled on Win10+) + MSVC build tools
33- - Linux: ` libwebkit2gtk-4.1-dev ` , ` build-essential ` , ` libssl-dev `
50+ - Linux: ` libwebkit2gtk-4.1-dev ` , ` build-essential ` , ` libssl-dev ` ,
51+ ` libayatana-appindicator3-dev ` , ` librsvg2-dev `
3452
3553## Develop
3654
3755``` bash
38- pnpm install # repo root
39- pnpm --filter @objectos/ desktop dev # stages runtime + tauri dev
56+ pnpm install
57+ pnpm desktop: dev # = pnpm --filter @objectos/desktop dev
4058```
4159
42- The first run builds Rust dependencies (~ 2–4 min). Subsequent runs are
43- fast.
60+ First run builds Rust dependencies (~ 2–4 min). Subsequent runs are
61+ fast. The window opens on a splash page; once the sidecar is ready it
62+ navigates to the live Studio URL.
4463
4564## Build distributables
4665
4766``` bash
48- pnpm --filter @objectos/ desktop build
67+ pnpm desktop: build
4968```
5069
5170Output lands in ` src-tauri/target/release/bundle/ ` :
@@ -56,15 +75,66 @@ Output lands in `src-tauri/target/release/bundle/`:
5675| Windows | ` nsis/ObjectOS_<v>_x64-setup.exe ` |
5776| Linux | ` deb/objectos_<v>_amd64.deb ` , AppImage |
5877
59- Code signing / notarization is configured per platform in
60- ` src-tauri/tauri.conf.json ` (see Tauri docs).
78+ ## CI
79+
80+ ` .github/workflows/desktop.yml ` builds all four platforms in parallel
81+ (macOS arm64, macOS x64, Windows x64, Linux x64). Trigger:
82+
83+ - Push a tag matching ` desktop-v* ` → full build + draft GitHub release
84+ - Manual ` workflow_dispatch ` → artifacts only
85+
86+ The workflow is wired for code signing — provide the secrets below to
87+ enable. Without secrets the builds still succeed (unsigned binaries,
88+ end users will see OS warnings on first launch).
89+
90+ ## Code signing
91+
92+ ### macOS (Developer ID + notarization)
93+
94+ Required repo secrets:
95+
96+ | Secret | Value |
97+ | ------------------------------| ----------------------------------------------------|
98+ | ` APPLE_CERTIFICATE ` | base64 of your ` .p12 ` Developer ID Application cert |
99+ | ` APPLE_CERTIFICATE_PASSWORD ` | the export password |
100+ | ` APPLE_SIGNING_IDENTITY ` | ` Developer ID Application: Company (TEAMID) ` |
101+ | ` APPLE_ID ` | Apple ID email used for notarization |
102+ | ` APPLE_PASSWORD ` | App‑specific password (appleid.apple.com → security) |
103+ | ` APPLE_TEAM_ID ` | 10‑char team ID from Apple Developer portal |
104+
105+ Tauri picks these up automatically and runs ` codesign ` + ` notarytool `
106+ during ` tauri build ` .
107+
108+ ### Windows (Authenticode)
109+
110+ | Secret | Value |
111+ | ---------------------------------| ----------------------|
112+ | ` WINDOWS_CERTIFICATE ` | base64 of your ` .pfx ` |
113+ | ` WINDOWS_CERTIFICATE_PASSWORD ` | export password |
114+
115+ Then in ` tauri.conf.json ` set ` bundle.windows.certificateThumbprint `
116+ to the SHA‑1 thumbprint (or extend the workflow to import the .pfx
117+ and sign post‑build with ` signtool ` ).
118+
119+ ### Tauri updater key (optional)
120+
121+ To enable in‑app auto‑update:
122+
123+ ``` bash
124+ pnpm tauri signer generate -w ~ /.tauri/objectos.key
125+ ```
126+
127+ Set ` TAURI_SIGNING_PRIVATE_KEY ` (file contents) and
128+ ` TAURI_SIGNING_PRIVATE_KEY_PASSWORD ` in CI, paste the public key into
129+ ` tauri.conf.json → plugins.updater.pubkey ` , and flip
130+ ` plugins.updater.active ` to ` true ` .
61131
62132## Comparison with the portable zip
63133
64134| | Portable zip | Tauri |
65135| ---| ---| ---|
66136| Brand | none (terminal) | dock icon, menu, tray |
67- | Size | ~ 110 MB | ~ 120 MB (Node sidecar dominates; shell adds ~ 10 MB ) |
137+ | Size | ~ 110 MB zip | ~ 140 MB installer (signed ) |
68138| Auto‑update | no | yes (Tauri updater) |
69139| Code signing | manual | first‑class |
70140| Dev effort | tiny | moderate (Rust toolchain) |
0 commit comments