From 0833987c969b9fb8672a03fa6a38cfc952c900c7 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Sun, 23 Aug 2026 22:20:57 +0200 Subject: [PATCH 1/5] Fix broken external links MuData's docs dropped the language segment from their URLs, so every mudata.readthedocs.io/en/latest link on the site 404'd, including the core package card on the front page. The 2025 conference summary linked x.com/scaboranova, which does not exist; the account is @scverse_team. Two management committee profiles in the announcement post had moved: Fabian Theis to helmholtz-munich.de/en/icb, Aviv Regev to gene.com. Signed-off-by: Lukas Heumos --- content/_index.md | 2 +- content/blog/2025-07-biomni.md | 2 +- content/blog/2025-conference-summary.md | 2 +- content/blog/hello-world.md | 8 ++++---- content/learn/_index.md | 2 +- content/packages/_index.md | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) 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/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-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/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/learn/_index.md b/content/learn/_index.md index a9484123..c7804aee 100644 --- a/content/learn/_index.md +++ b/content/learn/_index.md @@ -17,7 +17,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..cedefdd6 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/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 +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/stable/" [[datastructures.links]] text = "PyPI" url = "https://pypi.org/project/mudata/" From 69e16fe28b38c1c9a567048fbf600f325fa07bd3 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Sun, 23 Aug 2026 22:22:57 +0200 Subject: [PATCH 2/5] Fix the page metadata in the document head No page carried a , so search engines had nothing to quote; Open Graph and Twitter descriptions were there but those are not the same tag. sat at byte 1582, past the 1024-byte limit the spec allows, because it came after the title, the stylesheets and every social tag. Titles carried no site name, so tabs and search results read just "Packages" or "People". Also adds canonical URLs, RSS autodiscovery for the twelve feeds that were already being generated, a robots.txt with a sitemap pointer, and a 404 page, and drops the series taxonomy, which had no terms and only produced an empty feed. buildFuture moves into the config so that a local hugo server lists upcoming events the way production does. Signed-off-by: Lukas Heumos --- config.toml | 9 ++++++--- content/about/_index.md | 1 + content/about/mission/_index.md | 1 + content/about/roles/_index.md | 1 + content/community-calendar/_index.md | 1 + content/events/_index.md | 1 + content/join/_index.md | 1 + content/learn/_index.md | 1 + content/packages/_index.md | 1 + content/people/_index.md | 1 + layouts/404.html | 18 ++++++++++++++++++ layouts/partials/head.html | 28 ++++++++++++++++++++++++---- layouts/robots.txt | 4 ++++ 13 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 layouts/404.html create mode 100644 layouts/robots.txt 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/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/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/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/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 c7804aee..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. diff --git a/content/packages/_index.md b/content/packages/_index.md index cedefdd6..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]] 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" }} +
+

Page not found

+

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. +

+
+{{ end }} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 0695cc33..4d498880 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,4 +1,12 @@ -{{ .Title }} + + + +{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }} +{{ with or .Description .Summary .Site.Params.description .Site.Params.Description }} + +{{ end }} + + {{ $styles := resources.Get "main.scss" | toCSS | minify }} @@ -14,12 +22,24 @@ +{{ range .AlternativeOutputFormats }} + +{{ end }} + + {{ template "_internal/twitter_cards.html" . }} {{ template "_internal/opengraph.html" . }} - - - diff --git a/layouts/robots.txt b/layouts/robots.txt new file mode 100644 index 00000000..6b4c001c --- /dev/null +++ b/layouts/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: {{ "sitemap.xml" | absURL }} From 374edb65f62af0bfd4b77599182a71efe5845364 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Sun, 23 Aug 2026 22:25:42 +0200 Subject: [PATCH 3/5] Fix the accessibility problems on the site The front page had no h1 at all: the wordmark was a styled span, so neither search engines nor screen readers had a document title to anchor on. Six pages emitted more than one h1 because the layout renders the title as h1 and the body then started at level one again; anndata 0.13 had four. The media kit, which is a page made entirely of images, had fifteen of them with no alt text. The landing page demo's run controls were divs with click handlers, so they could not be reached or triggered from a keyboard, and had no accessible name. Also adds a prefers-reduced-motion block, a focus ring for those controls, lazy loading for images below the fold, and drops the src-less that SnapATAC2 rendered for its missing icon. Signed-off-by: Lukas Heumos --- assets/main.scss | 24 ++++++++++++++++++++ content/about/code_of_conduct/_index.md | 10 ++++----- content/blog/2025-11-biocontextai.md | 8 +++---- content/blog/2025-anndata-012.md | 8 +++---- content/blog/2025-core-expansion.md | 16 ++++++------- content/blog/2026-anndata-013.md | 8 +++---- content/blog/2026-rsc-goes-nanobind.md | 30 ++++++++++++------------- layouts/design/list.html | 20 +++++++++++------ layouts/index.html | 18 ++++++++++++--- layouts/learn/list.html | 1 + layouts/packages/list.html | 4 ++-- layouts/partials/main/cover.html | 2 +- layouts/partials/main/packages.html | 2 +- layouts/people/list.html | 1 + static/main.js | 10 +++++++++ 15 files changed, 108 insertions(+), 54 deletions(-) diff --git a/assets/main.scss b/assets/main.scss index a906e3d5..eac5d3a7 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -367,6 +367,7 @@ body { #title { #title-text { #title-name { + margin: 0; font-size: 6rem; font-weight: 900; letter-spacing: 0.2rem; @@ -532,6 +533,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; } @@ -2749,3 +2753,23 @@ $eco-hues: transition: width 1s ease-in-out; pointer-events: none; } + +// Respect the operating system's reduced-motion setting: the landing page runs +// a looping pulse and animates the demo's progress bars and scatter dots. +@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; + } +} + +// The demo's run controls are divs with role="button"; without this they get no +// visible focus ring when tabbed to. +.command-icon:focus-visible { + outline: 3px solid #1a73e8; + outline-offset: 2px; +} 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/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 BioContextAI overview -## 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-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 SnapATAC2 overview -## 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 pertpy overview -## 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 decoupler overview -## 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/layouts/design/list.html b/layouts/design/list.html index b08b4d6f..9cf9d868 100644 --- a/layouts/design/list.html +++ b/layouts/design/list.html @@ -17,7 +17,7 @@

Primary Logos

id="{{ .name | lower }}-tile" >
- + {{ .name }}
@@ -46,7 +46,7 @@

Primary Logos

id="{{ .name | lower }}-tile" >
- + {{ .name }}
@@ -94,7 +94,11 @@

Logo in Action