Repository navigation
Releases: ckmah/milume
Release list
UI evidence PR #248
Auto-generated Playwright captures for PR review.
v2.0.0
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_cynow moves the map's window square too, not only the cube. - The default position is the volume centre:
w.inspect_open = Truewithinspect_cx/inspect_cystillNoneopens the cube there. inspect_openfollows the browser: opening the cube there (a click) readsTrue; Esc or Exit readsFalse.- 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_openreadFalse. w.inspect_open = Truewithout a 3D image raisesValueError.volumeandvolume_cutjoininspect_openin 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
fresnelMinis 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
Auto-generated Playwright captures for PR review.
v1.3.5
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
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
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
Auto-generated Playwright captures for PR review.
UI evidence PR #156
Auto-generated Playwright captures for PR review.
UI evidence PR #154
Auto-generated Playwright captures for PR review.
v1.3.2
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