Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
0.5.0 - 2026-04-08¶
Added¶
- File download support in the embedded JupyterLab webview (notebook export, etc.) via QWebEngineProfile download hook with a save-file dialog
Fixed¶
- Server startup crash when
fps_nbconvertis installed — excludenbconvertmodule to avoid pulling in tornado/SSL
0.4.1 - 2026-04-05¶
Fixed¶
- Crash on macOS when creating a QWebEngineProfile — use the default profile instead of constructing a new one, which triggers a fatal assertion in Chromium's ProfileAdapter on Qt 6.10
0.4.0 - 2026-03-25¶
Added¶
- Kernel interrupt support (
interrupt_requesthandler) input()/ stdin support for interactive prompts- Non-blocking kernel dispatch (execute requests no longer block the Qt event loop)
- Auto-create python3 kernel spec so JupyterLab finds a kernel on all OSes, with fallback to user Jupyter data dir when
sys.prefixisn't writable
Fixed¶
- Server startup timeout now raises
TimeoutErrorinstead of silently proceeding - Server thread restores working directory after shutdown (
os.chdiris process-wide) - Bumped
PySide6>=6.8(6.5 segfaults on Python 3.12+) - Bumped
ipython>=8.14/>=9.2(Python 3.14 compatibility) -
Ci
install
libegl1on Linux, useQT_QPA_PLATFORM=offscreen, drop Python 3.15-dev - Resolved pre-existing ruff lint and ty type checker errors
0.3.1 - 2026-03-19¶
Fixed¶
NotImplementedError: Implement enable_gui in a subclasswhen switching matplotlib backends- All repository URLs now point to the SciQLop org instead of personal fork
0.3.0 - 2026-03-19¶
Added¶
- Rich display support:
display()calls producedisplay_dataiopub messages with base64-encoded binary MIME types - Matplotlib inline backend auto-activation with backend-aware flush hook (switching to Qt backend stops inline rendering from closing figures)
- Matplotlib Qt backend (
module://jupyqt.matplotlib.backend): native Qt figure windows with zoom/pan toolbar, created on the main thread viaMainThreadInvoker - ipywidgets/comm protocol support:
comm_open,comm_msg,comm_close,comm_info_requesthandlers enabling interactive widgets - Example apps and notebooks for matplotlib and ipywidgets
Fixed¶
- QtProxy now recursively wraps non-callable QObject attributes
- Matplotlib Qt backend lifecycle: proper Gcf cleanup on window close, guarded destroy() against deleted C++ objects
0.2.0 - 2026-03-19¶
Added¶
cwdparameter onEmbeddedJupyterto set the JupyterLab file browser root directory- Lazy server start —
start()only starts the kernel thread; the jupyverse server launches on firstwidget()oropen_in_browser()call
Fixed¶
- All ruff lint errors resolved across source and test files
- Release workflow only triggers on tag pushes (no more spurious failures)
- Documentation deployment added to release workflow
0.1.0 - 2026-03-18¶
Added¶
- Embed JupyterLab in PySide6 applications — no ipykernel, no ZMQ, no qasync
- Background-thread kernel with IPython InteractiveShell and asyncio event loop
- Jupyter wire protocol handler over anyio memory streams (execute, complete, inspect, is_complete, history, shutdown)
- jupyverse kernel plugin with FPS module integration
- Server launcher managing jupyverse lifecycle in a background thread
- QtProxy for safe cross-thread access to Qt objects from notebook cells
- JupyterLabWidget (QWebEngineView) with loading placeholder and ready signal
- EmbeddedJupyter public API:
push(),wrap_qt(),widget(),start(),shutdown() - Top-level
awaitsupport in notebook cells viarun_cell_async() - Minimal smoke test example (
examples/minimal_app.py) - Demo app with exposed UI widgets and pre-loaded notebook (
examples/demo_app.py)
Fixed¶
- All shell access (complete, inspect, is_complete) dispatched to kernel thread
- IPython completions wrapped in
provisionalcompleter()context manager