Full Python GUI apps in the browser
Developer ProductivityA cross‑platform GUI framework for desktop, mobile, and web that unifies Dear ImGui with C++ and Python APIs and includes plotting, Markdown, image inspection, node editors, and more.
Features
- Cross‑platform support: Windows, macOS, Linux, iOS, Android, WebAssembly
- Unified C++ and Python APIs with similar structure
- Integrated ecosystem including ImPlot/ImPlot3D, ImmVision, node editor, file dialogs, UI widgets, Markdown viewer
Recent releases
View all 9 releases →- Update Python code using affected ImDrawList methods to reorder arguments (thickness before flags).
- Replace direct integer line/column accesses in TextEditor with `DocPos` objects and adapt callbacks receiving `PopupData` instead of raw integers.
- Swapped last two arguments of `add_rect`, `add_polyline`, and `path_stroke` methods on `imgui.ImDrawList` (thickness now precedes flags).
- Renamed `column` to `index` in cursor/selection structs; replaced integer line/column pairs with `TextEditor.DocPos(line, index)` objects for all position-related TextEditor calls.
- Rebased ImGuiColorTextEdit on the upstream "future" branch introducing layered architecture and groundwork for word wrap, line folding, and minimap.
- Added new WebGL binding in Pyodide (`webgl.register_texture` / `webgl.unregister_texture`) and corresponding demo examples.
Full changelog
v1.92.800
Updated Dear ImGui to v1.92.8
Breaking changes: add_rect, add_polyline, path_stroke argument order
Dear ImGui v1.92.8 swapped the last two arguments of three ImDrawList
drawing functions so that thickness (which is set explicitly far more
often than flags) comes first. The bindings track this change.
For Python users — the affected methods on imgui.ImDrawList:
| Method | Old signature | New signature |
| ------------- | ---------------------------------------------- | ---------------------------------------------- |
| add_rect | (p_min, p_max, col, rounding, flags, thickness) | (p_min, p_max, col, rounding, thickness, flags) |
| add_polyline| (points, col, flags, thickness) | (points, col, thickness, flags) |
| path_stroke | (col, flags, thickness) | (col, thickness, flags) |
If you use only positional arguments and pass 5+ of them, swap the last two:
# Before
draw_list.add_rect(p0, p1, col, rounding, imgui.ImDrawFlags_.none.value, 1.5)
draw_list.path_stroke(col, imgui.ImDrawFlags_.closed.value, thickness)
# After
draw_list.add_rect(p0, p1, col, rounding, 1.5, imgui.ImDrawFlags_.none.value)
draw_list.path_stroke(col, thickness, imgui.ImDrawFlags_.closed.value)
Old-order calls will not silently misrender — they are caught by one of three
mechanisms:
- Static type-check (recommended). Running
mypyorpyrightonce
after upgrading flags every call that passes a float literal where the
new signature expectsflags: int:Argument of type "float" cannot be assigned to parameter "flags" of type "ImDrawFlags" in function "add_rect" - Runtime, float thickness. pybind11 refuses to convert
float→int,
soadd_rect(..., flags=ALL, thickness=2.0)written in the old order
raisesTypeErrorimmediately. - Runtime, int thickness. When both arguments are ints (e.g.
thickness=2), the swapped value lands inflagsand trips ImGui's own
guard(flags & ImDrawFlags_InvalidMask_) == 0, raising:
The mask reserves bits 0-3 specifically to catch this swap: any smallRuntimeError: IM_ASSERT(... "Incorrect parameter. Did you swapped 'thickness' and 'flags'?")
integer thickness ends up with bits 0-3 set, while every valid flag uses
only bits 4-9.
In practice this covers every realistic old-order call site, so no extra
detection layer is added on the Python side.
For C++ users — same swap on ImDrawList::AddRect, ImDrawList::AddPolyline
and ImDrawList::PathStroke. See the upstream ImGui v1.92.8 changelog for
the full rationale; the short version is that the typical call site changes
from:
// Before
draw_list->AddRect(p_min, p_max, col, rounding, ImDrawFlags_None, border_size);
// After
draw_list->AddRect(p_min, p_max, col, rounding, border_size);
When IMGUI_DISABLE_OBSOLETE_FUNCTIONS is off (the default), ImGui keeps an
inline redirection so old call sites still compile; with it on (as in the
ImGui Bundle Python build), the old overloads are =delete, surfacing
mistakes at compile time.
Updated ImGuiColorTextEdit (architecture refactor)
ImGuiColorTextEdit was rebased on its upstream future branch, which
introduces a layered architecture (Document / TypeSetter / Colorizer /
Bracketeer / LineFold / MiniMap / AutoComplete overlays) and lays the
groundwork for word wrap, line folding, and a VSCode-style minimap.
The public C++ API changed in ways that propagate to the Python bindings.
All cursor/selection coordinates now go through dedicated structs instead
of (line, column) integer pairs, and column is renamed to index in
the document-coordinate struct (rows differ from lines once word-wrap is
enabled).
Breaking changes: TextEditor API
For Python users — the most common call sites:
| Before | After |
| ------------------------------------------------------- | ---------------------------------------------------------------- |
| editor.get_main_cursor_position().column | editor.get_main_cursor_position().index |
| editor.set_cursor(line, col) | editor.set_cursor(TextEditor.DocPos(line, col)) |
| editor.select_region(sl, sc, el, ec) | editor.select_region(TextEditor.DocPos(sl, sc), TextEditor.DocPos(el, ec)) |
| editor.get_word_at_screen_pos(pos) | editor.get_word_at_mouse_pos(pos) |
| editor.grow_selections_to_curly_brackets() | editor.grow_selections() |
| editor.shrink_selections_to_curly_brackets() | editor.shrink_selections() |
| editor.get_first_visible_line() / get_last_visible_line() | editor.get_first_visible_row() / get_last_visible_row() |
Context-menu and hover callbacks now receive a PopupData object instead
of (line, column) integers:
# Before
def text_context_menu(line: int, column: int):
...
editor.set_text_context_menu_callback(text_context_menu)
def line_number_context_menu(line: int):
...
editor.set_line_number_context_menu_callback(line_number_context_menu)
# After
def text_context_menu(data: TextEditor.PopupData):
line, column = data.pos.line, data.pos.index
...
def line_number_context_menu(data: TextEditor.PopupData):
line = data.pos.line
...
For C++ users — same shape, with TextEditor::DocPos{line, index} and
TextEditor::PopupData& data. Line/column counters are now size_t (use
%zu in printf-style format strings).
Test Engine: safer Python integration
- Catch Python exceptions in
test_func/gui_func/teardown_func. Previously a
Python exception in one of these callbacks propagated asnanobind::python_error
on the engine's coroutine thread, hitstd::terminate, and killed the process
(taking remaining queued tests with it). Exceptions are now printed as a
traceback, reported viaImGuiTestEngine_Error(test marked asTestStatus.error),
and swallowed so the engine continues. imgui_test_engineCrashHandler: installSA_RESETHANDon *nix to avoid
abort() reentry spam.- Fix
imgui_bundle.imgui.<submodule>imports (e.g.imgui.test_engine).
imgui-node-editor
- Suppress hover/active for widgets inside a node that is covered by another
node. - Fix popup position for
ComboandColorEditinside the node editor canvas
(three coords needed canvas→screen translation; the right guard is
NextWindowData.HasFlags, notWindowFlags). - Link color now automatic, based on light vs dark theme.
UpdateNodeEditorColorsFromImguiColors(): improve colors, especially
selection colors.- README: documented keyboard/mouse interactions; added doc in the header.
ImmVision
- Clamp images so their texture does not bleed when dragged completely
outside the viewport. - Improved resize: widget size, contrast, and behavior in a zoomed node
editor.
ImGui (StackLayout patch)
- StackLayout: don't inflate
measured_sizewhen the layout has no springs
(fixes fractional-height alignment drift in some layouts).
Pyodide / Playground
- Switched to pyodide 0.29.4.
- New WebGL binding for Pyodide:
webgl.register_texture/
webgl.unregister_texture. Use it inside HelloImGui'scustom_background
to upload textures produced from JS-sideWebGL2RenderingContext.
Seepyodide_projects/projects/playground/examplesfor documented examples. - Playground: added documented WebGL examples, source link on the minimal
example, and restore the landing page on browser back-to-root. - Added
implot_demo,implot3d_demo, andimgui_demoto the playground. - New "WebAudio minimal beep" example demonstrating browser audio from Python.
- Save Python code to a file before running it (for nicer tracebacks).
- Per-file deployment of demo source into the Emscripten FS
(imgui_bundle_add_demo.cmake). - Non-blocking loading banner over the canvas, with explanatory text,
smooth time-based progress, rotating tips, and a lazy pendulum video. - Smooth progress bar for per-demo wheel installs; snap back to 0 when the
banner reopens. - Pyodide + LaTeX: fix issues on consecutive runs.
min_pyodide_app: log errors to the JS console.
Python backends
- Fix SDL python backends on Wayland (#463).
- Move the PyOpenGL Wayland workaround out of
imgui_bundle/__init__.py
(#321, #463): applied only by the affected backends.
- Previous imgui-bundle.pages.dev URLs now redirect to the new faster server (home, doc, explorer, playground).
- Markdown Renderer: adaptive code snippet colors with `SnippetTheme::Auto`.
- Pyodide/Playground clipboard support added; numpy becomes optional.
- Python: `TextEditor.PaletteId.dark` → `TextEditor.get_dark_palette()`, `TextEditor.PaletteId.light` → `TextEditor.get_light_palette()`, removed palettes `retro_blue` and `mariana`.
- Python: Language definition IDs changed (`LanguageDefinitionId.cpp` → `Language.cpp()`), `set_language_definition(id)` → `set_language(Language.cpp())`.
- Python: Method renames – `set_cursor_position(line, col)` → `set_cursor(line, col)`, `set_view_at_line(line, mode)` → `scroll_to_line(line, alignment)`, `get_selected_text(cursor)` → `get_cursor_text(cursor)`, `get_cursor_position()` → `get_main_cursor_position()`.
- LaTeX math rendering in Markdown via `imgui_microtex`.
- ImPlot v1.0 and ImPlot3D v0.4 add per-index color/size support with numpy arrays.
- New ImGuiColorTextEdit features: find/replace UI, text markers, bracket matching, line decorators, context‑menu callbacks, change & transaction callbacks, filter selections, Autocomplete framework, TextDiff widget, many additional language syntaxes.
Full changelog
Updated Dear ImGui to v1.92.7
imgui-bundle.pages.dev
The docs and demos were relocated to a new and faster server, with new URL addresses. The new URL are also much easier to remember.
- Home: https://imgui-bundle.pages.dev/
- Documentation: https://imgui-bundle.pages.dev/doc
- ImGui Bundle Explorer: https://imgui-bundle.pages.dev/explorer/
- Playground: https://imgui-bundle.pages.dev/playground/
(Note: all previous url will now automatically redirect to the new urls)
Markdown Renderer Improvements
Added LaTeX math rendering
LaTeX math is now supported in the Markdown renderer, using the new imgui_microtex library (native rendering via MicroTeX + FreeType). Enable it with AddOnsParams.with_latex = True.
- Inline
$...$and display$$...$$math in Markdown - Python bindings for
imgui_microtex - Pyodide: lazy-download LaTeX fonts via jsdelivr
- Frame-generation cache eviction (default 60 frames)
Markdown: HTML and CommonMark extensions
- Task lists:
- [ ]/- [x] - GitHub-style admonitions:
> [!NOTE],> [!WARNING],> [!TIP], etc. - Permissive autolinks (bare URLs become links; opt-out available)
- Inline HTML spans:
<sub>,<sup>,<kbd>,<mark>, plus anOnHtmlSpancallback for custom spans <details>/<summary>collapsibles<pre>blocks<img>tags with width/height, async download (desktop via libcurl, Pyodide via JS fetch)
Other Markdown improvements
- Fix word wrapping issues around transitions between bold/italic and normal
- Make spacing between blocks, headers and paragraphs more coherent
- Adaptive code snippet colors: new
SnippetTheme::Autopicks dark or light based on current ImGui theme - TextEdit no longer shows a caret in coded blocks.
Pyodide / Playground
- Improved online playground
- Clipboard support (SDL2 + Emscripten)
immapp.download_url_bytes/immapp.download_url_bytes_async- Pin pyodide-build version to pyodide version
- Lazy import for pydantic types
- numpy is now optional (no runtime dependency)
ImPlot v1.0 - Per-index color/size support
- Updated ImPlot to v1.0
ImPlotSpec: numpy array support for per-index color/size fields (fill_colors,line_colors,marker_fill_colors,marker_line_colors,marker_sizes)
ImPlot3D v0.4 - Per-index color/size support
- Updated ImPlot3D to v0.4
ImPlot3DSpec: same numpy array fields as ImPlot- New Python demo: Per-Index Colors (colorful lines, scatter, triangles, quads, Gouraud-shaded duck)
- Refactored Custom Per-Point Style demo to use batched per-index arrays
ImGuiColorTextEdit: switched to goossens rewrite (breaking API changes)
Replaced the santaclose-based ImGuiColorTextEdit with the complete rewrite by Johan A. Goossens. This brings a cleaner architecture, proper UTF-8 support, C++17, no regex/boost dependency, and many new features.
New features
- Find/replace UI with keyboard shortcuts
- Text markers (colored line highlights with tooltips)
- Bracket matching with visual indicators
- Line decorators (custom gutter content per line)
- Context menu callbacks (separate for line numbers and text area)
- Change and transaction callbacks
- Filter selections/lines (transform text via callbacks)
- Autocomplete framework
- TextDiff widget (combined and side-by-side diff view)
- Many more languages (C#, JSON, Markdown, AngelScript)
Breaking API changes (Python)
| Old | New |
|-----|-----|
| TextEditor.PaletteId.dark | TextEditor.get_dark_palette() |
| TextEditor.PaletteId.light | TextEditor.get_light_palette() |
| TextEditor.PaletteId.retro_blue | (removed) |
| TextEditor.PaletteId.mariana | (removed) |
| TextEditor.LanguageDefinitionId.cpp | TextEditor.Language.cpp() |
| set_language_definition(id) | set_language(Language.cpp()) |
| set_cursor_position(line, col) | set_cursor(line, col) |
| set_view_at_line(line, mode) | scroll_to_line(line, alignment) |
| get_selected_text(cursor) | get_cursor_text(cursor) |
| get_cursor_position() -> TextPosition | get_main_cursor_position() -> CursorPosition |
| render(title, border, size) -> bool | render(title, size, border) -> None |
| undo(steps) / redo(steps) | undo() / redo() (no steps) |
| SnippetTheme.retro_blue / .mariana | (removed) |
To detect text changes, use set_change_callback(callback, delay_ms) instead of the old render() return value.
See the breaking changes note at the top of imgui_color_text_edit.pyi for a quick summary.
Breaking API changes (C++)
Same renames as Python (CamelCase). Additionally:
Render()parameter order changed:(title, size, border)instead of(title, border, size)Render()returnsvoidinstead ofbool
hello_imgui
- Add
emscriptenAllowBrowserZoomShortcutspreference: forward browser zoom shortcuts (Ctrl+/Ctrl-) to the browser, true by default - Add
ImageAndSizeFromEncodedDataandLoadImageDataFromEncodedDatafor loading images from in-memory encoded data IniFolderLocationon Emscripten: return""forCurrentFolder,"/"for othersLoadDefaultFont_WithFontAwesomeIcons: log a message if the icon font file is not found (instead of silently failing)- Skip
TearDownif it already ran at exit (e.g. if it threw an exception itself) - Suppress GCC false positive
-Wstringop-overflowin stb_image - Document theming API
Test Engine: interaction and screenshot tooling
New helpers for driving an ImGui app from Python (or C++) and capturing screenshots, useful for visual self-validation and automated testing.
- New
immapp.testingmodule: high-level helpers to interact with widgets and capture screenshots - Bind
imgui_capture_tool.hfor Python; addCaptureSetFilename HelloImGui::OpenglScreenshotRgb: report an explicit error if capture fails
ImmVision
- Fix colormap rendering for single-channel images
- Improve draw pixel values: better text contrast against background
- Fix zoom synchronization between linked views
- Polish overall look
- Add license file
Other library updates
- Updated ImCoolBar, ImGuizmo, ImAnim, nanovg, ImFileDialog, imgui_tex_inspect, md4c
Build & CI
- MSVC: add
/bigobjfor implot (fixes Windows ARM64 wheel build) - CMake: refuse in-source builds
- CI: add win64 wheels, bump cibuildwheel/pypi-publish/deploy-pages/upload-pages-artifact
- Fix ImGui StackLayout fractional-height alignment drift
Python bindings & API fixes
- Expose
TextFilter.input_bufproperty (#451) imgui_explorer: showim_anim.pyiin Python (#406)- Fix
get_style_color_vec4/color_convert_rgb_to_hsvbindings register_demos_assets_folder()helper- async runners: fix an issue where immapp.run_async could use 100% CPU (cf #460)
Documentation
- Developer docs: fork management, justfile workflows, bindings, Pyodide
- FAQ review, Nuitka compatibility docs
- Interactive explorable demos
Full Changelog: https://github.com/pthom/imgui_bundle/compare/v1.92.601...v1.92.700
- When OpenCV is available (`IMMVISION_HAS_OPENCV`), implicit conversion between `cv::Mat` and `ImageBuffer` is provided for zero‑copy interop.
- Python users experience no change; numpy arrays continue to be used via the removed `cvnp_nano` bridge.
- Removal of mandatory OpenCV dependency; all image processing reimplemented without it.
- Public API types changed: `cv::Mat` replaced by new core types (`ImageBuffer`, `Point`, `Point2d`, `Size`, `Matrix33d`).
- ImmDebug() now assumes RGB input; use ImmDebugBgr() for BGR images.
- GPU‑accelerated zoom/pan using texture sampling and ImGui DrawList with mipmap filtering.
- Colormap support for single‑channel integer images, multithreaded drawing/resizing, and inspector redesign (horizontal filmstrip).
Full changelog
ImmVision: OpenCV is now optional / use GPU rendering pipeline
ImmVision no longer requires OpenCV: this way the compilation and installation of the library is much faster, and the resulting binaries are smaller.
All image processing (color conversion, statistics, alpha blending, drawing annotations, zoom/pan transform, image saving) has been reimplemented without OpenCV dependencies.
- New core types:
ImageBuffer,Point,Point2d,Size,Matrix33dreplacecv::Matand OpenCV geometric types in all public APIs - Zero-copy interop: When OpenCV is available (
IMMVISION_HAS_OPENCV),cv::Matconverts seamlessly to/fromImageBuffervia implicit constructors - Python: No change for Python users — ImmVision continues to use numpy arrays (the
cvnp_nanobridge has been removed) - Drawing primitives: Custom bitmap font and Bresenham drawing replace OpenCV's
putText,line,ellipse,rectangle - Image saving: Uses
stb_image_write(PNG/JPG/BMP/TGA/HDR) instead ofcv::imwrite - Zoom/pan: Custom implementation with nearest, bilinear, and area-based downscaling
- ImmDebug API change:
ImmDebug()now assumes RGB (the common default); useImmDebugBgr()for OpenCV BGR images. Fixed per-image color order handling in the viewer. - Smaller wheels: ~16% size reduction across all platforms (45 MB total savings)
- Faster CI builds: 5–8 minutes faster per platform (no more OpenCV compilation)
- New features: colormap support for single-channel integer images, multithreaded pixel drawing/resize, fixed watched pixel delete button visibility
The ImmVision rendering pipeline has been rewritten to use GPU texture sampling and ImGui DrawList:
- GPU zoom/pan: Image uploaded to GPU texture once (with mipmaps); pan/zoom handled via UV coordinates — no more per-frame CPU warp
- Mipmap filtering:
GL_NEARESTat high zoom (pixel-perfect),GL_LINEARfor moderate zoom,GL_LINEAR_MIPMAP_LINEARfor downsampling (high-quality anti-aliasing) - DrawList annotations: Grid lines, pixel values, and watched pixel markers drawn via ImGui DrawList in screen space (TrueType font replaces bitmap font)
- DrawList backgrounds: School paper and alpha checkerboard rendered via DrawList (no longer composited into texture)
- Inspector redesign: Horizontal filmstrip with scrolling and adjustable thumbnail size replaces the old vertical listbox
- Other fixes: "Export colormap image" now available for uint8 images with colormap; save dialog remembers last directory
demo_imgui_bundle (aka "Dear ImGui Bundle Explorer")
- Display version and compilation time at startup (C++, emscripten and Python versions)
- Python demo code is also shown in the python version (when installed from Pypi)
hello_imgui
- Fix potential memory error in font handling (
_LoadFontImpl: pass font buffer allocated withIM_ALLOC) - Add
HelloImGui::LoadImageDataFromAsset()— decode an image from assets into CPU memory (C++ only) - Compile
imgui_impl_metal.mmandMetalNanoVGwith-fobjc-arc(fixes ARC bridge cast warnings) - Workaround plutovg
file(RELATIVE_PATH)error with relativeCMAKE_INSTALL_PREFIX(scikit-build-core)
Build & warnings cleanup
We are now at zero-warnings, on all CI / platforms and configs.
- CMake: fetch freetype & plutovg with
EXCLUDE_FROM_ALL - CMake: fix ImAnim exclusion when
IMGUI_BUNDLE_WITH_IMANIM_FULL_DEMOSis off - CMake:
ibd_add_this_folder_as_demos_librarynow linksdemo_utils(fixes GCC linker error) - CMake: suppress Apple ld duplicate library warnings
- CMake: suppress third-party warnings (ImAnim:
-Wno-unused-result,-Wno-nontrivial-memaccess; plutosvg:-Wno-deprecated-declarations) - CMake: normalize install path (
./lib/→lib) to fix CMP0177 warning - Fix
ImFileDialogu8pathdeprecation warning (C++20 compatibility) - Fix GCC
-Wformat-truncationwarning indemo_imgui_bundle_intro.cpp
Contributors
- Fix mouse click for pygame backend by @anhddo in https://github.com/pthom/imgui_bundle/pull/448
Full Changelog: https://github.com/pthom/imgui_bundle/compare/v1.92.600...v1.92.601
- implot: added `ImPlotSpec`, removed plot item styling
- implot3d: added `ImPlot3DSpec`
- Fixed shell injection vulnerability in BrowseToUrl by replacing `system()` with `fork+execlp`
- Dear ImGui Bundle Explorer renamed and now includes a carousel intro tab with 7 interactive slides
- New library ImAnim added for tweening and animation support in ImGui (Python via `with_im_anim=True`)
- Async Python runners (`run_async()`, `immapp.nb` module) and Pyodide Docker build system introduced
Full changelog
v1.92.600
Based on ImGui v1.92.6 & hello_imgui v1.92.6.
Dear ImGui Explorer
Dear ImGui Explorer (formerly "imgui_manual") has been rewritten from scratch and integrated into the Dear ImGui Bundle repository. It was previously a standalone project; Dear ImGui Bundle is now its parent repository.
It provides interactive manuals for ImGui, ImPlot, ImPlot3D, and ImAnim — with side-by-side C++/Python code, syntax highlighting, and search in API reference files (headers, Python stubs).
- Follow source: click on any demo widget to jump to its source code
- Search across API files with Ctrl+Shift+F
- Lazy-load demo code files (desktop and Emscripten)
- Deployed at pthom.github.io/imgui_explorer
Dear ImGui Bundle Explorer (formerly "ImGui Bundle Interactive Manual")
The interactive manual has been renamed to Dear ImGui Bundle Explorer and significantly enhanced:
- New intro tab with a carousel of 7 interactive slides showcasing the ecosystem
- Deployed at traineq.org/imgui_bundle_explorer
New library: ImAnim
Added ImAnim, a tweening and animation library for ImGui.
- Available via
immapp.run(..., with_im_anim=True)/ImmApp::AddOnParams::withImAnim - Python API adapted for
get_float,get_vec2,get_color, etc.
Updates to libraries
- Update imgui to v1.92.6-docking
- Update hello_imgui to v1.92.6
- Update implot to latest version (breaking change: added
ImPlotSpec, removed plot item styling) - Update implot3d to latest version (breaking change: added
ImPlot3DSpec) - Update ImGuiColorTextEdit: line numbers always visible in separate gutter, improved selection colors
- Update imgui_knobs: added
SetKnobColors,UnsetKnobColors, default color adapts to light/dark theme - Update imgui_md: render tables using ImGui tables (resizable columns), delay before showing link hrefs
Python: Async run and notebook support
- Added
hello_imgui.run_async()/immapp.run_async()for async/await support (with maximal performance). See doc for async - Added
immapp.nbmodule for non-blocking Jupyter notebook execution (nb.start(),nb.stop(),nb.is_running()). See doc for notebook - Added
hello_imgui.nbconvenience module
Pyodide (web) support
- Added Docker build system for Pyodide wheels
run()is fire-and-forget in Pyodide; userun_async()for awaitable behavior- CI workflow for Pyodide builds
- Pyodide wheels now exclude demo code to reduce size
Python bindings
- Added
em_size()andem_to_vec2()at root ofimgui_bundlefor DPI-independent sizing - Added
__getitem__/__setitem__(subscript[]) for ImVec2 and ImVec4 - Configurable wheel builds with selective module inclusion
- Fix: accept read-only numpy arrays (e.g. from pandas) in nanobind bindings
hello_imgui improvements
- Added
AddAssetsSearchPath()/ClearAssetsSearchPaths()/GetAssetsSearchPaths()for multi-folder asset resolution at runtime - Added
topMostwindow attribute - Added
iniDisableandiniClearPreviousSettingsparams - Added
FpsIdling::vsyncToMonitorandFpsIdling::fpsMaxsettings - Added
theme_changedcallback - Fix: ManualRender RunnerParams lifetime management
Build & CI
- Added ARM Linux (aarch64) wheel builds using native
ubuntu-24.04-armrunners - Reduced Emscripten .data sizes: demos only bundle the assets they actually need
- Deduplicated demo assets (removed ~1.1M of files duplicated between
assets/anddemos_assets/) - Emscripten: use GLFW3 backend by default instead of SDL2
- Fix: shell injection in BrowseToUrl (replaced
system()withfork+execlp)
Documentation
- Complete documentation overhaul using Jupyter Book, available as PDF
- Added developer documentation (building, bindings, repo structure)
Full Changelog: https://github.com/pthom/imgui_bundle/compare/v1.92.5...v1.92.600
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.