Client Platforms · 4 of 6

Desktop

Windows, macOS, Linux. Big screens, real keyboards, multi-window workflows, and full filesystem access. Less hyped than mobile but still where most "professional" software lives.

ElectronTauriWPF / WinUIJavaFXQtSwiftUI / AppKit
← Back to Client Side
Quick Facts

At a Glance

Basic Concepts

  • Three OSes with very different conventions: Windows (most users), macOS (most developers), Linux (most servers/devs).
  • Two big architectures: native toolkits per OS, or one cross-platform shell wrapping web tech.
  • Distribution happens via direct download, vendor stores (Microsoft Store, Mac App Store), or package managers (winget, Homebrew, apt).
  • Code signing & notarization — required on macOS (Apple notarization) and strongly expected on Windows (Authenticode).
  • Auto-update is your responsibility unless you're in a store — Squirrel, Sparkle, Velopack, MSIX.
Landscape

The Toolkits

ToolkitLanguageApproachSweet spot
ElectronJS / TSChromium + NodeVS Code, Slack, Figma desktop. Largest ecosystem; biggest binaries.
TauriRust + JSOS WebView + Rust backendModern Electron alternative. ~10× smaller, much less RAM.
WinUI 3 / WPF / WinFormsC# / .NETNative WindowsFirst-class Windows apps; deep OS integration.
SwiftUI / AppKitSwiftNative macOSNative Mac apps; Catalyst brings iOS apps over.
QtC++ / QMLCross-platform nativeIndustrial / scientific / automotive UIs.
JavaFX / Compose MultiplatformJava / KotlinJVM cross-platformExisting JVM teams; line-of-business apps.
Flutter DesktopDartOwn rendererOne codebase from mobile to desktop.
GTK / Qt on LinuxC / C++ / RustNative LinuxGNOME and KDE applications.
Mechanics

Desktop-Specific Concerns

Electron vs Tauri — The Modern Choice
ElectronTauri
Browser engineBundled ChromiumOS WebView (WebView2 / WebKit)
Backend languageNode.jsRust
Binary size~120–200 MB~5–15 MB
RAM baseline~150–250 MB~30–80 MB
Browser consistencyIdentical everywhereDiffers per OS WebView
MaturityPowers VS Code, Slack, Discord1.x stable, fast-growing
Window & Process Model
  • Multi-window apps need explicit window state management — restoring positions, multi-monitor DPI scaling.
  • Electron splits into a main process (Node, OS) and renderer processes (one per window). They talk via IPC.
  • Tauri has a similar split: Rust core, WebView frontend, message-passing.
  • System tray, dock badges, jump lists, menu bars are platform-specific APIs.
Code Signing & Notarization
  • macOS: Apple Developer ID + notarization (a malware scan). Without it, Gatekeeper blocks the app on first launch.
  • Windows: Authenticode certificate (EV preferred) so SmartScreen doesn't warn users away.
  • Linux: typically signed packages (.deb, .rpm) or Flatpak/Snap with their own signing.
  • Renewals expire — set calendar reminders. Expired certs break already-shipped installers.
Auto-Update
  • Squirrel (Electron's default) — differential updates, used by Slack, GitHub Desktop.
  • Sparkle — the macOS standard; works with native apps too.
  • Velopack — modern cross-platform replacement.
  • MSIX on Windows handles signing + update via the OS.
  • Stores (Mac App Store, Microsoft Store) handle updates for you — but enforce sandboxing limits.
Filesystem & OS Integration
  • Settings live in OS-specific locations: %APPDATA% (Windows), ~/Library/Application Support (macOS), ~/.config (Linux XDG).
  • File associations, URL schemes (myapp://), drag-and-drop, clipboard formats — all platform-specific APIs.
  • Native menu bars on macOS (top of screen) vs in-window menus on Windows/Linux.
  • Notifications go through the OS notification center; permission prompts on first use (macOS).
App Stores vs Direct Distribution
  • Mac App Store: sandboxing required — kills many pro-app use cases. 30%/15% revenue cut.
  • Microsoft Store / MSIX: friendlier sandboxing; growing share but not the default channel.
  • Direct download remains the default for most professional desktop apps. You own updates, signing, billing.
  • Setapp / Homebrew Cask / winget are alternative discovery channels.
Picking

Choosing a Stack

Web team, big team

Electron — battle-tested, every problem already solved on Stack Overflow.

Web team, performance-focused

Tauri — same web frontend, much smaller and lighter.

Mac-first product

SwiftUI / AppKit — best-in-class feel, Catalyst brings it to iPad.

Windows enterprise app

WinUI 3 or WPF — deep OS integration, enterprise deployment via MSIX.

Existing JVM codebase

Compose Multiplatform or JavaFX.

Cross-platform native feel

Qt — proven for decades, especially in scientific / industrial software.

Pitfalls

Common Anti-Patterns

  • Treating it like a website — desktop users expect keyboard shortcuts, multi-window, drag-and-drop, native menus.
  • Forgetting offline-first — desktop users open apps on planes.
  • Ignoring high-DPI — 4K monitors and Retina displays need crisp rendering at every zoom level.
  • Letting code-signing certs expire — breaks installers, panics users.
  • Shipping a 300 MB Electron bundle when the app is 30 KB of UI logic.
  • Not testing on all three OSes — file paths, fonts, permissions all differ.
Continue

Other Client Platforms