diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 04f8b552..a82c9768 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -9,9 +9,9 @@ repos:
- repo: https://github.com/ericmjl/webp-pre-commit
rev: v0.0.12
hooks:
- # Convert blog and learn images
+ # img/logo is excluded on purpose: the media kit advertises PNG downloads.
- id: convert-to-webp
- files: ^static/img/(blog|learn)/.*\.(png|jpe?g|gif|bmp|tiff)$
+ files: ^static/img/(blog|learn|events)/.*\.(png|jpe?g|gif|bmp|tiff)$
- repo: https://github.com/oxipng/oxipng
rev: v10.2.0
hooks:
diff --git a/assets/main.scss b/assets/main.scss
index a906e3d5..be29950e 100644
--- a/assets/main.scss
+++ b/assets/main.scss
@@ -59,11 +59,13 @@ $additionalInfoColor: #666666;
// Font stack: these two have well matching cap- and x-heights
@font-face {
font-family: "Inter";
- src: url("fonts/Inter/Inter-VariableFont_slnt,wght.ttf");
+ src: url("fonts/Inter/Inter-VariableFont_slnt,wght.woff2") format("woff2");
+ font-display: swap;
}
@font-face {
font-family: "JetBrains Mono";
- src: url("fonts/JetBrainsMono/JetBrainsMono[wght].ttf");
+ src: url("fonts/JetBrainsMono/JetBrainsMono[wght].woff2") format("woff2");
+ font-display: swap;
}
// Global
@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
+ margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
@@ -532,6 +535,9 @@ body {
display: flex;
min-width: 6rem;
max-width: 6rem;
+ // Matches the img height below, so that a package
+ // without an icon still lines up with the others.
+ min-height: 4rem;
@media (max-width: 50rem) {
display: none;
}
@@ -763,62 +769,6 @@ body {
// }
}
}
- .page-item {
- display: flex;
- flex-direction: row;
-
- @media (max-width: 50rem) {
- flex-direction: column;
- align-items: flex-start;
- justify-content: center;
- h2 {
- margin: 0.5rem 0 !important;
- }
- margin: 0 -0.5rem;
- padding: 0.5rem;
- padding-bottom: 1.3rem;
- }
-
- margin: 0 -1rem;
- padding: 1rem;
-
- background-color: #ff000000;
- transition: all 200ms ease-in-out;
- border-radius: 0.5rem;
-
- &:hover {
- cursor: pointer;
- background-color: $tilebg3;
- }
-
- @media (max-width: 50rem) {
- background-color: $tilebg4;
- }
-
- h2 {
- color: $tiletext;
- margin: 0 0 0.5rem 0;
- line-height: 1.5rem;
- }
- span {
- font-size: 1rem;
- color: $greydesc;
- line-height: 1.3rem;
- }
- .page-item-date {
- flex: 1;
- line-height: 1.3rem;
- }
- .page-item-content {
- flex: 2;
- display: flex;
- flex-direction: column;
- font-size: 1rem;
- h2 {
- font-size: 1.4rem;
- }
- }
- }
// TODO: Much of this does nothing AFAICT
.post {
.post-subtitle {
@@ -1175,6 +1125,9 @@ $eco-hues:
}
.eco-card {
+ // All 120 registry entries are in the DOM so the filter can work offline.
+ content-visibility: auto;
+ contain-intrinsic-size: auto 14rem;
position: relative;
display: flex;
flex-direction: column;
@@ -2749,3 +2702,82 @@ $eco-hues:
transition: width 1s ease-in-out;
pointer-events: none;
}
+
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
+}
+
+.command-icon:focus-visible {
+ outline: 3px solid #1a73e8;
+ outline-offset: 2px;
+}
+
+// Hoisted out of #page-content: the landing page shows one of these and uses #cover.
+
+.page-item {
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 50rem) {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ h2 {
+ margin: 0.5rem 0 !important;
+ }
+ margin: 0 -0.5rem;
+ padding: 0.5rem;
+ padding-bottom: 1.3rem;
+ }
+
+ margin: 0 -1rem;
+ padding: 1rem;
+
+ background-color: #ff000000;
+ transition: all 200ms ease-in-out;
+ border-radius: 0.5rem;
+
+ &:hover {
+ cursor: pointer;
+ background-color: $tilebg3;
+ }
+
+ @media (max-width: 50rem) {
+ background-color: $tilebg4;
+ }
+
+ h2 {
+ color: $tiletext;
+ margin: 0 0 0.5rem 0;
+ line-height: 1.5rem;
+ }
+ span {
+ font-size: 1rem;
+ color: $greydesc;
+ line-height: 1.3rem;
+ }
+ .page-item-date {
+ flex: 1;
+ line-height: 1.3rem;
+ }
+ .page-item-content {
+ flex: 2;
+ display: flex;
+ flex-direction: column;
+ font-size: 1rem;
+ h2 {
+ font-size: 1.4rem;
+ }
+ }
+}
+
+.page-item-author {
+ font-weight: 600;
+}
diff --git a/config.toml b/config.toml
index 7e77399f..434cfdc0 100644
--- a/config.toml
+++ b/config.toml
@@ -3,11 +3,14 @@ languageCode = "en-us"
title = "scverse"
description = "Foundational tools for omics data in the life sciences"
+# CI publishes with --buildFuture so that events dated in the future are listed.
+# Setting it here too keeps `hugo server` in step with production.
+buildFuture = true
+enableRobotsTXT = true
+
[params]
images = ["img/scverse-social-card.png"]
-
-[taxonomies]
- series = 'series'
+description = "Foundational tools for omics data in the life sciences"
[markup.goldmark.renderer]
unsafe= true
diff --git a/content/_index.md b/content/_index.md
index 397caf6d..6e2284bf 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/stable/"
[[packages]]
name = "spatialdata"
diff --git a/content/about/_index.md b/content/about/_index.md
index 3086cca0..1d423943 100644
--- a/content/about/_index.md
+++ b/content/about/_index.md
@@ -1,5 +1,6 @@
+++
title = "About scverse"
+description = "Scverse is a consortium of foundational tools for the analysis of omics data in the life sciences."
+++
Scverse® is a consortium of foundational tools for analysis of omics data in life sciences. It has been founded to ensure the long-term maintenance of these core tools.
diff --git a/content/about/code_of_conduct/_index.md b/content/about/code_of_conduct/_index.md
index 005c58f4..3af84834 100644
--- a/content/about/code_of_conduct/_index.md
+++ b/content/about/code_of_conduct/_index.md
@@ -2,11 +2,11 @@
title = "Code of Conduct"
+++
-# NUMFOCUS CODE OF CONDUCT
+## NUMFOCUS CODE OF CONDUCT
You can find the whole document [here][NumFOCUS Code of Conduct].
-## THE SHORT VERSION
+### THE SHORT VERSION
NumFOCUS is dedicated to providing a harassment-free community for everyone, regardless of gender, sexual orientation, gender identity and expression, disability, physical appearance, body size, race, or religion.
We do not tolerate harassment of community members in any form.
@@ -20,15 +20,15 @@ Sexual language and imagery is not appropriate.
Thank you for helping make this a welcoming, friendly community for all.
-## LONG VERSION
+### LONG VERSION
You can find the long version of the Code of Conduct on the [NumFOCUS Code of Conduct][] page.
-## HOW TO REPORT
+### HOW TO REPORT
If you feel that the Code of Conduct has been violated, feel free to submit a report, by using the [NumFOCUS Code of Conduct Reporting Form](https://forms.monday.com/forms/f130e8cddb99568fa86cf077b8912a60?r=use1).
-## WHO WILL RECEIVE YOUR REPORT
+### WHO WILL RECEIVE YOUR REPORT
Your report will be received and handled by NumFOCUS Code of Conduct Working Group; trained, and experienced contributors with diverse backgrounds.
The group is making decisions independently from the project, PyData, NumFOCUS or any other organization.
diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md
index e9d2421c..032e5ab0 100644
--- a/content/about/mission/_index.md
+++ b/content/about/mission/_index.md
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
+description = "The goals, organization and vision of the scverse consortium."
+++
diff --git a/content/about/roles/_index.md b/content/about/roles/_index.md
index f9a296a2..d0153e64 100644
--- a/content/about/roles/_index.md
+++ b/content/about/roles/_index.md
@@ -1,5 +1,6 @@
+++
title = "Roles and Decisions"
+description = "How scverse is governed: the roles within the project and the process by which decisions are made."
+++
## Roles and Responsibilities
diff --git a/content/blog/2025-07-biomni.md b/content/blog/2025-07-biomni.md
index 461885d1..f46cbf66 100644
--- a/content/blog/2025-07-biomni.md
+++ b/content/blog/2025-07-biomni.md
@@ -10,7 +10,7 @@ draft = false
Single-cell and spatial omics have unlocked unprecedented insights into cellular diversity, tissue architecture, and drug responses.
Despite the remarkable progress in computational tools, the diversity and complexity of analyses can still pose challenges.
-While the scverse ecosystem provides powerful and interoperable tools such as [Scanpy](https://scanpy.scverse.org/), [scvi-tools](https://scvi-tools.org/), [Squidpy](https://squidpy.readthedocs.io/), [AnnData](https://anndata.scverse.org/), [MuData](https://mudata.readthedocs.io/en/latest/), and [SpatialData](https://spatialdata.scverse.org/en/latest/), researchers can sometimes face a steep learning curve, particularly when integrating multiple analytical steps or modalities.
+While the scverse ecosystem provides powerful and interoperable tools such as [Scanpy](https://scanpy.scverse.org/), [scvi-tools](https://scvi-tools.org/), [Squidpy](https://squidpy.readthedocs.io/), [AnnData](https://anndata.scverse.org/), [MuData](https://mudata.readthedocs.io/stable/), and [SpatialData](https://spatialdata.scverse.org/en/latest/), researchers can sometimes face a steep learning curve, particularly when integrating multiple analytical steps or modalities.
Scverse is a community-driven, open-source initiative behind many of the most widely adopted Python tools in single-cell biology, known for promoting modular, interoperable, and scalable analysis across diverse modalities—from transcriptomics to spatial and immune profiling.
diff --git a/content/blog/2025-11-biocontextai.md b/content/blog/2025-11-biocontextai.md
index 774b3180..3abada57 100644
--- a/content/blog/2025-11-biocontextai.md
+++ b/content/blog/2025-11-biocontextai.md
@@ -6,7 +6,7 @@ author = "Malte Kuehl, Lukas Heumos"
draft = false
+++
-# scverse × BioContextAI: Community Infrastructure for Agentic Analysis
+## scverse × BioContextAI: Community Infrastructure for Agentic Analysis
We're excited to announce that we are partnering with [BioContextAI][biocontextai], a new open-source initiative for building agentic systems in biomedical research.
BioContextAI provides a community registry for Model Context Protocol (MCP) servers.
@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N
-## What we're building
+### What we're building
BioContextAI currently hosts over 40 community-built biomedical MCP servers with hundreds of tools, including the BioContextAI Knowledgebase MCP with access to resources like UniProt, Open Targets, and pathway databases.
There's a natural synergy here: while scverse packages handle computational analyses, these knowledge resources support the hypothesis generation and interpretation work that happens around those analyses.
By jointly building best practice scverse MCP servers, we hope to facilitate exploration of omics data and provide improved code generation for scverse ecosystem-enabled analyses, all while maintaining reproducibility and transparency.
This is early work and we are actively evaluating patterns for building MCP servers that integrate well with existing workflows and best practices.
-## How to get involved
+### How to get involved
Check out the Registry at [biocontext.ai][biocontextai] to explore community-built MCP servers.
If you're interested in building new servers, try the [cookiecutter template][biocontextai-cookiecutter] to get started.
Join the conversation on the [BioContextAI channel][biocontextai-zulip] within the scverse Zulip to connect with other developers and researchers working in this space.
We're excited to see what the community builds together.
-## Learn more
+### Learn more
Learn more about BioContextAI in the [Nature Biotechnology correspondence][Nature Biotechnology correspondence] and on the [BioContextAI website][biocontextai].
diff --git a/content/blog/2025-anndata-012.md b/content/blog/2025-anndata-012.md
index 06c6cd74..0ebcae0b 100644
--- a/content/blog/2025-anndata-012.md
+++ b/content/blog/2025-anndata-012.md
@@ -6,14 +6,14 @@ author = "Ilan Gold"
draft = false
+++
-# 0.12 released
+## 0.12 released
We're happy to announce that `anndata` 0.12 is out now!
Check out [the changelog](https://anndata.scverse.org/page/release-notes/index.html#v0-12-0) for a full list of changes.
Here, we want to give our users a bit of a deep dive into the new functionality.
We have lots of great features, like zarr v3 support (package and format), full lazy loading, and new API customisability! Let’s dive in!
-## Zarr v3
+### Zarr v3
[Zarr v3 as a file format](https://zarr-specs.readthedocs.io/en/latest/v3/core/index.html) provides improved cloud support, support for sharding to reduce the number of files created in a zarr store, and improved support for extensibility.
Check out the following graphic from the zarr docs:
@@ -36,7 +36,7 @@ And of course, all of this new functionality has not broken our backwards compat
Anndata 0.12 is still fully zarr v2 compatible, both with the package and the file format.
Upgrade fearlessly!
-## Fully lazy file access
+### Fully lazy file access
Moving on, we have also replaced `anndata.experimental.read_elem_as_dask` with [`anndata.experimental.read_elem_lazy`](https://anndata.scverse.org/page/generated/anndata.experimental.read_lazy.html) and [`anndata.experimental.read_lazy`](https://anndata.scverse.org/page/generated/anndata.experimental.read_elem_lazy.html).
Why? Because now your dataframes can be lazy too thanks to support from [xarray](https://docs.xarray.dev/en/stable/user-guide/index.html)!
@@ -47,7 +47,7 @@ Mix this with zarr v3 for performant, fully lazy, fully remote (if needed) acces
Check out [our notebook](https://anndata.scverse.org/page/tutorials/notebooks/read_lazy.html) to learn more about the API – thanks to [Nils Gehlenborg’s HIDIVE lab](https://hidivelab.org/) for hosting the data, and be sure to check out the [Vitessce visualisation](https://tinyurl.com/jtan4nx7) of the very same data backing the notebook.
This dual-access really showcases the power of smart remote data access!
-## Customizable API
+### Customizable API
And if that wasn’t enough, we now have [a new way of extending the anndata API](https://anndata.scverse.org/page/generated/anndata.register_anndata_namespace.html) contributed by one of our community members, Sri Varra.
This contribution lets users extend the `AnnData` API easily, great for tinkering with new APIs and features but also for writing new methods directly into the `AnnData` object:
diff --git a/content/blog/2025-conference-summary.md b/content/blog/2025-conference-summary.md
index 13aadc0e..2268108d 100644
--- a/content/blog/2025-conference-summary.md
+++ b/content/blog/2025-conference-summary.md
@@ -177,6 +177,6 @@ Each sponsor provided an outlook of the latest technologies in perturbation scre
### Conclusion
-This was the second time we organized the scverse conference — you can read about [the first edition in Munich](/blog/2024-conference-summary/). We're looking forward to seeing you at future scverse events! In the meantime, you can engage with the community on [Zulip](https://scverse.zulipchat.com/) and at our community meetings. Look out for announcements on our social media channels ([X](https://x.com/scaboranova), [Bluesky](https://bsky.app/profile/scverse.bsky.social), [LinkedIn](https://www.linkedin.com/company/scverse/)).
+This was the second time we organized the scverse conference — you can read about [the first edition in Munich](/blog/2024-conference-summary/). We're looking forward to seeing you at future scverse events! In the meantime, you can engage with the community on [Zulip](https://scverse.zulipchat.com/) and at our community meetings. Look out for announcements on our social media channels ([X](https://x.com/scverse_team), [Bluesky](https://bsky.app/profile/scverse.bsky.social), [LinkedIn](https://www.linkedin.com/company/scverse/)).
*Photo credits: Vivekanandan Ramalingam (Vivek), Research Scientist at Stanford Genetics.*
diff --git a/content/blog/2025-core-expansion.md b/content/blog/2025-core-expansion.md
index 462509d6..1b2d2f04 100644
--- a/content/blog/2025-core-expansion.md
+++ b/content/blog/2025-core-expansion.md
@@ -6,7 +6,7 @@ author = "Lukas Heumos"
draft = false
+++
-# Four new core packages in scverse
+## Four new core packages in scverse
We're happy to announce that four new packages have joined the scverse core ecosystem: [SnapATAC2](https://github.com/scverse/snapatac2), [rapids-singlecell](https://github.com/scverse/rapids-singlecell), [pertpy](https://github.com/scverse/pertpy), and [decoupler](https://github.com/scverse/decoupler).
This broadens the scope of scverse beyond our so far supported modalities and brings in new functionality for epigenomics, perturbation screens, GPU acceleration, and functional inference.
@@ -19,7 +19,7 @@ We're also welcoming the following lead maintainers to the scverse core develope
- **Kai Zhang** for **snapatac2**
- **Pau Badia i Mompel** for **decoupler**
-## SnapATAC2
+### SnapATAC2
[SnapATAC2](https://github.com/scverse/snapatac2) enables fast, scalable analysis of single-cell ATAC-seq and related epigenomic data.
Built in Rust with a Python front end, it handles millions of cells efficiently.
@@ -28,7 +28,7 @@ All outputs are stored in AnnData and integrate seamlessly with scanpy and other
-## rapids-singlecell
+### rapids-singlecell
[rapids-singlecell](https://github.com/scverse/rapids-singlecell) accelerates the full single-cell analysis pipeline through GPU acceleration with CuPy and NVIDIA RAPIDS.
Core steps—including PCA, neighborhood graph construction, and clustering—are executed on GPU using cuML, cuGraph, and custom CUDA/CuPy kernels for peak performance.
@@ -40,7 +40,7 @@ By preserving familiar APIs and data structures, it enables seamless GPU acceler
For more details, we refer to a recent blog post by NVIDIA: [Driving Toward Billion-Cell Analysis and Biological Breakthroughs with RAPIDS-singlecell](https://developer.nvidia.com/blog/driving-toward-billion-cell-analysis-and-biological-breakthroughs-with-rapids-singlecell)
-## pertpy
+### pertpy
[pertpy](https://github.com/scverse/pertpy) focuses on single-cell perturbation screens, including CRISPR and compound treatments.
It supports differential analysis, signature scoring, and dose-response modeling.
@@ -49,7 +49,7 @@ Built on AnnData and scverse libraries, pertpy fits smoothly into existing pipel
-## decoupler
+### decoupler
[decoupler](https://github.com/scverse/decoupler) enables the inference of enrichment scores from omics data using prior knowledge.
It maps omics profiles to annotated biological sets, such as transcription factors, pathways, or kinases, using methods like GSEA, GSVA, and linear models.
@@ -57,14 +57,14 @@ Designed for bulk, single-cell and spatial data, decoupler works directly with o
-## What this means
+### What this means
We're continuing to support a modular but coherent ecosystem where high-quality tools can interoperate.
These additions bring coverage of new data types and analysis goals while staying within the same technical foundations.
All packages use our scverse core data structures, follow shared conventions, and benefit from a growing set of shared infrastructure and community practices.
We aim to keep development decentralized and open while improving alignment across projects.
-## Get involved
+### Get involved
If you're building something new, we'd love to have your work be a part of the [scverse ecosystem](https://github.com/scverse/ecosystem-packages).
If you're our tools, please share feedback or ideas via the respective issue trackers.
@@ -72,7 +72,7 @@ The best places to start are [scverse.org](https://scverse.org), [github.com/scv
We're always looking for more contributors to our packages but especially also for community related work.
Please reach out!
-## Thank you
+### Thank you
We’re grateful to the maintainers of these packages for their work and commitment to open, reusable tools.
Their contributions help make the scverse ecosystem more useful, inclusive, and sustainable.
diff --git a/content/blog/2026-anndata-013.md b/content/blog/2026-anndata-013.md
index 0393a45d..37f6a788 100644
--- a/content/blog/2026-anndata-013.md
+++ b/content/blog/2026-anndata-013.md
@@ -9,7 +9,7 @@ draft = false
We're thrilled to announce that `anndata` 0.13 is out now!
We'll highlight some of the major changes here but be sure to check out [the changelog][] for the full list of changes, including breaking changes.
-# `X` is now a layer
+## `X` is now a layer
The biggest conceptual change in 0.13 is that the main expression matrix `X` is now stored as a layer, internally `layers[None]`.
For most code this is invisible since you still access/read/write `adata.X` exactly as before.
@@ -17,7 +17,7 @@ But treating `X` as just another layer moves us towards encouraging our users to
Towards this end, our support for accessor objects (see below) will hopefully help make it easier for packages to declare what layers they expect to produce/consume.
One **major breaking change** you will notice here is that anything relying on the keys of `layers` being all strings will now need to handle `None` as a key.
-## Copy-on-write for `X `
+### Copy-on-write for `X `
As `X` is now a layer, writing into a view's `X` no longer mutates the parent `X`.
This now matches how every other element (`obsm`, `var` etc.) already behaved:
@@ -28,7 +28,7 @@ view.X = 0 # does NOT modify adata.X anymore, instead instantiates `vie
If you were relying on the old propagating behavior, operate on the original object directly.
-# Zarr v3 by default
+## Zarr v3 by default
We introduced support for the zarr v3 file-format as well as the v3 `zarr-python` package in 0.12.
In 0.13 the file format v3 becomes the default, and support for `zarr-python<3` (i.e., the python package) is dropped entirely, however you can still opt-in to write v2 data.
@@ -41,7 +41,7 @@ Concretely:
If you want a refresher on what zarr v3 buys you, sharding to avoid file-system slowdowns, concurrent/parallel io, tips/tricks, and using rust-accelerated tooling like [zarrs-python][], the [zarr v3 guide][] and our [0.12 post][] cover it in depth.
If `zarrs` is installed in your environment the bulk read/write functions i.e., `anndata.read_zarr` and `AnnData.write_zarr` will use it.
-# Accessors: object-independent array references
+## Accessors: object-independent array references
0.13 introduces the new [`anndata.acc`][] module for referring to a vector or array *by location* without binding it to a specific object.
diff --git a/content/blog/2026-rsc-goes-nanobind.md b/content/blog/2026-rsc-goes-nanobind.md
index 8ffc4acf..a6f6331d 100644
--- a/content/blog/2026-rsc-goes-nanobind.md
+++ b/content/blog/2026-rsc-goes-nanobind.md
@@ -6,11 +6,11 @@ author = "Severin Dicks, Lukas Heumos"
draft = false
+++
-# Rapids-singlecell release 0.15.0
+## Rapids-singlecell release 0.15.0
We are proud to announce rapids-singlecell release 0.15.0 which comes with lots of new features but also changes to the installation process.
-## Why the packaging changes
+### Why the packaging changes
In earlier versions of rapids-singlecell, all GPU kernels were written as CuPy RawKernels.
These were compiled the first time you called them — in your environment, on your machine.
@@ -28,7 +28,7 @@ That worked, but it came with friction:
Starting with 0.15.0, these kernels are compiled once at build time and shipped as nanobind/CUDA C++ extension modules inside the wheel.
The result is a more conventional compiled-extension workflow: you `pip install` the package and every kernel is ready immediately.
-### Packaging changes in detail
+#### Packaging changes in detail
The GPU kernels that were previously CuPy RawKernels are now nanobind C++ extensions built with `scikit-build-core` and CMake.
This gives us:
@@ -49,7 +49,7 @@ import rapids_singlecell as rsc
Your existing analysis scripts should work without modification.
-### CUDA-specific wheels
+#### CUDA-specific wheels
Because the kernels are now compiled binaries, we need to ship one wheel per CUDA major version.
(Python wheel tags don't encode CUDA version, so we encode it in the package name — the same approach used by CuPy, PyTorch, and other CUDA-dependent packages.)
@@ -64,9 +64,9 @@ Both wheels are available for **x86_64** and **aarch64** on Linux.
If you have a Blackwell GPU (B200, GB200) and want the best out-of-the-box performance, the CUDA 13 wheel includes native binaries for Blackwell architectures.
The CUDA 12 wheel still supports Blackwell through PTX just-in-time compilation, so it will work, but the first kernel launch on Blackwell will be slightly slower while the driver JIT-compiles the PTX.
-### How to install
+#### How to install
-#### Prebuilt wheel (recommended)
+##### Prebuilt wheel (recommended)
Pick the wheel that matches your CUDA version:
@@ -78,7 +78,7 @@ pip install rapids-singlecell-cu12 # CUDA 12
This installs rapids-singlecell with precompiled kernels, but does **not** pull in the RAPIDS stack (cupy, cuml, cudf, etc.).
If you manage those dependencies separately — for example, through conda — this is all you need.
-#### Prebuilt wheel with RAPIDS dependencies
+##### Prebuilt wheel with RAPIDS dependencies
If you want pip to also install the matching RAPIDS and CuPy packages:
@@ -91,7 +91,7 @@ Note: on the prebuilt wheels, the dependency extra is always `[rapids]`.
The CUDA version is determined by which package name you install — `rapids-singlecell-cu12` or `rapids-singlecell-cu13`.
If you're building from source instead, the extras are `[rapids-cu12]` and `[rapids-cu13]`.
-#### Conda / Mamba
+##### Conda / Mamba
Environment files are provided in the repository:
@@ -102,7 +102,7 @@ conda env create -f conda/rsc_rapids_26.04_cuda12.yml # Python 3.14, CUDA 12
> **Note:** RAPIDS currently does not support `channel_priority: strict`. Use `channel_priority: flexible` instead.
-#### Docker / Apptainer
+##### Docker / Apptainer
Pre-built containers are available for both CUDA versions:
@@ -118,7 +118,7 @@ apptainer pull rsc.sif docker://ghcr.io/scverse/rapids-singlecell-cu13:latest
apptainer run --nv rsc.sif
```
-### Migration from 0.14.x
+#### Migration from 0.14.x
For most users, upgrading is straightforward:
@@ -130,7 +130,7 @@ For most users, upgrading is straightforward:
Run `nvidia-smi` or `nvcc --version` to confirm whether you're on CUDA 12.x or CUDA 13.x, and install the matching wheel.
If you're using conda, make sure the CUDA runtime library version in your environment matches the wheel you install — e.g., `cuda-cudart` from the `nvidia` channel should be 12.x for the cu12 wheel or 13.x for the cu13 wheel.
-### What about `pip install rapids-singlecell`?
+#### What about `pip install rapids-singlecell`?
The plain install — `pip install rapids-singlecell`, without the `-cu12` or `-cu13` suffix — still works.
It will compile the CUDA extensions from source during installation.
@@ -157,17 +157,17 @@ Source builds are the right choice if you are:
If none of those apply to you, use the prebuilt wheel.
-## Other highlights in 0.15.0
+### Other highlights in 0.15.0
Beyond packaging, this release includes a substantial set of algorithmic and performance improvements built up across the 0.15.0 development cycle:
-### Harmony2 and C++ harmony
+#### Harmony2 and C++ harmony
Harmony was rewritten as a C++ nanobind kernel ([#578](https://github.com/scverse/rapids-singlecell/pull/578)), making it significantly faster and more memory-efficient.
On top of that, we implemented three algorithmic improvements from the Harmony2 paper (Patikas et al. 2026): a stabilized diversity penalty, dynamic per-cluster-per-batch ridge regularization, and automatic batch pruning to prevent overintegration in biologically heterogeneous datasets ([#625](https://github.com/scverse/rapids-singlecell/pull/625)).
This is also the first example of a more complex routine built on the new compiled-kernel infrastructure.
-### Contrast-based energy distance
+#### Contrast-based energy distance
Perturbation experiments typically don't need a full k×k distance matrix between all groups — you want to compare each perturbation against one or two controls, possibly stratified by cell type.
The new `contrast_distances()` API ([#603](https://github.com/scverse/rapids-singlecell/pull/603)) lets you express exactly that.
@@ -194,7 +194,7 @@ result = dist.contrast_distances(adata, contrasts=contrasts)
`onesided_distances()` also now accepts a sequence of control group names via `selected_group`, returning a DataFrame with one column per control ([#601](https://github.com/scverse/rapids-singlecell/pull/601)).
Both energy distance and co-occurrence kernels gained multi-GPU support ([#545](https://github.com/scverse/rapids-singlecell/pull/545), [#546](https://github.com/scverse/rapids-singlecell/pull/546)).
-### More highlights
+#### More highlights
- **RAPIDS 26.04 and Python 3.14 support** across all CI and conda environments.
- **Dask support for `highly_variable_genes`** with the Seurat v3 flavor ([#616](https://github.com/scverse/rapids-singlecell/pull/616)).
diff --git a/content/blog/hello-world.md b/content/blog/hello-world.md
index 0ca322cd..9610ea8f 100644
--- a/content/blog/hello-world.md
+++ b/content/blog/hello-world.md
@@ -22,8 +22,8 @@ Furthermore, to bring the community together we are planning workshops and hacka
As we grow, we are hoping to recruit more members into governance roles as well as find even more ways to support and connect our community of developers and users.
There are already a few visible outcomes of our joint work including improved
-[mudata performance](https://mudata.readthedocs.io/en/latest/changelog.html#v0-1-2) and
-[mudata documentation](https://mudata.readthedocs.io/en/latest/). Additionally,
+[mudata performance](https://mudata.readthedocs.io/stable/changelog.html#v0-1-2) and
+[mudata documentation](https://mudata.readthedocs.io/stable/). Additionally,
[scvi-tools is now using MuData](https://github.com/scverse/scvi-tools/pull/1444) for the representation of multimodal data.
[Scanpy has gained new workshop notebooks](https://github.com/scverse/scanpy-tutorials/pull/52), and, moreover, we have started
[a collection of learning resources for scverse libraries](/learn/).
@@ -39,9 +39,9 @@ In our initial form, we have divided responsibilities into several [roles](/peop
[Isaac Virshup](https://github.com/ivirshup), [Danila Bredikhin](https://github.com/gtca) and [Lukas Heumos](https://github.com/Zethson) form the steering committee and also belong to the core developers together with [Adam Gayoso](https://github.com/adamgayoso), [Giovanni Palla](https://github.com/giovp), [Gregor Sturm](https://github.com/grst), and [Ilia Kats](https://github.com/ilia-kats). The core developers have made significant contributions to the ecosystem and are jointly developing and maintaining the major libraries.
-Our management committee, consisting of [Fabian Theis](https://www.helmholtz-munich.de/icb/institute/staff/staff/ma/2494/index.html), [Oliver Stegle](https://www.embl.org/groups/stegle/), [Nir Yosef](https://yoseflab.github.io/), [Alex Wolf](https://falexwolf.me/) and [Francesca Finotello](https://computationalbiomedicinegroup.github.io/), are providing resources and academic freedom to scverse to develop our tools.
+Our management committee, consisting of [Fabian Theis](https://www.helmholtz-munich.de/en/icb/fabian-theis), [Oliver Stegle](https://www.embl.org/groups/stegle/), [Nir Yosef](https://yoseflab.github.io/), [Alex Wolf](https://falexwolf.me/) and [Francesca Finotello](https://computationalbiomedicinegroup.github.io/), are providing resources and academic freedom to scverse to develop our tools.
-[Aviv Regev](https://biology.mit.edu/profile/aviv-regev/), [Sarah Teichmann](https://www.sanger.ac.uk/group/teichmann-group/), [Dana Pe'er](https://www.mskcc.org/research/ski/labs/dana-pe-er) and [Bonnie Berger](https://people.csail.mit.edu/bab/) are our scientific advisory board which helps shaping the overall vision and defining the right priorities.
+[Aviv Regev](https://www.gene.com/scientists/our-scientists/aviv-regev), [Sarah Teichmann](https://www.sanger.ac.uk/group/teichmann-group/), [Dana Pe'er](https://www.mskcc.org/research/ski/labs/dana-pe-er) and [Bonnie Berger](https://people.csail.mit.edu/bab/) are our scientific advisory board which helps shaping the overall vision and defining the right priorities.
## How can I join and contribute?
diff --git a/content/community-calendar/_index.md b/content/community-calendar/_index.md
index 125e382f..ebac579e 100644
--- a/content/community-calendar/_index.md
+++ b/content/community-calendar/_index.md
@@ -1,5 +1,6 @@
+++
title = "Community Calendar"
+description = "Open community meetings, hackathons and conferences across the scverse community."
+++
Here's an overview of what's happening across the scverse community: our regular open community meetings and upcoming events such as hackathons and conferences.
diff --git a/content/conference2025.md b/content/conference2025.md
index ff3ccedb..9cf8cb24 100644
--- a/content/conference2025.md
+++ b/content/conference2025.md
@@ -12,7 +12,7 @@ conferenceLocation: "Stanford, CA"
subtitle: "Follow us on our channels to learn more details in the coming weeks"
# Design Options
-backgroundImage: "/img/events/2025_11_conference_bg.jpeg"
+backgroundImage: "/img/events/2025_11_conference_bg.webp"
# highlightColor: "#ff4f00"
highlightColor: "#ff8b57"
diff --git a/content/conference2026/_index.md b/content/conference2026/_index.md
index 2e955864..ba1f4a13 100644
--- a/content/conference2026/_index.md
+++ b/content/conference2026/_index.md
@@ -8,7 +8,7 @@ weight = 1
label = "Registration open"
conferenceDates = "October 12 – 14, 2026"
conferenceLocation = "DTU, Copenhagen, Denmark"
-backgroundImage = "/img/events/2026_10_conference_bg.jpg"
+backgroundImage = "/img/events/2026_10_conference_bg.webp"
subtitle = "The third scverse conference brings together the single-cell and spatial omics community — developers, researchers, and users of the scverse ecosystem — for three days of talks, posters, workshops, and collaboration."
# Call-to-action buttons (first is primary)
diff --git a/content/conference2026/speakers.md b/content/conference2026/speakers.md
index 6184c698..8e448a34 100644
--- a/content/conference2026/speakers.md
+++ b/content/conference2026/speakers.md
@@ -11,7 +11,7 @@ We are delighted to announce the following speakers for scverse conference 2026,
+
Seqera
Product Manager for Open Source at Seqera, with a PhD in Molecular Biology from the University of Cambridge. He previously worked at the National Genomics Infrastructure (SciLifeLab, Stockholm) and the Babraham Institute in Cambridge. Phil co-founded the nf-core community and authored MultiQC, RustQC, and SRA-Explorer, and is a passionate advocate for user-friendly open-source software.
@@ -24,7 +24,7 @@ We are delighted to announce the following speakers for scverse conference 2026,
+
Helmholtz Munich
Group leader at Helmholtz Munich and a TUM Junior Fellow at the Technical University of Munich. Her research develops artificial-intelligence methods for quantitative biological image analysis across modalities including cryo-electron tomography, light-sheet microscopy, and digital pathology. Her group builds open-source tools for the bioimaging community and collaborates closely with experimental labs to enable data-driven discovery.
@@ -34,7 +34,7 @@ We are delighted to announce the following speakers for scverse conference 2026,
+
Technical University of Denmark (DTU)
Professor at the Technical University of Denmark (DTU), where he leads the Cell Diversity Lab. After an MSc from Utrecht University and a PhD from DTU, he carried out postdoctoral work on normal and malignant hematopoiesis as an EMBO Fellow with John Dick (Toronto) and a Lundbeck Fellow with Bo Porse (Copenhagen). His lab develops high-sensitivity single-cell and spatial proteomics to study how cellular heterogeneity drives cell fate and therapy response in cancer.
@@ -44,7 +44,7 @@ We are delighted to announce the following speakers for scverse conference 2026,
+
Wellcome Sanger Institute & University of Cambridge
Head of the Cellular Genomics Programme and Deputy Director of the Wellcome Sanger Institute, and Professor of Clinical Dermatology at the University of Cambridge. A clinician-scientist, she has pioneered the application of single-cell genomics to decode the developing human immune system and to understand cell and tissue dynamics in human skin in health and disease. She is co-Vice Chair of the Human Cell Atlas consortium and coordinates its Development Bionetwork, and is an elected Fellow of the Academy of Medical Sciences and EMBO.
diff --git a/content/events/2024_09_conference.md b/content/events/2024_09_conference.md index 00a8df02..d84f07e8 100644 --- a/content/events/2024_09_conference.md +++ b/content/events/2024_09_conference.md @@ -7,6 +7,6 @@ draft = false Join us for the first scverse conference taking place from **Tuesday, September 10** to **Thursday, September 12** in **Munich, Germany**. Stay tuned for the registrations, speaker announcements, and more! -[Visit the dedicated conference page for more details](/conference2024/) +[Read the conference summary on our blog](/blog/2024-conference-summary/) -
+
diff --git a/content/events/2025_11_conference.md b/content/events/2025_11_conference.md
index 657b5aa7..e28f44b0 100644
--- a/content/events/2025_11_conference.md
+++ b/content/events/2025_11_conference.md
@@ -9,4 +9,4 @@ Join us for the scverse conference taking place from **Monday, November 17** to
[Visit the dedicated conference page for more details](/conference2025/)
-
+
diff --git a/content/events/_index.md b/content/events/_index.md
index fbbad351..8484db8b 100644
--- a/content/events/_index.md
+++ b/content/events/_index.md
@@ -1,5 +1,6 @@
---
title: Events
+description: Upcoming and past scverse conferences, hackathons and community meetings.
---
## Open community meeting
diff --git a/content/join/_index.md b/content/join/_index.md
index df784992..82286007 100644
--- a/content/join/_index.md
+++ b/content/join/_index.md
@@ -1,5 +1,6 @@
+++
title = "Join scverse"
+description = "How to reach the scverse community on GitHub, Zulip, Discourse and social media, and who to e-mail about what."
[[resources]]
id = "github"
diff --git a/content/learn/_index.md b/content/learn/_index.md
index a9484123..30dc99e5 100644
--- a/content/learn/_index.md
+++ b/content/learn/_index.md
@@ -1,5 +1,6 @@
+++
title = "Getting Started"
+description = "Tutorials for getting started with the scverse core packages, covering data structures, scRNA-seq, spatial, immune receptor and multimodal analysis."
tutorials_intro = """\
If you are new to the scverse, get started with this set of tutorials covering basic analysis and functionality of the core packages.
@@ -17,7 +18,7 @@ You can also find recordings of past talks and workshops on our [YouTube channel
img = "../../img/libs/anndata_schema.svg"
[[tutorials.section]]
name = "MuData Quickstart"
- url = "https://mudata.readthedocs.io/en/latest/notebooks/quickstart_mudata.html"
+ url = "https://mudata.readthedocs.io/stable/notebooks/quickstart_mudata.html"
img = "../../img/libs/mudata_flat.svg"
[[tutorials]]
diff --git a/content/packages/_index.md b/content/packages/_index.md
index f170caa7..f316a055 100644
--- a/content/packages/_index.md
+++ b/content/packages/_index.md
@@ -1,5 +1,6 @@
+++
title = "Packages"
+description = "The scverse core packages — data structures and analysis frameworks — and the wider ecosystem of community-maintained tools built on them."
aliases = ["/projects/"]
[[sections]]
@@ -31,7 +32,7 @@ aliases = ["/projects/"]
[[datastructures]]
name = "mudata"
description = "Multimodal data format"
- url = "https://mudata.readthedocs.io/en/latest/"
+ url = "https://mudata.readthedocs.io/stable/"
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 +40,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/stable/"
[[datastructures.links]]
text = "PyPI"
url = "https://pypi.org/project/mudata/"
diff --git a/content/people/_index.md b/content/people/_index.md
index 7502b7a4..cdebdcee 100644
--- a/content/people/_index.md
+++ b/content/people/_index.md
@@ -1,5 +1,6 @@
+++
title = "People"
+description = "The core team, steering council, management committee and contributors behind scverse."
preface = "For people participating in and interacting with the consortium, there are different roles — from core team to developers, contributors and community members."
# ---------- core team, in alphabetical order
diff --git a/layouts/404.html b/layouts/404.html
new file mode 100644
index 00000000..13f02735
--- /dev/null
+++ b/layouts/404.html
@@ -0,0 +1,18 @@
+{{ define "main" }}
+ The page you were looking for does not exist. It may have been moved or removed.
+From here you can:
++ If you followed a link from our own site, please + let us know. +
+diff --git a/layouts/design/list.html b/layouts/design/list.html index b08b4d6f..a4b5dc55 100644 --- a/layouts/design/list.html +++ b/layouts/design/list.html @@ -17,7 +17,7 @@
+
+
+
+
+