Luvatrix
Luvatrix is a Python app protocol and rendering runtime for building custom apps that can run headless, on macOS, as static browser-side web apps, and through scaffolded native Android/iOS projects.
Install
Base install:
pip install luvatrix
Optional platform/runtime extras:
pip install "luvatrix[macos]"
pip install "luvatrix[vulkan]"
pip install "luvatrix[macos,vulkan]"
pip install "luvatrix[web]"
pip install "luvatrix[android]"
pip install "luvatrix[ios]"
The base package intentionally includes common raster/data dependencies
(numpy and Pillow). Platform-specific renderers still live behind extras.
Extras are target-scoped: installing luvatrix[ios] does not install macOS
PyObjC bindings, Vulkan bindings, web socket runtimes, or Android-only helpers.
iOS ABI-specific packages are prepared by the native scaffold's
ios/scripts/setup_ios.sh and copied into the app-owned PyPackages bundle.
Create An External App
Create a standalone app outside this repository:
luvatrix init-app my_app
cd my_app
luvatrix validate-app . --render headless
luvatrix run-app . --render headless --ticks 1
For an Android-only app, validate against the Android runtime from your development machine:
luvatrix init-app my_android_app --template camera
cd my_android_app
luvatrix validate-app . --render android-emulator
luvatrix run-app . --render headless --ticks 1
Build and serve a browser-side app:
luvatrix build-web . --out dist/web
luvatrix serve-web .
Run with macOS rendering:
pip install "luvatrix[macos,vulkan]"
luvatrix validate-app . --render macos
luvatrix run-app . --render macos
Native Scaffolds
Native Android and iOS projects are app-owned. Scaffold them into your app repository when you need native targets:
luvatrix init-native . --target android --out android
luvatrix init-native . --target ios --out ios
Initialized native projects include per-file scaffold provenance. Upgrade untouched template files while preserving app customizations with:
luvatrix upgrade-native . --target android --out android
For native projects created before provenance tracking, run once with --adopt.
Customized files are preserved and current-template candidates are written under
.luvatrix-scaffold-updates/ for review.
Measured release improvements and their raw trial data are indexed in
docs/performance/.
Then run with the app-owned native project:
luvatrix run-app . --render android-emulator --native-project android
luvatrix run-app . --render ios-simulator --native-project ios
Native prerequisites:
- Android: Android SDK, ADB, Gradle/Android Gradle Plugin support, and a configured emulator or device.
- iOS: Xcode, xcodegen, signing for physical devices, and the iOS Python support
assets prepared by the scaffold's
ios/scripts/setup_ios.sh. - Vulkan on macOS: the Python
vulkanbinding plus a native Vulkan SDK/loader such as Vulkan SDK or MoltenVK.
Native package sync also prunes unrelated platform runtimes from app bundles. Android bundles keep the Android runtime tree, iOS bundles keep the iOS runtime tree, and sibling macOS/web/native-template trees are left out unless that target is being packaged.
App Layout
A minimal Luvatrix app is just:
my_app/
├── app.toml
└── app_main.py
app.toml declares the app id, protocol version, entrypoint, capabilities,
platform support, display metadata, and render preferences. The Python
entrypoint returns an object compatible with init(ctx), loop(ctx, dt), and
stop(ctx), or a subclass of luvatrix.app.App.
Public app-developer API:
from luvatrix.app import App, AppContext, validate_app_install
See docs/app_protocol.md in the repository for the detailed protocol contract.
Google Sign-In
Luvatrix provides an in-app sign-in control and an event-driven controller. The user starts inside the app, authenticates in Google's trusted system browser surface, and returns to the same app through its configured callback URL.
from luvatrix.app import App
from luvatrix.auth import (
GoogleOAuthClient,
GoogleOAuthConfig,
GoogleSignInController,
PlatformGoogleAuthSession,
SecureTokenStore,
)
from luvatrix.auth.ui import GoogleSignInButton
class MyApp(App):
def init(self, ctx):
session = PlatformGoogleAuthSession(open_browser=my_native_bridge.open_google_auth)
store = SecureTokenStore(
read_secret=my_native_bridge.read_secret,
write_secret=my_native_bridge.write_secret,
delete_secret=my_native_bridge.delete_secret,
key="google-account",
)
oauth = GoogleOAuthClient(
GoogleOAuthConfig(
client_id="YOUR_CLIENT_ID.apps.googleusercontent.com",
redirect_uri="com.example.app:/oauth2redirect",
scopes=("openid", "email", "profile"),
),
token_store=store,
)
self.google = GoogleSignInController(
oauth,
session=session,
invalidate=self.invalidate,
)
self.google_button = GoogleSignInButton(self.google)
def loop(self, ctx, dt):
state = self.input.snapshot()
self.google_button.update(state, x=24, y=24, width=220, height=44)
def render(self):
with self.frame(clear=(14, 18, 26, 255)) as frame:
self.google_button.render(frame, x=24, y=24, width=220, height=44)
The native callback handler calls session.deliver_callback(callback_url).
Android bridges should open a Custom Tab and back SecureTokenStore with
Android Keystore. iOS bridges should use ASWebAuthenticationSession and
Keychain. InMemoryTokenStore remains available for tests, but production apps
should not use it for long-lived refresh tokens. Mobile apps must not embed a
Google client secret.
Prepared Text Wrapping
Luvatrix includes an optional, dependency-free prepared wrapping style inspired by the MIT-licensed Pretext architecture. Text is segmented and measured once; changing only the available width reuses those native measurements.
Scene/UI text uses TextWrapping on TextComponent:
from luvatrix.app import TextWrapping
from luvatrix_ui.text import TextComponent
body = TextComponent(
component_id="body",
text="A paragraph which should wrap across multiple lines.",
max_width_px=320,
wrapping=TextWrapping(white_space="normal"),
)
Matrix text uses the same layout engine and its matrix-font measurements:
from luvatrix.app import draw_text_to_matrix
draw_text_to_matrix(
matrix,
"A paragraph rendered into an RGBA matrix.",
x=12,
y=12,
font_size_px=12,
max_width_px=240,
wrapping="pretext",
line_height_multiplier=1.2,
)
white_space="pre-wrap" preserves repeated spaces and hard line breaks.
Ordinary wrapping collapses whitespace and uses grapheme-safe emergency breaks
for content wider than a complete line.
Metadata
Release files for luvatrix 0.2.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| luvatrix-0.2.10.tar.gz | 1.0 MB | With provenance | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| luvatrix-0.2.10-py3-none-any.whl | Python 3 | none | any | Details |
| luvatrix-0.2.10-cp314-cp314-android_24_x86_64.whl | CPython 3.14 | CPython 3.14 | Android API level 24+ x86-64 | Details |
| luvatrix-0.2.10-cp314-cp314-android_24_arm64_v8a.whl | CPython 3.14 | CPython 3.14 | Android API level 24+ ARM64 v8a | Details |
Total release size: 4.0 MB
Release files / luvatrix-0.2.10.tar.gz
| Download URL | luvatrix-0.2.10.tar.gz |
|---|---|
| Size | 1.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1f2029150c5a4fed079329cf4cbb94bc6010f1077dc8bd1bce333daf9391a9b0
|
|
BLAKE2b-256 checksum How to use checksums |
f57f1678d5f9f011cf7648efbdeca7b691d0427532241e5aba9258b29b5c7404
|
| 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 Aug 2, 2026.
Transparency logRelease files / luvatrix-0.2.10-py3-none-any.whl
| Download URL | luvatrix-0.2.10-py3-none-any.whl |
|---|---|
| Size | 926.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c00050ef481029ea4e79a1d6053b3ad827a5fd0b96bca717aa06ed356a548dbd
|
|
BLAKE2b-256 checksum How to use checksums |
b3eb239bef80d8192bc6176348582d84af4c8f329e9f360d75d2c1adc74ebf9b
|
| 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 Aug 2, 2026.
Transparency logRelease files / luvatrix-0.2.10-cp314-cp314-android_24_x86_64.whl
| Download URL | luvatrix-0.2.10-cp314-cp314-android_24_x86_64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | Android API level 24+ x86-64 CPython 3.14 |
|
SHA-256 checksum How to use checksums |
d7efd3d59706af758473e9be7125369d5ddd4542c9c674f62b4350ff2ff6444b
|
|
BLAKE2b-256 checksum How to use checksums |
437d0e61fac14ededf7bc59049d344b7335c18f51eeed7547497eef0926239d0
|
| 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 Aug 2, 2026.
Transparency logRelease files / luvatrix-0.2.10-cp314-cp314-android_24_arm64_v8a.whl
| Download URL | luvatrix-0.2.10-cp314-cp314-android_24_arm64_v8a.whl |
|---|---|
| Size | 1.0 MB |
| Tags | Android API level 24+ ARM64 v8a CPython 3.14 |
|
SHA-256 checksum How to use checksums |
774015765cc2da08b63ed33415c8acb2e89aa70cc58c1ccd16d5f18dc1ce1bbd
|
|
BLAKE2b-256 checksum How to use checksums |
1c1e75a51657582843a9bafc018e33faa30174f9d7cafed6fed533631132b11d
|
| 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 Aug 2, 2026.
Transparency logSecurity for luvatrix 0.2.10
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.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for luvatrix-0.2.10.tar.gz
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 Aug 2, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.