Troubleshooting¶
A symptom → cause → fix table for the errors STELLAR users hit most often. Each entry shows the error line you'll actually see, what's causing it, and the exact command or config snippet that resolves it.
If your problem isn't here, run stellar doctor first — it catches
the majority of misconfigurations before they reach uvicorn.
Input / config errors¶
FileNotFoundError: Seurat .rds not found or h5ad not found¶
Symptom
or
Cause — input.matrices[*].path in stellar.yaml points at a file
that doesn't exist relative to the project root (the directory
containing stellar.yaml).
Fix — check the path and run stellar doctor:
stellar doctor --config stellar.yaml
# ✗ [input.matrices.primary] input matrix not found: /abs/path/data/raw/my.h5ad
Either move the file into place or update the config:
input:
matrices:
- name: primary
path: data/raw/correct_name.h5ad # relative to stellar.yaml
role: primary
cohort.cell_type_column='cell_type' not in obs¶
Symptom
✗ [input.matrices.primary] cohort.cell_type_column='cell_type' not in obs;
available cols: ['CellType', 'donor', 'condition_raw', ...]…
Cause — your h5ad's obs has the column under a different name
than stellar.yaml declares.
Fix — point stellar.yaml at the actual column. No need to rename
columns in the h5ad:
cohort:
cell_type_column: CellType # match what's in obs
condition_column: condition_raw
donor_column: donor
Re-run stellar doctor; once it's clean, run stellar ingest.
Rscript is not on PATH¶
Symptom
stellar.core.io.seurat.SeuratConversionError: `Rscript` not on PATH.
Install R 4.x to enable Seurat inputs. See docs/recipes/from_seurat.md.
Cause — your input.matrices[*].path ends in .rds, but the
machine running stellar ingest doesn't have R installed.
Fix — install R and either SeuratDisk or sceasy:
# Debian / Ubuntu
sudo apt install r-base
# Inside R
install.packages("remotes")
remotes::install_github("mojaveazure/seurat-disk")
# OR
remotes::install_github("cellgeni/sceasy")
Verify:
The full Seurat-input recipe lives at
recipes/from_seurat.md.
Need either SeuratDisk or sceasy installed in R¶
Symptom
SeuratConversionError: Rscript exited 1 ...
--- stderr ---
Error: Need either SeuratDisk or sceasy installed in R.
Cause — R is on PATH but neither converter package is installed.
Fix — inside R, install one:
If both are installed, SeuratDisk wins automatically (it's the lossless path).
readRDS produced a SingleCellExperiment object — expected Seurat¶
Cause — your .rds is a SingleCellExperiment, not a Seurat object.
Fix — convert on the R side first:
sce <- readRDS("my.rds")
seurat_obj <- Seurat::as.Seurat(sce, counts = "counts", data = "logcounts")
saveRDS(seurat_obj, "my_as_seurat.rds")
…then point stellar.yaml at my_as_seurat.rds.
Build / runtime errors¶
no built atlas yet — run stellar ingest¶
Symptom
stellar doctor:
⚠ [artifacts] no built atlas yet — run `stellar ingest` to create
/abs/path/data/atlas.duckdb
…or, at serve time:
Cause — stellar serve was called before stellar ingest.
Fix
<name>.h5ad is newer than the built DuckDB¶
Symptom — stellar doctor warns:
Cause — you edited the h5ad (or its .rds source) after the last
ingest; the on-disk DuckDB + Lance stores are stale.
Fix
The build is idempotent — it drops and recreates the stores.
ImportError: cannot import name 'lance' / Lance ImportError¶
Symptom
or
Cause — you installed the wrong package on PyPI: there's both a
lance (unrelated) and a
pylance (the real LanceDB
storage layer that imports as lance). STELLAR's pyproject.toml
pins pylance>=0.21 — if you've installed lance directly it will
shadow pylance.
Fix
lance.list_tables() error / opening Lance table fails¶
Symptom
Cause — the Lance directory under data/lance/ is missing or
corrupt — usually because the last stellar ingest was interrupted
before completing.
Fix — re-run ingest. It overwrites in place:
LanceDB / DuckDB version mismatch on import¶
Symptom
or
duckdb.IOException: Trying to read a database file with version number 67,
but we can only read version 64.
Cause — you upgraded lancedb / duckdb after building the stores,
and the on-disk format moved forward (or vice-versa: you downgraded).
Fix — rebuild the stores against the installed library versions:
Copilot module errors¶
ANTHROPIC_API_KEY not configured¶
Symptom — POST /api/copilot/ask returns HTTP 503:
Cause — the copilot module is enabled but the Anthropic key is
neither in the environment nor in <project_root>/.env.
Fix — either set the env var:
…or drop it into <project_root>/.env (the file is parsed by the
copilot route at request time):
If you've named the env var something other than ANTHROPIC_API_KEY,
match it in stellar.yaml:
anthropic SDK not installed¶
Symptom
Cause — modules.copilot.enabled: true is set but the optional
copilot extra wasn't installed.
Fix
Or, if you don't need the copilot, set
modules.copilot.enabled: false in stellar.yaml.
Copilot literature returns 400¶
Symptom
Cause — the request set include_literature: true but the project
didn't opt in.
Fix — enable literature for the project:
modules:
copilot:
enabled: true
literature:
enabled: true
scope:
diseases: [] # [] = no disease filter
techniques: [single-cell, snRNA-seq, scRNA-seq, single-nucleus]
min_year: 2018
Restart the serve process; the tool will be registered with the configured scope.
Enrichment module errors¶
503 from /api/enrichment when EnrichR is down¶
Symptom — the Enrichment tab shows an inline error banner; under the hood the route returned HTTP 503 with a message like:
Cause — the EnrichR public API at maayanlab.cloud is
unreachable: network outage, EnrichR maintenance, or the host running
stellar serve doesn't have outbound HTTPS access.
Fix
- Check EnrichR's status:
curl -sI https://maayanlab.cloud/Enrichr/ - Confirm outbound access from the server (firewall, proxy).
- If you need to run fully offline, set
modules.enrichment.enabled: false; the SPA hides the tab and the copilot drops theenrich_genestool automatically.
The route caches identical (genes × libraries) requests in-process for 1 hour, so a transient blip is tolerated for repeat clicks.
Tests / development¶
tests/test_seurat_io ImportError on a CI box¶
Symptom
Cause — the Seurat test exercises the subprocess path to Rscript.
On a box without R the test is skipped (it doesn't import any
R-side Python deps), so any ImportError here points at a missing
Python test dep, not R.
Fix — install the dev extra:
You do NOT need [copilot] — Seurat conversion has no Python deps
beyond what's already in the base install.
mkdocs build --strict fails¶
Symptom — a WARNING line gets promoted to a fatal error under
--strict:
Cause — broken relative link, missing nav entry, or an mkdocstrings
... directive pointing at a Python symbol that doesn't exist.
Fix — fix the link / symbol path. If you've added a new doc page,
add it to mkdocs.yml's nav: block too — --strict complains
about un-navved pages.
When in doubt — stellar doctor¶
Almost every config / data error STELLAR can detect surfaces from
stellar doctor:
It's safe to run anytime. If doctor returns exit code 0 and your
problem persists, it's likely a runtime issue (network, key, R) — work
back through the sections above.