gpui-python-runtime
Retained scene specifications for the GPUI Python wrapper.
Python declares UI and scene3d objects. Rust validates the scene, tracks
stable ids, classifies dirty resources, and adapts supported nodes to
gpui-d3rs 3D elements. Raw wgpu devices, queues, buffers, pipelines, and
shaders remain private to the renderer.
Scene3D Scope
- Surfaces: row-major
zgrids with optionalx/yaxes, log axes, z range, labels, colormaps, wireframe mode, orbit cameras, and interactions. - Lines: retained orbit camera state and CPU-projected
Lines3DElementsegments/line strips. - Meshes and surfaces consume retained
ArrayDatageometry and scalar-field resources; materials, perspective cameras, and lights remain declarative scene objects while GPU state stays host-owned.
Audited Python Surface
python-surface.toml is the reviewed Python mapping registry. The generated
python-rustdoc-inventory.json freezes the all-feature macOS public API of the
current priority crates, gpui-d3rs and gpui-px, including inherent methods,
fields, callable parameters, and return types. Run the freshness gate with:
just qa-python-rustdoc-inventory
The gate uses pinned nightly-2026-09-02 rustdoc JSON and rejects public Rust
surface changes until the snapshot is reviewed and regenerated. Inventory
coverage does not itself claim Python parity; stable v2 remains blocked until
every inventory entry has a reviewed binding or exclusion classification.
JSON Schema Contract
Python-authored payloads are versioned at the JSON boundary:
- app IR uses
schema_version: 1, exposed asPYTHON_APP_IR_SCHEMA_VERSION. - Scene3D specs use
schema_version: 1, exposed asSCENE3D_SPEC_SCHEMA_VERSION.
New Python emitters write the current schema version. Rust treats omitted
schema_version fields as v1 so early examples and local scripts keep loading,
but validation rejects unsupported future versions before rendering or reusing a
cached spec.
Compatibility policy:
- Additive optional fields may stay on v1 when Rust gives them safe defaults.
- Renaming fields, removing fields, changing data-shape semantics, or changing renderer meaning requires a schema-version bump.
- A schema-version bump must include compatibility tests for previous v1 payloads and a migration path before Python emitters start writing it.
- Consumers should parse JSON, validate
PythonAppIr, then parse and validate Scene3D specs throughTypedSpecCacheorvalidate_scene3d_spec_schema_version.
Resource Model
RetainedSceneCache fingerprints geometry, material, and camera state
separately:
- unchanged scenes do no renderer work,
- camera-only changes update uniforms/state,
- color/material changes update small renderer state,
- data/mesh changes reupload affected geometry.
Gpui3DCache is available behind the gpui feature and keeps
Surface3DElement / line camera state keyed by stable ids.
Tutorial
New to the Python API? python/tutorial/ walks through
installing the gpui-toolkit wheel and building a native demo app
(demo_app.py: text, metrics, a px line chart, and a button with a live
on_action → patch loop), then points at the larger examples below.
Python Examples
The examples build JSON-serializable scene specs that the Rust runtime can validate and adapt to GPUI elements:
PYTHONPATH=python python examples/surface_dispersion.py
PYTHONPATH=python python examples/lines_orbit.py
PYTHONPATH=python python examples/mesh_scene.py
surface_dispersion.pyshows a log-frequency surface with orbit controls.lines_orbit.pyshows line strips, axis references, and a shared orbit camera.mesh_scene.pyshows the future lower-level scene shape with mesh, path, and light nodes.
The larger app-authored demos mirror the Rust showcase programs:
# Dump the native app IR without requiring a GPUI host.
GPUI_TOOLKIT_DUMP_IR=1 PYTHONPATH=python python examples/spinorama_demo.py
GPUI_TOOLKIT_DUMP_IR=1 PYTHONPATH=python python examples/surface3d_demo.py
GPUI_TOOLKIT_DUMP_IR=1 PYTHONPATH=python python examples/chart_gallery.py
# Without a host-related environment variable, each script prints JSON too.
PYTHONPATH=python python examples/spinorama_demo.py > /tmp/spinorama-python.json
spinorama_demo.pycontains CEA2034, horizontal SPL, vertical SPL, contour, and retained 3D surface sections using deterministic local data.surface3d_demo.pycontains the sinc, spinorama-style, and saddle surface modes from the Rustsurface3d_demo.chart_gallery.pycovers scatter, line, area, heatmap, contour, isoline, bar, pie, donut, box-plot, and treemap declarations.
Replace the local data-builder functions with measurement or application data when adapting a demo; the chart and Scene3D declarations remain unchanged.
Python Package
The Python declarations are packaged as gpui-toolkit with the import package
gpui_toolkit. Wheels contain a private PyO3 abi3-py310 extension for pure
native computations, while Rust/GPUI remains the rendering host. The base
wheel has no Python runtime dependencies.
python -m pip install gpui-toolkit
python -c "from gpui_toolkit import native; print(native.AVAILABLE)"
Build a platform wheel with maturin (rather than invoking Cargo's cdylib
directly):
maturin build --manifest-path Cargo.toml --release
The installed extension is gpui_toolkit._native; public code should import
gpui_toolkit.native or the corresponding gpui_toolkit.d3rs functions.
Native d3rs array statistics, search, tick generation, numeric/array and
RGB/HSL/Lab/HCL/Cubehelix interpolation, color operations, and linear_scale
execute the corresponding gpui-d3rs implementation. Substantial array work
releases the GIL.
Command request objects remain available for deliberately host-owned execution.
The package version matches the Rust crate version. Update both
pyproject.toml and Cargo.toml together when releasing a new Python-facing
runtime.
Showcase Application
Run the Python-authored native GPUI showcase with retained 3D scenes and
embedded gpui-px charts:
cargo run -p gpui-python-runtime --features showcase --bin gpui-python-showcase -- crates/gpui-toolkit/gpui-python-runtime/python/showcase.py
PYTHONPATH=crates/gpui-toolkit/gpui-python-runtime/python ./venv/bin/python crates/gpui-toolkit/gpui-python-runtime/python/showcase.py
The complete gpui-d3rs gallery can use the same generic host with no
d3rs-showcase-specific Rust route:
cargo run -p gpui-python-runtime --features showcase --bin gpui-python-showcase -- crates/gpui-python-runtime/python/d3_showcase.py
The abi3 wheel publishes nullable Boolean, integer, floating-point, and UTF-8
Dataset columns as Arrow IPC without Python dependencies. Install the
optional Arrow adapter when nested or temporal columns need PyArrow's richer
conversion support:
python -m pip install 'gpui-toolkit[arrow]'
Declare every live Dataset and ArrayData object on the application:
app = App(sections=(...), resources=(events, spectrum_grid))
The base App.on_session_ready publishes initial binary generations and
subscribes to later commits. Overrides must call
super().on_session_ready(context) before issuing application-specific
commands. Resource values never enter the JSON application snapshot.
The base wheel remains dependency-free. Source-only use without either the native extension or PyArrow can still dump declarations, while starting a live dataset app raises a typed transport error instead of displaying an unpopulated chart.
The installed host negotiates resource_mmap_frames and creates a private
0700 directory with a high-entropy session token. Python publishes each
complete dataset or ArrayData generation as a 0600 file; the host validates
the token, local filename, size, permissions, and checksum, maps it read-only,
and unlinks it immediately on Unix. The retained mapping is consumed directly
by Arrow/table/chart and dense-array readers. Bounded binary stdout frames are
used only when mmap transport is unavailable. Dataset and mesh frames carry
payload checksums. Per-frame acknowledgements drive shared Python in-flight
byte accounting, typed rejection reporting, backpressure, and deterministic
fallback cleanup.
Native consumers acquire generation-scoped leases. Publishing a new generation
keeps an older mapped generation alive only while a retained consumer still
owns it; explicit drops cannot invalidate active owners, and the final release
reclaims both the mapping and its byte-budget charge.
Resource-backed scatter, line, area, boxplot, bar, pie, and
donut declarations execute bounded LOD sampling from Dataset/DatasetView or
numeric ArrayData frames. heatmap, contour, and isoline consume only a
two-dimensional ArrayData grid ([height, width]) and never flatten it into
JSON. One projection, one stable sort, and one range(...) execute in the
host. Tables, aggregate pipelines, resource-backed charts, and static export
execute the typed DatasetView.filter AST, including comparisons, boolean
composition, membership, and null checks. Projection is enforced by Python,
Rust IR validation, and each consumer. Tables sort before extracting
their visible window. Tables, resource-backed charts, and static chart export
execute one group_by(...).aggregate(...) stage over Arrow batches, then sort
and consume only the bounded aggregate window. Supported reducers are count,
sum, mean, min, max, first, and last. Scatter and line charts sort on their
bound x or y role.
Chart sort-plus-range remains explicitly rejected until it can preserve full
pipeline ordering. Tables retain primary-key selection, scatter/line charts
emit keyed point selections and viewport changes, treemaps emit keyed
selection, and surfaces emit retained camera viewport changes.
Scene3D surfaces, line-strip points, mesh vertices, triangle indices, and
scalar fields accept ArrayData. Their declarations contain only resource
descriptors; the host resolves the exact generation and validates shape and
dtype before creating native geometry or GPU state.
The showcase app, sections, UI kit demos, chart data, and scene3d specs live
in Python. Rust loads the JSON UI IR, then owns GPUI, retained 3D renderer
state, chart widgets, and theme integration.
Platform Notes
The renderer path is inherited from wgpu via gpui-d3rs:
- macOS/iOS: Metal,
- Linux: Vulkan where available,
- Windows: DirectX 12 or Vulkan depending adapter support,
- Android: Vulkan once a GPUI Android backend exists.
The Python API is intended to stay the same across platforms; only GPUI backend initialization should differ.
Metadata
Release files for gpui-toolkit 0.9.30
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| gpui_toolkit-0.9.30-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| gpui_toolkit-0.9.30-py3-none-manylinux_2_39_x86_64.whl | Python 3 | none | Linux glibc 2.39+ x86-64 | Details |
| gpui_toolkit-0.9.30-py3-none-macosx_14_0_arm64.whl | Python 3 | none | macOS 14.0+ ARM64 | Details |
| gpui_toolkit-0.9.30-py3-none-macosx_10_13_x86_64.whl | Python 3 | none | macOS 10.13+ x86-64 | Details |
| gpui_toolkit-0.9.30-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.0 MB
Release files / gpui_toolkit-0.9.30-py3-none-win_amd64.whl
| Download URL | gpui_toolkit-0.9.30-py3-none-win_amd64.whl |
|---|---|
| Size | 26.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c24c93e5c09b01eb5585cc7d02b02bf87c20768a709edf84f5816c662fa1dd2f
|
|
BLAKE2b-256 checksum How to use checksums |
d8f380e0eb5f734c5b315e742b955612d3125f87e6bafd95491f52c5aeb8f793
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / gpui_toolkit-0.9.30-py3-none-manylinux_2_39_x86_64.whl
| Download URL | gpui_toolkit-0.9.30-py3-none-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 19.7 MB |
| Tags | Linux glibc 2.39+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
f3ba4c0b0f718b41bf279868bf94a8d23f9f58862774f7cb16829b1cdd6412ab
|
|
BLAKE2b-256 checksum How to use checksums |
b51419f0e015339142ff969596ced7b16232d38442b1a2d6a17ffa68b6962f22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / gpui_toolkit-0.9.30-py3-none-macosx_14_0_arm64.whl
| Download URL | gpui_toolkit-0.9.30-py3-none-macosx_14_0_arm64.whl |
|---|---|
| Size | 13.1 MB |
| Tags | Python 3 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
67536005818ac682e1b35a8354c53bc7d1275b519cfe05f19519d8f923c8172a
|
|
BLAKE2b-256 checksum How to use checksums |
62ae1bd3ff47e9a49d2c8c7d95479b9040e2ff7ec4af3f3d5261e9b540e13855
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / gpui_toolkit-0.9.30-py3-none-macosx_10_13_x86_64.whl
| Download URL | gpui_toolkit-0.9.30-py3-none-macosx_10_13_x86_64.whl |
|---|---|
| Size | 13.9 MB |
| Tags | Python 3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
2b9f7757264fbc48c0c009617bf45dcda869fd2c45bec8ce2a5f2c654d5c2252
|
|
BLAKE2b-256 checksum How to use checksums |
d6cc2b1c4fa6e55bfefd3085c24fc93becd4d465129330eb2336d738ec0b4560
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / gpui_toolkit-0.9.30-py3-none-any.whl
| Download URL | gpui_toolkit-0.9.30-py3-none-any.whl |
|---|---|
| Size | 12.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2603f4a9f864f8afce487453ddde0c4b9254a230795d17ca058e88d82e6c1165
|
|
BLAKE2b-256 checksum How to use checksums |
90bc1e49e44389c36bd7843404b7bb2b4a6a7af59c999cf2fee4114cb48c24a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log