Releases: zauberzeug/nicegui
v3.8.0
Security
-
⚠️ Prevent XSS via unsanitized method names inrun_method()(GHSA-78qv-3mpx-9cqq by @anuraagbaishya, @evnchn, @falkoschindler)Breaking change: For security reasons,
run_method()andrun_*_method()no longer accept arbitrary JavaScript expressions as method names. Only actual method names are supported now. If you previously passed JS functions likerow = await grid.run_grid_method('(g) => g.getDisplayedRowAtIndex(0).data')
use
row = await run_javascript(f'return getElement({grid.id}).api.getDisplayedRowAtIndex(0).data')
instead.
New features and enhancements
- Preserve cursor position when calling
ui.codemirror.set_value(#5775 by @falkoschindler, @evnchn) - Wake outbox loop on
stop()to avoid ~1s shutdown delay (#5804, #5805 by @Denubis, @evnchn, @falkoschindler) - Prevent
prune_user_storagecrash when UI elements are created beforeui.run_with()(#5480, #5768 by @TulyOpt, @Phloog, @jammerhund, @evnchn, @falkoschindler) - Expose
ui.aggrid.VERSIONconstant for AG Grid version reference (#5726, #5727 by @taschini, @evnchn, @falkoschindler)
Bugfixes
- Guard innerHTML writes in
ui.html,ui.markdownandui.interactive_imageto avoid server-side updates overwriting client-side DOM modifications (#5749, #5761, #5816, #5821, #5823, #5826 by @Denubis, @phifuh, @evnchn, @falkoschindler) - Fix
ui.echartzoom reset on data update by usinggetOption()API (#5819, #5822 by @rtrrtr, @falkoschindler, @evnchn) - Fix
ui.logbackground color being tinted by inner scroll-area element (#5828, #5831 by @rolfn, @falkoschindler, @evnchn) - Cancel connection-wait task when page coroutine completes first to prevent task leak (#5803, #5806 by @Denubis, @evnchn, @falkoschindler)
- Fix jumpy
ui.tablefullscreen toggle with smooth scrolling enabled (#5789 by @falkoschindler, @evnchn) - Guard against missing element in
beforeUnmounthooks during@ui.refreshablerebuild (#5765, #5766 by @evnchn, @falkoschindler) - Fix Leaflet Draw circle resize broken by ES module strict mode (#5751, #5756 by @MicaelJarniac, @evnchn, @falkoschindler)
- Exclude Python prefix directory from reload file watcher to prevent spurious reloads (#5750, #5780 by @phifuh, @evnchn)
- Fix WebSocket URL missing host on HTTPS due to JS operator precedence (#5734 by @evnchn)
- Fix race condition: use static DOMPurify import to avoid mid-module yield (#5732, #5799 by @evnchn, @codingpaula, @rodja, @falkoschindler)
Documentation
- Add security best practices section (#5736 by @evnchn, @falkoschindler)
- Add a "Reaktiv Order Calculator" example (#4758, #5783, #5812 by @FabianGoessling, @buiapp, @evnchn, @buiapp, @falkoschindler)
- Add a "Device Control" example with events and logging (#5201, #5737 by @weinibuliu, @rodja, @eddie3ruff, @evnchn, @falkoschindler)
- Add AI co-authorship attribution guidance to CONTRIBUTING.md (#5758 by @evnchn, @falkoschindler)
- Upgrade the "SQLite Database" example to Tortoise ORM 1.0.0 (#5754 by @falkoschindler)
- Improve Plausible's SPA compatibility for website analytics (#5830 by @evnchn, @rodja)
- Make first demo always load immediately for better SEO (#5793, #5800 by @evnchn, @falkoschindler)
- Fix Googlebot homepage screenshot with unbounded
h-screen(#5792 by @evnchn) - Select search text when reopening search dialog (#5744, #5779 by @Aleborg-Finansforbundet, @marcrichard22, @evnchn, @falkoschindler)
- Fix sponsor button border styling with dark mode support (#5778 by @evnchn)
- Use static URL for sponsor images instead of local path (#5733 by @evnchn)
Testing
- Reuse Chrome driver across screen tests for faster execution (#5729 by @evnchn, @falkoschindler)
- Add support for typing numbers in
UserInteraction(#5771, #5772 by @atollk, @falkoschindler, @evnchn) - Reset
_page_exception_handlerinApp.reset()for test isolation (#5809 by @evnchn) - Fix flaky page test (#5818 by @falkoschindler, @evnchn)
Dependencies
- Update bundled Google Fonts: Material Symbols and Roboto v50 (#5743, #5762 by @VerteinPL, @evnchn, @falkoschindler)
- Bump Mermaid to 11.12.2 (#5755 by @henriknoren, @falkoschindler, @evnchn)
Infrastructure
- Add Copilot coding agent setup (#5770 by @evnchn, @falkoschindler)
- Remove
nanasess/setup-chromedriverfrom CI in favor of runner's preinstalled Chrome (#5740 by @evnchn) - Add GitHub CLI and pre-commit hooks to devcontainer (#5741 by @evnchn, @falkoschindler)
- Add CLAUDE.md with native @AGENTS.md import (#5730 by @rodja, @evnchn)
Special thanks to our top sponsors Lechler GmbH and TestMu AI ✨
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!
v3.7.1
Bugfix
- Fix .mjs files served with wrong MIME type on some Windows machines (#5723, #5724 by @python-and-novella, @evnchn)
v3.7.0
Security
⚠️ Prevent XSS attacks via unsanitized HTML inui.markdown()(GHSA-v82v-c5x8-w282 by @falkoschindler, @evnchn)⚠️ Prevent path traversal via unsanitizedFileUpload.nameenabling arbitrary file write (GHSA-9ffm-fxg3-xrhh by @k14uz, @evnchn, @falkoschindler)
New features and enhancements
- Introduce UnoCSS support (#5485 by @evnchn, @falkoschindler)
- Unify dark mode API and add color-scheme meta tag for browser/extension compatibility (#5471, #5483 by @davetapley, @evnchn, @falkoschindler)
- Set Redis TTL on tab storage keys (#5594 by @quantumdark, @evnchn, @falkoschindler)
- Perform implicit handshake and fix
on_connectcalled before page is ready (#5673 by @evnchn, @falkoschindler) - Deprecate custom AG Grid
checkboxRendererin favor of built-inagCheckboxCellRenderer(#5681, #5685 by @CatamountJack, @CrystalWindSnake, @falkoschindler, @evnchn) - Speed up SVG updates for
ui.interactive_imagewith PIL images (#5583, #5653 by @denniswittich, @evnchn, @falkoschindler)
Bugfixes
- Fix vertical stepper animation jitter (#3881, #5721 by @StarDustEins, @evnchn, @falkoschindler)
- Fix REPL detection for Python 3.13's new pyrepl (#5675, #5710 by @KrilleGH, @falkoschindler, @evnchn)
- Fix shutdown handler not called with native mode and reload enabled (#2107, #5702 by @PawelRoman, @rodja, @retsyo, @frankhuurman, @krashdifferent, @python-and-novella, @Ansari-Codes, @evnchn, @falkoschindler)
- Fix
app.shutdownforui.run_with(#3253, #5686 by @MuuXB, @python-and-novella, @falkoschindler, @evnchn, @falkoschindler) - Fix video loading issues on Windows in native mode (#4970, #5700 by @MaidScientistIzutsumiMarin, @python-and-novella, @evnchn, @falkoschindler)
- Fix
NiceGUIJSONResponseto inherit fromJSONResponseso response model schema appears in Swagger (#5688, #5689 by @AleDetto, @evnchn, @falkoschindler) - Avoid
ui.expansionstutters during animation (#4918, #5659 by @platinops, @evnchn, @falkoschindler) - Fix protocol not being set when using SSL in native mode (#4814, #5655 by @nachobacanful, @evnchn, @falkoschindler)
- Fix input elements not being updated when re-opening a
ui.dialog(#2149, #5652 by @adosikas, @meslahik, @python-and-novella, @liunux4odoo, @evnchn, @falkoschindler)
Documentation
- Add AG Grid Enterprise demo (#5676 by @falkoschindler, @evnchn)
- Add style principles for exception suppression and optional imports (#5715 by @evnchn, @falkoschindler)
Testing
- Fix test isolation for pages defined in submodules (#5692, #5697 by @kleynjan, @falkoschindler, @evnchn)
- Persist
tab_idin User fixture (#5687, #5690 by @5553455237, @evnchn, @falkoschindler)
Dependencies
- Upgrade minimum Python version to 3.10 and modernize type annotations (#5696 by @falkoschindler, @evnchn)
- Update dependencies to fix security vulnerabilities (#5695 by @falkoschindler, @evnchn)
- Update
uv.lockto revision 3 (#5707 by @evnchn, @falkoschindler)
Infrastructure
- Let GPU-free Chrome 144 work in CI (#5678 by @evnchn, @falkoschindler)
- Use
contextlib.suppressto ignore exceptions (#5714 by @falkoschindler, @evnchn)
Special thanks to our top sponsors Lechler GmbH and TestMu AI ✨
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!
v3.6.1
Bugfix
- Fix hot reload and On Air connection by reverting PR #5499 (#5671 by @python-and-novella, @falkoschindler)
Testing
- Preserve
valuewhen closing aui.selectpopup in User simulation (#4894, #5670 by @briemla, @falkoschindler, @evnchn, @rodja)
Special thanks to our top sponsors Lechler GmbH and TestMu AI ✨
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!
v3.6.0
New features and enhancements
- Introduce
app.colorsfor global color configuration (#3787, #5611 by @ghbm-itk, @evnchn, @falkoschindler) - Introduce color setters and bindings like
set_background_color()andbind_text_color()(#5511, #5512 by @borolepratik, @evnchn, @falkoschindler) - Introduce
ui.on_exceptionfor handling exceptions after the page has been sent to the client (#5617, #5618 by @CatamountJack, @evnchn, @falkoschindler) - Provide an easy way to replace AG Grid Community with Enterprise (#2431, #5623, #5629 by @ducnva, @luongnv275, @xaptronic, @gioxc88, @evnchn, @falkoschindler)
- Let
ui.altairaccept any Altair chart type likeLayerChartorFacetChart(#5649, #5650 by @s-meza, @falkoschindler) - Allow passing a path to
ui.run(show=...)to open a specific page (#5642 by @jsb-zz, @falkoschindler, @evnchn) - Make
ui.tabsandui.tab_panelsalways emit change values as string (#5637, #5638 by @jeffective, @evnchn, @falkoschindler) - Allow the user to click-to-reload when
ui.sceneloses the WebGL context (#5360, #5656 by @falkoschindler, @evnchn) - Suppress Vue component registration warnings for native tags (#3179, #5654 by @jojje, @ksikka, @evnchn, @falkoschindler)
- Patch and warn about late event registrations (#4154, #5439, #5663, #5664 by @Alyxion, @xaptronic, @evnchn, @falkoschindler)
- Break up strong reference cycles in slot children for better garbage collection (#5110, #5644 by @thevinchi, @falkoschindler, @evnchn, @phifuh)
- Reduce initial page payload by omitting unused element properties (#5500 by @evnchn, @falkoschindler)
- Speed-up the websocket handshake process (#5499 by @evnchn, @falkoschindler)
Bugfixes
- Fix CSS not being added correctly when calling
ui.add_cssafter client connected (#5624, #5628, #5666, #5667 by @svhb1000, @falkoschindler, @evnchn) - Fix
ui.dialogbeing hidden when created insideui.menu(#4116, #5602 by @tgbl-mk, @evnchn, @falkoschindler) - Fix
ui.leaflettiles not loading when element is unhidden (#2338, #5614 by @kleynjan, @evnchn, @falkoschindler) - Fix
ui.logscroll-to-bottom inui.tab_panel(#5118, #5632 by @pandabearcodes, @evnchn, @falkoschindler) - Fix errors when updating elements on hidden tabs (#5333, #5633 by @natankeddem, @evnchn, @falkoschindler)
- Fix AG Grid memory leak on update and unmount (#5635 by @evnchn, @falkoschindler)
- Fix nested updates in
ui.anywidgetnot propagating back to frontend (#5626, #5636 by @s-meza, @evnchn, @falkoschindler) - Ensure API exceptions return raw error instead of NiceGUI error page (#5508, #5510 by @ghbm-itk, @evnchn, @falkoschindler)
- Forward log messages through On Air relay (#5668 by @falkoschindler)
Documentation
- Add
on_path_changeddemo and reference forSubPagesRouter(#5487, #5665 by @GinjiJizai, @falkoschindler, @evnchn) - Fix documentation for native mode settings in packaged apps (#4842, #5651 by @h0uter, @himbeles, @falkoschindler, @evnchn)
- Avoid duplication in methods documentation and use best available docstring (#5630, #5631 by @evnchn, @falkoschindler)
- Fix docs for
ui.context.client.connected(#5607 by @jeffective, @falkoschindler, @evnchn)
Testing
- Add a note about limitations for the
asyncio_default_fixture_loop_scopesetting (#4785 by @gzu300, @evnchn, @rodja, @falkoschindler)
Special thanks to our top sponsors Lechler GmbH and TestMu AI ✨
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!
v3.5.0
Security
⚠️ Prevent Zero-click XSS attacks via user-defined link fragments (GHSA-mhpg-c27v-6mxr by @evnchn, @falkoschindler)⚠️ Prevent XSS attacks via user-defined links in apps withui.sub_pages(GHSA-m7j5-rq9j-6jj9 by @evnchn, @falkoschindler, @xx-mikusan-xx)⚠️ Prevent XSS attacks via user-defined URL inui.navigate.pushandui.navigate.replace(GHSA-7grm-h62g-5m97 by @xx-mikusan-xx, @evnchn, @falkoschindler)⚠️ Prevent service degradation via leaking Redis connections for disconnected clients (GHSA-mp55-g7pj-rvm2, #5616 by @yudelevi, @evnchn, @falkoschindler)
New features and enhancements
- Allow defining table cell slots without string templates (#846, #1138, #2080, #2625, #3148, #3317, #3540, #3662, #3939, #5092, #5591, #5592 by @tofusoul, @kleynjan, @retsyo, @me21, @CrystalWindSnake, @Ottokranz, @williamhCode, @marcuslimdw, @zceemja, @strunov, @Yuerchu, @falkoschindler, @evnchn)
- Introduce
ui.anywidgetandui.altair(#657, #5096, #5137 by @murilomm192, @Jerold-S, @azjps, @evnchn, @falkoschindler, @Noghpu, @s-meza) - Allow disabling or setting a custom GZipMiddleware (#5582 by @falkoschindler, @denniswittich, @evnchn)
- Introduce
on_clickforui.echart(#5576, #5578 by @TheOtherRealm, @evnchn, @falkoschindler) - Add support for scheme validations with AJV formats in
ui.json_editor(#4748, #5571 by @phnmn, @evnchn) - Convert
ui.plotlyandui.joystickinto JavaScript components for faster loading (#5567, #5568 by @evnchn, @falkoschindler) - Add
prefixandsuffixproperties toui.inputandui.number(#5534 by @Yuerchu, @evnchn, @falkoschindler) - Check dependencies for naming conflicts (#5495 by @evnchn, @falkoschindler)
Bugfixes
- Avoid default parameter values overwriting default props (#4856, #4857, #5505, #5622 by @SHDocter, @falkoschindler, @thetableman, @evnchn)
⚠️ Note: This bugfix changes the name of some undocumented, internally used props. If you happen to have used them in advanced use cases in user code, refer to this list of all renamed props. NiceGUI will warn and auto-convert them. This backward compatibility will be removed in NiceGUI 4.0. - Fix Docker bind-mount regression after uv migration (#5593, #5600 by @lpellicer, @evnchn)
⚠️ Note: If you adjusted your code/workflows to work around the 3.4.0 regression, you can now undo those workarounds for 3.5.0. - Fix
ui.mermaidsending error events to wrong UI element (#5597, #5599 by @AwMalka, @evnchn, @falkoschindler) - Fix
ui.timerleaking memory when client disconnects immediately (#5595, #5598 by @ftilde, @evnchn, @falkoschindler)
Documentation
- Extend documentation about input validation (#5584, #5620 by @whoamiafterall, @evnchn)
- Make sure example images are always shown (#5604, #5605 by @evnchn)
- Segment direct & inherited properties/methods in reference documentation to enhance readability (#5484 by @himbeles, @evnchn, @falkoschindler)
Testing
- Test
.vuecomponents (#5619 by @evnchn, @falkoschindler)
Special thanks to our top sponsors Lechler GmbH, LambdaTest and frankhuurman ✨
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!
v3.4.1
Enhancement
Bugfixes
- Fix automatic event unsubscription which could cause a memory leak (#5581 by @ftilde, @falkoschindler, @evnchn)
- Avoid logging HTTP 404 exceptions for
rootfunction withui.sub_pages(#5579, #5580 by @codingpaula, @falkoschindler, @evnchn) - Avoid confusing point click events with other component clicks in
ui.echart(#5576 by @TheOtherRealm, @evnchn, @falkoschindler)
Infrastructure
- Fix speculative loading tests for new Chrome version (#5573 by @evnchn)
- Bump actions/upload-artifact from 5 to 6 (#5586 by @dependabot)
Special thanks to our top sponsors Lechler GmbH and LambdaTest ✨
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!
v3.4.0
Security
⚠️ Prevent arbitrary file access when usingapp.add_media_files(GHSA-hxp3-63hc-5366 by @y4rvin, @evnchn, @falkoschindler)⚠️ Prevent XSS attacks via user-defined content forui.add_css,ui.add_scss, orui.add_sass(GHSA-72qc-wxch-74mg by @twmoon, @evnchn, @falkoschindler)⚠️ Prevent XSS attacks via user-defined SVG content inui.interactive_imageusing a newsanitizeparameter (GHSA-2m4f-cg75-76w2 by @twmoon, @evnchn, @falkoschindler)
New features and enhancements
- Let
element.clear()return the element (builder pattern) (#5461 by @falkoschindler, @evnchn) - Support wildcard routing in
ui.sub_pages(#5437, #5440, #5529, #5530, #5541 by @davetapley, @evnchn, @falkoschindler, @rodja) - Lazily start active link refresher task (#5438 by @bulletmark, @evnchn, @falkoschindler)
- Remove orjson dependency for PyPy (#5161 by @evnchn, @falkoschindler)
- Load Vue components faster (#5496 by @evnchn)
- Load codehilite.css faster (#5497 by @evnchn, @falkoschindler)
- Load headwind.css faster (#5513 by @evnchn)
- Allow emitting events from other threads (#4985, #5546 by @MaidScientistIzutsumiMarin, @rodja, @ftilde, @evnchn, @falkoschindler)
- Allow upgrading to pywebview 6 (#5555 by @paco-sevilla, @evnchn, @falkoschindler)
- Drop support for non-ESM support browsers (#5514 by @evnchn)
- Warn about accidental script mode due to missing
shared=Trueinui.add_head_html(#5472, #5478 by @davetapley, @evnchn, @falkoschindler) - Forward
--cleanand--noconfirmto pyinstaller in nicegui-pack (#5469 by @himbeles) - Raise exception when trying to run script mode in REPL (#5414, #5456 by @defkev, @falkoschindler, @evnchn, @python-and-novella, @plambertgis)
- Compile SASS and SCSS in the browser (#5321, #5449 by @falkoschindler, @evnchn)
Deprecation
⚠️ Deprecateui.add_scssandui.add_sassin favor ofui.add_css(#5321, #5449 by @falkoschindler, @evnchn)
Bugfixes
- Fix
.tooltip()for complex elements likeui.table(#5447, #5482 by @pandabearcodes, @python-and-novella, @evnchn, @himbeles, @falkoschindler) - Fix sizing problem of
ui.interactive_image(#5479, #5517 by @daniel-anderberg, @evnchn, @falkoschindler) - Fix default values of
ui.range(#5467 by @Mick235711) - Fix padding of horizontal
ui.stepper(#5434, #5463 by @Buruxianian, @evnchn, @falkoschindler)
Documentation
- Show a screenshot per example on the website (#4391, #5044 by @kler, @leocjj, @rodja, @falkoschindler, @evnchn)
- Improve loading speed (#5507, #5515 by @evnchn)
- Add a note about native mode on Windows requiring .NET (#5544 by @phifuh, @falkoschindler)
- Add missing link in
ui.sub_pagesdemo (#5498, #5504 by @evnchn, @falkoschindler) - Remove error message "The type of the None singleton." (#5488, #5489 by @evnchn)
Testing
- Add possibility to perform tests without NiceGUI pytest plugins (#5377, #5380 by @himbeles, @evnchn, @rodja, @falkoschindler)
Dependencies
- Bump actions/checkout from 5 to 6 (#5506 by @dependabot)
- Exclude broken FastAPI version 0.123.5 to avoid "coroutine object not iterable" (#5535 by @frankhuurman, @edouardrolland, @Alyxion, @falkoschindler, @evnchn)
Infrastructure
- Migrate to uv (#5311, #5547 by @falkoschindler, @evnchn, @EmberLightVFX, @pascalzauberzeug, @himbeles, @codingpaula)
- Add codespell support (#5368 by @yarikoptic, @evnchn, @falkoschindler)
Special thanks to our top sponsors Lechler GmbH and LambdaTest ✨
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!
v3.3.1
Enhancement
Bugfixes
- Fix event handlers for
ui.plotlynot being initialized (#5459, #5460 by @mathisschmidt, @falkoschindler, @evnchn) - Fix spurious
ui.table"found list in column" warnings (#5454 by @Mick235711, @falkoschindler) - Fix
ui.leafletwhen callingset_centerandset_zoomin combination (#4491, #5453 by @amks1, @falkoschindler, @evnchn) - Fix navigating
ui.sub_pagesin root page with remaining path (#5442 by @rodja)
Testing
- Use local resources to avoid flaky test (#5441 by @evnchn, @falkoschindler)
Special thanks to our top sponsors Lechler GmbH, LambdaTest, and Pierre Gronlier ✨
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!
v3.3.0
New features and enhancements
- Introduce
ui.date_inputandui.time_input(#4815 by @evnchn, @falkoschindler) - Introduce
ui.page_scroller(#4816 by @evnchn, @falkoschindler) - Load Vue as an ES module to support integrating Vue components built with Vite (#4673, #5257, #5328, #5351 by @xaptronic, @frankier, @falkoschindler, @evnchn)
- Introduce Mermaid
on_node_clickusing a no-markdown solution (#4845, #4862, #4871 by @thetableman, @evnchn, @falkoschindler) - Improve exception when
run.cpu_boundfails in script mode (#5382 by @wschoenell, @evnchn, @rodja, @falkoschindler) - Show an error popup if a socket message was too long for transmission (#3410, #4571 by @Xtreemrus, @me21, @evnchn, @rodja, @falkoschindler)
Bugfixes
- Fix Quasar and Tailwind collision resulting in wrong rotation angle (#5399, #5405, #5444, #5445 by @henriknoren, @evnchn, @Moldeador, @falkoschindler)
- Fix responsive behavior for
ui.plotly(#4870, #5369, #5397, #5404 by @lucasimi, @AlePiccin, @evnchn, @falkoschindler) - Fix fallback for pywebview's storage path (#4882, #5419 by @phifuh, @evnchn, @jochso, @python-and-novella, @falkoschindler)
- Avoid clients being deleted too early (#5090, #5119, #5422 by @alydersen, @sonicno1, @zbxiany, @maria-ems, @rodja, @falkoschindler)
- Add missing HTML IDs to complex Quasar elements (#5417, #5420 by @ghbm-itk, @evnchn, @falkoschindler)
- Use correct lifecycle hooks for Vue 3 (#5373 by @falkoschindler, @evnchn)
- Cleanup resize observers when unmounting a component (#5374 by @falkoschindler, @evnchn)
- Avoid race condition when rendering
ui.markdowncontaining Mermaid diagrams (#5366 by @falkoschindler, @evnchn)
Documentation
- Improve docstrings and demos about updating content elements (#5318, #5446 by @roddy-zhang, @evnchn, @falkoschindler)
- Document and discourage working off the main branch of the fork (#5375 by @evnchn, @falkoschindler)
Testing
- Add pytests for
VBuild(#5393 by @falkoschindler, @evnchn)
Infrastructure
- Improve GitHub workflows with parallelization, branch protection and a merge queue (#5307 by @evnchn, @falkoschindler)
Special thanks to our top sponsor Dhorz ✨
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!