ShellDeck Desktop — auto-updating Tauri thin client + landing site#39
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
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-platformlatest.jsonmanifests to populate download links. - Adds a new
.github/workflows/desktop-release.ymlto build/sign/publish Windows + Linux bundles and upload artifacts/manifests to R2 ondesktop-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 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 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 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 on lines
+69
to
+70
| git push origin feat/shelldeck-desktop | ||
| git push origin desktop-vX.Y.Z |
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 tagdesktop-v*: builds Linux AppImage+.deb (ubuntu-latest) and Windows NSIS.exe(windows-latest, GitHub-hosted since our pool is Linux-only), signs, generateslatest.json, uploads to R2, attaches to a GitHub Release.site/— static Cloudflare Pages landing page; download buttons read the live version fromlatest.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 (reqwestw/ 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 onsite/+ 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)
cd desktop && npm run tauri signer generate→ paste the public key intotauri.conf.json; add the private key + password as GitHub secrets.TAURI_SIGNING_PRIVATE_KEY,TAURI_SIGNING_PRIVATE_KEY_PASSWORD,CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_API_TOKEN,SHELLDECK_R2_BUCKET.shelldeck.app+ R2 bucket servingdl.shelldeck.app/desktop/...(placeholder — one-line change if you want a*.falkinator.orgsubdomain instead).site/screenshot-*.pngplaceholders.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