desktop-app — installed cross-platform applications
This sub-skill stands up a desktop application that users download and install on
Windows, macOS, and/or Linux. It mirrors the proven release flow of a cross-platform Python+Qt
desktop app with local ML weights (e.g. a local-speech tool): Python + Qt control center,
local model weights, packaged online + offline installers, GitHub Releases, a Netlify download
site, big assets on Hugging Face, Windows build on a remote host, portable offline build in a
container. Distribution is treated as a first-class deliverable, not an afterthought.
What this sub-skill is for
A program that runs as an installed binary with a real OS presence (window, tray/menu-bar,
notifications, file associations), shipped as signed per-OS installers. Use it for GUI tools,
utilities, and tray apps — not for web UIs (website), pure command-line tools (cli-tool),
or mobile (mobile-app), though it composes with cli-tool when the app also ships a launcher.
Mandatory grill-questions (fold into the DoR)
- Framework — Electron (web stack, biggest bundle), Qt/Python (native
feel, PySide6/PyQt), or Tauri (Rust core, tiny bundle, system webview). Recommended: Qt/Python
for a native feel unless web UI reuse forces Electron. Lock this before any code.
- Target OSes — which of Windows / macOS / Linux, and the minimum versions. Each adds a
packaging + signing + CI lane.
- Code signing — do you have (or will you get) an Apple Developer ID + notarization, and a
Windows Authenticode cert? If not, ship unsigned and warn users of the OS gatekeeper prompts.
- Auto-update — needed? (electron-updater / Tauri updater / Sparkle / custom check against
GitHub Releases). Define the update channel and the signing key for update artifacts.
- Offline / heavy assets — large models or data (like bundled ML weights)? Decide
online-installer-fetches-on-first-run vs. offline multi-part bundle, and where big files live
(Hugging Face / GitHub Release assets / CDN).
- Distribution surface — GitHub Release + a download page (Netlify)? Confirm
the download-site repo and the artifact naming scheme.
- Build hosts — can all target OSes be built here, or is a remote build host needed (e.g.
SSH to a Windows machine for the Windows lane)? Flag any cross-build gaps now.
- Data & privacy — local-only vs. cloud; where user data/config lives per-OS; any telemetry
(default: none, opt-in only).
Project sub-agents to generate (<project>/.claude/agents/)
packager (delegate-by-default) — produces per-OS installers (NSIS/MSI, dmg/pkg,
AppImage/deb/rpm or Tauri bundles); owns the build matrix and artifact naming.
release-engineer (delegate-by-default) — prepares the GitHub Release, artifacts +
checksums, and the download-page/Hugging-Face upload; never invents version tags. Cuts the
release and pushes the assets only after the user confirms — this ships to real users.
installer-tester — installs each artifact on a clean target, verifies launch, signing,
auto-update, and offline-asset fetch; reports honestly when a lane is broken.
ui-reviewer — checks the GUI against the done-bar and the no-emoji rule (typographic
symbols / drawn elements only in UI and notifications).
- Plus the kit defaults:
reviewer (diff/PR) and verifier (launches the app to confirm behaviour).
Tools / CLIs / MCP / skills needed
- Runtime/build: Node + the framework toolchain (electron-builder /
@tauri-apps/cli /
Rust+cargo) or Python + PySide6/PyQt + PyInstaller/briefcase. Check in environment-readiness.
- Signing/notary:
codesign/notarytool (macOS), signtool/osslsigncode (Windows) — only
if signing was chosen; flag missing certs, never fabricate credentials.
- Distribution:
gh (GitHub Releases), netlify-cli (download page), huggingface_hub /
git-lfs for big assets. Container runtime (Docker/Podman) for the portable offline build
(glibc-pinned) and remote ssh to a build host for OS lanes that can't build locally.
- CHAIN global skills:
cli-anything (if wrapping an existing GUI into an agent-drivable CLI),
verify (run the built app), code-review, doc-coauthoring (README + install docs),
update-config (permissions/hooks for build commands). For the desktop UI itself, the
framer-inspiration / design-harvest skills inform layout even though it isn't a website.
- Design chain (2026-07-29 addition):
design-bausteine's four-part brief and fan-out step apply
to the GUI regardless of framework. If Electron was chosen, the renderer is real HTML/CSS — run
slop-detect on it as a ship gate the same as a website; Qt/Tauri-native UIs skip slop-detect
(it reads CSS/Tailwind tokens, not native widgets). Either way, design-critique before release
gives ui-reviewer the same two-isolated-pass mechanism used for client-facing web work.
File / asset nudges (on top of the base set)
packaging/ — per-OS build configs (electron-builder.yml / tauri.conf.json / PyInstaller specs).
packaging/signing/ — signing notes + a .gitignored slot for certs/secrets (never committed).
.github/workflows/release.yml — the build matrix + release pipeline.
download-site/ (or a linked repo) — the download page.
assets/ + an ASSETS.md documenting where heavy files live and how the online installer fetches them.
INSTALL.md — per-OS install, the unsigned-app gatekeeper steps, and uninstall.
Stack defaults & done-bar
Default stack: Qt/Python (PySide6) + PyInstaller, signed where certs exist, auto-update
checked against GitHub Releases, online installer + optional offline bundle, download page on
Netlify, big assets on Hugging Face — i.e. the Python+Qt local-weights pattern. (Switch to Electron/Tauri if grilled.)
Done-bar (all true): a signed (or knowingly-unsigned) installer for each target OS installs
on a clean machine; the app launches, shows its window/tray, and survives a restart; auto-update
applies a newer release end-to-end; offline assets resolve on first run; a GitHub Release exists
with artifacts + checksums and the download page links to them; INSTALL.md is accurate.
Guardrails
- No emojis in the app UI or notifications — typographic symbols or drawn elements only (standing user rule).
- Honesty about signing: if the app is unsigned, say so plainly and document the OS warnings — never imply it's trusted.
- Never commit certs, signing keys, notary creds, or API tokens —
.gitignore them; ask the user to supply them.
- Don't claim a build lane works until
installer-tester proves it on that OS; report cross-build gaps instead of faking them.
- Commit under the user's own name only (Skryx-L-A) — never add Claude as a co-author.
- Verify big-asset licensing before redistributing models/data; record provenance in
ASSETS.md.
1---2name: desktop-app3description: Build and set up a desktop / cross-platform application project (Electron, Qt/Python, or Tauri) with per-OS packaging, code signing, auto-update, and a GitHub-Release-plus-download-page distribution flow. This is a project-kit sub-skill loaded by new-project routing. Use WHENEVER the user wants to build, create, or ship a desktop app, a native GUI, a tray/menu-bar utility, a cross-platform installer, or anything that runs as an installed program on Windows / macOS / Linux.4---56# desktop-app — installed cross-platform applications78This sub-skill stands up a **desktop application** that users download and install on9Windows, macOS, and/or Linux. It mirrors the proven release flow of a cross-platform Python+Qt10desktop app with local ML weights (e.g. a local-speech tool): Python + Qt control center,11local model weights, packaged online + offline installers, GitHub Releases, a Netlify download12site, big assets on Hugging Face, Windows build on a remote host, portable offline build in a13container. Distribution is treated as a first-class deliverable, not an afterthought.1415---1617## What this sub-skill is for18A program that runs as an installed binary with a real OS presence (window, tray/menu-bar,19notifications, file associations), shipped as signed per-OS installers. Use it for GUI tools,20utilities, and tray apps — not for web UIs (`website`), pure command-line tools (`cli-tool`),21or mobile (`mobile-app`), though it composes with `cli-tool` when the app also ships a launcher.2223## Mandatory grill-questions (fold into the DoR)241. **Framework** — Electron (web stack, biggest bundle), Qt/Python (native25 feel, PySide6/PyQt), or Tauri (Rust core, tiny bundle, system webview). **Recommended: Qt/Python**26 for a native feel unless web UI reuse forces Electron. Lock this before any code.272. **Target OSes** — which of Windows / macOS / Linux, and the minimum versions. Each adds a28 packaging + signing + CI lane.293. **Code signing** — do you have (or will you get) an Apple Developer ID + notarization, and a30 Windows Authenticode cert? If not, ship unsigned and warn users of the OS gatekeeper prompts.314. **Auto-update** — needed? (electron-updater / Tauri updater / Sparkle / custom check against32 GitHub Releases). Define the update channel and the signing key for update artifacts.335. **Offline / heavy assets** — large models or data (like bundled ML weights)? Decide34 online-installer-fetches-on-first-run vs. offline multi-part bundle, and where big files live35 (Hugging Face / GitHub Release assets / CDN).366. **Distribution surface** — GitHub Release + a download page (Netlify)? Confirm37 the download-site repo and the artifact naming scheme.387. **Build hosts** — can all target OSes be built here, or is a remote build host needed (e.g.39 SSH to a Windows machine for the Windows lane)? Flag any cross-build gaps now.408. **Data & privacy** — local-only vs. cloud; where user data/config lives per-OS; any telemetry41 (default: none, opt-in only).4243## Project sub-agents to generate (`<project>/.claude/agents/`)44- **`packager`** *(delegate-by-default)* — produces per-OS installers (NSIS/MSI, dmg/pkg,45 AppImage/deb/rpm or Tauri bundles); owns the build matrix and artifact naming.46- **`release-engineer`** *(delegate-by-default)* — prepares the GitHub Release, artifacts +47 checksums, and the download-page/Hugging-Face upload; never invents version tags. Cuts the48 release and pushes the assets only after the user confirms — this ships to real users.49- **`installer-tester`** — installs each artifact on a clean target, verifies launch, signing,50 auto-update, and offline-asset fetch; reports honestly when a lane is broken.51- **`ui-reviewer`** — checks the GUI against the done-bar and the **no-emoji rule** (typographic52 symbols / drawn elements only in UI and notifications).53- Plus the kit defaults: `reviewer` (diff/PR) and `verifier` (launches the app to confirm behaviour).5455## Tools / CLIs / MCP / skills needed56- **Runtime/build:** Node + the framework toolchain (electron-builder / `@tauri-apps/cli` /57 Rust+cargo) **or** Python + PySide6/PyQt + PyInstaller/briefcase. Check in environment-readiness.58- **Signing/notary:** `codesign`/`notarytool` (macOS), `signtool`/`osslsigncode` (Windows) — only59 if signing was chosen; flag missing certs, never fabricate credentials.60- **Distribution:** `gh` (GitHub Releases), `netlify-cli` (download page), `huggingface_hub` /61 `git-lfs` for big assets. Container runtime (Docker/Podman) for the portable offline build62 (glibc-pinned) and remote `ssh` to a build host for OS lanes that can't build locally.63- **CHAIN global skills:** `cli-anything` (if wrapping an existing GUI into an agent-drivable CLI),64 `verify` (run the built app), `code-review`, `doc-coauthoring` (README + install docs),65 `update-config` (permissions/hooks for build commands). For the desktop UI itself, the66 `framer-inspiration` / `design-harvest` skills inform layout even though it isn't a website.67- **Design chain (2026-07-29 addition):** `design-bausteine`'s four-part brief and fan-out step apply68 to the GUI regardless of framework. If Electron was chosen, the renderer is real HTML/CSS — run69 `slop-detect` on it as a ship gate the same as a website; Qt/Tauri-native UIs skip `slop-detect`70 (it reads CSS/Tailwind tokens, not native widgets). Either way, `design-critique` before release71 gives `ui-reviewer` the same two-isolated-pass mechanism used for client-facing web work.7273## File / asset nudges (on top of the base set)74- `packaging/` — per-OS build configs (electron-builder.yml / tauri.conf.json / PyInstaller specs).75- `packaging/signing/` — signing notes + a `.gitignore`d slot for certs/secrets (never committed).76- `.github/workflows/release.yml` — the build matrix + release pipeline.77- `download-site/` (or a linked repo) — the download page.78- `assets/` + an `ASSETS.md` documenting where heavy files live and how the online installer fetches them.79- `INSTALL.md` — per-OS install, the unsigned-app gatekeeper steps, and uninstall.8081## Stack defaults & done-bar82**Default stack:** Qt/Python (PySide6) + PyInstaller, signed where certs exist, auto-update83checked against GitHub Releases, online installer + optional offline bundle, download page on84Netlify, big assets on Hugging Face — i.e. the Python+Qt local-weights pattern. (Switch to Electron/Tauri if grilled.)85**Done-bar (all true):** a signed (or knowingly-unsigned) installer for each target OS installs86on a clean machine; the app launches, shows its window/tray, and survives a restart; auto-update87applies a newer release end-to-end; offline assets resolve on first run; a GitHub Release exists88with artifacts + checksums and the download page links to them; `INSTALL.md` is accurate.8990## Guardrails91- **No emojis in the app UI or notifications** — typographic symbols or drawn elements only (standing user rule).92- **Honesty about signing:** if the app is unsigned, say so plainly and document the OS warnings — never imply it's trusted.93- **Never commit certs, signing keys, notary creds, or API tokens** — `.gitignore` them; ask the user to supply them.94- **Don't claim a build lane works until `installer-tester` proves it** on that OS; report cross-build gaps instead of faking them.95- **Commit under the user's own name only (Skryx-L-A)** — never add Claude as a co-author.96- **Verify big-asset licensing** before redistributing models/data; record provenance in `ASSETS.md`.