Neony
Reactive desktop UI framework for Python, built on LumiView.
Overview
Neony renders a reactive DOM in a native window. You compose your UI from Python objects — components, layouts, styles — and Neony diff-updates the browser DOM automatically. No HTML, no JavaScript, no CSS strings.
It builds on LumiView, which uses the same Rust
tao/wry webview stack as Tauri.
- Pure Python API — components, layouts and events, no need for non-python codes
- Same stack as Tauri — Rust
tao/wrywebviews via LumiView - 3 theme presets — dark / light / deep-blue via CSS custom properties
- (Optional) Frosted glass — translucent surfaces with backdrop blur
- Custom window chrome — frameless, transparent, custom TitleBar
- (Supported platform only) Native window effects — blur / acrylic / mica materials
Installation
pip install neony
Requires Python 3.11+ and the platform WebView stack (WebKitGTK on Linux, WebView2 on Windows, WKWebView on macOS).
Quick Start
from neony.application import Page, launch
from neony.application.elements import Button, Heading, Text, VStack
counter = Button("Click me")
async def on_click(event) -> None:
counter.label = "Clicked!"
counter.on_click(on_click)
page = Page(gap="16px").add(
VStack(
Heading("Hello, Neony", level=1),
Text("Build desktop UI in pure Python.", role="secondary"),
counter,
gap="12px",
)
)
launch(page, title="My App", width=480, height=360, devtools=True)
Components
Import from neony.application.elements.
| Component | Description |
|---|---|
Button |
Themed push button — primary / ghost / danger variants, hover & press feedback |
Checkbox |
Custom-styled checkbox with label and change event |
Input |
Single-line text field — text / password / email / number… |
Heading |
Themed heading (h1–h6) with automatic sizing |
Text |
Inline body copy with semantic roles (primary / secondary / danger / success) |
Tabs |
Tab bar + panels, exactly one visible at a time |
Flex |
Generic flex container with full control |
VStack / HStack |
Vertical / horizontal flex stacks |
Spacer |
Flexible empty space that absorbs leftover room |
Separator |
Subtle horizontal divider |
GlassPanel |
Frosted-glass container with optional background image |
TitleBar |
Custom window chrome for frameless windows — drag, minimize / maximize / close |
Sidebar / SidebarItem |
Vertical navigation rail, glass-matched to the TitleBar |
All components share a fluent, chainable API — see the API reference for usage.
Window Features
- Frameless custom titlebar — set
decorations=False, add aTitleBar, and drag / minimize / maximize / close all work automatically. Seedocs/api.en.mdand thetest_custom_window.pydemo. - Transparent windows & native effects —
transparent=Trueplusapply_blur(),apply_acrylic(),apply_mica(). Seetest_transparent_panel.py. - Programmatic window control —
set_title(),set_size(),minimize(),toggle_maximize(),close(), … all onNeonApplication, withwindow_index=0for multi-window apps. - Multi-window —
run(*pages)opens one window per page, all sharing one event loop andapp.state.launch([...])accepts a list. Seetest_multi_window.py.
Theming
Three built-in presets — DARK (default), LIGHT, DEEP_BLUE — exposed as
CSS custom properties on :root, so a theme switch redraws the whole UI with
zero DOM diff. See the API reference for switching and
custom themes.
Demos
Run from the repository root:
| File | Shows |
|---|---|
test_gallery.py |
Component gallery with docs & code samples, glass TitleBar |
test_custom_window.py |
Frameless window: TitleBar + Sidebar chrome |
test_transparent_panel.py |
Floating transparent panel with native blur |
test_multi_window.py |
Two windows sharing one app state |
test_reactive.py |
Minimal launch() app |
test_builder.py |
Raw DOM builder without the app layer |
uv run test_gallery.py
Development
This project uses uv as the environment manager and runner.
uv sync --group dev # install dependencies (incl. dev tools)
uv run test_gallery.py # run a demo
uv run pytest -q # run the test suite
uv run ruff check . # lint
uv run ruff format --check . # format check
uv run pyrefly check # type check
License
LGPL-3.0-or-later © HarcicYang
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neony-0.1.0.tar.gz.
File metadata
- Download URL: neony-0.1.0.tar.gz
- Upload date:
- Size: 54.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1619c995d687949baba2409b787d902b7465cb1e0c7d6385cb89fa3afddb1ba7
|
|
| MD5 |
44de24ba94c94ea5f429f3cd007f56ba
|
|
| BLAKE2b-256 |
8f62e187c75f66e6359828c190bb120ab9064cb5194a82ec7ab919c58ea5c28c
|
Provenance
The following attestation bundles were made for neony-0.1.0.tar.gz:
Publisher:
pypi.yml on HarcicYang/Neony
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neony-0.1.0.tar.gz -
Subject digest:
1619c995d687949baba2409b787d902b7465cb1e0c7d6385cb89fa3afddb1ba7 - Sigstore transparency entry: 2334833365
- Sigstore integration time:
-
Permalink:
HarcicYang/Neony@3cb42980e82bb98550f64e56d2402ab8dd0578d3 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/HarcicYang
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@3cb42980e82bb98550f64e56d2402ab8dd0578d3 -
Trigger Event:
release
-
Statement type:
File details
Details for the file neony-0.1.0-py3-none-any.whl.
File metadata
- Download URL: neony-0.1.0-py3-none-any.whl
- Upload date:
- Size: 54.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d4cfe91f528b510ff8cf68234d2729b420bad0d1fe97c550bdc729b0e0c2c4c
|
|
| MD5 |
85a83fa7b73ed3773469f21ac32f4b25
|
|
| BLAKE2b-256 |
a8ceff3320d7718364037529c8cb46826db20926a742657b482ecdd6fb8a6d30
|
Provenance
The following attestation bundles were made for neony-0.1.0-py3-none-any.whl:
Publisher:
pypi.yml on HarcicYang/Neony
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neony-0.1.0-py3-none-any.whl -
Subject digest:
6d4cfe91f528b510ff8cf68234d2729b420bad0d1fe97c550bdc729b0e0c2c4c - Sigstore transparency entry: 2334833400
- Sigstore integration time:
-
Permalink:
HarcicYang/Neony@3cb42980e82bb98550f64e56d2402ab8dd0578d3 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/HarcicYang
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@3cb42980e82bb98550f64e56d2402ab8dd0578d3 -
Trigger Event:
release
-
Statement type: