SimVX

A Python game engine. Write games in pure Python: node scenes, Vulkan rendering, browser export.

SimVX gives you a node-based scene tree, signals, animation, audio, UI widgets, physics, and a GPU-driven Vulkan renderer: all as a clean, idiomatic Python API, with no second language to learn. The visual editor and the integrated IDE are themselves built using the engine. Scenes are authored and saved as ordinary .py files, and any game can be exported to a static WebGPU HTML page that runs in the browser with no backend.

A PBR-lit 3D scene rendered by SimVX

Why SimVX

  • Pure Python. Write game logic, tools, and editor plugins in real Python: use any PyPI package, pdb, and your existing toolchain. No custom scripting language.

  • Scenes are Python. A scene is a Node subclass in a .py file; the editor round-trips scenes to and from source. No custom scene format. (Save-games use JSON or pickle.)

  • One command to the browser. simvx export web game.py produces a static WebGPU HTML page: the same scene code as the desktop Vulkan build.

Features

  • Node scene tree: hierarchy, signals, groups, coroutines, and a Property system that is inspector-visible and serialisable.

  • GPU-driven rendering: a Vulkan forward renderer (multi-draw indirect, PBR, shadows, SSAO, bloom, post-processing) on the desktop; WebGPU in the browser.

  • 2D and 3D, one API: sprites, tilemaps, and 2D lighting alongside PBR meshes, skeletal animation, particles, and physics.

  • Animation & audio: tweens, sprite sheets, keyframe clips, and state machines; 2D/3D spatial audio with bus routing.

  • UI, editor & IDE: buttons, sliders, trees, and layout containers, plus a visual scene editor and an engine-native Python IDE, all built on the same widget system.

  • Headless test harness: render frames without a window, replay input deterministically, and assert on scene state.

What SimVX is not

Stated up front, so you can rule it out quickly:

  • Not a C++ engine with Python bindings. Game logic runs in Python and pays Python’s cost. Hot paths live on the GPU or in NumPy; per-object logic does not.

  • No visual scripting. Python is the scripting language. Effort goes into the code editor instead.

  • No Godot, Unity or Unreal project compatibility. Scenes are Python modules and nothing imports a foreign scene format.

  • No engine-provided networking. Use asyncio, websockets or gRPC directly; the engine does not wrap them.

  • Not distributed on public PyPI. SimVX ships from its own package index. See Quick start.

Quick start

Install the current build from the project’s own index, with the example library alongside it:

pip install --pre "simvx[examples]" --extra-index-url https://pypi.simvx.com/

The --extra-index-url is not optional. The simvx name on public PyPI is a placeholder that ships no code and declares no extras, so the bare pip install simvx[examples] warns that the extra does not exist and installs nothing.

SimVX publishes continuously: every build is a dev release cut from a commit, which is why --pre is needed too.

Or work from a clone, which is what you want in order to change the engine itself:

git clone https://git.simvx.com/simvx/simvx.git
cd simvx
uv sync

Then write a scene: a Node subclass is a complete program:

import math

from simvx.core import Camera3D, Material, Mesh, MeshInstance3D, Node
from simvx.graphics import App


class MyGame(Node):
    def on_ready(self):
        cam = self.add_child(Camera3D(position=(0, 5, 10)))
        cam.look_at((0, 0, 0))

        self.cube = self.add_child(MeshInstance3D(
            name="Cube",
            mesh=Mesh.cube(),
            material=Material(colour=(1.0, 0.2, 0.2, 1.0)),
        ))

    def on_update(self, dt):
        self.cube.rotate((0, 1, 0), math.radians(90) * dt)  # 90 degrees/sec


App(width=1280, height=720, title="My Game").run(MyGame())

Run it with uv run python my_game.py and a window opens with a red cube spinning. Or launch a full game straight away:

uv run python examples/demos/asteroids2d.py

Where to go next

Note

SimVX is free and open source under AGPL-3.0. A Game-Distribution Exception lets you ship games, including closed-source ones, at no cost; a commercial licence is available for private engine forks and unbranded builds. See Licensing below.

Start here

🚀 Install

Set up SimVX from source in a few minutes.

Installation
⚡ Quickstart

Window, draw, input: the 60-second tour.

Quickstart
🎮 Examples gallery

Browse every demo: most run in your browser.

Examples Gallery
🟦 First 2D game

Build Pong end-to-end.

Your First 2D Game
🧊 First 3D game

Build a 3D gem collector from scratch.

Your First 3D Game
🛠 Try the editor

The full visual editor, live in your browser.

https://simvx.com/docs/editor.html

Going deeper

Licensing

SimVX is dual-licensed. Pick the row that matches what you want to do:

You want to…

Path

Cost

Your obligation

Open-source your game

AGPL-3.0

Free

License your game under AGPL-3.0; keep the NOTICE file (no splash required)

Ship a game under any licence, including closed-source

Game-Distribution Exception

Free

Display the “Made with SimVX” splash / watermark

Ship closed-source without the splash, privately fork the engine, or use “Official SimVX” branding

Commercial licence

Paid

Contact us

Different parts of the repository carry different licences: the engine is AGPL-3.0-or-later (with Additional Terms and a Game-Distribution Exception), the examples (features / tutorials / demos) are MIT, the documentation is CC-BY-4.0 with MIT code snippets (details), and each port under examples/ports/ is licensed per port as a derivative of the original game.