Changelog
[Since 2.10.0 (2.11.0-rc1)] — 2026-09-24
Image transport (codec byte, tiled images, camera streams, JPEG export) · layout reconciliation by stable view id · granular background-image update · entity/control enable-disable-hide · EImageCodec enum + ImageFrameHeader header parsing
Perf: cached blade-name parsing · branch-free MV operator dispatch · Bug fixes: SDF Cylinder align_center=0.0 · same-scene pane reuse
→ Details
[Since 2.9.0 (2.10.0-rc1)] — 2026-09-24
GA-only conic/quadric API (geo(...) + op/join/meet/gp, dual, sp) · op/join/meet/gp sequence products · matrix-accepting Conic/Quadric3D (to_matrix()) · cone lift + geo(Translator) linear map · Hyperboloid/Paraboloid entities · conic/quadric intersection via analyze · @ operator applies a single-variable expression
Bug fixes: Expression.lstsq/svd null-space (full_matrices=True)
→ Details
[Since 2.9.0] — 2026-09-22
Calibrated pinhole camera views (PinholeCamera/CameraView, image background, 2D viewport navigation, per-pane visibility, Frustum) · Matrix/MatrixProvider/CoordinateFrame/OpenCVFrame/CameraCalibration coordinate-frame + calibration types · canonical-frame transform placement (quaternion Transform in pytanga.geometry, shape-only serialization, re-parameterized Frustum) · BOP T-LESS calibrated example
Bug fixes: data background image orientation · Circle center update
→ Details
[Since 2.8.1] — 2026-09-19
2D overlay coordinate system (CoordinateSystem(display_mode="overlay"): fixed screen-space axes frame + grid underlay, live viewer + HTML export) · configurable pan/zoom limits (pan_xlim/pan_ylim, min_zoom/max_zoom) · per-axis tick subdivision (x_intervals/y_intervals) with pixel-based density (min_tick_spacing_px)
→ Details
[Since 2.8.0] — 2026-09-18
Expression.compile() / AffineExpression.compile() fast repeated evaluation · automatic compiled fast path for fully-bound MV/scalar __call__ · multilinear AffineExpression.get_tensor() (rank 1+k, quadratic operators) · BladeMask.ids_outside · compile_fastpath.py + quadratic_get_tensor.py examples
→ Details
[Since 2.7.0] — 2026-09-18
BladeMask named bases (basis_vectors/basis_names/with_basis/basis_matrix, auto display basis, composed-name parsing, basis-aware union/intersection) · Expression.get_tensor() / AffineExpression.get_tensor() + MVTensor.get_array() (recombine tensors into named bases) · TwistBivector 6-DOF basis · per-algebra mask_for named bases
Bug fixes: mask_for now returns hard-coded full type masks (fixes partial-mask derivation, e.g. N2 Sphere/Circle/Inversion)
→ Details
[Since 2.6.0] — 2026-09-17
Expression / AffineExpression bind-to-subexpression composition (bind/__call__ accept an Expression binding value) · repeated occurrences substitute consistently · bind_subexpression.py example
→ Details
[Since 2.5.0] — 2026-09-17
Expression / AffineExpression project_onto (restrict an expression to a blade subspace) · module-level project_onto dispatcher · N3-only TwistBivector geometry operator · N3 Euclidean projection example
Bug fixes: AffineExpression.rename_var skips terms missing the variable · BladeMask(alg, []) now returns an empty mask
→ Details
[Since 2.4.1] — 2026-09-16
Detached scene-subtree insertion (viz.add(group) / viz.new(group) + Scene.add_subtree) · analyze_operator(expect=…) half-turn reflection coercion · named GA product functions (gp/ip/op/vp/nvp/sp/cp/acp/rc) on the expression system · expression variable renaming/unifying (bind(X=X) / rename_var / unify)
→ Details
[Since 2.4.0] — 2026-09-14
Bug fixes: left-mouse 3D orbit rotation restored (THREE.MOUSE.ROTATE is 0, which || null coerced to null, silently disabling left-drag rotation)
→ Details
[Since 2.3.0 (2.4.0-rc3)] — 2026-09-14
ImageCanvas display (numpy/PIL) with custom shaders + uniforms · DragBinding/ClickBinding handlers · rebindable camera controls · ActRectangle2D resize/translate · per-handler enable/disable + cursors
Docs: viz restructured into ui/ + image/ sections · new py/ga/quadric/ guide
→ Details
[Since 2.3.0 (2.4.0-rc2)] — 2026-09-13
py/tests ANN coverage ratcheted (existing code frozen with per-line # noqa: ANN…, new tests enforced) · star imports removed repo-wide (F403/F405 now enforced)
Bug fixes: solver_basics_01.py no longer fails its own paths disagree! check (floating-point tolerance comparison)
→ Details
[Since 2.3.0 (2.4.0-rc1)] — 2026-09-13
Full ty + ruff ANN type-hint coverage of py/pytanga and py/examples · both gates gating in pre-commit and CI · typing-and-annotations.md typing policy + handler-types docs · Q3 point tuples analyze to PointSet · new point_tuples_demo.py
Breaking: pytanga.viz.Handler removed (use ControlHandler / InteractionHandler) · one ControlEvent base + InteractionEvent hierarchy · interaction API typed instead of Any · Bug fixes: ReflectionPlane label frame · tempfile.mktemp · example Reflection(normal=…) / wireframe / DataArray bugs
→ Details
[Since 2.3.0] — 2026-09-12
Projective quadric space (BasisQ2/BasisQ3) · conic/quadric entities with analysis/creation · quadric-space rotation rotor · plane pairs · two-quadric intersection (plane-conics + sampled curves) · conic/curve renderers
Bug fixes: unbounded quartic intersection curves now reach the view box via analytic asymptotes
→ Details
[Since 2.2.0] — 2026-09-12
AffineExpression counting-axis reduction, broadcast, and linear solve (.lstsq()/.svd()/.inv()) · new affine_counting_reduction / affine_linear_solve examples
Bug fixes: serverless inline display (display_snapshot()/display_row) defaults to delivery="inline" (no CDN 404 on unpublished branches) · HDirection(x, y, z) construction · MV/Expression operator return types
→ Details
[Since 2.1.0] — 2026-09-10
Jupyter-scoped Visualizer singleton (one server + one scene host reused across cell re-runs) · named-scene re-run reset (viz.scene(name)) · PortConflictMode port-conflict resolution (CANCEL/AUTO/KILL/ASK)
Bug fixes: port re-bind on cell re-run · interactive.ipynb wireframe keyword · SIGTERM teardown
→ Details
[Since 2.0.0] — 2026-09-09
install_info() + hardened install_docs()/install_examples() · LogView/MessageView local-time timestamp formatting (show_date/show_utc_offset)
Bug fixes: animated HTML export froze on frame 0 (missing updateEntityMesh/removeEntityMesh on the viewer bridge) · exported "Loop" checkbox had no effect
→ Details
[Since 1.17.0 (2.0.0-rc4)] — 2026-09-08
Standalone HTML exports no longer inline UI control/view CSS (base + token shell only) · delivery="cdn" references the theme shell from jsDelivr
→ Details
[Since 1.17.0 (2.0.0-rc3)] — 2026-09-07
jsDelivr CDN bundle delivery (default) · delivery="inline" / "offline" options · committed js/tanga-viewer.js bundle + vendored offline assets with CI/pre-commit drift gates · column/custom table column types · per-control DOM factories moved to templates/controls/*.js
→ Details
[Since 1.17.0 (2.0.0-rc2)] — 2026-09-06
Configurable CSV delimiter & decimal separator in Table/TableView (auto-detected, overridable)
Bug fixes: SplitView fills flow containers · TableView shrinks to fit narrow panes · opaque sticky table headers · column resize grows the table · toolbar checkbox alignment
→ Details
[Since 1.17.0 (2.0.0-rc1)] — 2026-09-05
Native typed/editable TableView (column types & editors, JSON/CSV persistence, sorting, zoom/resize, row/column control) · per-scene space_dim + live 2D/3D switch · 2D camera stretch modes · fit_view2d label margins · client→server log channel · SdfCompose combine descriptor · unified transform arguments
Breaking: 2D camera uniform replaced by stretch
Bug fixes: split-pane 2D clipping, table editing/scrollbar/toolbar, versor factorization hang
→ Details
[Since 1.17.0] — 2026-09-03
Scene/layout/overlay model · control display views (LabelView/MarkdownView/LogView/SeparatorView/ToolbarView) · Expression.bind()/evaluate() · Transform.from_operator() · smooth SDF CSG
Breaking: add_* control facades, control_position, runtime value API, and the legacy controls_define path removed
Bug fixes: reflected MV ^ Variable / MV | Variable now build an Expression
→ Details
[Since 1.16.0 (1.17.0-rc3)] — 2026-09-02
DataArray binding & counting-axis reduction · RndMV random multivectors · Constant/fixed components in random generators · expression & tensor type hints
Breaking: Expression.__call__ accepts only MV/DataArray (legacy list/MVTensor/(array, specs) forms removed) · pytanga.random_mv removed
→ Details
[Since 1.16.0 (1.17.0-rc2)] — 2026-09-02
Flexible flow layout (gap/align/justify) · Size.fr(n) grows a child to fill leftover space · Python control size floors · SpacerView fills leftover flow space
Bug fixes: fixed split pane no longer locks unrelated splitters
→ Details
[Since 1.16.0 (1.17.0-rc1)] — 2026-09-02
FileChooserDialog file-open dialog (FileChooserView listing + path line + OK/Cancel) · dialog width/height + drag-to-resize corner
Breaking: FileChooserView no longer renders a path field or "Browse…" button
Bug fixes: menu bar renders horizontally, left-aligned · nested bar-menu submenus open downwards · file-chooser "Up" steps one level on every platform
→ Details
[Since 1.16.0] — 2026-09-02
Stacked +/- merge & single-stacked * composition · integer axis labels (AxisLabel) · integer variable-label pool · project_onto (MV / BladeMask) · constant Expression(A)
Breaking: MVLabeledTensor.labels is now structured · Variable.label is an integer · project_to removed
→ Details
[Since 1.15.0] — 2026-09-01
CSS theme system · runtime theme switching · themed exports & viewport background · user-provided themes (register_theme/copy_theme) · theme auto-reload
Bug fixes: group panel chrome is now token-driven (light/pastel themes render correctly)
→ Details
[Since 1.14.1] — 2026-09-01
Menu system (MenuView, add_menu, serialize_layout(overlay=...)) · dialogs (show_dialog/remove_dialog/clear_dialogs) · control variants (EControlVariant) · EAnchor enum · GroupView icon/icon_only chrome · unified control groups · single-layout scene serving with live overlay updates
Breaking: control groups are now GroupView overlays
→ Details
[Since 1.14.1] — 2026-09-01
Table undo/redo (Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y + undo_table/redo_table API) · spreadsheet-style keyboard editing · drag-to-select row deletion
Bug fixes: table cells editable again (double-click) · cell-edit coordinates preserved · 2D export camera recomputed on resize
→ Details
[Since 1.14.0] — 2026-09-01
2D fit_camera=True frames to the pane size (not the window) · unified ortho/aspect camera-fit math in one shared camera-fit.js
Bug fixes: split-view 2D scenes correctly aspected on first paint
→ Details
[Since 1.13.0] — 2026-09-01
ActSceneObject/ActPoint on_click handler · ideal-point drag-start & click position · zoom-aware 2D drag scale
Bug fixes: clear_controls() no longer wipes interaction handlers · stationary click no longer emits drag_end
→ Details
[Since 1.12.0] — 2026-08-31
Scrollable StackView/GroupView panes (scrollable=True + custom scrollbar) · horizontal-toolbar example
Breaking: banner on_close now receives the control value, not the banner id
Bug fixes: FileChooserView selected-path write-back & root= clamp · controls_define no longer wipes layout-view controls · banner button clicks dispatch
Refactor: unified (id, event) control/interaction registry · single control model · single event envelope & dispatch tail
→ Details
[Since 1.11.1] — 2026-08-31
Scene-scoped alert/confirm/update_control on VizSceneHandle · Visualizer.scene(add_axes=…, add_grid=…) · fit_view2d() camera helper · ActSceneObject.drag_anchor() ideal-drag hook
Breaking: deprecated Visualizer/VisualizerApp port/host/open_browser constructor params removed
Bug fixes: server lifecycle no longer corrupts global state · update_entity re-applies rotation & creation-only geometry · per-pane pointer interaction and 2D aspect ratio
→ Details
[Since 1.11.0] — 2026-08-30
Docs restructured to mirror the example topic layout: GA reference under docs/py/ga/ · viz docs regrouped into app/·entities/·plotting/·interaction/·labels/·styling/·sdf/ · new reference page for every declarative xxxView control
Bug fixes: update_label now works on entity refs with attached labels
→ Details
[Since 1.10.1] — 2026-08-30
Editable table control (add_table / TableView) with per-change async handlers · unified, tighter camera auto-fit shared by live viewer + HTML export
Bug fixes: standalone HTML export now renders KaTeX math labels
→ Details
[Since 1.10.0] — 2026-08-29
Searchable example docs gallery: every py/examples/ example gets a keyworded docs page (with full source) under a new top-level "Examples" nav section · dev/workflows/example-docs.md + cline rule
→ Details
[Since 1.9.1] — 2026-08-28
Wireframe dash-pattern and control View classes re-exported from pytanga.viz · viz docs/examples corrected to match the public API
→ Details
[Since 1.9.0] — 2026-08-28
Documentation fixes: Inversion(center=…, radius=…) example · precompiled-wheel binding list (seven bindings) · Geometry BasisXX-only restriction
Bug fixes: GeneralRotor label frame no longer dereferences a missing .rotor
→ Details
[Since 1.8.0] — 2026-08-27
In-place control value updates (set_control_value · set_control_view_value · control_update) · value-edit stepper control (add_value_edit / ValueEditView)
Breaking: control default field renamed to value (no alias kept)
→ Details
[Since 1.7.0] — 2026-08-27
New interactive controls (add_text_field · add_text_area · add_color_picker · add_checkbox) · button icons + icon model · control tooltips · reusable text editor (open_editor) · ActPoint drag-mode constraint
→ Details
[Since 1.6.0] — 2026-08-26
Extra visualization-only geometry entities (Disk/PartialDisk/Box/Ellipsoid/Ellipse/RegularPolygon) · mesh + SDF style classes and Three.js renderers · new partialDisk/regularPolygon SDF primitives · analytic SDF silhouette edge anti-aliasing (SdfStyle.antialias, off by default)
→ Details
[Since 1.5.0] — 2026-08-26
Awaitable flush (flush_async) + blocking flush(wait=True) · banners/dialogs (show_banner/alert/confirm, modal + per-scene) · compute offload to the user loop (submit_user/run_user) · slider on_press/on_release · file chooser with a backend-driven file browser
→ Details
[Since 1.4.0] — 2026-08-26
ActPoint drag lifecycle handlers (on_drag_start / on_drag_end) · ActPoint label support · clear(add_axes=, add_grid=) re-add options
Bug fixes: 2D pointer interaction (stale camera + orthographic drag scale) · removing an entity now removes its attached labels
→ Details
[Since 1.3.0] — 2026-08-25
WebGL2 SDF viewer (SdfVisualizer) · SDF primitive/combinator GLSL library · analytic entity→SDF serializer · SDF objects in the standard viewer (proxy renderer, Composed/SdfGroup, per-object CSG + materials) · SdfObject/Combine + ECompose operator object model · per-entity Sdf*Style classes · configurable lighting + grid/axes overlays
Bug fixes: inverted SDF rotations · patchy lighting normals · SDF browser connect/reconnect parity
→ Details
[Since 1.2.0] — 2026-08-25
Per-frame camera playback in animated HTML export · default 2D view now uses an orthographic camera · HTML export honors the live scene camera · viz examples reorganized into topic subfolders
Bug fixes: default 2D orthographic camera · HTML export applies the full camera config
→ Details
[Since 1.1.0] — 2026-08-25
CoordinateSystem inner data group (cs.data_group + to_data) · vline/hline/line/point annotation helpers (create-or-update by name + remove_*)
→ Details
[Since 1.0.1] — 2026-08-24
Split views (SplitView panes) · StackView + control views (SliderView/ButtonView/DropdownView) · multi-scene WebSocket subscription · per-pane scene cameras · viz-only Cylinder/Arc entities · CoordinateSystem plotting helper
Bug fixes: standalone HTML export no longer crashes on duplicate renderer helper declarations
→ Details
[Since 1.0.0] — 2026-08-24
VisualizerApp shutdown (opt-in Ctrl+Q + request_shutdown()) · PGA3/PGA2 dual/undual Hodge-star sign fixes · blade-name parsing sign fix (e31 → -e13)
Bug fixes: canonical bivector attributes on 3D-space bases
→ Details
[Since 0.13.0] — 2026-08-22
show() in Jupyter · idempotent display()/show() · scene context managers · animate(auto_clear=True) · viz(...) shorthand · viz docs restructure · multi-scene guide · browser full-server stop key · operator visualizations reworked
Breaking: animate() no longer opens the viewer · PGA2/PGA3 meet/join inverted (Gunn/Dorst) · e0_inv → e0_recip
→ Details
[Since 0.12.0] — 2026-08-21
Per-scene browser interrupt key (animate(stop_key=...), default q) · KeyModifier enum
Breaking: animate() no longer stops the server on loop exit (teardown moves to the atexit hook)
→ Details
[Since 0.11.0] — 2026-08-20
Variable/Expression symbolic layer · vectorized batch MV↔tensor conversion · expression inverse/lstsq/svd · AffineExpression · repeated-variable polynomial terms · geometry-derived variable masks · interruptible animation loops
Bug fixes: snapshot export default camera now matches the live view
→ Details
[Since 0.10.0] — 2026-08-20
Bug fixes: macOS (Apple Clang/libc++) wheel build fails with an ambiguous operator- — the generic multivector operator+/operator- templates are now SFINAE-constrained so they no longer clash with std iterator subtraction via ADL
→ Details
[Since 0.10.0] — 2026-08-19
meet operator · blade_join renamed to join (meet exposed as meet) · Windows MSVC auto-detection for JIT compile (no developer shell required)
Breaking: LabelStyle.along for Circle now (radius fraction, angle fraction × π) and for Sphere (radius fraction, two angle fractions × π)
Bug fixes: join no longer hangs on non-unit blades — projection now uses the conjugate-based pseudo-inverse conjugate(N) / IP(N, conjugate(N))
→ Details
[Since 0.10.0] — 2026-08-18
Consolidated display/export/serving API (show/wait/start_server/stop_server · export_snapshot/export_figure/export_glb · animation= keyword) · display_snapshot() · display_row(mode="static") · frontend version check
Breaking: open_figure() → open_snapshot(); Visualizer(port=..., host=...) deprecated in favor of start_server(...)
Bug fixes: display_static()/display_snapshot() renders via <iframe srcdoc> (no notebook style leakage) · frontend assets served with Cache-Control: no-cache · start_server()/show() default to port 8765 for reconnect
→ Details
[Since 0.9.2] — 2026-08-16
OPNS/IPNS flag on Algebra.opns · typed analyzers · MV-accepting constructors · Geometry.__call__ · random entity generators · macOS compilation + Apple Silicon wheels · extended algebra/MV operators · MV.prune(tol) · Color enum · entities-module split
Breaking: per-call opns removed · basis geometry methods removed
→ Details
[0.9.1] — 2026-08-14
Camera up decoupled · up config fields · screen-space fat lines (Line2)
→ Details
[0.9.0] — 2026-08-12
View2DConfig / ViewPlaneConfig · set_camera() · Axis / Grid / Axes2D / Axes3D · default axes+grid
Breaking: removed space_extent / show_grid / show_axes
Bug fixes: WebSocket backoff/reconnect · animated HTML export · add() returns str
→ Details
[0.8.0] — 2026-08-12
Interactive 3D manipulation · ActSceneObject / ActPoint · ActObjectStyle / ActPointStyle · set_interaction() / on_interaction() · DragMode
Breaking: Circle parameter order changed
→ Details
[0.5.3] — 2026-08-10
Circle.normal optional (defaults to +z)
Bug fixes: WebSocket startup/reconnect · 2D orthographic export · KaTeX titles · PointPath export renderer
→ Details
[0.5.2] — 2026-08-10
ControlEvent · get_label_ids() · flush(fit_camera=True)
Bug fixes: browser connection detection · GPU crash timeout · orbit target drift · sphere flicker · reflection_point.js renderer · add() returns str
→ Details