See every cell. Query any gene. Fly through millions. Zero friction.
GPU-powered atlas viewer with real-time filtering, velocity overlays, and collaborative community annotation.
Live: cellucid.com
- Real-time rendering of millions of cells with adaptive LOD
- Gene expression overlays with efficient sparse matrix handling
- Categorical and continuous cell metadata coloring
- Interactive filtering and cell selection
- Community annotation voting (π³οΈ) with optional GitHub sync (GitHub App)
- KNN connectivity edge visualization
- Multi-dimensional support (1D timelines, 2D, 3D)
- Animated vector field overlay (velocity / drift) with GPU particle flow
- Publication export: SVG (vector) + PNG (high-DPI)
- Works in browser without Python (file picker) or with Python (Jupyter, CLI)
- Go to cellucid.com
- Click "Browse local data..."
- Select a pre-exported folder,
.h5adfile, or.zarrstore
pip install cellucid
# Serve any data (format auto-detected)
cellucid serve /path/to/data.h5ad
cellucid serve /path/to/data.zarr
cellucid serve ./my_exportfrom cellucid import show_anndata
show_anndata(adata) # In-memory or file pathUse the Figure Export accordion in the sidebar to export the current view:
- SVG: best for Illustrator/Inkscape editing; for large datasets youβll be prompted to choose Full Vector, Optimized Vector (density-preserving), or Hybrid (points raster + vector annotations).
- PNG: best compatibility; choose DPI (150/300/600).
- Axes: only rendered for 2D planar views (switch navigation to Planar) to avoid misleading axes on 3D projections.
- Enable per-field voting: right-click the categorical field dropdown β βEnable community annotationβ.
- Open Community Annotation accordion to sign in with GitHub, select an installed repo, and
Pull/Publishvotes/suggestions. - Annotation repo template:
cellucid-annotation/README.md. - Detailed repo + auth setup:
cellucid/assets/js/app/community-annotations/REPO_SETUP.md.
Cellucid supports 6 deployment modes, each with support for pre-exported binary data, h5ad files, and zarr stores:
| # | Method | Exported | h5ad | zarr | Python | Lazy Load | Performance |
|---|---|---|---|---|---|---|---|
| 1 | Local Demo (GitHub) | β | - | - | No* | Yes | Best |
| 2 | Remote Demo (GitHub) | β | - | - | No* | Yes | Best |
| 3 | Browser File Picker | β | - | - | No | Yes | Best |
| 4 | Browser File Picker | - | β | - | No | No | Slower |
| 5 | Browser File Picker | - | - | β | No | No | Slower |
| 6 | Server CLI | β | - | - | Yes | Yes | Best |
| 7 | Server CLI | - | β | β | Yes | Yes | Good |
| 8 | Python serve() | β | - | - | Yes | Yes | Best |
| 9 | Python serve_anndata() | - | β | β | Yes | Yes | Good |
| 10 | Jupyter show() | β | - | - | Yes | Yes | Best |
| 11 | Jupyter show_anndata() | - | β | β | Yes | Yes | Good |
* Python required for initial export, not for viewing
Summary by method:
| Method | Exported | h5ad | zarr | Total |
|---|---|---|---|---|
| Local/Remote Demo | β | - | - | 2 |
| Browser File Picker | β | β | β | 3 |
| Server CLI | β | β | β | 3 |
| Python serve | β | β | β | 3 |
| Jupyter | β | β | β | 3 |
| Total | 14 |
- Browser h5ad/zarr (Options 4-5): Entire file loaded into browser memory - no lazy loading possible due to JavaScript limitations. Best for datasets < 100k cells.
- Python h5ad/zarr modes (Options 7, 9, 11): True lazy loading via AnnData backed mode (h5ad) or zarr's native chunked access. Recommended for large datasets.
- Pre-exported data: Always fastest - recommended for production and sharing.
- zarr stores: Can be a directory (.zarr) or a file - the Python server auto-detects the format.
- Required:
obsm['X_umap']orobsm['X_umap_3d'](shape: n_cells Γ 2 or 3) - Optional:
obs(cell metadata),X(expression matrix),obsp['connectivities'](KNN graph)
Cellucid can render an animated particle-flow overlay from per-cell displacement vectors (e.g. scVelo velocity, CellRank drift).
- AnnData: store vectors in
adata.obsmusing keys likevelocity_umap_2d,velocity_umap_3d,T_fwd_umap_2d, etc. (shape: n_cells Γ dim). - Prepared exports: include binary vector files under
vectors/and avector_fieldsblock indataset_identity.json.
Naming/import details: VECTOR_FIELD_OVERLAY_CONVENTIONS.md
# Save AnnData as zarr store
adata.write_zarr("data.zarr")For best performance, especially with large datasets:
from cellucid import prepare
prepare(adata, output_dir="./my_export", compress=True)cellucid/
βββ index.html # Single-page app
βββ assets/
β βββ css/ # CSS design system (tokens/themes/utilities/components)
β βββ js/
β β βββ app/ # UI, state management
β β βββ data/ # Data loaders (binary, h5ad)
β β βββ rendering/ # WebGL renderer
βββ scripts/ # Dev/validation scripts
βββ types/ # Editor-only type defs (design tokens)
Sample datasets (prepared exports) live in a separate repo/site:
cellucid-datasets/
βββ exports/ # Static exports (datasets.json + dataset folders)
βββ bridge.html # CORS-free fetch bridge (GitHub Pages)
βββ bridge.js
- Entry point:
assets/css/main.css(layered: tokens β themes β base β utilities β components β layouts) - Documentation:
assets/css/README.md - Validate token usage:
node scripts/validate-tokens.js - Validate token types sync:
node scripts/validate-token-types.js - Themes:
light(default) anddarkonly (set via the Theme dropdown)
python -m http.server 8000
open http://localhost:8000See theislab/cellucid-python for the companion Python package.
- Contributing: CONTRIBUTING.md
- Code of Conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
- Support: SUPPORT.md
- Citation: CITATION.cff
BSD 3-Clause License - see LICENSE for details.