New features
- PageRank-based image summarizer — cluster labels can now show a representative image instead of text. New
--pagerankflag (computes PageRank from the neighbor graph, or accepts a precomputed column) and--imageflag in the CLI; newimage/importanceoptions across the Python and JS APIs. - WebGPU acceleration for UMAP & NN-descent — opt-in
gpuoption 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 aprogresscallback. - 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.
onPredicateChangecallback — viewer notifies when the filter predicate changes from brush/click interactions.
Breaking changes
Component library (@embedding-atlas/component)
Label.textrenamed toLabel.contentand retyped toLabelContent(a string or an image reference).queryClusterLabelsnow returnsPromise<(LabelContent | null)[]>instead ofPromise<(string | null)[]>(strings still work at runtime).
Viewer API (EmbeddingAtlas)
EmbeddingAtlasStatereshaped:layout→currentLayout,layoutStates→layouts(+ newlayoutOrder);timestampandpredicatefields removed. Old serialized state won't fully restore.Searcher.nearestNeighbors()method removed; nearest neighbors now come from theneighborscolumn.
umap-wasm (@embedding-atlas/umap-wasm)
UMAP.run()is now async (Promise<void>) — callers mustawaitit.
Python backend (embedding-atlas)
EmbeddingAtlasWidget.selection("arrow")now returns apyarrow.RecordBatchReaderinstead of apyarrow.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 onlyRecordBatchReader;to_parquet_bytes()takesIntoDataFrame.- 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;
fastparquetdependency 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
- @polochau made their first contribution in #192
- @sheitabrk made their first contribution in #199
- @kiwigitops made their first contribution in #201
- @adityasingh2400 made their first contribution in #200
Full Changelog: v0.20.0...v0.21.0