Changelog#

The format is based on Keep a Changelog.

[0.0.5] - 2026-09-22#

Changed#

  • Nested app.update() calls during an active Kit asyncio tick no longer dispatch any asyncio work, including plain callbacks, worker-thread wakeups and executor-completion callbacks. Synchronous waits such as while not future.done(): app.update() inside a task or callback must be migrated to await; otherwise they can stall indefinitely. Top-level application update loops are unchanged. See docs/USAGE_PYTHON.md.

  • Log a warning on the first suppressed nested tick in each outer tick, including with keep_loop_running=false.

Fixed#

  • Prevent recursive Kit run_once ticks when a task or callback calls app.update(). Keep queued work for the outer tick instead of dropping task wakeups or corrupting its ready-queue iteration. This does not make nested application updates safe for all subsystems; scripts should use asynchronous update waits. Nested asyncio.run(), loop.run_until_complete() and loop.run_forever() are not protected by this change. In particular, explicit same-loop reentry can still invalidate an outer ready-queue iteration. This is not a general asyncio reentrancy fix or a confirmed fix for NVBug 6783259’s native renderer crash.

[0.0.4] - 2026-09-02#

Added#

  • OMPE-92066: maxRunOnceTimeMs setting, an optional soft budget in milliseconds for the time spent spinning the event loop during one update, checked between iterations. Defaults to zero, which keeps spinning until no ready tasks remain.

[0.0.3] - 2025-06-02#

Fixed#

  • Changes to the async engine’s run monkey-patch implementation to handle situations where an exception is thrown inside a separate asyncio.run call that’s made inside the “top-level” run invocation.

[0.0.2] - 2025-04-07#

Fixed#

  • OMPE-28324: Removed an unused argument in a lambda function to avoid creating extra Python objects that just need to be garbage collected later.

[0.0.1] - 2024-07-09#

Changed#

  • Updated documentation with AI agent.