NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4191 most downloaded on PyPI
Create web-based user interfaces with Python. The nice way.
Last release 16 days ago
18 Sep 2026
Ships on a steady schedule
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
5 years old
315 releases · first in 2021
One column per quarter.
Allow awaiting client disconnect if it hasn't connected yet (#1195 by @rodja)
ui.interactive_image (@falkoschindler)Introduce `ui.carousel` element (#1087, #1091, #1176 by @michangelis, @falkoschindler)
ui.carousel element (#1087, #1091, #1176 by @michangelis, @falkoschindler)ui.aggrid cells (#1079 by @BrianLandry)ui.log (#1173 by @BrianLandry, @falkoschindler)ui.select, ui.radio and ui.toggle after changing their options (#1073 by @CrystalWindSnake, @falkoschindler)ui.card without shadow (#1172 by @Smug246, @falkoschindler)ui.chart with extra dependencies (by @falkoschindler)cleanups and refactorings made possible by having Python 3.8 as minimum version (by @falkoschindler)
Remove NumPy dependency (#1167 by @dyipon, @falkoschindler)
netifaces package is now an optional dependency (#1166 by @falkoschindler and @rodja)
netifaces package is now an optional dependency (#1166 by @falkoschindler and @rodja)httpx dependency (by @rodja)New dependency management to reduce payload, improve load times and support ESM (#658 by @dclause, @falkoschindler)
ui.run(on_air=True) to get a temporary public URL through which your local app is accessible via the internet (@falkoschindler, @rodja)ui.notify() (#930 by @CatamountJack)ui.menu for custom context menus (#747 by @falkoschindler)no-parent-event prop for ui.menu (#713 by @falkoschindler)on_change parameter for ui.knob (#1119 by @rodja)ui.scroll_area element (#1072 by @eli-kha, @falkoschindler)on_shutdown callback not being called on Windows 10 (#1050 by @chhinze, @firai)ui.footer(fixed=False) (#1136 by @falkoschindler)ui.query selector (#1120 by @rodja).on()The argument passed to the event handler is now of type GenericEventArguments. So instead of
grid.on('cellClicked', lambda msg: ui.label(f'{msg["args"]["data"]["name"]} has been clicked!'))
we access the event arguments like this:
grid.on('cellClicked', lambda e: ui.label(f'{e.args["data"]["name"]} has been clicked!'))
See https://nicegui.io/documentation/generic_events for more information.
We radically simplified the API to register custom components and external libraries. Now you can pass the location of the component and additional libraries as parameter to the derived class:
class CustomElement(ui.element, component='custom_element.js', libraries=['lib/some-library.min.js']):
super().__init__()
...
Note that you don't have to pass a tag to the base initializer. It will be set automatically.
Besides libraries you can specify exposed_libraries (will be added to importmaps) and extra_libraries (will be registered but not automatically requested by that element).
All library parameters support absolute and relative paths (relative to the Python file), either as str or as Path, and support globbing.
The exclude parameter of ui.run is gone.
Due to NiceGUI's new dynamic dependency management there is no need to explicitly exclude individual elements.
With NiceGUI 1.3 we drop support for Python 3.7, which had its end of life on June 27, 2023.
Update pytests to avoid deprecation warnings (#1110 by @falkoschindler)
refreshable.refresh() (#1096 by @CrystalWindSnake, @falkoschindler)ui.timer (#1098 by @rodja)run_method() for Quasar component wrappers like ui.input and ui.select (#1092, #1093 by @CatamountJack, @cj, @rodja, @falkoschindler)app.storage (#1099, #1104 by @rodja, @falkoschindler)Support the clearable prop with `ui.select` (#1069 by @CrystalWindSnake, @falkoschindler)
clearable prop with ui.select (#1069 by @CrystalWindSnake, @falkoschindler)toggle() method to ui.menu (#860 by @patrickwasp, @falkoschindler)ui.input after server-side value change (#1071, #1088 by @pythonormen, @eshyun, @falkoschindler)ui.input to repeat change events in a loop (#1086 by @CrystalWindSnake, @falkoschindler)ui.plotly (#1037, #1070 by @duane-impulse, @falkoschindler)ui.separator (#1081 by @rodja)Support autocomplete `ui.input` on mobile devices (#852, #1063 by @rodja, @phoskee, @falkoschindler)
ui.input on mobile devices (#852, #1063 by @rodja, @phoskee, @falkoschindler)error property for input elements with validation (#894 by @itay-raveh, @falkoschindler)min, max and out_of_limits for ui.number (#924, #1049 by @ukoehler, @falkoschindler)ui.table (#1058, #1061 by @juledwar, @falkoschindler)ui.select when using with_input and multiple (#1044 by @groucho86, @falkoschindler)Introduce `ui.stepper` element based on Quasar's QStepper (#679, #1033 by @bobwatcherx, @falkoschindler)
ui.stepper element based on Quasar's QStepper (#679, #1033 by @bobwatcherx, @falkoschindler)icon parameter for ui.button (#1021 by @falkoschindler)ui.image demo for Base64 data (#1036 by @falkoschindler)ui.image on Windows (#1039 by @Hamza-Rafi, @falkoschindler)ui.mermaid when updated with content beginning with a line break (#1031 by @jsharer, @falkoschindler)switch from python-magic to internal mimetype module to reduce external dependencies introduced in v1.2.18 (#1020 by @rodja)
python-magic to internal mimetype module to reduce external dependencies introduced in v1.2.18 (#1020 by @rodja)Use keep-alive for tab panels (#1017 by @rodja and @falkoschindler)
image, interactive_image, video and audio (#1016 by @rodja)ui.select (#995 by @falkoschindler)run_with (#1012 by @awfulness)ui.tab objects into ui.tab_panel (#999 by @BrianLandry and @rodja)ui.log element while client is already connected (#906 by @falkoschindler)save general and user specific data with new `app.storage` interface (#967, #978 by @rodja and @falkoschindler)
app.storage interface (#967, #978 by @rodja and @falkoschindler)Mapping type and ignore missing attributes (#981 by @falkoschindler)Allow using NiceGUI elements as link targets (#964 by @rodja)
on_change callbacks (#970 by @rodja)Support dynamic props (#893, #896 by @falkoschindler, @duane-impulse)
__iter__ for elements and slots (#958 by @falkoschindler, @DLu)clearable prop for ui.input(), ui.number and ui.textarea (#300 by @falkoschindler, @Mantanium)ui.chart series (#948, #951 by @falkoschindler, @gengyudong)ui.page decorator (#949 by @@falkoschindler, @AndrewMHenry)on() (#722 by @falkoschindler, @cj)ui.button (#933 by @rodja)closeBtn argument in ui.notify documentation (#928 by @CatamountJack)Allow images inside `ui.avatar` (#903 by @rodja)
ui.avatar, more documentation, and bugfixesui.avatar (#903 by @rodja)set_visibility() method (#911 by @jonathanunderwood and @rodja)% can't be pushed to ui.log (#899 by @falkoschindler and @phoskee)element.move() does not work as expected in some cases (#898 by @falkoschindler)Fix issue with table not rendering Decimal values (#901 by @stefan-sherwood, @falkoschindler)
Support internationalization for Quasar elements (#874 by @phoskee, @falkoschindler)
element.move() (#880 by @falkoschindler)ui.markdown and improve styling (#876 by @rodja)Allow awaiting button clicks (#849 by @rodja) `py @ui.page('/') async def index(): b = ui.button('Step') await b.clicked() ui.label('One') await b.cli
@ui.page('/')
async def index():
b = ui.button('Step')
await b.clicked()
ui.label('One')
await b.clicked()
ui.label('Two')
await b.clicked()
ui.label('Three')
ui.input's autocompletion (#856 by @phoskee)root_path as prefix (#848, #857 by @wdroz)ui.log (#865 by @phoskee, @falkoschindler)ui.refreshable with async functions (#863 by @markbaumgarten, @rodja)ui.button (#853, #854 by @masykur8d, @rodja)Add autocomplete for ui.input (#824 by @phoskee, @falkoschindler)
ui.grid, ui.chat_message and moreui.input (#824 by @phoskee, @falkoschindler)ui.grid (#827 by @falkoschindler)ui.chat_message (#826 by @markbaumgarten, @rodja, @falkoschindler)ui.refreshable with async functions (@rodja, @falkoschindler)ui.markdown elements (#820, #825 by @atomicrichard, @falkoschindler)seek method for ui.video (#812 by @rodja, @falkoschindler)mount_path parameter to ui.run_with (#842 by @Viicos)ui.refreshable (#841 by @falkoschindler)ui.refreshable (@rodja, @falkoschindler)Introduce `ui.refreshable` (#782 by @rodja, @falkoschindler)
ui.refreshable (#782 by @rodja, @falkoschindler)enable and disable methods for input elements (#560, #797 by @Help-i-am-lost, @falkoschindler)ui.dark_mode (#342, #783 by @smojef, @falkoschindler)ui.number (#765, #790 by @1081, @falkoschindler)StaticFiles (#714, #723 by @clueple, @falkoschindler)ui.upload behind reverse proxy with subpath (#787 by @falkoschindler)ui.timer (@falkoschindler)ui.table from a pandas dataframe (#30 by @bdshoener, @falkoschindler)Fix updating and replacing ui.links (#779 by @Yonsh, @rodja, @falkoschindler)
ui.links (#779 by @Yonsh, @rodja, @falkoschindler)@ui.page (#773 by @rodja)allow creating ui.aggrid from pandas dataframe (#557 by @falkoschindler)
ui.aggrid from pandas dataframe (#557 by @falkoschindler)app.add_static_files (#742 by @2000Nic and @falkoschindler)ui.colors (#740 by @SilvesterSJ and @falkoschindler)ui.download (#656 by @terrytrent and @falkoschindler)ui.button that accept Quasar, Tailwind, and CSS colors (#371 by @Diegiwg, @miqsoft and @falkoschindler)ui.card (#726 by @miqsoft and @falkoschindler)webview.start (#607, #755 by @al-eax)ui.number’s format on blur (#736 by @tmichela and @falkoschindler)ui.input with masks (#731 by @phoskee and @falkoschindler)ui.scene (#727 by @h0uter and @falkoschindler)ui.interactive_image (#600 by @DavidLeBonk, @falkoschindler and @dclause)Bugfix release #2 for windows venv: missing files in static folder
Bugfix release #2 for windows venv: missing files in static folder (https://github.com/zauberzeug/nicegui/issues/714, #720 by @kiwifoxtrot, @clueple, @PabloCR, @falkoschindler and @rodja)
Bugfix release for windows venv: missing files in static folder (#714 by @kiwifoxtrot, @clueple, @falkoschindler and @rodja)
Bugfix release for windows venv: missing files in static folder (#714 by @kiwifoxtrot, @clueple, @falkoschindler and @rodja)
Introduce Tailwind CSS class manager for auto-complete suggestions (#362 by @Diegiwg, @falkoschindler)
ui.scene (#700 by @JakobGue)RedirectResponse from an async page function (#693 by @rodja, @espeoceka)ui.run() (#412, #625 by @tobb10001, @JS-Aibel)Add Discord link to site header to improve community discoverability (#671 by @dclause)
dtype=object in ui.plotly (#601, #669 by @rbeeli, @JS-Aibel)ui.interactive_image (#618 by @ThonAfterPy, @falkoschindler)ui.scene (#659 by @falkoschindler)ui.interactive_image when cross is False (#642 by @falkoschindler)ui.mermaid (#641 by @cedricWassenaar, @falkoschindler)ui.interactive_image (#624 by @dclause, @falkoschindler, @DavidLeBonk)This release includes several improvements and bug fixes.
This release includes several improvements and bug fixes.
ui.markdown (#612 by @falkoschindler, @pythonormen)ui.select (#272 by @falkoschindler, @shakamoushie)ui.interactive_image (#600, #616 by @dclause, @DavidLeBonk, @falkoschindler)ui.table (#609 by @falkoschindler)ui.color_input's popup (#603 by @RobinSchfr, @falkoschindler)Thank you to all contributors who helped make this release possible.
Fixed an issue where an exception was thrown when closing the window in native mode on Windows. (#584, #602 by @al-eax, @rodja)
ui.chart before it is successfully mounted. (#581 by @dclause)ui.scene (#591 by @falkoschindler)ui.row and ui.column. (#595 by @DavidLeBonk, @falkoschindler)Thank you to all our contributors!
We are excited to announce the release of NiceGUI 1.2.0! While including many great new features, we want to specially highlight the introduction of a
We are excited to announce the release of NiceGUI 1.2.0! While including many great new features, we want to specially highlight the introduction of a “native” mode which allows Electron-like capabilities by not opening a browser but a native window on your desktop. Of course this can also be packaged into an executable.
The implementation of ui.table is no longer based on AG Grid but rather on QTable from Quasar which is in line with the other components. The AG Grid element is still available through ui.aggrid (see #370 and #500 for details; by @dclause, @falkoschindler, @Diegiwg and @rbeeli).
All web dependencies have been upgraded to their most recent stable version (with the exception of Mermaid, which is at 9.x instead of 10.x due to technical reasons). In general, this should not change the behavior of NiceGUI applications (#524 by @dclause and @falkoschindler).
The upgrade of TailwindCSS can, however, change the interpretation of contradicting Tailwind classes: The effective class order has been nondeterministic and using contradicting classes was dangerous and discouraged by the Tailwind developers. Now the order is deterministic such that the result does not change when, e.g., moving the element around. But this could change the behavior of your app if it relies on a certain interpretation order. See this very informative post and this comment for more information.
ui.run(native=True) which will open a desktop window instead of a browser tab (#89, #558, #519 by @eli-kha, @rodja, @al-eax, @smojef, @bobwatcherx, @hditano, @ItsCubeTime and @falkoschindler)ui.log element (#414 by @Allen-Taylor and @falkoschindler)ui.audio and ui.video (#555 by @chook100 and @falkoschindler)ui.keyboard configurable (#460 by @MrTLMWD and @falkoschindler)asyncio.create_subprocess_exec for Windows (#486 by @wielandb, @spehj and @rodja)Added persistent tabs functionality to ui.tabs (Issue #488 by @wwoods)
Thanks for all the great contributions. We hope you enjoy the new features and improvements in NiceGUI v1.1.11!
new `ui.knob` element (Issue #424 by @Diegiwg).
ui.knob element (Issue #424 by @Diegiwg).ui.avatar element (Issue #416 by @Diegiwg).Huge thank to all contributors for their valuable help in making NiceGUI better.
Introduced a new multiline textarea element (Issue #390 by @falkoschindler).
Thank you to everyone who contributed to this release, including @JS-Aibel and @smojef. We hope that you will enjoy using NiceGUI 1.1.9!
Added support for creating tabs (Issue #251 by @JS-Aibel).
Thank you to everyone who contributed to this release, including @JS-Aibel, and @rbeeli. We hope that you will enjoy using NiceGUI 1.1.8!
Drawers now behave correctly thanks to the resolution of #308.
ui.element to improve the overall developer experience. (#356, thanks @washad)We would like to extend a special thank you to @misterkramer, @Diegiwg, and @washad for their contributions to this release.
Improved the update performance for large UIs on slow machines (#338). The internal implementation on when we send out updates has changed quite a lot
ui.mermaid() and inside markdown (see reference for an example); thank you @SebastienDorgan for contributing (#278, #277)<img width="794" alt="mermaid" src="https://user-images.githubusercontent.com/131391/218241939-4cf3ce32-527f-476f-ad32-dc86ea728fa9.png">
Thanks to all contributors who helped make this release possible. As always, if you encounter any issues or have any feedback, please don't hesitate to reach out to us.
improve initialization of ui.interactive_image to avoid "Too many packets in payload" (#209, #320)
ui.interactive_image to avoid "Too many packets in payload" (#209, #320)ui.input, ui.number, and ui.color_input from dropping keys when typing fast (#287, #306, thanks @FI-Mihej for the pull request)ui.scene and show error message (#315, #325)app.on_startup (#316)create_lazy() (#323)ui.expansion programmatically (#330)ui.tree (#331)ui.input, ui.number, and ui.color_input without label or placeholderui.dialogin Python <=3.9allowing async callbacks for generic events: Element.on() (#285, #305)
Element.on() (#285, #305)ui.date and ui.time (#270, #263)ui.log: Now new clients see previously pushed lines. And reloading the browser does not clear the log. (#288, #292)ui.input.on() (#276)fixed AttributeError: module 'nicegui.globals' has no attribute 'tailwind'
AttributeError: module 'nicegui.globals' has no attribute 'tailwind' (#244)Nothing published for this version
introducing getElement() JavaScript function
app.remove_route()getElement() JavaScript function (#230)using Quasar Uploader for ui.upload (#227, #220)
on_connect() and on_disconnect() functions to clientawait client.handshake() to await client.connected()await client.disconnected()app.on_connect() and app.on_disconnect() functions which are called for every clienton_startup(), on_shutdown() and add_static_files() from ui into apptable.call_api_method() (#233)ui.table (#228)Prevent object duplication in ui.scene when using without page decorator
ui.scene when using without page decorator (#218)ui.table (#217)ui.run_javascript within ui.on_connect (#219)Fixing lost state changes with ui.timer (#207, #206)
update table by replacing whole DOM element #204
changes
ui.interactive_imageinternals
add support for aggrid table events #202
- fix ui.plot on auto-index page
ui.plot on auto-index pagefix scene.move_camera() having no effect #200
scene.move_camera() having no effect #200fixed memory leak in ui.line_plot #124
remove deprecated lastModifiedDate in ui.upload #193
nicgui.globals.socket_io_js_extra_headers to provide extra headers for the javascript socket.io connectionNothing published for this version
Nothing published for this version
NiceGUI version 0.9.28 is a bugfix release that resolves compatibility issues with the old 0.9 version. Thanks to the effort of @me21, this release ad
NiceGUI version 0.9.28 is a bugfix release that resolves compatibility issues with the old 0.9 version. Thanks to the effort of @me21, this release addresses conflicts caused by the required cryptography version, which affected users running Debian Buster with only version 37.0.4 (see #374). We recommend upgrading to this latest release to avoid any compatibility issues.
compatibility with debian buster (#374 and #375)
support async JavaScript commands
reset() method for ui.uploadNothing published for this version
add support for internal validation rules for input elements
ui.link_targetui.badgeEnsuring that the public docker image has the right version.
Ensuring that the public docker image has the right version.
new elements (special thanks to @hroemer for contribution #107):
ui.linear_progressui.circular_progressui.markdown and ui.htmlremove(element) method on groups (eg. column, row, card, ...) #145auto-update page before each await in a generator-style page (see #142 and #131)
ui.plot when leaving its contextui.update and element.updateYour coding agent can read these notes before it upgrades. Set up the MCP server →