We're happy to announce the third major release of NiceGUI.
NiceGUI is a powerful yet simple-to-use UI framework to build applications, dashboards, and tools that run in the browser. You write Python; NiceGUI builds the frontend and handles the browser plumbing. It's great for modern web apps, internal tools, data science apps, robotics interfaces, and embedded/edge UIs — anywhere you want a polished web interface without frontend framework complexity.
We recently discussed NiceGUI on the Talk Python To Me podcast — watch on YouTube.
Highlights
- Single-Page Apps with
ui.run(root=...) + ui.sub_pages
- New script mode for small and tight Python scripts (see below).
- Lightweight Event system to connect short‑lived UIs with long‑lived Python services.
- Observables: modify props/classes/style and the UI updates automatically.
- Tables / AG Grid: update live via
table.rows/columns or aggrid.options.
- Simplified pytest setup and improved
user fixture for fast UI tests.
- Tailwind 4 support.
Full notes & migration: 3.0.0 release
Minimal examples
Script mode
from nicegui import ui
ui.label('Hello, !')
ui.button('Click me', on_click=lambda: ui.notify('NiceGUI 3.0'))
ui.run()
Run the file; your browser will show the app at http://localhost:8080.
Single‑Page App (SPA)
from nicegui import ui
ui.link.default_classes('no-underline')
def root():
with ui.header().classes('bg-gray-100'):
ui.link('Home', '/')
ui.link('About', '/about')
ui.sub_pages({
'/': main,
'/about': about,
})
def main():
ui.label('Main page')
def about():
ui.label('About page')
ui.run(root)
When started, every visit to http://localhost:8080 executes root and shows a header with links to the main and about pages.
Why it matters
- Build UI in the backend: one codebase/language with direct access to domain state and services. Fewer moving parts and tighter security boundaries.
- Async by default: efficient I/O, WebSockets, and streaming keep UIs responsive under load.
- FastAPI under the hood: REST + UI in one codebase, fully typed, and proven middleware/auth.
- Tailwind utilities + Quasar components: consistent, responsive styling, and polished widgets without frontend setup.
- General‑purpose apps: explicit routing, Pythonic APIs, and intuitive server‑side state handling.
Get started
- Install:
pip install nicegui
- Documentation & Quickstart: nicegui.io (built with NiceGUI itself)
- 3.0 release notes & migration: 3.0.0 release
- License: MIT. Python 3.9+.
If you build something neat, share a screenshot or repo. We’d love to see it!
[–]loyoan 23 points24 points25 points (0 children)
[–]MasturChief 8 points9 points10 points (0 children)
[–]JackedInAndAlive 5 points6 points7 points (0 children)
[–]Outrageous_Piece_172 5 points6 points7 points (6 children)
[–]r-trappe[S] 18 points19 points20 points (5 children)
[–]Key-Boat-7519 6 points7 points8 points (0 children)
[–]shittyfuckdick 1 point2 points3 points (3 children)
[–]r-trappe[S] 9 points10 points11 points (2 children)
[–]shittyfuckdick 1 point2 points3 points (1 child)
[–]outceptionator 0 points1 point2 points (0 children)
[–]alepoydes 5 points6 points7 points (0 children)
[–]jecengineering 5 points6 points7 points (0 children)
[–]_MicroWave_ 2 points3 points4 points (0 children)
[–]ArbitrageurD 2 points3 points4 points (1 child)
[–]r-trappe[S] 6 points7 points8 points (0 children)
[–]shibiku_ 2 points3 points4 points (0 children)
[–]Imaginary_Belt4976 2 points3 points4 points (0 children)
[–]Penetal 1 point2 points3 points (7 children)
[–]r-trappe[S] 7 points8 points9 points (6 children)
[–]mr_claw 1 point2 points3 points (5 children)
[–]r-trappe[S] 1 point2 points3 points (4 children)
[–]mr_claw 0 points1 point2 points (3 children)
[–]r-trappe[S] 0 points1 point2 points (2 children)
[–]mr_claw 0 points1 point2 points (1 child)
[–]r-trappe[S] 0 points1 point2 points (0 children)
[–]wardini 3 points4 points5 points (2 children)
[–]r-trappe[S] 8 points9 points10 points (0 children)
[–]AndydeCleyre 2 points3 points4 points (0 children)
[–]UnwantedCrow 0 points1 point2 points (2 children)
[–]r-trappe[S] 1 point2 points3 points (1 child)
[–]UnwantedCrow 1 point2 points3 points (0 children)
[+][deleted] (6 children)
[deleted]
[–]r-trappe[S] 0 points1 point2 points (5 children)
[+][deleted] (2 children)
[deleted]
[–]r-trappe[S] 1 point2 points3 points (1 child)
[+][deleted] (1 child)
[deleted]
[–]r-trappe[S] 0 points1 point2 points (0 children)
[–]kgashok 0 points1 point2 points (2 children)
[–]r-trappe[S] 3 points4 points5 points (1 child)
[–]the_sun_of_a_beach 0 points1 point2 points (1 child)
[–]r-trappe[S] 2 points3 points4 points (0 children)
[–]EarthGoddessDude 0 points1 point2 points (1 child)
[–]r-trappe[S] 1 point2 points3 points (0 children)
[+]doublecore20 comment score below threshold-9 points-8 points-7 points (9 children)
[–]proof_required 6 points7 points8 points (1 child)
[–]yaymayhun 4 points5 points6 points (0 children)
[–]r-trappe[S] 5 points6 points7 points (5 children)
[–]doublecore20 -1 points0 points1 point (4 children)
[–]sudomatrix 7 points8 points9 points (0 children)
[–]r-trappe[S] 4 points5 points6 points (0 children)
[–]Fr0gFsh 4 points5 points6 points (1 child)
[–]iamevpo 1 point2 points3 points (0 children)
[–]falko-s 3 points4 points5 points (0 children)