Building Your Godot Project for Every Platform

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

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

Tested with: Godot 4.7

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 ways to hand over the PCK: handing over only the .exe ends with an error; separate means handing over the .exe and .pck together; Embed PCK puts the .pck inside the .exe so one file is enough
PCK handlingProsConsTypical use
Separate (default)Small executable, easy patch distributionMultiple files to distributePC
Embedded (Embed PCK)Distribute a single fileLarger executablePC (when you want a single file)

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. The editor on Windows ignores filename case, but inside the exported data (the PCK) case matters strictly, even in a Windows build.

Diagram of the case sensitivity trap: code references res://Assets/Player.png while the actual file is res://assets/player.png. It works in the editor, which ignores case, but the exported game treats them as different files inside the PCK and fails to load, even on Windows

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, Godot writes the icon and version info into the executable itself through the export option Modify Resources (on by default), so rcedit is no longer needed. 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.7's official instructions use OpenJDK 17
  • 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 off Thread Support in the export settings lets the build run without the headers (it's off by default in Godot 4.7; 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), 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 and JDK 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: text .tres files are converted to binary automatically on export. If you want the contents harder to read, consider encryption (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.
Sponsored

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 OpenJDK 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

Read nextNext in the learning path
Build

Godot Web Export Basics: Make Your Game Playable in the Browser and Put It on itch.io

Read this note
Godot Notes in this section104