SimVX

A Godot-style game engine in pure Python: node scenes, Vulkan rendering, runs in the browser.

SimVX gives you a Godot-like scene tree, signals, animation, audio, UI widgets, physics, and a GPU-driven Vulkan renderer: all as a clean, idiomatic Python API, with nothing to compile and 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 single self-contained WebGPU HTML page that runs in the browser.

A PBR-lit 3D scene rendered by SimVX

Why SimVX

  • Pure Python, no build step. 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 single standalone WebGPU HTML file: 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 Godot-style visual 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.

Quick start

Install from source with uv (SimVX is not yet on PyPI):

git clone https://fezzik.dev/fezzik/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_process(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 for non-commercial use. See LICENSE for the exact terms before using it in a product.

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

A 3D asteroid dodger from scratch.

Your First 3D Game
🛠 Try the editor

The full visual editor, live in your browser.

https://simvx.com/editor.html

Going deeper