Shipping a game

A SimVX game reaches players by three routes. None of them is a fallback for the others: pick the one that matches your audience.

Route

What the player gets

Install burden

Source and wheel

pip install your-game, then your-game

Needs Python

Standalone executable

A folder (or one file) they double-click

None

Web export

A URL

None; also the mobile answer

Web export is covered in its own page, Web Export. This page covers the other two.

Source and wheel

Build a wheel for your game, publish it, and a player with Python installs it like any other package:

uv build --wheel
pip install dist/your_game-1.0.0-py3-none-any.whl
your-game

This is the path with the least that can go wrong, because nothing repackages your dependencies: numpy, the Vulkan loader and the engine’s native extensions are installed by pip exactly as their authors built them.

Standalone executable

For players who will not install Python. The editor’s Export dialog offers a Standalone Executable target, and simvx uses PyInstaller underneath.

The engine has native pieces that a bundler has to carry: numpy, the Vulkan loader, and the shared libraries of the audio, texture and Jolt physics accelerators. It also loads shaders, fonts and default assets through importlib.resources, which a bundler cannot see by reading import statements, so a bundler invoked with no options produces a binary that dies on its first frame with ModuleNotFoundError: No module named 'simvx.graphics.shaders'.

So the collection flags are not optional:

pyinstaller --collect-all simvx --collect-all vulkan --collect-all glfw --collect-all freetype \
            --hidden-import miniaudio --hidden-import _cffi_backend \
            game.py

Most of a one-directory build is numpy, Pillow and the engine’s own assets. It starts about as fast as running the game from a virtualenv, because the engine’s Vulkan setup dominates.

--onefile produces a smaller file, at the cost of unpacking into a temporary directory on every launch, which adds to each start. Ship one-directory unless the single file matters to you.

One-directory writes a folder named after your game, with the executable inside it next to an _internal/ directory. dist/mygame/mygame is the thing you run; dist/mygame/ is the thing you ship, and it must be shipped whole.

A bundle is host-only. PyInstaller does not cross-compile, so a Windows .exe is built on Windows and a macOS app on macOS.

A bundle does not hide your code

The engine ships as readable .py files under _internal/simvx/. Your own modules are byte-compiled into the executable, which anyone can read back with the standard library (marshal, dis): strings, constants and the full logic. Do not ship secrets in a bundle. If your business depends on an opaque client, SimVX does not provide one.

Mobile

Play the web export in a mobile browser. That is the supported mobile path today: touch input is captured and the WebGPU renderer runs on current mobile browsers.

The editor’s Export dialog also lists an Android APK target. It runs android/build.sh, which only a source checkout provides, so it is not available from a pip install.