Skip to content

Commit 6f59f6e

Browse files
joaoh82claude
andauthored
docs: document unsigned-installer bypass + prebuilt download path (#22)
First v0.1.3 desktop download on Apple Silicon hit the "SQLRite is damaged and can't be opened" Gatekeeper dialog — a misleading variant of the unsigned-app warning that shows up specifically for (quarantined) + (ad-hoc signed) binaries on recent macOS. The old release-body text only warned about the gentler "unidentified developer" message and offered a right-click-Open workaround that doesn't work for the "damaged" variant. Replace that with the actual fix (`xattr -cr /Applications/SQLRite.app`) across three surfaces so nobody else hits it cold: - `.github/workflows/release.yml` — the template for future desktop releases: Linux / macOS / Windows-specific bypass steps, plus an explanation of why "damaged" happens (Apple Silicon requires a signature, Tauri ad-hoc signs, quarantine + ad-hoc trips a stricter Gatekeeper path). - `README.md` — the Desktop app section now lists the seven installer artifacts per platform, links to the latest GitHub Release, and calls out the unsigned-installer friction inline. - `docs/desktop.md` — new "Installing a prebuilt binary" section covering the full download table, per-platform bypass commands, and a paragraph on why macOS uses "damaged" instead of "unidentified developer". Updated the "Running from source" section to reflect `bundle.active` now defaulting to `true` (Phase 6e) and that icons are pre-generated + committed. - `docs/getting-started.md` — adds a "Don't want to build from source?" pointer to the latest desktop release. - `docs/_index.md` — surfaces `desktop.md` in the "Start here" list so people arriving at the developer guide find the downloads + bypass info without drilling. Also backfilled the already-published `sqlrite-desktop-v0.1.3` release body with the new text via `gh release edit` so the URL anyone hits today has the workaround (done separately, not part of this commit). Phase 6.1 (code signing) removes the need for any of this — this commit just makes the gap before 6.1 lands less miserable. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b4a3295 commit 6f59f6e

5 files changed

Lines changed: 99 additions & 7 deletions

File tree

.github/workflows/release.yml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,34 @@ jobs:
385385
tagName: sqlrite-desktop-v${{ needs.detect.outputs.version }}
386386
releaseName: Desktop v${{ needs.detect.outputs.version }}
387387
releaseBody: |
388-
SQLRite desktop app — unsigned installers for Linux (AppImage + deb), macOS (dmg, aarch64), Windows (msi).
388+
SQLRite desktop app — unsigned installers. This release wave ships:
389389
390-
**⚠️ Unsigned installers**: macOS shows "SQLRite can't be opened because it is from an unidentified developer" — right-click → Open → Open to bypass. Windows SmartScreen blocks on first run — click "More info" → "Run anyway". Code signing lands in Phase 6.1.
390+
- **Linux**: `.AppImage` + `.deb` (Debian/Ubuntu) + `.rpm` (Fedora/RHEL), x86_64
391+
- **macOS**: `.dmg` + raw `.app.tar.gz`, Apple Silicon (aarch64). Intel Macs not supported yet — tracked as a Phase 6e follow-up (universal dmg).
392+
- **Windows**: `.msi` + `.exe` (NSIS installer), x86_64
393+
394+
### ⚠️ Unsigned installer warnings
395+
396+
Installers aren't code-signed yet (Phase 6.1 wires up Apple Developer ID + Windows code-signing). First-launch warnings to expect:
397+
398+
**macOS — "SQLRite is damaged and can't be opened" or "unidentified developer":**
399+
400+
```bash
401+
xattr -cr /Applications/SQLRite.app
402+
```
403+
404+
This strips the `com.apple.quarantine` attribute your browser attached on download. macOS Gatekeeper shows "damaged" (not the gentler "unidentified developer") because Tauri ad-hoc signs the binary — Apple Silicon *requires* a signature, even an ad-hoc one, but quarantined ad-hoc signatures trip a stricter Gatekeeper path. The app is fine; the signature just isn't from a registered Apple Developer ID.
405+
406+
**Windows — SmartScreen "Windows protected your PC":**
407+
408+
Click "More info" → "Run anyway".
409+
410+
**Linux — AppImage:**
411+
412+
```bash
413+
chmod +x SQLRite_*_amd64.AppImage
414+
./SQLRite_*_amd64.AppImage
415+
```
391416
392417
See the umbrella release [v${{ needs.detect.outputs.version }}](../../releases/tag/v${{ needs.detect.outputs.version }}) for the full changelog.
393418
releaseDraft: false

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,20 @@ A cross-platform Tauri 2.0 + Svelte 5 desktop GUI ships alongside the REPL (see
6565

6666
![SQLRite Desktop](<images/SQLRite - Desktop.png> "The SQLRite desktop app")
6767

68-
Launch it with `cd desktop && npm install && npm run tauri dev`. The header's New… / Open… / Save As… buttons cover the file lifecycle; the query editor has a live line-number gutter, `⌘/` (Ctrl+/) SQL comment toggle, and selection-aware Run (highlight a statement to run just that one).
68+
**Prebuilt installers** — download from the [latest desktop release](https://github.com/joaoh82/rust_sqlite/releases/latest):
69+
70+
| Platform | Files |
71+
|---|---|
72+
| Linux x86_64 | `.AppImage`, `.deb` (Debian/Ubuntu), `.rpm` (Fedora/RHEL) |
73+
| macOS Apple Silicon | `.dmg`, raw `.app.tar.gz` *(Intel Macs not supported yet — universal dmg is a follow-up)* |
74+
| Windows x86_64 | `.msi`, `.exe` (NSIS) |
75+
76+
> ⚠️ **Installers are unsigned** until Phase 6.1 wires up Apple Developer ID + Windows code-signing certs. First-launch friction to expect:
77+
> - **macOS**: "SQLRite is damaged" or "unidentified developer" → run `xattr -cr /Applications/SQLRite.app` once to strip the quarantine attribute, then it opens normally. The app is fine; Tauri ad-hoc signs every macOS binary (Apple Silicon requires a signature), but quarantined ad-hoc signatures trip a stricter Gatekeeper path with the scary "damaged" wording.
78+
> - **Windows**: SmartScreen → click "More info" → "Run anyway".
79+
> - **Linux AppImage**: `chmod +x SQLRite_*.AppImage` before launching.
80+
81+
**From source**`cd desktop && npm install && npm run tauri dev`. The header's New… / Open… / Save As… buttons cover the file lifecycle; the query editor has a live line-number gutter, `⌘/` (Ctrl+/) SQL comment toggle, and selection-aware Run (highlight a statement to run just that one).
6982

7083
### Developer guide
7184

docs/_index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ A small, hand-written guide to the SQLRite codebase — how it's structured, how
66

77
- [Getting started](getting-started.md) — install toolchain, build, run the REPL, your first `CREATE TABLE`
88
- [Using SQLRite](usage.md) — complete REPL / SQL / meta-command reference
9+
- [Desktop app](desktop.md) — downloads, unsigned-installer bypass steps, and the Tauri architecture
910
- [Smoke test](smoke-test.md) — step-by-step walkthrough to sanity-check REPL + desktop app after any non-trivial change
1011
- [Architecture](architecture.md) — high-level layer diagram and module map
1112
- [Design decisions](design-decisions.md) — the "why" behind the major choices

docs/desktop.md

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,54 @@ Lives under [`desktop/`](../desktop/).
88

99
*Screenshot: the default three-pane layout — sidebar with tables and schema on the left, query editor with line numbers up top, result grid below. Header carries New… / Open… / Save As… and shows the active database path.*
1010

11-
## Running it
11+
## Installing a prebuilt binary
12+
13+
Since Phase 6e, every release pushes installers to a per-version GitHub Release. Grab the right artifact for your platform from the [latest desktop release](https://github.com/joaoh82/rust_sqlite/releases/latest):
14+
15+
| Platform | Artifact | Notes |
16+
|---|---|---|
17+
| Linux x86_64 | `SQLRite_<ver>_amd64.AppImage` | `chmod +x` then run directly; bundles its own libs |
18+
| Linux x86_64 | `SQLRite_<ver>_amd64.deb` | Debian / Ubuntu — `sudo dpkg -i` |
19+
| Linux x86_64 | `SQLRite-<ver>-1.x86_64.rpm` | Fedora / RHEL / openSUSE — `sudo rpm -i` |
20+
| macOS aarch64 | `SQLRite_<ver>_aarch64.dmg` | Apple Silicon only (M1/M2/M3/M4) |
21+
| macOS aarch64 | `SQLRite_aarch64.app.tar.gz` | Raw `.app` bundle — for users who don't want the dmg |
22+
| Windows x86_64 | `SQLRite_<ver>_x64_en-US.msi` | Windows Installer package |
23+
| Windows x86_64 | `SQLRite_<ver>_x64-setup.exe` | NSIS installer, smaller footprint |
24+
25+
Intel Macs and Linux aarch64 are [tracked as follow-ups](roadmap.md#phase-6e-desktop-publish) — for now those platforms build from source.
26+
27+
### Unsigned-installer warnings
28+
29+
Installers ship **unsigned** until Phase 6.1 wires up Apple Developer ID + Windows code-signing certs. Expect one of these on first launch:
30+
31+
#### macOS — "SQLRite is damaged and can't be opened"
32+
33+
Or the gentler "unidentified developer" dialog on older macOS versions. One-time fix:
34+
35+
```bash
36+
xattr -cr /Applications/SQLRite.app
37+
```
38+
39+
Then double-click normally. Point `xattr` at wherever the `.app` lives if you haven't moved it to `/Applications` yet.
40+
41+
**Why "damaged" instead of "unidentified developer"?** Apple Silicon *requires* every Mach-O binary to carry a signature — even an ad-hoc one (`codesign --sign -`), which is what Tauri applies by default. When you download the dmg, your browser attaches `com.apple.quarantine` as an extended attribute. On recent macOS, the combination of (quarantined) + (ad-hoc signed) trips a stricter Gatekeeper code path that reports "damaged" instead of the milder unsigned-app flow. Stripping the quarantine attribute with `xattr -cr` takes Gatekeeper out of the loop. The app isn't actually corrupt — the error message just isn't honest about what it's complaining about.
42+
43+
Once Phase 6.1 lands notarization, this bypass won't be needed; macOS will trust the binary on first launch.
44+
45+
#### Windows — SmartScreen "Windows protected your PC"
46+
47+
Click **More info****Run anyway**. SmartScreen remembers your choice, so subsequent launches are clean.
48+
49+
#### Linux — AppImage won't run
50+
51+
```bash
52+
chmod +x SQLRite_<ver>_amd64.AppImage
53+
./SQLRite_<ver>_amd64.AppImage
54+
```
55+
56+
`.deb` and `.rpm` packages don't have this step — they install through the system package manager and get the executable bit from the package metadata.
57+
58+
## Running from source
1259

1360
Two prerequisites beyond the engine's toolchain:
1461

@@ -25,13 +72,15 @@ npm run tauri dev
2572

2673
That builds the Rust side (incremental after the first time), boots the Vite dev server on port 1420, and opens a native window pointing at it. Hot reload works for the Svelte side; Rust changes trigger a rebuild.
2774

28-
For a one-off release build:
75+
For a one-off release build that produces installers for your local platform:
2976

3077
```bash
3178
npm run tauri build
3279
```
3380

34-
Bundling is disabled in [`tauri.conf.json`](../desktop/src-tauri/tauri.conf.json) by default — flip `bundle.active` to `true` and plug in real app icons when you want to produce an installer.
81+
[`tauri.conf.json`](../desktop/src-tauri/tauri.conf.json) ships with `bundle.active: true` since Phase 6e, so this builds a full set of platform-native installers (`.dmg` on macOS, `.AppImage` / `.deb` / `.rpm` on Linux, `.msi` / `.exe` on Windows) under `desktop/src-tauri/target/release/bundle/`.
82+
83+
Icons are pre-generated and committed at `desktop/src-tauri/icons/`. If you swap the source `icon.png`, re-run `npx tauri icon src-tauri/icons/icon.png` from `desktop/` and commit the regenerated `.icns` / `.ico` / size-specific PNGs. CI doesn't re-run this — the commit is the source of truth.
3584

3685
## Architecture
3786

docs/getting-started.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,11 @@ rust_sqlite/
110110

111111
## Running the desktop app
112112

113-
A Tauri 2.0 desktop GUI lives under [`desktop/`](../desktop/). It needs Node.js in addition to the Rust toolchain:
113+
A Tauri 2.0 desktop GUI lives under [`desktop/`](../desktop/).
114+
115+
**Don't want to build from source?** Prebuilt installers (`.dmg`, `.msi`, `.AppImage`, `.deb`, `.rpm`) land on every release at [the latest desktop release page](https://github.com/joaoh82/rust_sqlite/releases/latest). They're unsigned — see [the desktop docs](desktop.md#unsigned-installer-warnings) for the one-line Gatekeeper / SmartScreen bypasses.
116+
117+
**From source** — needs Node.js in addition to the Rust toolchain:
114118

115119
```bash
116120
cd desktop

0 commit comments

Comments
 (0)