Skip to content

Full Python GUI apps in the browser

Developer Productivity

A 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.

Python Latest v1.92.801 · 21d ago Security brief →

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 →
No immediate action
v1.92.801 Bugfix

Version number fix

v1.92.800 Breaking risk
⚠ Upgrade required
  • 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.
Breaking changes
  • 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.
Notable features
  • 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

See release info for 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:

  1. Static type-check (recommended). Running mypy or pyright once
    after upgrading flags every call that passes a float literal where the
    new signature expects flags: int:
    Argument of type "float" cannot be assigned to parameter "flags" of type
    "ImDrawFlags" in function "add_rect"
    
  2. Runtime, float thickness. pybind11 refuses to convert float→int,
    so add_rect(..., flags=ALL, thickness=2.0) written in the old order
    raises TypeError immediately.
  3. Runtime, int thickness. When both arguments are ints (e.g.
    thickness=2), the swapped value lands in flags and trips ImGui's own
    guard (flags & ImDrawFlags_InvalidMask_) == 0, raising:
    RuntimeError: IM_ASSERT(... "Incorrect parameter. Did you swapped
    'thickness' and 'flags'?")
    
    The mask reserves bits 0-3 specifically to catch this swap: any small
    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 as nanobind::python_error
    on the engine's coroutine thread, hit std::terminate, and killed the process
    (taking remaining queued tests with it). Exceptions are now printed as a
    traceback, reported via ImGuiTestEngine_Error (test marked as TestStatus.error),
    and swallowed so the engine continues.
  • imgui_test_engine CrashHandler: install SA_RESETHAND on *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 Combo and ColorEdit inside the node editor canvas
    (three coords needed canvas→screen translation; the right guard is
    NextWindowData.HasFlags, not WindowFlags).
  • 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_size when 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's custom_background
    to upload textures produced from JS-side WebGL2RenderingContext.
    See pyodide_projects/projects/playground/examples for 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, and imgui_demo to 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.
v1.92.700 Breaking risk
⚠ Upgrade required
  • 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.
Breaking changes
  • 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()`.
Notable features
  • 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

See release info for 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 an OnHtmlSpan callback 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::Auto picks 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() returns void instead of bool

hello_imgui

  • Add emscriptenAllowBrowserZoomShortcuts preference: forward browser zoom shortcuts (Ctrl+/Ctrl-) to the browser, true by default
  • Add ImageAndSizeFromEncodedData and LoadImageDataFromEncodedData for loading images from in-memory encoded data
  • IniFolderLocation on Emscripten: return "" for CurrentFolder, "/" for others
  • LoadDefaultFont_WithFontAwesomeIcons: log a message if the icon font file is not found (instead of silently failing)
  • Skip TearDown if it already ran at exit (e.g. if it threw an exception itself)
  • Suppress GCC false positive -Wstringop-overflow in 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.testing module: high-level helpers to interact with widgets and capture screenshots
  • Bind imgui_capture_tool.h for Python; add CaptureSetFilename
  • 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 /bigobj for 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_buf property (#451)
  • imgui_explorer: show im_anim.pyi in Python (#406)
  • Fix get_style_color_vec4 / color_convert_rgb_to_hsv bindings
  • 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

v1.92.601 Breaking risk
⚠ Upgrade required
  • 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.
Breaking changes
  • 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.
Notable features
  • 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, Matrix33d replace cv::Mat and OpenCV geometric types in all public APIs
  • Zero-copy interop: When OpenCV is available (IMMVISION_HAS_OPENCV), cv::Mat converts seamlessly to/from ImageBuffer via implicit constructors
  • Python: No change for Python users — ImmVision continues to use numpy arrays (the cvnp_nano bridge 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 of cv::imwrite
  • Zoom/pan: Custom implementation with nearest, bilinear, and area-based downscaling
  • ImmDebug API change: ImmDebug() now assumes RGB (the common default); use ImmDebugBgr() 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_NEAREST at high zoom (pixel-perfect), GL_LINEAR for moderate zoom, GL_LINEAR_MIPMAP_LINEAR for 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 with IM_ALLOC)
  • Add HelloImGui::LoadImageDataFromAsset() — decode an image from assets into CPU memory (C++ only)
  • Compile imgui_impl_metal.mm and MetalNanoVG with -fobjc-arc (fixes ARC bridge cast warnings)
  • Workaround plutovg file(RELATIVE_PATH) error with relative CMAKE_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_DEMOS is off
  • CMake: ibd_add_this_folder_as_demos_library now links demo_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 ImFileDialog u8path deprecation warning (C++20 compatibility)
  • Fix GCC -Wformat-truncation warning in demo_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

v1.92.600 Breaking risk
Breaking changes
  • implot: added `ImPlotSpec`, removed plot item styling
  • implot3d: added `ImPlot3DSpec`
Security fixes
  • Fixed shell injection vulnerability in BrowseToUrl by replacing `system()` with `fork+execlp`
Notable features
  • 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 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.nb module for non-blocking Jupyter notebook execution (nb.start(), nb.stop(), nb.is_running()). See doc for notebook
  • Added hello_imgui.nb convenience module

Pyodide (web) support

  • Added Docker build system for Pyodide wheels
  • run() is fire-and-forget in Pyodide; use run_async() for awaitable behavior
  • CI workflow for Pyodide builds
  • Pyodide wheels now exclude demo code to reduce size

Python bindings

  • Added em_size() and em_to_vec2() at root of imgui_bundle for 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 topMost window attribute
  • Added iniDisable and iniClearPreviousSettings params
  • Added FpsIdling::vsyncToMonitor and FpsIdling::fpsMax settings
  • Added theme_changed callback
  • Fix: ManualRender RunnerParams lifetime management

Build & CI

  • Added ARM Linux (aarch64) wheel builds using native ubuntu-24.04-arm runners
  • Reduced Emscripten .data sizes: demos only bundle the assets they actually need
  • Deduplicated demo assets (removed ~1.1M of files duplicated between assets/ and demos_assets/)
  • Emscripten: use GLFW3 backend by default instead of SDL2
  • Fix: shell injection in BrowseToUrl (replaced system() with fork+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.

About

Stars
1,286
Forks
116
Languages
Python C++ Jupyter Notebook

Install & Platforms

Install via
pip
Platforms
windows macos linux arm64

Community & Support

Beta — feedback welcome: [email protected]