Skip to main content

gameship

CI PyPI Python 3.11+ License: FSL-1.1-MIT

Ship your Python game. One command from a pygame project to real Windows / macOS / Linux builds and an itch.io release — the workflow every Python gamedev currently hand-rolls from PyInstaller + GitHub Actions + butler blog posts, packaged.

pip install gameship

gameship build                # freeze this OS's build   -> dist/<platform>/
gameship push you/your-game   # publish to itch.io (butler auto-installed)
gameship ci                   # write the 3-OS GitHub Actions workflow
gameship web                  # browser build via pygbag (pygame-ce)

Why

Python gamedevs are great at game code and stuck on the last mile: a real double-clickable app for people who don't have Python, built for all three OSes, uploaded to itch.io. The tools all exist — PyInstaller can't cross-compile so you need per-OS builders, butler is scriptable but manual, the GitHub Actions matrix is a blog-post ritual. gameship glues them so you never think about it:

  • gameship build — detects your entry point (main.py) and assets/ folder, names the app from your pyproject.toml or folder, runs PyInstaller windowed, outputs to dist/<platform>/.
  • gameship ci — drops a ready GitHub Actions workflow: every v* tag builds Windows + macOS + Linux in parallel and uploads artifacts. Add a BUTLER_API_KEY secret and an ITCH_TARGET variable and it also publishes each build to the right itch.io channel.
  • gameship push — wraps butler, itch.io's official CLI (downloads it on first use), so local pushes are one line too.
  • gameship web — wraps pygbag for a browser build you can host on itch.io's HTML5 player (pygame-ce projects with an async main loop).

Quick start (60 seconds, local)

cd your-game/          # has a main.py that runs your game
pip install gameship
gameship build
open "dist/mac/YourGame.app"        # or dist/windows/, dist/linux/

Full release pipeline (10 minutes, once)

gameship ci
git add .github && git commit -m "release workflow" && git push
# GitHub repo -> Settings -> Secrets -> Actions: BUTLER_API_KEY (from itch.io)
# GitHub repo -> Settings -> Variables -> Actions: ITCH_TARGET=you/your-game
git tag v1.0 && git push --tags

Three OS builds appear as artifacts; each pushes to you/your-game:windows, :mac, :linux on itch.io. Delta uploads, versioned channels — butler's whole feature set, none of its setup.

Honest limitations (v0)

  • PyInstaller quirks are inherited: Windows Defender sometimes flags frozen Python apps (code-signing fixes it; on the roadmap), and asset paths inside the bundle should be loaded relative to your script, not the cwd.
  • gameship web requires pygame-ce and an async-ified main loop — that's a pygbag rule, not ours; we warn rather than rewrite your code.
  • macOS builds are unsigned/un-notarized (players right-click > Open). Signing
    • notarization service is the roadmap item after this one.
  • Steam/Epic: not yet. itch.io first, on purpose.

Example

example/ is a complete 60-line pygame catcher — the repo's CI builds it on all three OSes and smoke-runs the frozen binary headless (SDL_VIDEODRIVER=dummy GAMESHIP_MAX_FRAMES=120).

See it in the wild: the same example, live on itch.io — built with gameship build, published with gameship push (all three OS channels via the release workflow). The page is the pipeline's own output. The example's main loop is async, so it's also gameship web-compatible — verified running in-browser via pygbag.

Common questions this answers

How do I turn my pygame game into an .exe? gameship build on a Windows machine (or let the generated workflow's Windows runner do it) — PyInstaller under the hood, no spec file to write.

How do I make a Mac .app from a pygame game? Same command on macOS: gameship builddist/mac/YourGame.app.

How do I upload a pygame game to itch.io automatically? gameship push you/your-game locally, or add the BUTLER_API_KEY secret so every tagged release publishes to your itch channels from CI.

How do I build my game for Windows, Mac, and Linux at once? You can't cross-compile Python — nobody can — so gameship ci writes the GitHub Actions matrix that builds natively on all three, free on public repos.

Is gameship open source? Source-available under FSL-1.1-MIT: free for any use except reselling gameship itself as a service, and each release converts to plain MIT after two years. Games built with it are entirely unaffected — they're yours.

Can my pygame game run in the browser? If it's pygame-ce with an async main loop: gameship web (pygbag), then upload the build as an itch.io HTML5 game.

Development

pip install -e . pytest
pytest            # unit tests (pure logic, no PyInstaller needed)

The CI dogfoods the tool: every push runs the tests on Python 3.11–3.13 and builds + headless-smoke-runs the example game on Windows, macOS, and Linux with gameship itself.

License

FSL-1.1-MIT (Functional Source License), which in plain words means:

  • Your games are yours. Build them, sell them, ship them anywhere — commercial use of gameship for making things is unrestricted, and nothing about the license touches your game or its builds.
  • The one thing you can't do is offer gameship itself as a competing product or service (e.g. a hosted build-your-game SaaS) — that lane funds the tool's maintenance.
  • Every release automatically becomes plain MIT two years after its publication. No takebacks, it's in the license text.

Assets: none — the example uses shapes, and the logo is original.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gameship-0.1.4.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gameship-0.1.4-py3-none-any.whl (10.3 kB view details)

Uploaded Python 3

File details

Details for the file gameship-0.1.4.tar.gz.

File metadata

  • Download URL: gameship-0.1.4.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for gameship-0.1.4.tar.gz
Algorithm Hash digest
SHA256 eeeda09ca6bca46bee29e366f6ab6a111f2853534171de4ada4e95f25d3f9a6f
MD5 67dda7e0b3a80cced86ee7b89c577f79
BLAKE2b-256 e1d2443e506b1c38fb6e0888008096ce346b6e065e71e8fed79cb7b10fb50682

See more details on using hashes here.

File details

Details for the file gameship-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: gameship-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 10.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for gameship-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 c8c0249f4194bb9e4cfbe19facfc326a1505df2f0f6e240f5fee5a0931d3da22
MD5 bc71f183182ac490bb52ee431e3671d4
BLAKE2b-256 6c7c923fd06f9d0e9a5cc8b97210c686723332eb73250ef2e1dafcb63e478ebb

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page