Build for Desktop
Shipping a game to desktop means producing native binaries for Windows / macOS / Linux, signing them, and distributing through Steam, the Mac App Store, Itch, or your own installer. Engines (Unity, Godot, Unreal, web-wrapped via Electron/Tauri) take very different paths to the same end state.
Per-engine build, sign, and distribute
EXAMPLE
# ===== Engine -> build pipeline =====
# Unity: Build Settings -> Windows / Mac / Linux. IL2CPP backend for native binaries.
# Godot: Project -> Export -> Add 'Windows Desktop' / 'macOS' / 'Linux/X11'.
# Unreal: File -> Package Project -> Win64 / Mac / Linux. Big binaries.
# Web-wrapped: Electron (Chromium + Node) or Tauri (system webview, much smaller).
# ===== Windows =====
# 1) Build artifact: game.exe + DLLs + data folder
# 2) Code signing: required for SmartScreen reputation
# - Get an EV (Extended Validation) code-signing cert from DigiCert / Sectigo
# - Or use a standard cert + accept reputation will take weeks of installs
# - Tools: signtool.exe sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a game.exe
# 3) Installer: Inno Setup, NSIS, or MSIX
# - Inno Setup is free, scriptable, and produces familiar installers
# - Sign the installer the same way as the exe
# 4) Distribution
# - Steam (Steamworks pipeline; depots + branches)
# - GOG, Itch.io (drag-drop ZIP), Microsoft Store (MSIX)
# ===== macOS =====
# 1) Build artifact: Game.app bundle (a directory with Info.plist + binary)
# 2) Code signing + notarisation are MANDATORY for distribution outside the
# Mac App Store on modern macOS:
# - Apple Developer ID 'Developer ID Application' cert
# - codesign --deep --force --options runtime --sign 'Developer ID Application: My Co' Game.app
# - xcrun notarytool submit Game.app.zip --apple-id <id> --team-id <team> --wait
# - xcrun stapler staple Game.app
# 3) Distribution
# - DMG via 'create-dmg' or 'hdiutil create' (sign the DMG too)
# - Mac App Store: separate signing identity ('3rd Party Mac Developer Application')
# AND a provisioning profile; submit via Transporter
# - Steam: same as Windows; Steamworks handles the .app
# ===== Linux =====
# 1) Build artifact: a binary + data files OR an AppImage / Flatpak / Snap
# 2) AppImage — easiest, single-file distribution
# - linuxdeploy --appdir AppDir --executable game --desktop-file game.desktop --icon-file icon.png
# - appimagetool AppDir Game.AppImage
# - chmod +x Game.AppImage
# 3) Flatpak (Steam Deck friendly) — flatpak-builder
# 4) Steam — Steamworks supports Linux depots; Proton lets Windows builds run on Linux too
# ===== Cross-cutting concerns =====
# Versioning
# - Same version string across all builds (Steamworks branch, Game.app Info.plist, .exe metadata)
# - Embed git SHA in an in-game 'About' screen so support knows the build
# Auto-update
# - Steam handles updates for free if you ship there
# - Otherwise: Squirrel.Windows (NuGet), Sparkle (mac), AppImageUpdate
# - Don't roll your own updater; bad ones brick games
# Save / settings location
# - Windows: %APPDATA%\YourGame
# - macOS: ~/Library/Application Support/YourGame
# - Linux: $XDG_DATA_HOME/YourGame (default ~/.local/share/YourGame)
# Use the platform's standard locations or you will get angry emails from users.
# Cloud saves
# - Steam Cloud is the easiest path
# - Otherwise: a small JSON over HTTPS to your own server (sign with userId + ts)
# Anti-piracy
# - Steamworks DRM is free; covers most of what you need
# - Denuvo + similar add cost, complexity, and angry players; rarely worth it for indie
# CI integration
# - Build all three platforms in CI (GitHub Actions: runs-on: macos-14 / windows-latest / ubuntu-latest)
# - Sign + notarise on the platform that needs it
# - Upload artifacts to Steamworks via 'steamcmd' from a Linux runner
# ===== Steam-specific tips =====
# - 'depots' = collections of files; you set the depot per platform
# - 'branches' = where the depot lives (default = public)
# - Test in a 'beta' branch with a password before promoting to 'public'
# - Steam Workshop requires a separate uploader if you want user-generated content
# ===== Common gotchas =====
# - Mac: forgot to enable Hardened Runtime + the right entitlements -> notarisation fails
# - Win: SmartScreen warns 'unknown publisher' until reputation builds -> EV cert fixes it
# - Linux: missing libgl / libstdc++ on user systems -> bundle via AppImage
# - All: too-big installer (uncompressed Unity build > 4 GB) -> use Assets Bundles + LZ4 compression
Why it matters
Sign EVERYTHING you ship and notarise on macOS — without that step, modern operating systems quarantine your game, scare users with red dialogs, and refuse to launch. Once signing is set up in CI (one-time), it adds 30 seconds to a build; without it, every release becomes a customer-support afternoon.
Tip: Tweak the snippet with Try it Yourself », then sit the quiz at the bottom of the page.
Example
Example
// Windows / macOS / Linux from any major engine. // Sign your binaries; Apple notarisation is mandatory for distribution.Try it Yourself »
Discussion
Loading…