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.
Fix missing Docker image for ARM64 (#4072 by @codingpaula)
As always: Kudos to DigiQuip AS, egs-hub, Davi Borges and many more for supporting this project ✨
Add support for JSONSchema validation in `ui.json_editor` (#4003, #4012 by @jm-amt, @falkoschindler)
ui.json_editor (#4003, #4012 by @jm-amt, @falkoschindler)max_cache_age parameter to add_static_files and add_static_file (#3998, #4032 by @bl0x)User tests. (#4057 by @rlcmtzc, @rodja, @falkoschindler)
NOTE: existing tests may break if you relied on the bug that invisible elements being accessible by the userui.html documentation (#4027 by @rodja)and all our other sponsors and contributors for supporting this project!
🙏 Want to support this project? Check out our GitHub Sponsors page to help us keep building amazing features!
_Huh, where's 2.6.0? - Yeah, counting is hard..._ 🤦🏻♂️
Huh, where's 2.6.0? - Yeah, counting is hard... 🤦🏻♂️
ui.table and ui.aggrid from Polars dataframes (#3969 by @trivedihoney, @falkoschindler)User fixture (#3886, #4001 by @GrazingScientist, @rodja, @falkoschindler)ui.echart (#3936 by @Piguite, @falkoschindler)tr and header element to the html module (#4005 by @kleynjan, @falkoschindler)ui.dark_mode breaks Tailwind (#3753, #3994 by @petergaultney, @jdoiro3, @falkoschindler)and all our other sponsors and contributors for supporting this project!
🙏 Want to support this project? Check out our GitHub Sponsors page to help us keep building amazing features!
Introduce an `html` module with plain HTML elements (#572, #3900 by @ofenbach, @dridk, @rodja, @falkoschindler)
html module with plain HTML elements (#572, #3900 by @ofenbach, @dridk, @rodja, @falkoschindler)ui.tree only when needed (#3840, #3902 by @inessilva4-lis, @python-and-fiction, @falkoschindler)force_reload() is used on images with data sources (#2566, #3895 by @scottrcarlson, @rp10007, @rodja)ui.scene looking back to the origin after calling move_camera() (#3920 by @pascalzauberzeug, @falkoschindler)app.storage.tab not being unique for duplicated tabs (#3867, #3872, #3876 by @kfalcami, @python-and-fiction, @rodja, @falkoschindler)User pytest fixture (#3913 by @rodja)and all our other sponsors and contributors for supporting this project!
🙏 Want to support this project? Check out our GitHub Sponsors page to help us keep building amazing features!
Allow customizing the crosshair in ui.interactive_image (#3848, #3870 by @parlance-zz, @falkoschindler)
ui.interactive_image (#3848, #3870 by @parlance-zz, @falkoschindler)ui.aggrid when using run_grid_method and run_row_method (#3866 by @xaptronic)children property to 3D objects in ui.scene (#3864 by @SeiteBroken, @falkoschindler)ui.footer (#3835, #3836 by @kfalcami, @falkoschindler)ui.markdown (#696, #3860 by @egormkn, @al-eax, @sonnygeorge, @retsyo, @frankvp11, @stepheweffie, @motorst1, @falkoschindler)app.storage.tab (#3867, #3868 by @kfalcami, @python-and-fiction, @rodja)Allow faster creation of monochrome point clouds in ui.scene (#3545 by @voigta, @falkoschindler)
ui.scene (#3545 by @voigta, @falkoschindler)ui.carousel has additional slots (#3812 by @ruiheng, @python-and-fiction, @falkoschindler)Significantly reduce payload of `ui.markdown` elements (#3745, #3792 by @pierrecdn, @falkoschindler)
ui.markdown elements (#3745, #3792 by @pierrecdn, @falkoschindler)ui.colors (#3707, #3708 by @Kolterdyx, @falkoschindler)ui.navigate.to (#3699 by @marcuslimdw, @rodja, @falkoschindler)docker compose down command in docker.sh (#3709 by @Kolterdyx)ui.plotly causing ReferenceErrors in rare situations (#3784 by @valankar, @python-and-fiction, @falkoschindler)ui.select, ui.radio and ui.toggle (#3733, #3736 by @sSasha-uwu, @rodja)ui.radio and ui.toggle in ElementFilter (#3789 by @marcuslimdw, @falkoschindler)app.storage (#3731 by @python-and-fiction)ui.echart (#3703 by @python-and-fiction)Add expand parameter to `ui.page_sticky` (#3671 by @h0uter, @falkoschindler)
expand parameter to ui.page_sticky (#3671 by @h0uter, @falkoschindler)User fixture (#3686, #3689 by @marcuslimdw, @rodja)ui.timer elements (#3681 by @JS-Aibel, @falkoschindler)NotImplemented for set_visibility() on ui.timer and ui.notification (#3670 by @canyone2015, @falkoschindler)draggable() for object groups in ui.scene (#3549 by @voigta, @falkoschindler)ui.switch and ui.checkbox (#3678 by @rodja)Fix: Resolve dependency mismatch with nicegui-highcharts
Fix: Resolve dependency mismatch with nicegui-highcharts
This major release introduces several new features and enhancements, as well as breaking changes. We always try to keep breaking changes to a minimum,…
This major release introduces several new features and enhancements, as well as breaking changes. We always try to keep breaking changes to a minimum, guide you through the migration process using deprecation warnings, and provide migration instructions. Please read the following release notes carefully to understand the changes and adapt your code accordingly before upgrading.
Semantic versioning
NiceGUI 2.0 starts to implement semantic versioning, which means that we will follow the MAJOR.MINOR.PATCH versioning scheme. This release is a major version because it introduces breaking changes. We will increment the MAJOR version for breaking changes, the MINOR version for new features and enhancements, and the PATCH version for bug fixes.
Fix Quasar's layout rules for ui.card that remove children's borders and shadows (#726, #1295, #2265, #2301, #3444 by @miqsoft, @v479038280, @ghbm-itk, @falkoschindler)
⚠️ BREAKING: Quasar's QCard, the foundation of NiceGUI's ui.card, usually comes without any padding and requires nested card sections wrapping the actual content. NiceGUI simplified the use of cards by adding padding, flex layout and gaps automatically. But because a QCard also removes the outer-most borders and shadows of its children, this caused unexpected results in certain cases. NiceGUI 2.0 fixes the behavior of ui.card by disabling Quasar's respective CSS rules.
Improve the API of ui.table (#2633, #2731, #3263, #3264, #3525 by @bojh, @rohitsathish, @tmlmt, @falkoschindler)
⚠️ BREAKING: The API for adding and removing rows in a ui.table has been improved. Passing rows as multiple arguments has been deprecated. Now these methods expect lists of rows.
The columns argument for ui.table is optional now. If not provided, the columns are infered from the first row.
A new update_from_pandas method has been introduced to update rows and columns from a new dataframe.
A new column_defaults parameter has been introduced to allow specifying some properties for all columns at once.
Improve support for drawing items in ui.leaflet (#2422, #3586 by @joseph-fidelis, @falkoschindler)
⚠️ BREAKING: The ui.leaflet element used to remove drawn items and required the user code to add new layers to the map for visualization. Now such items remain visible by default. This new behavior can be disabled by passing hide_drawn_items=True to ui.leaflet.
Unify declaration of third-party dependencies (#2991 by @falkoschindler, @rodja)
⚠️ BREAKING: This release deprecates the libraries, extra_libraries and exposed_libraries parameters for subclassing ui.element. It introduces a new dependencies parameter to be used instead. New examples "Custom Vue Component" and "Signature Pad" demonstrate how to use NPM and this parameter for integrating custom components based on third-party JavaScript libraries.
Reserve bottom space in validation elements for error messages (#2484, #2492, #2738, #3013, #3446, #3660 by @akai-1024, @huche6, @atticus-lv, @rodja, @falkoschindler)
⚠️ BREAKING: UI elements with input validation like ui.input used to omit the bottom space for a potential error message. This caused a layout jump when the first error occurred. This release fixes this issue be reserving the space by default whenever the validation argument and property is not None. You can disable this behavior using the "hide-bottom-space" prop.
Remove ui.timer objects from UI hierarchy after they are finished (#3626, #3647 by @fwerner, @rodja)
Especially one-shot timers are now removed from the UI hierarchy after their callback has been executed. This avoids a potential memory leak.
Disable FastAPI docs by default (#3570, #3589 by @Yuerchu, @python-and-fiction, @rodja)
⚠️ BREAKING: NiceGUI apps used to automatically serve FastAPI docs at /docs, /redoc, and /openapi.json. This behavior has been disabled. You can enable it by passing fastapi_docs=True to ui.run. Furthermore, you can specify the individual routes by setting core.app.docs_url, core.app.redoc_url, and core.app.openapi_url.
Make client.ip available before socket connection is established (#2399, #3287, #3445 by @rodja, @falkoschindler)
⚠️ BREAKING: The client's IP is now already available before the page built and is returned to the client. On the auto-index page the client.ip property is None. If you need to check if the socket connection is established, use client.has_socket_connection instead.
Remove and update deprecated APIs (#3648 by @falkoschindler)
⚠️ BREAKING: Several deprecated APIs have been removed. The remaining deprecations will show warnings including the version when they will be removed. Please update your code accordingly.
ui.run_javascript() and related methods:
The respond and check_interval parameters are not needed anymore and got removed.context:
The get_slot_stack() method has been replaced with the slot_stack property.
The get_slot() method has been replaced with the slot property.
The get_client() method has been replaced with the client property.ui.header, ui.footer, ui.drawer, ui.left_drawer and ui.right_drawer:
Nesting top level layout elements now raises a RuntimeError.ui.aggrid:
The method call_api_method has been replaced with run_grid_method.
The method call_column_method has been replaced with run_column_method.ui.chart is now ui.highchart.ui.open has been replaced with ui.navigate.to.ui.add_style has been removed. Use ui.add_css, ui.add_scss, or ui.add_sass instead.The following JavaScript dependencies have been updated to the latest versions (#3654 by @falkoschindler):
Many thanks to all contributors and users who reported issues and provided feedback. We hope you enjoy this new release!
Provide a public API for accessing _props, _classes and _style (#3588 by @falkoschindler, @marcuslimdw)
_props, _classes and _style (#3588 by @falkoschindler, @marcuslimdw)IconElement mixin to allow binding the icon of various elements (#3596, #3600 by @WolfgangFahl, @falkoschindler)ui.aggrid via get_client_data() (#3581, #3582 by @JeppeKlitgaard, @falkoschindler)cv2.VideoCapture is only called once (#2321, #3619 by @jiang131072, @rodja)ui.page_title() in native mode (#3583 by @MastSE, @python-and-fiction, @rodja, @falkoschindler)ui.aggrid (#3611, #3612 by @mxiaonian, @python-and-fiction, @falkoschindler)align_items in ui.row, ui.column and ui.card (#3602 by @frankhuurman, @falkoschindler)ui.color_picker (#3571 by @zobac, @falkoschindler)User simulation (#3616, #3635 by @zx000097, @rodja, @falkoschindler)Defer some rarely used imports to reduce startup times (#3533, #3548, #3559, #3562 by @ed2050, @falkoschindler)
ui.joystick (#1707, #3531, #3546 by @LarsEggimann, @python-and-fiction, @falkoschindler)auto_close = False for ui.context_menu (#3539 by @gavinpotter, @falkoschindler)ui.scene when reloading the page (#3339, #3452 by @afullerx, @falkoschindler)Allow filtering nodes (#3436, #3481, #3482 by @MohAid, @falkoschindler)
ui.tree:
ui.scene:
get_camera to get the current camera parameters (#3459, #3465 by @thaije, @falkoschindler)ui.select elements for user simulation tests (#3486, #3487 by @marcuslimdw, @rodja, @falkoschindler)user and screen able to load independently (#3510, #3511 by @marcuslimdw, @rodja)ui.notify (#3454, #3457 by @falkoschindler)create_user fixture (#3512 by @rodja)Fix missing dependency in Docker image (@falkoschindler, @codingpaula)
Nothing published for this version
Introduce a new integration test framework (#1931, #2496, #3121, #3413 by @rodja, @ed2050, @MarcDelahousse, @codingpaula, @falkoschindler):
user fixture cuts away the browser and replaces it by a lightweight simulation entirely in Python; a test for a login page can now be written like this: async def test_login():
await user.open('/')
user.find('Username').type('user1')
user.find('Password').type('pass1').trigger('keydown.enter')
await user.should_see('Hello user1!')
user.find('logout').click()
await user.should_see('Log in')
ElementFilter allows to find and manipulate UI elements during tests and in productionscreen and user via pytest_plugins = ['nicegui.testing.plugin']run.io_bound and run.cpu_bound (#2234 by @rodja, @falkoschindler)Introduce `get_computed_prop` method for any UI element; provide computed, filtered and sorted rows for ui.table (#3395 by @srobertson86, @falkoschind
get_computed_prop method for any UI element; provide computed, filtered and sorted rows for ui.table (#3395 by @srobertson86, @falkoschindler)app.shutdown() even for ui.run(reload=True) (#3320 by @NiklasNeugebauer, @python-and-fiction, @falkoschindler)ui.number after sanitization (#3324, #3389 by @eddie3ruff, @python-and-fiction, @falkoschindler)ui.editor after client-side changes (#1088, #3217, #3346 by @tjongsma, @falkoschindler, @frankvp11, @python-and-fiction)Support named slots in Element.move() (#3319 by @NiklasNeugebauer, @falkoschindler)
Element.move() (#3319 by @NiklasNeugebauer, @falkoschindler)CancelledError in check_for_late_return_value (#3268, #3296 by @CatamountJack, @falkoschindler)BindableProperty for better binding performance (#1975, #3325, #3333 by @eponymic, @v479038280, @python-and-fiction, @falkoschindler)ui.teleport demo for placing charts in table cells (#3309 by @frankvp11, @falkoschindler)Add request object to the client (#1695, #2399, #3286 by @DoPaminexL, @rodja, @falkoschindler)
request object to the client (#1695, #2399, #3286 by @DoPaminexL, @rodja, @falkoschindler)ui.skeleton (#3082, #3202 by @patrickwasp, @frankvp11, @falkoschindler)ui.echart (#3184, #3195 by @natankeddem, @falkoschindler)min, max and step properties to ui.range (#3167, #3191, #3242, #3260 by @bojh, @falkoschindler, @Ezbaze)ui.scene (#3254, #3257 by @v479038280, @python-and-fiction, @falkoschindler)ui.pyplot not filling its container (#3277, #3289 by @Guilhermwn, @python-and-fiction, @falkoschindler)ui.number differing from value property (#3110, #3142, #3281 by @CrystalWindSnake, @Lucas-lyh, @frankvp11, @falkoschindler)ui.refreshable with local scope (#2535, #3219, #3233, #3279 by @Ezbaze, @ruisilvestre-snapp, @arunmp25, @falkoschindler, @rodja)ui.upload with large files (#3220, #3235 by @Rjdrenth)ui.teleport for fancy radio options (#3224, #3230 by @pierrecdn, @rodja)Introduce `ui.teleport` element to inject NiceGUI elements into regular html. (#3148, #3159 by @CrystalWindSnake, @falkoschindler)
ui.teleport element to inject NiceGUI elements into regular html. (#3148, #3159 by @CrystalWindSnake, @falkoschindler)align_items parameter for ui.row, ui.column and ui.card (#3174, #3175 by @tz301, @falkoschindler)config parameter for ui.mermaid (#3164 by @kyloe, @falkoschindler)# (#3124, #3138 by @gotev, @afullerx)settings attribute (#3135 by @miek770, @falkoschindler)ui.codemirror ignoring path prefixes (#3122, #3126 by @amks1, @falkoschindler)Make `ui.code` a ContentElement to support binding (#3077, #3089 by @JeanBaptiste-dlb, @falkoschindler)
ui.code a ContentElement to support binding (#3077, #3089 by @JeanBaptiste-dlb, @falkoschindler)ui.interactive_image (#3118 by @falkoschindler)ui.leaflet from flickering after calling flyTo() (#3035, #3125 by @backbord, @afullerx, @falkoschindler)proxy_redirect (#2977, #3108 by @falkoschindler, @Lucas-lyh)table_documentation.py (#3099 by @emmanuel-ferdman)on_pointer parameter in ui.interactive_image (#3078 by @MLaurenceFournier)Fix animations being interrupted when initializing `ui.echarts` (#2932, #3056 by @CrystalWindSnake, @falkoschindler)
ui.echarts (#2932, #3056 by @CrystalWindSnake, @falkoschindler)ui.input on mobile (#3055 by @falkoschindler)app.storage (#3023, #3046 by @natankeddem, @falkoschindler)options and value pointing to the same object in ui.select (#3014 by @natankeddem, @falkoschindler)ui.aggrid not resizing correctly with its parent container (#2850, #2852 by @tz301, @vickorian, @wasabismile, @falkoschindler)Introduce `ui.codemirror` element (#2760, #2775, #2913 by @frankvp11, @chrschorn, @rodja, @falkoschindler)
ui.codemirror element (#2760, #2775, #2913 by @frankvp11, @chrschorn, @rodja, @falkoschindler)ui.chip element (#2942 by @chrschorn, @falkoschindler)ui.scene_view component (#2608, #2947 by @fabian0702, @falkoschindler)background_color parameter to ui.scene (#2963 by @chrschorn, @falkoschindler)col-* classes in ui.row (#2881, #3008 by @me21, @falkoschindler)ui.plotly and reduce unnecessary re-rendering of UI elements (#2917, #2957 by @drummerboy2543, @bmaranville, @falkoschindler)ui.keyboard and its event arguments (#2974, #3010 by @ed2050, @falkoschindler)ui.page documentation (#2990 by @Dronakurl, @falkoschindler)Introduce `ui.context` as a simpler way to get client, slot and slot stack (#2879, #2905 by @rodja, @falkoschindler)
ui.context as a simpler way to get client, slot and slot stack (#2879, #2905 by @rodja, @falkoschindler)ui.scene (#2872, #2890 by @vitamingcheng, @falkoschindler)ui.scene (#2890, #2897 by @falkoschindler)ui.number (#2950 by @mwarrens63, @falkoschindler)ui.state variables (#2921, #2922 by @vickorian, @falkoschindler)app.storage.tab for NiceGUI On Air (#2902 by @rodja)ui.select and ui.radio for NiceGUI On Air (#2901 by @thetableman, @rodja)\uFE0F "Variation Selector-16" (#2888 by @tewhalen, @falkoschindler)ui.table demo (#2907, #2927 by @linkwww8, @rodja)Fix auto-close behavior of ui.menu, ui.color_input and some demos (#2894 by @digidigital, @falkoschindler, @codingpaula)
ui.menu, ui.color_input and some demos (#2894 by @digidigital, @falkoschindler, @codingpaula)Enable private vulnerability reporting (#2870 by @sunriseXu, @falkoschindler)
app.storage.tab as a storage for the current tab (#2837, #2866 by @rodja, @Alyxion, @alexzaech, @falkoschindler)app.storage.client as a storage for volatile data for the current connection (#1308, #2820 by @rodja, @amks1, @sklibanov312, @Alyxion, @falkoschindler)ui.matplotlib element as an object-oriented alternative to ui.pyplot (#2553 by @tacaswell, @falkoschindler)ui.list and ui.menu items (#2855 by @codingpaula, @falkoschindler)ui.timer (#2856, #2859 by @bmrast, @falkoschindler)maximize() method for maximizing a native application (#2836 by @Aues6uen11Z)check_interval for JavaScript requests with an asyncio event (#2482, #2827 by @pplno, @anjomro, @oidex, @afullerx, @rodja, @falkoschindler)ui.leaflet after calling set_center or set_zoom (#2825, #2826 by @thetableman, @falkoschindler)ui.markdown elements (#2779, #2803 by @me21, @aniketkumar7, @falkoschindler)Introduce `ui.button_group` (#2821 by @codingpaula, @falkoschindler)
ui.button_group (#2821 by @codingpaula, @falkoschindler)ui.dropdown_button (#2821 by @codingpaula, @falkoschindler)ui.range (#1191, #2762 by @frankvp11, @codingpaula)ui.clipboard functions (#2575, #2594 by @ZeroCool940711, @falkoschindler)on_multi_upload callback for ui.upload (#2698, #2765 by @rcovic, @d-meehan, @falkoschindler)ui.interactive_image (#2745 by @frankvp11, @falkoschindler)ui.add_style with ui.add_css, ui.add_scss and ui.add_sass (#2796, #2809 by @psy0rz, @rodja, @falkoschindler)run.io_bound and run.cpu_bound maintain type signatures of their callbacks (#2733 by @petergaultney)ui.editor (#2611, #2756 by @Gilser, @intrinsically, @falkoschindler)ui.select options (#2137 by @CrystalWindSnake, @falkoschindler)ui.number after changing its limits (#2743, #2753 by @eddie3ruff, @falkoschindler)Reduce payload by extracting nicegui.js to allow browser caching (#2728 by @falkoschindler)
run_method calls (#2556, #2671, #2705 by @ducnva, @dr-yd, @lapnd, @Pikaro, @falkoschindler)ui.add_style for CSS, SASS and SCSS (#2531 by @falkoschindler, @rodja)ui.interactive_image (#2713, #2727 by @hig-dev, @falkoschindler)ui.log (#2690, #2686 by @frosch01, @falkoschindler)ui.grid (#2701 by @falkoschindler)ui.date (#2681 by @daya0576)ui.table.from_pandas for datetimes with timezones (#1983, #2706 by @rohitsathish, @falkoschindler)ui.log element to avoid problems inside tabs (#1869, #2686 by @marcin-koziol, @E-H-E-H, @falkoschindler)ui.select.set_options (#2682 by @amks1, @falkoschindler)Allow disabling the auto-validation on value change (#2618, #2661 by @Ch41r05, @falkoschindler)
ui.navigate.reload() (#2659 by @mbrulatout)new_value_mode="add" for option dictionaries (#2462, #2467 by @me21, @falkoschindler)ui.select (#2641 by @CrystalWindSnake, @falkoschindler)ui.stepper element (#2655 by @rodja)Add missing docutils module for ui.restructured_text (#2624, #2629 by @sswatson, @rodja)
ui.restructured_text (#2624, #2629 by @sswatson, @rodja)Introduce `ui.navigate` module to replace ui.open (#2575, #2593 by @ZeroCool940711, @falkoschindler, @rodja)
ui.navigate module to replace ui.open (#2575, #2593 by @ZeroCool940711, @falkoschindler, @rodja)ui.restructured_text element (#2561 by @ZeroCool940711, @falkoschindler)ui.html (#2610 by @kleynjan)ui.leaflet (map) and ui.scene (3d) (#2500, #2606 by @elkarouh, @kleynjan, @falkoschindler, @rodja)ui.scene elements (#2532 by @fabian0702, @falkoschindler)ui.run_with (#2526, #2546 by @csrubin, @falkoschindler)ui.leaflet elements (#2587, #2609 by @thickmn, @falkoschindler)run_layer_method for ui.leaflet (#2500, #2557 by @elkarouh, @kleynjan, @falkoschindler)ui.interactive_image() (#2530 by @masrab, @falkoschindler).tooltip() ignoring default_classes from ui.tooltip (#2554 by @h0uter, @falkoschindler)python-multipart to avoid Content-Type Header ReDoS (#2569 by @svfoxat)Introduce `ui.list`, `ui.item`, `ui.item_section` and `ui.item_label` (#512, #2527 by @bobwatcherx, @falkoschindler, @codingpaula)
ui.list, ui.item, ui.item_section and ui.item_label (#512, #2527 by @bobwatcherx, @falkoschindler, @codingpaula)root_path to make ASGIServer from socketio compatible with mounting as sub-app (#2468, #2515, #2521 by @wdroz, @aersam, @rodja)Support validation for `ui.select` (#2436, #2498 by @me21, @falkoschindler)
ui.select (#2436, #2498 by @me21, @falkoschindler)media_type parameter for ui.download (#2491, #2494 by @me21, @iron3oxide, @falkoschindler)ui.plotly (#2435, #2504, #2505, #2516 by @Wzhipeng, @bmaranville, @platinops)Add "loaded" event which fires when the source of a ui.interactive_image changes (#2453 by @rodja)
ui.interactive_image changes (#2453 by @rodja)ui.audio and ui.video inherit from SourceElement (#2444, #2449 by @KimigaiiWuyi, @falkoschindler, @rodja)ui.log autoscroll to bottom when page is loaded (#2447 by @CrabzteR)ui.leaflet (#2418 by @falkoschindler)ui.number adding decimal points when a validation error occurs (#2454 by @jekoie, @rodja, @falkoschindler)tailwind.config.darkMode only if the value has changed, improving the initial load time of nicegui.io (#2287, #2446, #2451 by @platinops, @rodja)storage_secret is missing (#2438, #2445 by @me21, @rodja, @falkoschindler)ui.notification not changing its style based on the type argument (#2427 by @csrubin, @falkoschindler)Add support for calling `ui.aggrid` row methods (#2357, #2413 by @E-H-E-H, @falkoschindler)
ui.aggrid row methods (#2357, #2413 by @E-H-E-H, @falkoschindler)from_pyecharts method for ui.echart (#2403 by @CrystalWindSnake, @falkoschindler)ui.mermaid errors on the server (#2390, #2396 by @jdavidrcamacho, @falkoschindler)ui.code when the code contains a backtick ` (#2400 by @Wzhipeng, @falkoschindler)Greatly improve performance when removing bindings, e.g. when leaving a page (#2335, #2373, #2374 by @ruiheng, @falkoschindler)
ui.notification (#2379, #2380 by @zilch42, @rodja)ui.open without a socket connection (#2348, #2376 by @BlackF0rest, @falkoschindler)ui.code() in Safari (#2377 by @Wzhipeng, @falkoschindler)Optimize binding propagation (#2290, #2311 by @rodja, @falkoschindler)
run.cpu_bound (#2221, #2363 by @johancj, @rodja)Dynamically hide `ui.code`'s copy button (#2283, #2288 by @frankhuurman, @falkoschindler)
ui.code's copy button (#2283, #2288 by @frankhuurman, @falkoschindler)caption and group parameter for ui.expansion (#2281 by @thetableman)ui.refreshable_method to avoid mypy error (#2174, #2268 by @falkoschindler, @meirdev)Introduce new testing module and a new pytest example (#2200, #2245 by @hofaflo, @falkoschindler)
Introduce `ui.space` to fill all available space inside of a flexbox (#2225 by @falkoschindler)
ui.space to fill all available space inside of a flexbox (#2225 by @falkoschindler)run_chart_method for ui.echart (#1900, #2232 by @mq-evan, @natankeddem, @falkoschindler)run_editor_method for ui.json_editor (#2162 by @natankeddem, @rodja, @falkoschindler)ui.expansion bindable (#2199, #2211 by @frankhuurman, @falkoschindler)ui.interactive_image without an image (#1712, #2218 by @falkoschindler)ui.on (#2203 by @falkoschindler)ValdationElement.validate now returns a bool (#2220, #2227 by @ghbm-itk)ui.query's inheritance from ui.element with aggregation (#2217 by @falkoschindler)ValueElements (#2222 by @steweg)ui.scene (#1285 by @falkoschindler)validation dictionary of ValidationElements (#2235 by @ghbm-itk, @falkoschindler)ui.notification (#2224 by @thetableman)Introduce `ui.leaflet` element for interactive maps (#1217 by @falkoschindler, @rodja)
ui.leaflet element for interactive maps (#1217 by @falkoschindler, @rodja)ui.notification element (#515, #1994, #2031 by @pythonormen, @abel1502, @thaije, @falkoschindler)ui.page_title (#1436, #2182 by @liang-jacky, @iron3oxide, @ed2050, @falkoschindler)update_rows() method for ui.table (#2132 by @steweg, @falkoschindler)ui.table (#2081, #2192 by @ghbm-itk, @falkoschindler, @rodja)ui.input's "autocomplete" prop (#2181 by @rjzhou, @falkoschindler)ui.select with multiple=False (#2076, #2131, #2175 by @thetableman, @snowbollaanm, @steweg, @falkoschindler)ui.editor and ui.markdown (#2029, #2045 by @thetableman, @ljcleo, @falkoschindler)avoid implicit dependency to pillow
Allow specifying the port-,port,-%3A) in native mode (#1457, #2110 by @retsyo, @rodja, @falkoschindler)
ui.open accept a NiceGUI element as link target (#2105, #2108 by @retsyo)@ui.page builder, which were silently dropped before (#2088 by @rodja)ui.image and ui.interactive_image (#2067, #2069 by @nghia-vo, @falkoschindler)ui.download (#2050 by @Skilles, @falkoschindler)ui.echart options when number of series changes (#1900, #2068 by @mq-evan, @natankeddem, @falkoschindler)Add official support for Python 3.12 (#1798 by @falkoschindler)
from_pandas method for ui.table (#1972, #1983 by @zilch42)force_reload method for ui.image and ui.interactive_image (#1922, #1977 by @groucho86, @falkoschindler)ui.refreshable (#1951, #1969 by @CrystalWindSnake, @falkoschindler)precision parameter to ui.number (#1921, #1952 by @groucho86, @falkoschindler)timeout parameter to several ui.aggrid methods (#1794 by @bnxvs, @falkoschindler)ui.chat_message (#1772, #1774 by @jzluo, @falkoschindler)ui.select with input field and multi-select (#2015 by @netnem, @falkoschindler)ui.json_editor on the client (#1982 by @natankeddem)ui.number jumping back to 0 when loosing focus (#300, #1765 by @groucho86, @falkoschindler)new_value_mode when setting value of ui.select programmatically (#2033 by @natankeddem, @falkoschindler)Introduce `ui.pagination` (#1890, #1899 by @BertrandBorel, @falkoschindler, @adarshpunj)
ui.pagination (#1890, #1899 by @BertrandBorel, @falkoschindler, @adarshpunj)new_value_mode for ui.select (#1045, #1819 by @groucho86, @artreven, @falkoschindler)ui.tab_panels without ui.tabs (#1894, #1897 by @CrystalWindSnake)ui.element is called with an invalid HTML tag (#1908, #1915 by @ed2050, @ProbablyBrian, @falkoschindler)ui.upload for files with whitespace in native mode (#1576 by @birchtree02, @falkoschindler)Fix startup and shutdown handlers with existing FastAPI app (#1870, #1874, #1877 by @ProbablyBrian, @zilch42, @falkoschindler)
Remove deprecated APIs (#1711 by @falkoschindler)
ui.state to be used with ui.refreshable (#1410, #1438, #1447, #1489 by @qingant, @falkoschindler)globals module (#1708, #1847 by @falkoschindler)lifespan API (#1849 by @rj-vera, @rodja, @falkoschindler)ui.timer into an element (#1710, #1829 by @falkoschindler)When using run_javascript, run_method, call_api_method and call_column_api_method,
you can decide whether the client should respond with a return value or not by awaiting the method call or not.
The method will automatically inform the client.
The respond parameter of run_javascript is not used anymore. See https://nicegui.io/documentation/run_javascript
ui.chart is now ui.highchart and requires the package "nicegui-highchart"Highcharts requires you to buy a license for commercial products if the code is installed on your machine.
That's why we made it an optional package.
Install with pip install nicegui[highcharts].
globals module is goneWe removed the ugly globals module, which was never intended to be public API,
but might have been used nonetheless.
app.config instead (using from nicegui import app to get the app object).context module instead.Client.instances instead.Since FastAPI's @on_event("startup") and @on_event("shutdown") are deprecated,
NiceGUI switched to the new lifespan API.
You can still use app.on_startup() and app.on_shutdown().
Before you needed to use ui.column inside, e.g., ui.tab_panel and other elements to get proper alignment, padding and spacing.
Now most UI elements provide reasonable default so that the content looks like in a ui.row or ui.column.
Support single _and_ double quotes in element props (#1800 by @Dronakurl)
ui.menu_item in ui.context_menu (#1827 by @rodja, @falkoschindler)Introduce `ui.context_menu` (#1738, #1801 by @gavinpotter, @natankeddem, @falkoschindler)
ui.context_menu (#1738, #1801 by @gavinpotter, @natankeddem, @falkoschindler)validate() method for validation elements (#1781 by @falkoschindler)ui.open on auto-index pages (#1760 by @rodja)Simplify row updates in `ui.table` (#1753, #1755 by @nghia-vo, @falkoschindler)
ui.table (#1753, #1755 by @nghia-vo, @falkoschindler)ui.notify has no connected client to display the message (#1754 by @rodja)ui.audio and ui.video (#1636, #1741 by @Squigglez2, @wgong, @falkoschindler)ui.icon a bindable property (#1690, #1725 by @thetableman, @wgong, @falkoschindler)ui.aggrid.from_pandas to support datatypes like DatetimeIndex (#1698 by @johancj, @bapowell, @falkoschindler)ui.tree (#1385, #1704 by @frwkl, @signup2k, @falkoschindler, @rodja)value in ui.tab_panels (#1728 by @s2terminal)Introduce `ui.code` for displaying code blocks (#592, #1567, #1653 by @yipeng-jiang, @angel0614563, @falkoschindler)
ui.code for displaying code blocks (#592, #1567, #1653 by @yipeng-jiang, @angel0614563, @falkoschindler)ui.editor (#1124, #1651 by @DelScipio, @falkoschindler)ui.timeline (#1639 by @alikalik9, @falkoschindler)run.cpu_bound and run.io_bound (#1609, #1656 by @WolfgangFahl, @falkoschindler)ui.echart with click events and dynamic options (#1562, #1579 by @thetableman)ui.menu (#1657 by @natankeddem, @rodja)Allow making `ui.toggle` clearable (#1550, #1644 by @superlou, @falkoschindler)
ui.toggle clearable (#1550, #1644 by @superlou, @falkoschindler)ui.table as a dictionary (#1643, #1646 by @natankeddem)ui.stepper dropping UI state (#1638 by @rodja, @falkoschindler)ui.echart width on initial load (#1563, #1570 by @thetableman, @natankeddem, @dabenny, @falkoschindler)ui.interactive_image (#1634, #1635 by @falkoschindler)ui.markdown by upgrading pygments dependency (#1595, #1605 by @superlou, @clueple, @rodja)Use scoped logging (#1496, #1497 by @dreusel)
ui.circular_progress (#1491, #1493 by @Vincent1334, @pythonormen, @rodja)ui.timer when its context is deleted (#1500 by @dreusel, @falkoschindler)GenericEventArguments.args (#1518 by @AndrewMHenry, @falkoschindler)Allow canceling a ui.timer (#1477, #1478 by @bergmansj, @falkoschindler)
ui.timer (#1477, #1478 by @bergmansj, @falkoschindler)ui.color_input (#1390, #1473 by @adosikas, @falkoschindler)ui.aggrid (#1420, #1468, #1470 by @PyAntony, @aersam, @falkoschindler)ui.json_editor element (#1474 by @natankeddem, @falkoschindler)ui.number (#1479 by @bergmansj, @falkoschindler)ui.timer (#1477 by @bergmansj, @falkoschindler)docker-compose with docker compose (#1456 by @Suraj1089, @rodja)Fix ui.chart events (#1450 by @natankeddem)
ui.chart events (#1450 by @natankeddem)ui.echart documentation (#1451 by @natankeddem, @falkoschindler)Improve tick API for ui.tree (#1439 by @vindevoy, @falkoschindler)
ui.tree (#1439 by @vindevoy, @falkoschindler)ui.aggrid columns configurable (#1419, #1437 by @qingant, @falkoschindler)ui.aggrid from pandas with nested structures (#1417 by @dashorty, @firai, @falkoschindler)ui.select (#1405, #1409 by @cschmidtoptima, @rodja)app.shutdown() in native mode (#1322, #1403 by @Smug246, @rodja)ui.chart (#1350 by @natankeddem, @falkoschindler)ui.echart for Apache ECharts (#1346 by @natankeddem, @falkoschindler)ui.scene (#1201 by @falkoschindler)Fix dependency routing for Windows users and NiceGUI On Air (#1279 by @jdess, @rodja, @falkoschindler)
Fix deprecation warning from vbuild (#1187 by @frankenstein91, @falkoschindler)
ui.aggrid (#1267, #1359 by @aersam)on_value_change parameter to ui.expansion (#1354, #1356 by @aersam, @falkoschindler)frameless parameter to native mode (#1341 by @Smug246)ui.header (#1329 by @miek770, @falkoschindler)clear() method for ui.scene (#1246, #1327 by @WolfgangFahl, @falkoschindler)ui.download (#1118 by @rodja, @falkoschindler)ui.refreshable with parameters (#1340 by @alex-bezverkhniy, @falkoschindler)Add clear() method for `ui.line_plot` (#1316, #1317 by @stur86, @falkoschindler)
clear() method for ui.line_plot (#1316, #1317 by @stur86, @falkoschindler)is_fullscreen property as well as toogle_fullscreen method for ui.table (#1315 by @miqsoft, @falkoschindler)ui.open is used before client is connected (#1309 by @Anindya088, @rodja)ui.scene objects without context (#1203, #1213 by @WolfgangFahl, @falkoschindler)ui.refreshable updating wrong elements (#1283, #1313 by @falkoschindler)style() method of ui.query (#1293 by @CrystalWindSnake, @falkoschindler)ui.scene (#1269 by @chengguizi, @falkoschindler)Allow configuration of socket.io transport options (#1262 by @rodja)
ui.open with new tab (#1243 by @falkoschindler)ui.open (#1237 by @BrianLandry)ui.plotly etc. (#1266 by @falkoschindler)Your coding agent can read these notes before it upgrades. Set up the MCP server →