This release is a pre-release and may not be stable for production use.
Neony
Reactive desktop UI framework for Python, built on LumiView.
Overview
Status: alpha — the API is still settling. Feedback and contributions are welcome.
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.
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
- Fine-grained reactivity —
Signal/Computed/Effectprimitives with declarative bindings - Dirty-subtree diffing — only changed elements re-serialize; unchanged subtrees reuse cached snapshots
- Style direct-patch — pure style/attr changes (hover, focus, press) patch straight from the snapshot cache, skipping serialization and diff
- 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
- Colour-matched glow — focus rings and hover glows tinted with each element's semantic colour
- Theme-matched scrollbars — scrollbars follow the active theme (WebKit + Firefox)
- 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). X11 is not supported — see the Roadmap.
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 thedemo_custom_window.pydemo. - Transparent windows & native effects —
transparent=Trueplusapply_blur(),apply_acrylic(),apply_mica(). Seedemo_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. Seedemo_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. Scrollbars and interaction glows (focus rings, hover halos)
reference the same --color-* tokens, so they follow theme switches too.
See the API reference for switching and custom themes.
Demos
Run from the repository root:
| File | Shows |
|---|---|
demo_hello.py |
Minimal first app (same as the Quick Start example) |
demo_gallery.py |
Component gallery with docs & code samples, glass TitleBar |
demo_custom_window.py |
Frameless window: TitleBar + Sidebar chrome |
demo_transparent_panel.py |
Floating transparent panel with native blur |
demo_multi_window.py |
Two windows sharing one app state |
demo_reactive.py |
Signal-based API: declarative bindings instead of manual refresh |
demo_builder.py |
Raw DOM builder without the app layer |
uv run demo_gallery.py
Roadmap
Planned work lives in ROADMAP.md — performance, events, lifecycle, components, animation, platform integration and verification.
Development
This project uses uv as the environment manager and runner.
uv sync --group dev # install dependencies (incl. dev tools)
npm ci # install JS dev dependencies (vitest, jsdom)
uv run demo_gallery.py # run a demo
uv run pytest -q # run the Python test suite
uv run ruff check . # lint
uv run ruff format --check . # format check
uv run pyrefly check # type check
npm test # run the JS test suite (vitest)
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.1.dev1.tar.gz.
File metadata
- Download URL: neony-0.1.1.dev1.tar.gz
- Upload date:
- Size: 116.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21796d06479ce58675b2a870a7fc4c18221ec880959b3f61d231dc82fdf18aa1
|
|
| MD5 |
55ec3e14dbeb808dd2f3c9e1528d5e4b
|
|
| BLAKE2b-256 |
579b0080489cbc7a4073c733cac07602fa15a79e36e2cc58afaa3d867ca85407
|
Provenance
The following attestation bundles were made for neony-0.1.1.dev1.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.1.dev1.tar.gz -
Subject digest:
21796d06479ce58675b2a870a7fc4c18221ec880959b3f61d231dc82fdf18aa1 - Sigstore transparency entry: 2343503698
- Sigstore integration time:
-
Permalink:
HarcicYang/Neony@4f3458bec0ff7ed66088e084dfa5d310a22a03ce -
Branch / Tag:
refs/tags/v0.1.1.dev1 - Owner: https://github.com/HarcicYang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@4f3458bec0ff7ed66088e084dfa5d310a22a03ce -
Trigger Event:
release
-
Statement type:
File details
Details for the file neony-0.1.1.dev1-py3-none-any.whl.
File metadata
- Download URL: neony-0.1.1.dev1-py3-none-any.whl
- Upload date:
- Size: 86.3 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 |
fc76aca03b127ac066515a0cb19bd3b4aa539ab74412c5ace778c9d19857b4e2
|
|
| MD5 |
b5de5ec6c11e4bde474ae3da5eaf6c54
|
|
| BLAKE2b-256 |
54bbd8ae34b09ec16b10b7d806d014a91dd1dc77c702f8f17e9a1fa43576f7ef
|
Provenance
The following attestation bundles were made for neony-0.1.1.dev1-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.1.dev1-py3-none-any.whl -
Subject digest:
fc76aca03b127ac066515a0cb19bd3b4aa539ab74412c5ace778c9d19857b4e2 - Sigstore transparency entry: 2343503701
- Sigstore integration time:
-
Permalink:
HarcicYang/Neony@4f3458bec0ff7ed66088e084dfa5d310a22a03ce -
Branch / Tag:
refs/tags/v0.1.1.dev1 - Owner: https://github.com/HarcicYang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@4f3458bec0ff7ed66088e084dfa5d310a22a03ce -
Trigger Event:
release
-
Statement type: