Skip to content

Releases: ckmah/milume

UI evidence PR #248

UI evidence PR #248 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Oct 19:41
c60bf3c

Auto-generated Playwright captures for PR review.

v2.0.0

Choose a tag to compare

@ckmah ckmah released this 22 Oct 19:35
b0c3e39

Breaking: no deprecation release.

Color is one trait

w.color = key is the only way to colour the points. key is an adata.obs column (categorical or numeric) or a packed gene. An unknown key raises milume.ColorKeyError (a KeyError); a gene that was not packed, or a category column with more than 128 levels, raises milume.ColorValueError (a ValueError). Nothing changes when it raises.

Migration:

1.3.x 2.0.0
w.set_color(adata.obs["cell_type"]) w.color = "cell_type"
w.set_color(gene_values, legend_title="APOB") w.color = "APOB"
w.set_color(values) for a computed array adata.obs["score"] = values; w.color = "score"
w.set_points(x, y, color=..., color_map=..., legend_title=..., continuous_range=...) w.set_points(x, y) then w.color = key
w.color_by removed; the internal mode is derived from w.color

Custom category colours still come from adata.uns["<column>_colors"].

One region reader

w.get_obs_names(region) is the only way to read cells in a region. region is required: a selection id from w.selections, or "focus" for the focused selection or category groups (empty when nothing is focused). It returns a pd.Index and raises KeyError for an unknown id. The adata argument is gone; the widget's own coordinates and obs_names are used.

Migration:

1.3.x 2.0.0
w.get_obs_names(adata, sel_id) / w.get_obs_names(selection_id=sel_id) w.get_obs_names(sel_id)
w.get_obs_names(adata, "missing") returned an empty array raises KeyError
w.get_obs_names() / selection_id="all" / None returned every cell adata.obs_names
w.get_focus_obs_names(adata) w.get_obs_names("focus")
w.assign_obs_mask(adata, key, sel_id) adata.obs[key] = adata.obs_names.isin(w.get_obs_names(sel_id))
result was a np.ndarray of str result is a pd.Index
a hidden selection returned no cells a hidden selection returns its cells (hiding only affects display)

Open, move and close the Inspect cube from Python

New: w.inspect_open opens and closes the Inspect cube without a click (needs a widget built from SpatialData with a 3D image).

w.inspect_cx, w.inspect_cy = 120.0, 140.0  # optional: with no window placed it opens at the volume centre
w.inspect_open = True                      # switches to Inspect and opens the cube there
w.inspect_cx = 150.0                       # moves the window and the open cube
w.inspect_open = False                     # closes it and exits Inspect, like Exit
  • Setting inspect_cx / inspect_cy now moves the map's window square too, not only the cube.
  • The default position is the volume centre: w.inspect_open = True with inspect_cx / inspect_cy still None opens the cube there.
  • inspect_open follows the browser: opening the cube there (a click) reads True; Esc or Exit reads False.
  • Behaviour change: one Esc in Inspect now closes the cube and leaves Inspect, back to the previous tool (Select if none), like Exit. It used to take two (close the cube, then leave), which left the widget in Inspect while inspect_open read False.
  • w.inspect_open = True without a 3D image raises ValueError.
  • volume and volume_cut join inspect_open in the public API.

Inspect cube: cell meshes from polygons

The Inspect cube draws each cell as a 3D mesh lofted in the browser from the store's per-slice cell polygons, instead of raycasting a label image. Default mesh opacity is 0.9.

Migration:

1.3.x 2.0.0
milume.peek(sdata, labels="cells") / LandmarksWidget(..., labels=) shapes="cell_boundaries_z" (a shapes element with cell_id and Z_um)
w.volume["labels_url"] w.volume["cells"] → {url, bytes} for the polygon parquet
w.volume_label_ids w.volume_cell_rows (base64 int32, one table row per polygon cell; −1 when the table has none)

Stores without per-slice cell polygons (e.g. Xenium / CosMx) open Inspect image-only, with no cells; 2D image plus polygon rendering is tracked in #122. With several 3D images, pass image= to pick one.

Inspect cube: cell meshes composited by depth

  • Cell meshes sit inside the image by depth instead of drawing over it (#228): image in front of a cell (DAPI above a cell wall) shows in front of it, image behind it shows through the cell's opacity. Per pixel, the nearest cell's front and back walls are drawn; cells behind them are hidden there. In MIP mode the meshes draw over the projection.
  • Default mesh fresnelMin is 0.35 (was 0.15); opacity stays 0.9.

Inspect minimap

  • The Inspect view has a minimap (#226 inspect-minimap-218). Click or drag on it to move the cube; the mouse wheel does nothing over it. It is lazy-loaded, so it costs nothing until Inspect opens.
  • The minimap's active region (the 2D viewport rectangle and the Inspect window square) is drawn with square corners; it no longer rounds to a near-circle when zoomed in (#232 minimap-square-region).

Merged pull requests (since v1.3.5)

  • #178 — docs: readable API reference for milume 1.3.5
  • #180 — Add Cloudflare Web Analytics beacon to Pages site
  • #181 — Fix landing beacon inject ignoring explicit empty token
  • #183 — Copy: spatial biology tagline + Star on GitHub navbar CTA
  • #184 / #185 — Copy: headline Explore spatial biology in your notebook + 3D subtitle
  • #186 — Docs: ROADMAP headline
  • #187 — Docs: Tools & modes index, page template, and Navigate page
  • #188 — Docs: Select regions page (Tools & modes)
  • #189 — Docs: Landmarks page (Tools & modes)
  • #190 — Docs: Color & layers page (Tools & modes)
  • #191 — Docs: Probe and Measure pages (Tools & modes)
  • #192 — Docs: Inspect in 3D page (Tools & modes)
  • #193 — Docs: fix related-tools card links; lychee link check on Pages build
  • #194 — Docs: Tools & modes visuals (Inspect points off, DOM callouts, cursor in loops)
  • #195 — Docs: Inspect loops with visible cursor (dark-only)
  • #196 / #198 — e2e: undo molab helper DOM on the shared worker page
  • #197 / #199 — fix(volume-cube): apply cube host resize without a frame of lag
  • #200 / #204 / #210 — e2e: trim slow Inspect cube gesture tests; Python-seed pan clamp, Save, Z-only cut
  • #201 — Docs: Inspect media with labels at the 0.4 default
  • #208 — Public-trait registry + w.color = key (breaking)
  • #211 — Breaking get_obs_names(region) -> pd.Index (breaking)
  • #213 — e2e: seed setup-only state from Python instead of gestures
  • #214 — Drop marimo/molab e2e tests and marimo verification rules
  • #216 — Add use-milume skill; generate API docs from _PUBLIC_TRAITS
  • #217 — Open, move and close the Inspect cube from Python (inspect_open)
  • #220 — Inspect: cell meshes from per-slice polygons replace the label image (breaking)
  • #222 — Docs site: Open Graph / Twitter link-preview tags + social card
  • #223 — Social card v3: active Inspect cube (Iso) with cell meshes on colon crypts
  • #228 — Inspect: composite cell meshes inside the image raycast by depth
  • #226 — Inspect: minimap overlay while the cube is open (#218)
  • #232 — Minimap: draw the active region with square corners

Full Changelog: v1.3.5...v2.0.0

UI evidence PR #224

UI evidence PR #224 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Oct 17:20
b0c3e39

Auto-generated Playwright captures for PR review.

v1.3.5

Choose a tag to compare

@ckmah ckmah released this 14 Oct 06:51
b31d711

What's Changed

  • docs(site): homepage trims and molab Server tip (#155) by @ckmah in #156
  • fix(landmarks): realistic lasso e2e gesture and fast-drag commit by @ckmah in #165
  • docs(demos): consistent molab Run on Server header in demos by @ckmah in #167
  • Typography: Cabin Sketch wordmark, IBM Plex Sans docs, JetBrains Mono code by @ckmah in #163
  • Landing hero: static points, camera-only motion by @ckmah in #164
  • Landing hero: halve point cloud density at bake by @ckmah in #169
  • Landing hero: port designer reference renderer by @ckmah in #171
  • Trim landing montage to remove empty caption pill by @ckmah in #175
  • Inspect: drop cut-outline toggle, always render opaque cell outlines by @ckmah in #173
  • Release v1.3.5 by @ckmah in #176

Full Changelog: v1.3.4...v1.3.5

v1.3.4

Choose a tag to compare

@ckmah ckmah released this 11 Oct 20:37
6d327ef

milume v1.3.4

Fixes

  • molab lasso (shadow DOM): on molab the widget renders inside a shadow root, where a spurious "pointer left the canvas" event cancelled lasso drags. Lasso now draws and commits, and page text is no longer selected during the drag. Also includes Inspect cube framing, Save snapshot stability, cube cut outlines on anisotropic spacing, and embed-menu repacking fixes. (#154, closes #146)

Reverted

  • Inspect URL mode (#149) merged by mistake and is reverted; streaming is parked until spatialdata can read remote stores (#157).

No public API changes.

Verified: the wheel (with frontend bundle) installs into a clean venv; milume.__version__ == "1.3.4", milume.peek builds a widget on a small AnnData and wraps in marimo.ui.anywidget; no URL-mode code in the package.

Full changelog: v1.3.3...v1.3.4

v1.3.3

Choose a tag to compare

@ckmah ckmah released this 11 Oct 11:21
3570252

milume v1.3.3

Fixes

  • molab lasso, selection highlight and off-center Inspect cube: on molab the widget is rendered inside a CSS-scaled iframe, and deck.gl's picking canvas swap on pointer-down was still read as the cursor leaving the map. Lasso drags now draw and select, selected cells are highlighted on the map, and the Inspect cube is centred. Resizing the cell or window no longer resets the zoom. (#150, closes #146)

CI and agent tooling

  • Agent run budgets, CI mergeable gate, marimo smoke tier, HF fixtures and CI-watch caps (#151).

No public API changes.

Verified: the wheel (with frontend bundle) installs into a clean venv; milume.__version__ == "1.3.3", milume.peek builds a widget on a small AnnData, and wraps in marimo.ui.anywidget.

Full changelog: v1.3.2...v1.3.3

UI evidence PR #157

UI evidence PR #157 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 20:30
383ed98

Auto-generated Playwright captures for PR review.

UI evidence PR #156

UI evidence PR #156 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 20:49
437bd74

Auto-generated Playwright captures for PR review.

UI evidence PR #154

UI evidence PR #154 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 20:17
b884d70

Auto-generated Playwright captures for PR review.

v1.3.2

Choose a tag to compare

@ckmah ckmah released this 10 Oct 20:27
308e4a3

milume v1.3.2

Fixes

  • Lasso selection on molab / marimo: deck.gl briefly swaps its picking canvas on pointer-down, which the widget took as the cursor leaving the map and cancelled the lasso. Lasso now works under marimo, with regression tests for lasso and line authoring. (#147, closes #146)
  • Coordinate units from metadata: default raster bin/window sizes now come from µm/pixel units in the dataset metadata first, falling back to the point-spacing heuristic only when metadata is silent. Pyxa/Xenium keep the 8 / 24 µm defaults. (#144, closes #110)

Inspect

  • Cut-face cell outlines: with a Z-cut or crop, the cut face shows thin contrasting outlines around cells; uncut rendering is unchanged. (#120, closes #117)

Docs and site

  • Docs site polish: API page, Quickstart, logo (#124, closes #116).
  • README hero shots with colon A2 landmarks (#133).
  • New tagline, "A thinking surface for spatial omics.", on the landing page, README and docs home (#145).

CI

  • On-demand UI evidence and fast e2e tier (#135), volume smoke on PRs with full suite on main/nightly (#136), trimmed duplicate volume e2e (#137). Closes #128.

No public API changes.

Verified: the wheel installs into a clean venv; milume.__version__ == "1.3.2", milume.peek builds a widget on a small AnnData, and wraps in marimo.ui.anywidget.

Full changelog: v1.3.1...v1.3.2