emit a real desktop binary and .deb for deploy method 5

tauri build produced target/release/doxa-maps-desktop (65 MB ELF) and a 58 MB
.deb (Package: doxa-maps, Depends: libwebkit2gtk-4.1-0 libgtk-3-0). tauri info
reports the environment fully green and correctly detects frontendDist
../public, Vue.js, Vite.

The web tree is compiled INTO the binary rather than shipped as files, which is
why the .deb holds only 6 entries - confirmed by 19 distinct embedded
doxa-maps/... asset paths in the ELF and by size (a logic-free shell is 65 MB
only because the 132 MB public/ tree is compressed inside it).

bundle.targets narrowed from all to deb: rpmbuild and linuxdeploy are absent
here, so all would fail two of three formats at the END of a ~6-minute release
build.

The CLI is a devDependency (@tauri-apps/cli, prebuilt binary) rather than
cargo install tauri-cli, which compiles from source.

Status stays BUILT, NOT SHOT. The GUI launch is unverified because this box is
headless - the binary panics in tao with 'Failed to initialize GTK', the
absence of a display rather than a defect, and no Xvfb is installed.
This commit is contained in:
doxa-maps-88655c70 2026-09-21 21:36:18 +00:00
parent 381d3087c7
commit ea53a2e19a
7 changed files with 50 additions and 15 deletions

View file

@ -28,7 +28,7 @@ This README is a **show, don't tell** index. Skim the three tables, then jump to
| 2 | **Mobile app** (Android / Capacitor) | required | [§2](#deploy-2--mobile-app) |
| 3 | **Direct-JS / research dashboard** (props + events + SRI) | required | [§2](#deploy-3--research-dashboard-direct-js) |
| 4 | **WordPress** (PHP plugin: shortcode + Gutenberg block) | built, not yet shot | [§3](#3-cli-commands--installs-per-deploy-method) |
| 5 | **Desktop** (Tauri) | built, not shot (`src-tauri/`, compiles clean) | [§3](#3-cli-commands--installs-per-deploy-method) |
| 5 | **Desktop** (Tauri) | built, not shot (binary + `.deb` emitted; launch unverified) | [§3](#3-cli-commands--installs-per-deploy-method) |
### CLI commands + what to install
@ -258,7 +258,7 @@ This README does not over-claim. Per the verified ledger (2026-09-19):
| Count | State | Methods |
|-------|-------|---------|
| 2 | **proven live** | iframe embed · direct-JS embed |
| 3 | **built, not yet shot** | mobile (Capacitor scaffolded, APK never emitted) · WordPress (`wordpress/doxa-maps-embed/*.php` written, install never captured) · desktop (`src-tauri/` scaffolded, `cargo check` clean, no binary emitted) |
| 3 | **built, not yet shot** | mobile (Capacitor scaffolded, APK never emitted) · WordPress (`wordpress/doxa-maps-embed/*.php` written, install never captured) · desktop (`src-tauri/`; **65 MB binary + 58 MB .deb emitted** — launch unverified, headless box) |
| 0 | **aspirational** | — none. Method 5 moved to built-not-shot on 2026-09-21. |
All **5 capabilities** are proven by a built bundle. Every deploy *method* is now at least scaffolded; three are

BIN
bun.lock generated

Binary file not shown.

View file

@ -47,7 +47,7 @@ The scripts these commands are grounded in (from this branch's `package.json`):
| 2 | **Mobile app (Android)** | Bun ALONE for `check:mobile`; + Android SDK · `adb` on PATH · JDK 17 (Gradle) for the APK | `bun run check:mobile` (sync + webDir assertion, NO toolchain needed) · `bun run phone` (= `apk:debug` + `apk:install` to a device/emulator) |
| 3 | **Direct-JS / dashboard** | Bun | `bun run build`, then paste the `<script src> + integrity` (SRI) snippet from `manifest.json`. *Proven same-root AND foreign-host (verified 2026-09-20: gl + attribution, 0 errors, 0 404s). Fill the `YOUR_*` placeholders the snippet ships with* |
| 4 | **WordPress** | Bun (+ `php` CLI to run the contract gate) | `bun run build`, then either paste the iframe/script snippet into a **Custom HTML** block, **or** install `wordpress/doxa-maps-embed/` (shortcode + Gutenberg block). `bun run check:wp-embed` verifies the emitted markup. *(Contract-proven; not yet shot on a live WP install.)* |
| 5 | **Desktop (Tauri)** | Bun ALONE for `check:tauri`; + Rust toolchain · Tauri CLI · system webview libs for the binary | `bun run check:tauri` (config contract, NO toolchain needed) · `cargo tauri build` (needs the toolchain). *(Built, not shot — `cargo check` compiles clean, 0 errors; no binary emitted here.)* |
| 5 | **Desktop (Tauri)** | Bun ALONE for `check:tauri`; + Rust toolchain · Tauri CLI · system webview libs for the binary | `bun run check:tauri` (config contract, NO toolchain needed) · `cargo tauri build` (needs the toolchain). *(Built, not shot — a 65 MB binary + 58 MB `.deb` WERE emitted; only the GUI launch is unverified.)* |
---
@ -230,9 +230,17 @@ windows array, missing crate file); each exits 1.
> `capacitor.config.json` documents for `https://localhost`. **The fix is a response header on the
> token host, not a change in `tauri.conf.json`.**
**Status: built + COMPILES CLEAN; no binary emitted.** Verified 2026-09-21 with the real toolchain:
`cargo check` finishes with **0 errors and 0 warnings** across 400+ crates (`wry` 0.55.1, `tauri`
2.11.6), which proves the config parses under Tauri's strict schema and the icon embeds. Producing
and *launching* a packaged desktop binary still needs `cargo install tauri-cli`, so this is **not**
"proven" — say *built, not shot*. See [`src-tauri/README.md`](../src-tauri/README.md) for the
placement rules and the token/CORS caveat.
**Status: BUILT — artifacts emitted; launch unverified.** Run 2026-09-21 with the real toolchain
(`tauri info` all ✔: webkit2gtk 2.50.6, rustc/cargo 1.96.1, frontendDist `../public`, Vue.js/Vite):
`bun run tauri:build` produced a **65 MB ELF executable** and a **58 MB `.deb`**
(`Package: doxa-maps`, `Depends: libwebkit2gtk-4.1-0, libgtk-3-0`). The web tree is compiled INTO
the binary — 19 distinct `doxa-maps/...` asset paths are embedded in the ELF, which is why the
`.deb` holds only 6 entries.
`bundle.targets` is `["deb"]`, not `"all"`: `rpmbuild` and `linuxdeploy` (AppImage) are absent on
this box, so `"all"` would fail two of three formats at the very end of a ~6-minute release build.
Still **not "proven"** — say *built, not shot*. The GUI launch is unverified because this VPS is
headless: the binary panics in `tao` with "Failed to initialize GTK" (no display, not a defect) and
no Xvfb is installed. See [`src-tauri/README.md`](../src-tauri/README.md) for placement rules, the
token/CORS caveat and the full artifact table.

View file

@ -137,7 +137,7 @@ Your one element deploys five ways (only an element supports all five — a page
| 3 | **JavaScript embed** | `<script src=".../<plugin>.js">` + `<your-tag>` (SRI-hashed) | ✅ proven |
| 2 | **mobile** | `bun run phone` (Capacitor) — build step, no new code | 🔶 built, not shot |
| 4 | **WordPress plugin** | the `wordpress/doxa-maps-embed/` PHP wrapper emits the embed snippet | 🔶 built, not shot |
| 5 | **desktop (Tauri)** | `src-tauri/` wraps the same `public/` tree (`cargo check` clean) | 🔶 built, not shot |
| 5 | **desktop (Tauri)** | `bun run tauri:build` → a real binary + `.deb` wrapping the same `public/` tree | 🔶 built, not shot |
Say "proven" ONLY for 1 & 3 (2, 4 and 5 are scaffolded but no binary/install has been shot). Verify at `https://<platform>/plugin-assets/doxa-maps/<plugin>/<plugin>/index.html`.
**Done = the live site shows it, not a green build.**

View file

@ -23,6 +23,7 @@
"cap:sync": "./node_modules/.bin/cap sync android # NOT `bunx` — bunx is not on PATH in this environment (command not found, exit 127), which broke cap:sync -> apk:debug -> phone at step one. The CLI IS installed locally (@capacitor/cli 7.6.9); invoke the local bin directly. The rest of package.json already uses the spaced `bun x` form.",
"cap:verify": "test -f capacitor/android/app/src/main/assets/public/index.html && echo \"OK webDir copied\" || (echo \"FAIL: empty assets/public -> blank white screen. Check webDir.\" && exit 1)",
"check:tauri": "node internal/check-tauri-config.mjs",
"tauri:build": "./node_modules/.bin/tauri build",
"apk:debug": "bun run build && bun run cap:sync && bun run cap:verify && cd capacitor/android && ./gradlew assembleDebug",
"apk:install": "adb install -r capacitor/android/app/build/outputs/apk/debug/app-debug.apk",
"phone": "bun run apk:debug && bun run apk:install",
@ -73,6 +74,7 @@
"@capacitor/android": "7",
"@capacitor/cli": "7",
"@capacitor/core": "7",
"@tauri-apps/cli": "^2.11.5",
"@vitejs/plugin-vue": "^5.0.4",
"playwright": "1.61.1",
"terser": "^5.46.0",

View file

@ -69,9 +69,34 @@ from `public/assets/vendor/` (the no-CDN rule), so a naive `script-src` would br
```sh
bun run check:tauri # config contract — NO Rust, NO Tauri CLI needed (CI-safe)
cargo check # compiles the crate (needs Rust + webkit2gtk)
cargo tauri build # the binary — additionally needs `cargo install tauri-cli`
cargo check # typechecks the crate (needs Rust + webkit2gtk)
bun run tauri:build # the real binary + .deb (CLI is a devDependency: @tauri-apps/cli)
```
**Status: built, not shot.** No desktop binary has been emitted here. Say *built, not shot* —
"proven" is reserved for methods 1 (iframe) and 3 (direct-JS), which have live artifacts.
## `bundle.targets` is `["deb"]`, not `"all"` — on purpose
`"all"` attempts **deb + rpm + appimage**. Measured on this box: `dpkg-deb` present, but
`rpmbuild` and `linuxdeploy` (AppImage) **absent**, so `"all"` would fail on two of three
formats after a full release compile. Narrowed to what the machine can actually produce.
Add targets back when the packaging tools exist — the failure comes at the very END of a
~6-minute release build, which is the expensive place to discover it.
## Status: BUILT — binary + .deb emitted; LAUNCH still unverified
Verified 2026-09-21 with the real toolchain (`tauri info`: webkit2gtk 2.50.6, rustc/cargo
1.96.1, frontendDist `../public`, framework Vue.js, bundler Vite — all ✔):
| Artifact | Result |
|---|---|
| `target/release/doxa-maps-desktop` | **65 MB ELF 64-bit executable** |
| `target/release/bundle/deb/*.deb` | **58 MB**, `Package: doxa-maps`, `Depends: libwebkit2gtk-4.1-0, libgtk-3-0` |
The web tree is **compiled INTO the binary** — not shipped as loose files, which is why the
`.deb` has only 6 entries. Confirmed by 19 distinct embedded `doxa-maps/...` asset paths in the
ELF (all bundle dirs + `assets/`), and by size: a logic-free shell is 65 MB only because the
132 MB `public/` tree is compressed inside it.
**What is still NOT proven: that the window opens and renders.** This VPS is headless — running
the binary panics in `tao` with *"Failed to initialize GTK"*, which is the absence of a display,
not a defect. No Xvfb is installed. A human on a desktop machine (or a CI job with a virtual
display) must run it once to move method 5 to *shot*.

View file

@ -23,6 +23,6 @@
},
"bundle": {
"active": true,
"targets": "all"
"targets": ["deb"]
}
}