Exporting to Platforms

Popular CI: GitHub Actions with community Godot CI images (e.g., barichello/godot-ci) or godot-export actions.

39.1 Setup

*Editor → Manage Export Templates → Download and Install* (templates must match your exact Godot version).

*Project → Export → Add...* a preset per platform. Presets are saved in export_presets.cfg (commit it, but keep secrets like keystore passwords out — use environment variables or .godot/export_credentials.cfg, which is not committed).

Configure resources (export all, selected scenes, or exclude filters like *.psd, docs/*).

Click Export Project (or *Export PCK/ZIP* for patches/DLC).

39.2 Platform notes

Requirements & notes .exe + embedded or separate .pck; rcedit for icon/metadata; code signing optional

Universal binaries; notarization and signing for distribution (requires Apple Developer account) x86_64/arm64 binary + .pck

Android SDK, JDK 17, debug/release keystore; optional Gradle build for plugins; AAB for Play Store

Export Xcode project on macOS; sign and build in Xcode HTML5/WebAssembly; Compatibility renderer; threads need cross-origin isolation headers (COOP/COEP), or use the single-threaded export option (4.3+); C# not supported

Via third-party porting companies (W4 Games and others) due to NDAs

39.3 Command-line exports (CI)

Popular CI: GitHub Actions with community Godot CI images (e.g., barichello/godot-ci) or godot-export actions.

godot --headless --export-release "Windows Desktop" build/windows/game.exe
godot --headless --export-debug "Linux" build/linux/game.x86_64
godot --headless --export-release "Web" build/web/index.html
godot --headless --export-pack "Windows Desktop" build/patch.pck

39.4 Feature tags and platform code

Custom feature tags (set in the export preset, e.g., demo) let you build variants: OS.has_feature("demo"). Project settings can also be overridden per feature (e.g., display/window/size/viewport_width.mobile).

if OS.has_feature("web"):
	$QuitButton.hide()                  # can't quit a browser tab
if OS.has_feature("mobile"):
	$TouchControls.show()
if OS.is_debug_build():
	$DebugOverlay.show()
match OS.get_name():
	"Windows", "macOS", "Linux": pass
	"Android", "iOS": pass
	"Web": pass

39.5 Release checklist

Set application name, icon, version, and boot splash (*Project Settings → Application*).

Window stretch settings: canvas_items or viewport mode, aspect expand/keep.

Test exported builds (not just the editor): res:// is read-only; file paths are case-sensitive in PCKs; scripts are compiled to bytecode/tokenized.

Optional: PCK encryption (requires building custom export templates with an encryption key).

Strip debug features: remove debug overlays, and set *Debug → GDScript* warnings irrelevant to release.