Building Your Godot Project for Every Platform

Created: 2025-12-10Last updated: 2026-07-09

A reliable guide to exporting Godot projects to Windows, macOS, Android, and Web. Illustrates export templates and PCK files, common traps like case sensitivity, the header settings Web needs, build size optimization, and a final pre-ship checklist.

Your game is basically done and it's time to get it into players' hands. That final step, exporting (building), is where a lot of people hit an unexpected wall. "It ran perfectly in the editor, but the exported build is a black screen." "Only one platform errors out." Most of these last-mile problems are avoidable once you know how exporting works and the quirks of each platform.

This article covers everything you need to reliably ship a Godot project to Windows, macOS, Android, and Web: how export templates and PCK files work, the steps for your first export, the traps that catch people (case sensitivity and Web headers), build size optimization, and a final pre-ship checklist.

Illustration of exporting to each platform, with one Godot project producing builds for Windows, macOS, Android, and Web

What You'll Learn

  • How export templates and PCK files work (separate vs. embedded)
  • The steps for your first export (desktop, then Web)
  • The biggest trap, case sensitivity, and the header settings Web needs
  • Build size optimization and a pre-ship checklist

Sponsored

How Exporting Works: Templates and PCK

Two things unlock how exporting works: export templates and PCK files.

Diagram of the export flow: a Godot project in the center combines with precompiled per-platform export templates to produce Windows (.exe), macOS (.app), Android (.apk/.aab), and Web (.html) builds

Export templates are the Godot engine itself, compiled as binaries for each platform. Your project (its scenes and scripts) rides on top of a template to become something executable.

  • Versions must match: the Godot editor and the templates must be exactly the same version (a mismatch blocks exporting)
  • Debug and release builds: templates include both, and you choose at export time. Ship the release build

A PCK is a single file bundling your project's scenes, scripts, and assets. You can choose whether to keep it separate from the executable or embed it.

Comparison of separate and embedded PCK: separate keeps the executable (.exe) and data (.pck) apart, giving a small executable and easy patch distribution but multiple files; embedded packs everything into one executable for single-file distribution at the cost of size
PCK handlingProsConsTypical use
Separate (default)Small executable, easy patch distributionMultiple files to distributePC
EmbeddedDistribute a single fileLarger executableWeb, mobile

Hands-On: Your First Export (Desktop to Web)

Publishing an indie game on itch.io, handing out a free game for Windows, putting a mobile app on a store: the first step is the same. The standard route is to export for desktop (Windows) first, then move on to Web (itch.io). The steps follow the same flow on every platform.

  1. Get the templates: under Editor > Manage Export Templates, download the templates for the Godot version you're using
  2. Add a preset: under Project > Export > Add, pick the platform you want to ship (Windows Desktop, for example)
  3. Check the settings: confirm the main scene, the icon, and whether you're building release or debug
  4. Export: choose an output location with "Export Project" and write the build

Once your first desktop build runs, add a Web preset to the same project, export it, and upload it to itch.io to play in a browser. Getting one platform working end to end makes the rest much easier to follow.

There are two key points.

  • Always test the actual exported build: working in the editor and working in an export are two different things. Saving (user://) in particular can behave differently in an export, so always verify save/load against a real build.
  • Get one working before adding more: don't aim at every platform at once. Push one convenient target like Windows all the way through. It makes isolating errors far easier.
Sponsored

Platform-Specific Essentials and Traps

The Biggest Trap: Case Sensitivity

This is the error Windows developers hit most. Windows ignores filename case, but Linux and Android are strict about it.

Diagram of the case sensitivity trap: code references res://Assets/Player.png while the actual file is res://assets/player.png, which works on Windows because case is ignored but fails to load on Linux and Android, which treat them as different files

If your code says res://Assets/Player.png while the actual file is res://assets/player.png, it works in the Windows editor but fails to load once exported. The fix is simple: standardize filenames on lowercase snake_case.

Windows / macOS

Desktop is the simplest. On Windows you can embed an icon and version info with rcedit. On macOS, distribution may require Apple notarization.

Android

Android has the most settings of any platform.

  • SDK/JDK setup: set the paths under Editor Settings > Export > Android. Godot 4.x requires JDK 17 (or 21) (3.x used JDK 11)
  • AAB vs. APK: the Google Play Store recommends AAB. APK is easier for testing and direct distribution
  • Error signposts: No Android SDK found means the SDK path isn't set, apksigner not found means build-tools isn't installed

Web

Web is easy to reach, but it has a trap tied to your server environment. If you export with threads enabled, the browser needs SharedArrayBuffer, which requires COOP/COEP headers on the server.

Diagram of Web SharedArrayBuffer requirements: exporting with threads enabled requires SharedArrayBuffer, which needs Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers on the server. itch.io enables it with one checkbox, your own server needs the headers added, or you can disable threads and skip the headers
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
  • itch.io: a single SharedArrayBuffer checkbox enables it
  • Your own server: add the headers above to your configuration
  • Disable threads: turning threads off in the export settings lets the build run without the headers (this may affect performance)

Optimizing Build Size

A large distribution size means slow downloads and slow first loads on the Web. Tackle it in order of impact.

TechniqueActionImpact
Resource filteringInclude only the files you need, via the Resources tab in the export settingsHigh
Texture compressionEnable VRAM compression in the .import settingsHigh
Audio quality tuningLower the bitrate of music and sound effectsMedium

Excluding unused assets has an especially big payoff. Before shipping, check whether prototype-era assets are still sitting in your project.

The Final Pre-Ship Checklist

Confirm these four things before you export. Covering them prevents most "I shipped it and it doesn't run" situations.

Diagram of the pre-export checklist with four checked items: case sensitivity (filenames match reality), external tool paths (SDK/JDK/rcedit), debug disabled (release build), and main scene (startup scene set)
CheckDetails
Case sensitivityDo resource paths match the actual filenames, casing included?
External tool pathsAre the Android SDK, JDK, and rcedit paths correct?
Debug disabledIs "Export With Debug" OFF for the release build?
Main sceneIs the startup scene set correctly?

Bonus: Good to Know for Later

  • Try exporting early: if your first export is right before release, casing mismatches and friends all erupt at once. Getting one export through early in development saves pain later.
  • .res and encryption: for releases, consider binary .res over text .tres, and encryption if you need it (see custom resources).
  • Revisit controls per platform: Web and mobile change the assumptions (no keyboard, portrait screens, touch input). Check your input handling against the target you're shipping to.

Summary

  • Exporting means putting your project on a template (matching versions) and writing it out. Ship the release build
  • Choose PCK separate (PC) or embedded (Web, mobile) based on use case
  • The biggest trap is case sensitivity. Standardize filenames on lowercase snake_case
  • Android needs JDK 17 plus SDK/build-tools, and Web needs COOP/COEP headers when you use threads
  • Before shipping, confirm casing, external tool paths, debug OFF, and main scene, and always test the exported build

Start by getting a Windows export through and confirming the resulting .exe launches on its own. The moment it becomes something you can hand out, your project goes from a game to a released work.

Further Reading