From ef6930b7d4546d3f49f286bb499e17c660cd705c Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 7 Jul 2026 18:46:43 +0200 Subject: [PATCH 1/2] feat: generated llms.txt for AI agents Add a Hugo LLMS output format that renders /llms.txt from the homepage package front matter, plus curated links to other major scverse packages and project resources. Also fix mudata's dead docs URL. Co-Authored-By: Claude Opus 4.8 (1M context) --- config.toml | 8 ++++++ content/_index.md | 2 +- content/packages/_index.md | 4 +-- layouts/index.llms.txt | 54 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 layouts/index.llms.txt diff --git a/config.toml b/config.toml index 6135cba3..360d6a76 100644 --- a/config.toml +++ b/config.toml @@ -8,3 +8,11 @@ description = "Foundational tools for omics data in the life sciences" [markup.goldmark.renderer] unsafe= true + +[outputs] +home = ["HTML", "RSS", "LLMS"] + +[outputFormats.LLMS] +mediaType = "text/plain" +baseName = "llms" +isPlainText = true diff --git a/content/_index.md b/content/_index.md index bdffb6c8..99e4dec5 100644 --- a/content/_index.md +++ b/content/_index.md @@ -12,7 +12,7 @@ description = "Foundational tools for single-cell omics data analysis" [[packages]] name = "mudata" description = "Multimodal data format" - url = "https://mudata.readthedocs.io/en/latest/" + url = "https://mudata.readthedocs.io/" [[packages]] name = "spatialdata" diff --git a/content/packages/_index.md b/content/packages/_index.md index c699cf6d..79d3cc0b 100644 --- a/content/packages/_index.md +++ b/content/packages/_index.md @@ -31,7 +31,7 @@ aliases = ["/projects/"] [[datastructures]] name = "mudata" description = "Multimodal data format" - url = "https://mudata.readthedocs.io/en/latest/" + url = "https://mudata.readthedocs.io/" img = "../img/libs/mudata_flat.svg" details = "MuData is a format for annotated multimodal datasets where each modality is represented by an AnnData object. MuData's reference implementation is in Python, and the cross-language functionality is achieved via HDF5-based .h5mu files with libraries in R and Julia." [[datastructures.links]] @@ -39,7 +39,7 @@ aliases = ["/projects/"] url = "https://github.com/scverse/mudata" [[datastructures.links]] text = "Documentation" - url = "https://mudata.readthedocs.io/en/latest/" + url = "https://mudata.readthedocs.io/" [[datastructures.links]] text = "PyPI" url = "https://pypi.org/project/mudata/" diff --git a/layouts/index.llms.txt b/layouts/index.llms.txt new file mode 100644 index 00000000..b3b6b442 --- /dev/null +++ b/layouts/index.llms.txt @@ -0,0 +1,54 @@ +# scverse + +> scverse is a consortium of foundational, interoperable open-source tools (mostly Python) for single-cell and spatial omics data analysis in the life sciences. + +scverse packages share common data structures (AnnData, MuData, SpatialData) to guarantee interoperability across the ecosystem. +Most package documentation lives on dedicated external sites, linked below. +This site (scverse.org) hosts the package index, tutorials, project governance, events, and the blog. + +## Core packages + +Foundational packages maintained by the scverse core team. +{{ range .Params.packages }} +- [{{ .name }}]({{ .url }}): {{ .description }} +{{- end }} + +## More packages + +Other major packages developed within the scverse GitHub organization. + +- [gget](https://scverse.org/gget/): Efficient querying of genomic reference databases. +- [PyDESeq2](https://pydeseq2.readthedocs.io/en/stable/): Python implementation of the DESeq2 pipeline for bulk RNA-seq differential expression analysis. +- [CellRank](https://cellrank.readthedocs.io/en/latest/): Cell fate and dynamics from multi-view single-cell data. +- [anndataR](https://anndataR.scverse.org): AnnData interoperability in R. +- [spatialdata-io](https://spatialdata.scverse.org/projects/io/en/latest/): Readers and converters for spatial omics formats into SpatialData. +- [napari-spatialdata](https://spatialdata.scverse.org/projects/napari/en/latest/): Interactive napari viewer for SpatialData. +- [spatialdata-plot](https://spatialdata.scverse.org/projects/plot/en/latest/): Static plotting for the SpatialData framework. +- [annbatch](https://annbatch.readthedocs.io): Minibatch loading for on-disk AnnData files, co-developed with Lamin Labs. +- [pytometry](https://pytometry.readthedocs.io/en/latest/): Flow and mass cytometry analytics. +- [rustar-aligner](https://scverse.org/rustar-aligner/): Rust implementation of the STAR RNA-seq aligner. +- [anndata-rs](https://scverse.org/anndata-rs/): Rust implementation of AnnData. + +## Learn +- [Tutorials]({{ absURL "learn/" }}): Getting-started tutorials for the core packages. +- [Package index]({{ absURL "packages/" }}): All core and ecosystem packages with links to docs, source, and distribution. +- [Single-cell best practices](https://www.sc-best-practices.org/): Community book on best practices for single-cell analysis. + +## About +- [Mission]({{ absURL "about/mission/" }}): What scverse is and why it exists. +- [Roles and governance]({{ absURL "about/roles/" }}): Core team, steering council, and how the project is run. +- [Code of conduct]({{ absURL "about/code_of_conduct/" }}): Community standards for participation. +- [AI policy]({{ absURL "about/ai_policy/" }}): Expectations for contributing AI-assisted code to scverse projects. + +## Community +- [GitHub](https://github.com/scverse): Source code for all scverse packages. +- [Discourse](https://discourse.scverse.org/): User forum for questions and discussion. +- [Zulip](https://scverse.zulipchat.com/): Developer chat. +- [Ecosystem packages](https://github.com/scverse/ecosystem-packages): Community packages built on scverse standards, and inclusion criteria. +- [cookiecutter-scverse](https://cookiecutter-scverse-instance.readthedocs.io/en/latest/): Project template for creating new scverse-compatible packages. + +## Optional +- [Blog]({{ absURL "blog/" }}): Announcements and release notes. +- [Events]({{ absURL "events/" }}): Conferences and hackathons. +- [People]({{ absURL "people/" }}): Contributors and core team. +- [YouTube](https://www.youtube.com/channel/UCpsvsIAW3R5OdftJKKuLNMA): Recorded talks and workshops. From 1cef6d9c859da50b2d946b36acc877e27a05e47e Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 11:01:17 +0200 Subject: [PATCH 2/2] Derive the More packages list from the registry The section was hand-maintained with a note that new packages need a manual line. It now comes from registry entries whose project_home is in the scverse organisation, minus the core packages listed above it and minus core-infrastructure, which is the org's own repos rather than packages. No package name is written by hand in the template any more. What is left is site pages, the forums and the YouTube channel, none of which have a registry to read. This shrinks the section from eleven entries to two, because eight of the eleven are absent from the ecosystem registry: gget, spatialdata-io, napari-spatialdata, spatialdata-plot, annbatch, pytometry, rustar-aligner and anndata-rs. They are missing from the package index and from site search too, so the hand-written list was hiding that rather than fixing it. Adding them to the registry restores them here automatically. --- layouts/index.llms.txt | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/layouts/index.llms.txt b/layouts/index.llms.txt index ac05f523..e906becc 100644 --- a/layouts/index.llms.txt +++ b/layouts/index.llms.txt @@ -12,8 +12,15 @@ Foundational packages maintained by the scverse core team. {{- $registryBase := "https://scverse.org/ecosystem-packages/" }} {{- $pkgs := transform.Unmarshal (resources.GetRemote (printf "%spackages.json" $registryBase)).Content }} {{- $core := slice }} -{{- range where $pkgs "category" "in" (slice "core-datastructure" "core-framework") }} - {{- $core = $core | append (merge . (dict "sortkey" (lower .name))) }} +{{- $org := slice }} +{{- range $pkgs }} + {{- $entry := merge . (dict "sortkey" (lower .name)) }} + {{- if in (slice "core-datastructure" "core-framework") .category }} + {{- $core = $core | append $entry }} + {{- else if and (in (.project_home | default "") "github.com/scverse/") (ne .category "core-infrastructure") }} + {{- /* core-infrastructure is the scverse repos themselves, not packages. */}} + {{- $org = $org | append $entry }} + {{- end }} {{- end }} {{ range sort $core "sortkey" }} {{- /* Registry descriptions carry markdown and hard line breaks; llms.txt wants one line each. */}} @@ -23,19 +30,12 @@ Foundational packages maintained by the scverse core team. ## More packages -Other major packages developed within the scverse GitHub organization. - -- [gget](https://scverse.org/gget/): Efficient querying of genomic reference databases. -- [PyDESeq2](https://pydeseq2.readthedocs.io/en/stable/): Python implementation of the DESeq2 pipeline for bulk RNA-seq differential expression analysis. -- [CellRank](https://cellrank.readthedocs.io/en/latest/): Cell fate and dynamics from multi-view single-cell data. -- [anndataR](https://anndataR.scverse.org): AnnData interoperability in R. -- [spatialdata-io](https://spatialdata.scverse.org/projects/io/en/latest/): Readers and converters for spatial omics formats into SpatialData. -- [napari-spatialdata](https://spatialdata.scverse.org/projects/napari/en/latest/): Interactive napari viewer for SpatialData. -- [spatialdata-plot](https://spatialdata.scverse.org/projects/plot/en/latest/): Static plotting for the SpatialData framework. -- [annbatch](https://annbatch.readthedocs.io): Minibatch loading for on-disk AnnData files, co-developed with Lamin Labs. -- [pytometry](https://pytometry.readthedocs.io/en/latest/): Flow and mass cytometry analytics. -- [rustar-aligner](https://scverse.org/rustar-aligner/): Rust implementation of the STAR RNA-seq aligner. -- [anndata-rs](https://scverse.org/anndata-rs/): Rust implementation of AnnData. +Other packages maintained in the scverse GitHub organization. The full index, including +community packages built on scverse standards, is at {{ absURL "packages/" }}. +{{ range sort $org "sortkey" }} +{{- $desc := trim (.description | markdownify | plainify | htmlUnescape | replaceRE `\s+` " ") " " }} +- [{{ .name }}]({{ .documentation_home | default .project_home }}): {{ $desc }} +{{- end }} ## Learn - [Tutorials]({{ absURL "learn/" }}): Getting-started tutorials for the core packages.