Skip to content

SpatialScribe

SpatialScribe is a self-serve copilot for imaging-based spatial transcriptomics (Xenium, CosMx, MERSCOPE, and whole-transcriptome Atera).

Core trick

Computes a 0-1 Annotation Quality Index and abstains on cell types the panel's gene count cannot resolve.

Tags

Description

SpatialScribe is a self-serve copilot for imaging-based spatial transcriptomics (Xenium, CosMx, MERSCOPE, and whole-transcriptome Atera). A wet-lab scientist points it at a raw run folder and gets back a QC'd, annotated, spatially-explored tissue map plus a re-runnable report - in plain language, with no terminal, no R, and no waiting for a bioinformatician. It's a React + FastAPI + deck.gl app over a single shared analysis engine of 40 capabilities, drivable four ways: guided rails, one click ("Run full analysis"), one headless command, or a grounded Claude copilot that runs the real analysis and can recolour the map, subcluster a population, or load a whole new section from plain English. The thesis is honesty. Most tools label every cell. SpatialScribe refuses to: it abstains when the evidence isn't there, tells you up front which cell types your panel can and cannot resolve, and reports one 0-1 Annotation Quality Index. Three findings I didn't expect: A low "confidently typable" score is usually a DEPTH verdict, not a panel defect. On the bundled 5K-panel section, restricting to the panel's genes costs 1 of 10 cell types; thinning to the section's real ~50 counts/cell costs 5. Buying a bigger panel would not have helped. Reference agreement is not annotation quality. Transferring a lab's own 28-type skin reference lifted agreement with their existing RCTD from 0.23 to 0.70 while the quality index collapsed from 0.22 to 0.01 - those fine types simply aren't separable on a 495-gene panel. Coarsening the reference first buys both (agreement 0.65-0.75, AQI 0.28). Per-cell confidence heuristics barely rank correct cells (within-type AUC ~0.54, near a coin flip). Only cross-method ensemble agreement does (~0.77). So the app declares which regime it's in instead of pretending its greying is trustworthy. Why it matters: spatial runs are piling up far faster than bioinformaticians can read them, and the failure mode that actually hurts a biologist is a confident wrong label. The quality index is validated against expert ground truth (Spearman ~0.78, 95% CI 0.66-0.86, across 11 sections and 5 tissues) - and it is an index, explicitly not a probability of being correct.
p-gueguen/spatial-scribe★ 60 forksPythonMITCreated Jul 12, 2026 · last push Oct 5, 2026

README excerpt

# SpatialScribe

**A fast, self-serve spatial-transcriptomics analysis copilot for wet-lab scientists.**

You ran a Xenium (or CosMx / MERSCOPE) experiment and got your data back. SpatialScribe takes
you from raw output to annotated cell types, spatial insight, and a shareable report - in plain
language, without a terminal or R, and without waiting for a bioinformatician. Built for the
[Built with Claude: Life Sciences](https://cerebralvalley.ai/e/built-with-claude-life-sciences)
hackathon.

<p align="center">
  <img src="docs/demo.gif" alt="SpatialScribe: load a section, cluster, annotate, and hover a cell type to light it up across the tissue" width="820">
</p>

<p align="center"><em>Load a section, run the analysis, then hover a cell type - those cells light up across the tissue.</em></p>

## What it does

A three-pane web app (React + FastAPI + deck.gl) over one shared analysis engine:

- **Guided rails** - a wizard walks you through Load -> Panel check -> QC -> Cluster -> Annotate ->
  Spatial exploration -> Report, with smart defaults and a plain-language explanation (and the exact
  code) at every step.
- **One-click full run** - or skip the wizard: **Run full analysis** runs the whole spine as one
  background job and opens a fully-analyzed section.
- **Interactive spatial canvas** - box-select a region to QC it or exclude it; click a cell type
  to subcluster it into subtypes; **hover a cell type to highlight where it sits in the tissue**.
- **Claude copilot** - ask 

Team