brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
software-desktopBuilds and reviews desktop apps. Use when choosing a stack, signing or notarizing releases, adding auto-update, or reviewing Electron/Tauri security.
Independent GitHub snapshot · Automated classification · Original documentation governs
Build cross-platform and native desktop apps with correct architecture, security defaults, and distribution pipelines.
| Need | Recommended Tool / Framework |
|---|---|
| Cross-platform (JS/TS) | Electron — mature ecosystem, large community, Chromium-based |
| Cross-platform (Go + Web) | Wails — Go backend with an OS webview; verify target dependencies and selected major's release status at Wails |
| Cross-platform (.NET desktop) | Avalonia — Windows/macOS/Linux XAML UI; self-contained deployment bundles .NET, but target native libraries still matter |
| Cross-platform (Rust + Web) | Tauri — smaller bundles, stronger security model, OS webview, also targets iOS/Android from the same codebase (stable since Tauri 2.0, Oct 2024) |
| Cross-platform (Dart) | Flutter Desktop — shared mobile/desktop codebase; strongest on macOS, Windows/Linux slightly behind on package maturity |
| Cross-platform (.NET) | .NET MAUI — Windows (WinUI 3 host) + macOS (Mac Catalyst) only; no first-party native Linux desktop target (check the .NET MAUI supported-platforms docs, including any third-party Linux backends, before promising Linux) |
| Cross-platform (Kotlin) | Compose Multiplatform — shared Android/desktop UI |
| Native macOS | SwiftUI (default for new apps) + AppKit interop for advanced window/menu chrome |
| Native Windows | WPF for established Windows-only line-of-business apps; WinUI 3 when Windows App SDK integration fits the product |
| Native Linux | GTK (GNOME), Qt (KDE) |
| Auto-update | Pick by toolchain: electron-builder → NSIS target + electron-updater; Electron Forge → built-in autoUpdater (Squirrel.Windows via electron-winstaller, or MSIX); Tauri's built-in updater; Sparkle 2 (macOS) |
| Code signing | Apple notarization via notarytool; Windows Authenticode via Azure Artifact Signing (formerly "Trusted Signing") or a traditional EV/OV cert; Linux (distro-specific) |
| Installers | electron-builder, Tauri bundler, create-dmg, Inno Setup, NSIS, AppImage/Flatpak/Snap |
| Tauri capability/plugin migration | references/tauri-2-migration.md — load for migration and WebView2 deployment |
| Verify Developer ID .app signature and ticket | scripts/check_signing.sh — macOS only; non-macOS and unsupported artifacts fail |
| Validate signing configuration before CI | scripts/check_signing_readiness.py — static schema checks; --strict requires referenced files locally, without inspecting key material |
A meaningful fraction of "we need a desktop app" requests are better served by a PWA — no code signing, no update server, no per-OS QA matrix. Push back and confirm desktop is the right call before opening the decision tree below:
manifest.json + service worker) likely covers it with a fraction of the packaging and signing burden.Desktop framework selection (after confirming a PWA won't do):
START
├─ Need full native platform integration and max performance?
│ ├─ macOS only → SwiftUI (+ AppKit for custom chrome)
│ ├─ Windows only → WPF for an existing WPF codebase or WinUI 3 for Windows App SDK integration
│ └─ Linux only → GTK or Qt
├─ Have a web app and want desktop distribution?
│ ├─ Team knows Node.js, needs mature plugins / deepest native integration → Electron
│ ├─ Bundle size, memory, and a stronger default security posture matter, team can absorb some Rust → Tauri
│ ├─ Go backend team → Wails (OS webview; verify release status and native dependencies)
│ └─ Also need iOS/Android from the same codebase → Tauri (mobile targets stable since 2.0; feature parity with desktop plugins still catching up)
├─ Already have a Flutter mobile app?
│ └─ Flutter Desktop (shared codebase; strongest on macOS, fewer production-grade Windows/Linux packages)
├─ Already have a Compose Android app?
│ └─ Compose Multiplatform Desktop
├─ .NET team needing desktop?
│ ├─ Windows + macOS only, want one XAML codebase across mobile too → .NET MAUI (no native Linux target yet)
│ ├─ Windows/macOS/Linux desktop with XAML → Avalonia (self-contained publish per target RID)
│ └─ Windows-only → WPF or WinUI 3
├─ Bundle size and memory footprint critical?
│ └─ Tauri or Wails (OS webview); benchmark the actual release artifacts and full process tree
└─ Security-sensitive app?
└─ Tauri (no Node.js in renderer, capability-scoped IPC, an explicitly configured CSP) — or Electron with `contextIsolation`/`sandbox` enforced as non-negotiables if the team can't take on Rust
webkit2gtk-4.0 vs 4.1 (soup2 vs soup3) differs. WebKitGTK 2.52 removed libsoup2 support in March 2026; check package availability on the minimum supported distro. Pin and test against your minimum supported distro before committing to Tauri on Linux.Electron apps run two process types: the main process (Node.js, one per app) and renderer processes (Chromium, one per window).
Process model and IPC:
contextBridge.exposeInMainWorld.ipcMain.handle / ipcRenderer.invoke).Security model (mandatory):
contextIsolation: true — always. No exceptions.nodeIntegration: false — always. Preload scripts are the only bridge.webSecurity: true — never disable in production.sandbox: true — renderer default since Electron 20; keep it explicit because enabling Node integration disables it.webContents.loadURL to known origins; never load arbitrary remote content.Key anti-patterns:
nodeIntegration: true in BrowserWindow options — exposes full Node.js to renderer.webSecurity to work around CORS — opens the app to remote code execution.Tauri apps pair a Rust backend with a webview frontend (the OS-native webview, not bundled Chromium).
Core design:
#[tauri::command]) exposed to the frontend via an IPC bridge.tauri-plugin-shell's sidecar API) — useful when logic can't or shouldn't be ported to Rust/JS.Security advantages over Electron (no Node.js in the frontend, an explicitly configured CSP, capability-scoped IPC, smaller attack surface) and tradeoffs (cross-platform webview differences, Linux WebKitGTK fragmentation, smaller plugin ecosystem, Rust required, mobile plugin parity still catching up): references/framework-selection.md.
Use framework dialogs for file access (never raw fs in the renderer), follow each platform's tray/menu-bar and shortcut conventions, register protocol handlers and file associations deliberately, and treat local storage as the source of truth with sync-and-merge rather than fetch. Details for file system, tray and menus, native integrations, and offline-first: references/desktop-integration.md.
Update recovery gate.
An updater is production-ready only when the previous signed build can be restored after download failure, signature rejection, crash-on-launch, or incompatible local-data migration. Test interrupted download, offline launch, downgrade protection, and rollback on each supported OS. Keep application-data migrations backward compatible for at least the rollback window, or explicitly block auto-update until recovery is possible.
Sign for every target OS: macOS Developer ID plus notarytool notarization (altool is removed), Windows Authenticode via Azure Artifact Signing or a hardware-token/HSM EV/OV certificate, and the Linux channel's own trust model. Pick one auto-update toolchain per framework (Tauri updater with Minisign keys, electron-updater on NSIS, or Electron's built-in autoUpdater with Squirrel.Windows/MSIX, Sparkle 2 on macOS) and prefer hosted update endpoints over a bespoke server. Signing detail, update-server burden, installers, auto-update mechanisms, and app-store trade-offs: references/distribution-and-signing.md.
package.json dependencies vs devDependencies. Use electron-builder's pruning or Tauri's Rust release profile.tauri.conf.json allowlist, run cargo tauri migrate, review generated capability files, update all plugin imports from tauri::api::* to @tauri-apps/plugin-*, and update frontend invoke calls to @tauri-apps/api/core.references/platform-traps.md for current platform requirements.software-accessibility and audit evidence to qa-testing-accessibility (see the pointer below).autoUpdater with Squirrel.Windows/MSIX for Forge). Implement from day one; retrofitting auto-update is expensive.Whether the EAA applies is a question for qualified counsel; technical conformance mapping is in software-accessibility, legal landscape and audit evidence in qa-testing-accessibility, and desktop-specific checks in platform-traps.
Before choosing a release, read its support/compatibility notes through data/sources.json. For a signing or update pipeline, verify the chosen channel's eligibility, package requirements, and updater API at the linked distribution sources. Record the checked release and target OS/architecture in the recommendation; use measured artifacts for footprint claims.
When prior decisions or pitfalls are relevant, consult learnings.consolidated.md if present; use learnings.md only for needed history or as the available fallback. Otherwise skip both.
After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to learnings.md via agents-skills-feedback-loop/scripts/append_learning.py. Do not modify SKILL.md itself.