Skip to content

ShellDeck Desktop — auto-updating Tauri thin client + landing site#39

Merged
falkoro merged 14 commits into
masterfrom
feat/shelldeck-desktop
Jun 5, 2026
Merged

ShellDeck Desktop — auto-updating Tauri thin client + landing site#39
falkoro merged 14 commits into
masterfrom
feat/shelldeck-desktop

Conversation

@falkoro
Copy link
Copy Markdown
Owner

@falkoro falkoro commented Jun 4, 2026

Adds ShellDeck Desktop: a native, auto-updating desktop app (Tauri v2) that wraps the existing ShellDeck web UI in a real window pointed at a ShellDeck server (where tmux/ssh run). The browser stays fully supported — this is purely additive (desktop/, site/, .github/workflows/). The existing server/frontend are untouched.

Built by the codex bridge from the committed design spec, then reviewed by Claude.

What's here

  • desktop/ — Tauri v2 thin client: first-run/settings screen (enter + save server URL), Rust-side reachability check (avoids CORS), connection-error screen (Retry / Edit URL), then navigates the webview to your server so the existing login handles auth (cookies persist). System tray (Show/Hide, Open in browser, Check for updates, Switch server, Quit), single-instance, persistent window state, and the signed auto-updater (checks on launch + hourly, verifies signature, downloads with progress, relaunches).
  • .github/workflows/desktop-release.yml — on tag desktop-v*: builds Linux AppImage+.deb (ubuntu-latest) and Windows NSIS .exe (windows-latest, GitHub-hosted since our pool is Linux-only), signs, generates latest.json, uploads to R2, attaches to a GitHub Release.
  • site/ — static Cloudflare Pages landing page; download buttons read the live version from latest.json. Plain, non-AI-slop copy.

Verification

Reviewed by hand: no app files touched ✓; no secrets in the repo (updater pubkey is the placeholder REPLACE_WITH_TAURI_UPDATER_PUBKEY, workflow references secrets by name only) ✓; Cargo deps correct (reqwest w/ rustls to avoid openssl) ✓; Tauri v2 capabilities correct ✓; landing copy clean ✓.
Codex-run: npm run build ✓, cargo fmt --check ✓, npm run latest-json ✓, tauri info ✓, Playwright on site/ + settings screen (desktop + 390px, no console errors / overflow) ✓.
Not verified locally: the native Rust compile / AppImage — this box lacks WebKitGTK 4.1 dev packages (needs sudo). CI installs them; that's the designated build path.

Manual steps before the first real release (need your accounts)

  1. cd desktop && npm run tauri signer generate → paste the public key into tauri.conf.json; add the private key + password as GitHub secrets.
  2. GitHub secrets: TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN, SHELLDECK_R2_BUCKET.
  3. Domain shelldeck.app + R2 bucket serving dl.shelldeck.app/desktop/... (placeholder — one-line change if you want a *.falkinator.org subdomain instead).
  4. Replace site/screenshot-*.png placeholders.
  5. git tag desktop-v0.1.0 && git push --tags → CI builds + publishes.

v1 scope: thin client only, Win .exe + Linux AppImage/.deb, code signing skipped (Windows SmartScreen warning on first run; Authenticode is a fast-follow).

Not merging without your review — it's a new product surface. Full detail in desktop/STATUS.md + desktop/BUILD.md.

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings June 4, 2026 19:20
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces ShellDeck Desktop, a new, additive Tauri v2 “thin client” that wraps the existing ShellDeck web UI in a native desktop window pointed at a user-configured ShellDeck server, plus a small static landing site and a tag-driven release workflow for signed auto-updates.

Changes:

  • Adds a new desktop/ Tauri v2 app with first-run/settings UX, server reachability checks, tray controls, single-instance behavior, window-state persistence, and updater wiring.
  • Adds a new site/ static landing page that reads per-platform latest.json manifests to populate download links.
  • Adds a new .github/workflows/desktop-release.yml to build/sign/publish Windows + Linux bundles and upload artifacts/manifests to R2 on desktop-v* tags.

Reviewed changes

Copilot reviewed 22 out of 31 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
site/styles.css Styles for the static landing page layout and responsiveness.
site/index.html Landing page HTML (hero, downloads, screenshots, update info).
site/app.js Client-side logic to fetch latest.json and populate download links.
docs/superpowers/specs/2026-06-04-shelldeck-desktop-design.md Design spec describing the desktop thin-client approach, release flow, and constraints.
desktop/vite.config.ts Vite dev-server configuration for the desktop frontend.
desktop/tsconfig.json TypeScript compiler configuration for the desktop frontend.
desktop/STATUS.md Build/verification status and remaining manual steps for first release.
desktop/src/vite-env.d.ts Vite type references for the desktop frontend.
desktop/src/styles.css Styling for desktop settings/connection/error screens.
desktop/src/main.ts Desktop frontend app logic (settings, URL normalization, reachability check, navigation).
desktop/src/config.ts Shared config constant(s) for the desktop frontend.
desktop/src-tauri/tauri.conf.json Tauri app configuration (windows, CSP, updater endpoints/pubkey placeholder).
desktop/src-tauri/src/main.rs Tauri entrypoint calling the library runner.
desktop/src-tauri/src/lib.rs Tauri/Rust implementation: tray, update scheduling, URL checks, commands.
desktop/src-tauri/Cargo.toml Rust crate definition + dependencies for the desktop app.
desktop/src-tauri/capabilities/default.json Default Tauri capability/permission configuration.
desktop/src-tauri/build.rs Tauri build script hook.
desktop/scripts/write-latest-json.mjs Script to generate per-platform latest.json updater manifests.
desktop/package.json Desktop frontend package definition and scripts.
desktop/package-lock.json Locked npm dependency graph for the desktop app.
desktop/index.html Desktop frontend HTML shell for the local UI screens.
desktop/BUILD.md Local build + release-cut instructions for the desktop app.
desktop/.gitignore Desktop-specific ignored build artifacts and dependencies.
.github/workflows/desktop-release.yml CI workflow to build/sign/upload desktop releases and manifests.
Files not reviewed (1)
  • desktop/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +48 to +62
if status.as_u16() < 500 {
return Ok(ServerCheck {
ok: true,
status: Some(status.as_u16()),
final_url: Some(final_url),
message: "Server is reachable.".to_string(),
});
}

Ok(ServerCheck {
ok: false,
status: Some(status.as_u16()),
final_url: Some(final_url),
message: format!("The server responded with HTTP {status}."),
})
"title": "ShellDeck",
"width": 1280,
"height": 860,
"minWidth": 860,
Comment thread site/app.js
Comment on lines +60 to +66
if (versions.length > 0) {
status.textContent = `Current desktop release: ${versions[0]}.`;
return;
}

status.textContent = "Downloads will appear here after the first desktop release is published.";
}
Comment on lines +6 to +8
const args = parseArgs(process.argv.slice(2));
const required = ["version", "target", "arch", "artifact", "signature", "url", "out"];

Comment thread .github/workflows/desktop-release.yml Outdated
Comment on lines +87 to +90
for file in release/upload/*; do
npx wrangler@latest r2 object put "$R2_BUCKET/desktop/linux/$DESKTOP_ARCH/$(basename "$file")" --file "$file"
done
npx wrangler@latest r2 object put "$R2_BUCKET/desktop/linux/$DESKTOP_ARCH/latest.json" --file release/linux/latest.json
Comment thread .github/workflows/desktop-release.yml Outdated
Comment on lines +155 to +159
set -euo pipefail
for file in release/upload/*; do
npx wrangler@latest r2 object put "$R2_BUCKET/desktop/windows/$DESKTOP_ARCH/$(basename "$file")" --file "$file"
done
npx wrangler@latest r2 object put "$R2_BUCKET/desktop/windows/$DESKTOP_ARCH/latest.json" --file release/windows/latest.json
Comment thread desktop/BUILD.md
Comment on lines +69 to +70
git push origin feat/shelldeck-desktop
git push origin desktop-vX.Y.Z
falkoro and others added 7 commits June 5, 2026 09:50
A "just let me try it" build: produces a Windows .exe and Linux AppImage as
downloadable GitHub Actions artifacts, with the updater disabled so no signing
key/secrets are required. The real signed+R2 pipeline stays in desktop-release.yml.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CI surfaced three compile errors the local scaffold couldn't (no GTK to cargo check):
- generate_context! panicked: icons/icon.png was not RGBA
- Windows tauri-build: icons/icon.ico missing
- E0618: the `switch_server` tray MenuItem shadowed the switch_server() fn

Regenerated the full desktop icon set via `tauri icon` (RGBA png + ico + icns +
Windows logos; pruned unused iOS/Android), pointed tauri.conf.json at it, and renamed
the menu item binding to switch_server_item.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On a desktop-v* tag, build Win .exe + Linux AppImage/.deb and publish them to a
GitHub Release with auto-generated notes. This is the source the admin.spot-suite.com
ShellDeck Desktop tab reads. Signing + Tauri updater feed are a documented fast-follow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the artifact-only trial workflow with a pre-release publisher: each push
touching desktop/ builds Win .exe + Linux AppImage and publishes a prerelease=true
GitHub Release tagged desktop-v<version>-dev.<run>, pruning to the newest 5. The
admin tab lists these under "Pre-release builds".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Each push touching desktop/ builds Win .exe + Linux AppImage and publishes a
prerelease GitHub Release (desktop-v<version>-dev.<run>), pruned to the newest 5.
Surfaced in the admin tab's "Pre-release builds" section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@falkoro falkoro merged commit 202c90b into master Jun 5, 2026
3 checks passed
@falkoro falkoro deleted the feat/shelldeck-desktop branch June 5, 2026 09:40
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.

2 participants