Skip to content

v0.21.0

Latest

Choose a tag to compare

@donghaoren donghaoren released this 01 Jun 16:35
· 8 commits to main since this release
23690a0

New features

  • PageRank-based image summarizer — cluster labels can now show a representative image instead of text. New --pagerank flag (computes PageRank from the neighbor graph, or accepts a precomputed column) and --image flag in the CLI; new image/importance options across the Python and JS APIs.
  • WebGPU acceleration for UMAP & NN-descent — opt-in gpu option runs the projection and nearest-neighbor descent on the GPU for large speedups in the browser, with WGSL shaders and CPU fallback. Both now also accept a progress callback.
  • Redesigned viewer UI — new sidebar, multiple layout tabs, undo/redo history, and a centralized state store. Adds an import/export panel and schema/search/settings panels.
  • UMAP options in the file loader — configure n_neighbors, min_dist, and related UMAP settings directly from the loader, plus minor usability improvements.
  • Python API improvements — widget now works with any narwhals-supported dataframe (pandas, Polars, etc.) rather than pandas only.
  • onPredicateChange callback — viewer notifies when the filter predicate changes from brush/click interactions.

Breaking changes

Component library (@embedding-atlas/component)

  • Label.text renamed to Label.content and retyped to LabelContent (a string or an image reference).
  • queryClusterLabels now returns Promise<(LabelContent | null)[]> instead of Promise<(string | null)[]> (strings still work at runtime).

Viewer API (EmbeddingAtlas)

  • EmbeddingAtlasState reshaped: layoutcurrentLayout, layoutStateslayouts (+ new layoutOrder); timestamp and predicate fields removed. Old serialized state won't fully restore.
  • Searcher.nearestNeighbors() method removed; nearest neighbors now come from the neighbors column.

umap-wasm (@embedding-atlas/umap-wasm)

  • UMAP.run() is now async (Promise<void>) — callers must await it.

Python backend (embedding-atlas)

  • EmbeddingAtlasWidget.selection("arrow") now returns a pyarrow.RecordBatchReader instead of a pyarrow.Table.
  • EmbeddingAtlasWidget.selection("dataframe") returns a dataframe in the input's native namespace (via narwhals), not always pandas.
  • utils.arrow_to_bytes() narrowed to accept only RecordBatchReader; to_parquet_bytes() takes IntoDataFrame.
  • Dependency bumps requiring a newer runtime: pandas >= 3.0.0, pyarrow >= 24.0.0, duckdb >= 1.5.0, sentence-transformers >= 5.0.0, and others; fastparquet dependency removed.

What's Changed

  • feat: PageRank-based image summarizer by @polochau in #192
  • feat: improve UMAP performance on browser with WebGPU by @donghaoren in #194
  • feat: configure UMAP options in the file loader, and minor usability improvements by @donghaoren in #196
  • feat: python API improvements by @domoritz in #197
  • refactor: cargo workspaces and fix clippy issues by @domoritz in #198
  • fix: prevent embedding view hover tooltip from getting stuck by @sheitabrk in #199
  • fix: update labels when provided after mount by @kiwigitops in #201
  • feat: new sidebar UI, tabs, undo, and centralized store by @donghaoren in #202
  • fix: treat low-cardinality float columns as continuous in legends by @adityasingh2400 in #200
  • chore: update deps and bump version to 0.21.0 by @donghaoren in #203

New Contributors

Full Changelog: v0.20.0...v0.21.0