export-and-ship is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Prepare a game export: check templates and targets, validate release assets, build after approval.
When your agent uses it
- The user wants to assess or prepare a Summer game export — Steam, itch, HTML5, iOS, Android targets as available in the installed build
- The user says ‘publish my game’, ‘release it’, or ‘ship a build to players’ — produce the build they will upload
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
Overview
Shipping is a checklist, not a creative act. This skill first inventories the export templates and targets actually present in the installed Summer Engine build. It can then validate platform-specific assets and configuration and produce a local build for an available target after approval. It does not upload, host, submit, or promise a target that is absent from the installation. Core principle: prove the target is locally available, then read its list, satisfy the list, and build. Treat store submission and hosting as separate user-controlled workflows.Steps
1. Prove local export capability
Do this before presenting destinations, writing presets, or constructing an export command.- Read
engineBinaryPathfromsummer_get_project_context. - Resolve the matching export-template directory for that exact Summer technical base.
- Inventory the installed templates (
summer_export_templateslists them and installs Summer’s macOS, Windows and web templates) and anycustom_template/releasepaths already configured inexport_presets.cfg. - Build a capability table with
available,missing prerequisite, orimpossible on this buildfor every requested target.
summer_export_templates before marking
another target missing: it installs Summer’s macOS and Windows templates. Linux,
Android, and iOS require a matching custom template or an external CI/build
environment, plus their platform toolchains where applicable.
Hard gate: an absent template or toolchain means the target is unavailable.
Do not create its preset, recommend it as a local option, or invoke an export
command. Route it to an explicitly configured external CI job or stop and tell
the user which prerequisite is missing. An export pack is not a runnable
platform build and must not be presented as one.
2. Pick among proven destinations
Offer only targets markedavailable by step 1. Record other requested
destinations as blocked follow-ups with their exact prerequisite.
Locally proven targets: macOS. Requested but blocked: Windows
(install the template with summer_export_templates), Web (non-Mono
build), Android
(template + Android toolchain). Which proven target should I prepare?
Each destination has a different list. Multiple destinations = multiple lists. Don’t shortcut — the iOS list does not satisfy the Steam list.
3. Run the pre-flight checklist
Always do this first, regardless of destination. Preferred (Summer MCP):Pre-flight blockers (any one = stop)
If any check fails, list them in one message and ask:
Pre-flight failed on N items: <list>. Fix these before exporting? I can take them one by one.
4. Per-platform distribution requirements
These lists describe distribution requirements only. They do not establish local export capability. Walk a list only after step 1 proves its target or the user has selected an external build environment that does.a) Steam
Build config for Steam:
- Export only the platform builds proven in step 1. Additional Steam platforms require their own matching template or external build job.
- Export options:
Embed PCK = truefor single-EXE distribution. - Steam SDK integration: GodotSteam (
https://godotsteam.com) is the standard. Add the GDExtension before exporting. - App ID must be set in the Steam SDK init code.
- Build separately for each platform; Steam Pipe uploads handle distribution.
b) itch.io
Lower bar than Steam. itch is forgiving.
Build config:
- Package each proven platform build as a ZIP.
- Or use
butler push(itch’s CLI) for atomic versioning and patches. - A browser build is optional and requires a separately proven non-Mono Web export environment.
c) Web (HTML5) — unavailable on the stock Mono build
Do not recommend or attempt this target from the stock Mono installation. Route it to a verified non-Mono Summer-compatible build environment first. Once that prerequisite is proven, these browser constraints apply:- No threading without
cross-origin-isolatedheaders (most hosts don’t set them). - No ENet — use WebSocket / WebRTC if multiplayer.
- Long initial load — first-paint is critical. Add a loading screen.
- File size matters — strip unused features in export preset (no encryption, no debugging, no JavaScript eval if not needed).
- Export preset: Web.
- Output
.html+.wasm+.pck+.js. - Disable: “Variant: Editor support”, “Encryption”.
- Audio: Chrome blocks autoplay. First user click must trigger audio context resume.
- Local saves: use
user://(maps to IndexedDB on web). Test that saves persist across reload.
d) iOS App Store
Build config:
- Export preset: iOS.
- Bundle ID:
com.<your-org>.<game-name>. Must match Apple Developer portal. - Apple Developer account required ($99/year).
- Code signing: distribution certificate + provisioning profile.
- Build via macOS only (Xcode toolchain).
- TestFlight first (always). Don’t go straight to App Store review.
e) Google Play (Android)
Build config:
- Export preset: Android.
- Build as AAB (Android App Bundle), NOT APK — Play Store requires AAB since 2021.
- Signing: Play App Signing (Google holds the key) + an upload key.
- Target API level: latest required by Play Store policy (typically the previous year’s API level).
- Test on real device + emulator before submission.
f) macOS DMG (outside Steam)
- Export preset: macOS (universal binary).
- Codesign + notarize via Apple — unsigned builds get a Gatekeeper warning users can’t easily bypass.
- Notarization requires Apple Developer account ($99/year).
- DMG packaging:
create-dmgCLI orhdiutil.
g) Windows installer (outside Steam)
- Export preset: Windows Desktop (x86_64).
- Code-signing certificate (300/year from a CA) — without it, SmartScreen flags the EXE.
- Installer: NSIS or InnoSetup are the standards. Or just ship a ZIP.
5. Build config consistency check
Before producing builds, verifyexport_presets.cfg for each target:
6. Propose the build sequence
Capability proof: macOS available locally; Windows needs its template
(summer_export_templates); Linux requires external CI; Web is unavailable
on this Mono build. Pre-flight is clean
for the macOS preset. May I produce that one proven build now?
7. Produce a proven build
CLI export is the standard scripted path. Get the binary fromsummer_get_project_context → engineBinaryPath. Do not type an engine binary name from memory:
- There is no
godoton a Summer user’s machine. summeris the npm CLI, not the engine. It takes subcommands and would never accept--export-release.- On macOS the engine is
/Applications/Summer.app/Contents/MacOS/Summer; on Windows,%LOCALAPPDATA%\Summer\current\Summer.exe.
available, substitute only that exact proven
preset and output:
--path is not optional in a script — without it the export targets the current working directory.
The quoted preset name must match a name= in export_presets.cfg exactly. That file is plain text you can write yourself if it is missing: a hand-written preset plus this command was measured producing a runnable 144 MB .app, exit code 0.
To enable another target, prove one of these before returning to step 2:
- a matching installed export template;
- a valid
custom_template/release="<path>"for the current technical base; - an external CI/build job with the matching template and platform toolchain.
Export-option cautions
script/encryption_keydoes not exist. The real key isscript_encryption_key, and it lives in a separateexport_credentials.cfg, notexport_presets.cfg. Writing the wrong name produces an unencrypted build with no error at all.- There is no
debugfield in a preset. Debug versus release is chosen by--export-debugversus--export-release, nothing else.
binary_format/architecture="arm64" is the natural guess, and it fails leaving a 0-byte .app that looks like success. Only "universal" ships.
See headless-scripting for the wider pattern this is one instance of.
If the user is on a CI system (GitHub Actions etc), point them at a cross-compile workflow: the engine can export Windows and Linux from a Linux runner.
8. Verify each build
For each build:- Launch it. Confirm the title screen renders.
- Run for 30 seconds. Confirm no console errors.
- Check the file size (anything over 500 MB needs justification — usually unstripped textures or unused assets).
- For mobile: install on a real device, not just the emulator.
9. Hand off distribution
Per platform, point the user at the correct upload path:- summer.games:
summer_export_gamewrites the summer.games.zip;store.upload_fileuploads it to the game’s store listing after the user confirms the exact game, file and version (needssummer login --store; throughsummer_callwhen your client does not list it). If the store refuses this machine’s sign-in, the user uploads the.zipin Studio instead. Thepublish-your-gameskill takes it from there tostore.publish.- Per platform, the store takes: iPhone, Android, macOS and Windows in the Summer apps = one summer.games bundle (
summer_export_gametargets, formatbundle; no template, no signing; a game without a server targetsios/androidonly). Web = an HTML5.zipon Summer’s WebGPU Forward+ template (targets:["web"]; the project must render with Forward+ or Mobile). A macOS or Windows download for the store page =targets:["macos"]or["windows"]with formatdownload. Download exports need the template:summer_export_templatesinstallfetches it from Summer’s CDN. - Hosted games: if
summer_export_gamefails with ”… is in the source graph’s authority_engine domain, which the client pack leaves out”, an authority root insource-domains.jsonholds a file the client loads (often the composition.tres). Narrow that root to the server-only files, or move the shared file under asharedpath, then export again. Every exporter message is in themultiplayer-publishskill’s export-errors.md; the folder rules are inmultiplayer-project. - Every summer.games bundle: export with the released Summer editor from the download page, never a development build, and export again after updating Summer. Otherwise its scripts can fail to compile on players’ devices and the game opens to an empty window, though every upload check passes.
release-readinesscheck 7 proves it. - Every file the game reads by path at run time (
FileAccess,DirAccess,load_from_file) that Summer doesn’t import, such as a.binor.json, must match the summer.games preset’s owninclude_filter(Resources > Filters to export non-resource files/folders); a filter on another preset doesn’t carry over. A left-out file is no export error, it is just missing on players’ devices. Never useSystemFontfor phone text: on iPhone it draws every glyph as a box.release-readinesscheck 8 lists the pack. - iPhone and Android bundles: the Summer Games apps start only exports on their Summer version line (same MAJOR.MINOR, patch no newer). Export with the current Summer release and export again after every Summer minor update, or players see “The game could not start” on phones while desktop works.
release-readinesscheck 9. - Hosted games, before the upload: a clean export does not prove players can join. Run
release-readinesson the.zip: the bundle’sserver.pck, started with no scene, must load the authority scene (the server preset needs thesummer_authoritycustom feature), andSummer.initializemust pass no hard-coded Game ID. Otherwise every online join fails withworld_start_timeout. - Store page art: key art, covers and icons carry no text, logos or UI (the store page shows the title). Screenshots are real gameplay and may show the game’s own HUD; add no captions, logos or overlays. Capture them with
summer_capture_gameplay(offscreen, no editor needed;resolution1920x1080, or1080x1920for portrait; get past a title menu with the game’s own flags inargs, e.g.["--autostart"], orstepssuch as[{"press":"Play"},{"wait":3000},{"shot":true}]), orsummer_screenshottargetgamewhile the editor runs the game.
- Per platform, the store takes: iPhone, Android, macOS and Windows in the Summer apps = one summer.games bundle (
- Steam:
steamcmd+ Steam Pipe (builder_app_xxx.vdf). Set up depots first in Steamworks. - itch.io:
butler push <path> <user>/<game>:<channel>(e.g.butler push build/win <user>/mygame:windows). - Web (itch hosted): zip + drop into itch upload UI as “playable in browser”.
- iOS: Archive in Xcode → upload via Xcode Organizer → TestFlight → App Store.
- Android: Play Console → Internal testing → Closed → Open → Production.
Pre-flight checklist (master)
Use this as a one-shot grep before any export:Common mistakes
Anti-patterns
- “Just enable all export options.” Encryption + JS eval + edit-time features bloat the binary. Disable what you don’t use.
- “I’ll fix the icon later.” Apple and Google reject submissions with placeholder icons. They’ll take a week to re-review.
- Unsigned macOS builds outside Steam. Apple Gatekeeper is strict. The user-facing workaround (“right-click → Open → confirm”) is bad UX.
- Embed PCK = false on desktop. Splits the binary into multiple files; users delete the PCK by accident; bad first-run experience.
- Trailer is a slideshow. Steam’s algorithm down-weights gameplay-less trailers. Show actual gameplay in the first 5 seconds.
Collaborative protocol
This skill produces release artifacts. Always ask before each build is invoked. Group platforms — “I’m about to build Windows + Mac + Linux release configs intobuild/. OK?”. See summer_docs_read id reference/collaborative-protocol.
Want a working starter?
No template — this is a workflow. Each project’s export config and store assets are project-specific.See also
summer_docs_readidreference/mcp-tools-reference— full MCP tool listsummer_docs_readidreference/godot-version— Summer compatibility and export-template versioningsummer_docs_readidreference/collaborative-protocol— “May I write” patternheadless-scripting— the headless CLI pattern the export command followstune-performance— pre-ship performance pass
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Related skills
debug: Disciplined bug, crash and error loop: script errors, console, debugger, hypothesis, fix, verify.tune-performance: Profile a slow game, find rendering, physics or script hotspots, and propose fixes with expected gains.publish-your-game: Publish a game on Summer Games through MCP: store page, art, build upload, submit, owner approval link.
Source:
library/skills/export-and-ship/SKILL.md, rendered from summer-engine@4.3.0 on npm.
