Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand Down
148 changes: 90 additions & 58 deletions assets/main.scss
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand DownExpand Up@@ -367,6 +369,7 @@ body {
#title {
#title-text {
#title-name {
margin: 0;
font-size: 6rem;
font-weight: 900;
letter-spacing: 0.2rem;
Expand DownExpand Up@@ -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;
}
Expand DownExpand Up@@ -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 {
Expand DownExpand Up@@ -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;
Expand DownExpand Up@@ -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;
}
9 changes: 6 additions & 3 deletions config.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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"
Expand Down
1 change: 1 addition & 0 deletions content/about/_index.md
Original file line numberDiff line numberDiff line change
@@ -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.
Expand Down
10 changes: 5 additions & 5 deletions content/about/code_of_conduct/_index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -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.
Expand Down
1 change: 1 addition & 0 deletions content/about/mission/_index.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
+++
title = "Mission statement"
description = "The goals, organization and vision of the scverse consortium."
+++


Expand Down
1 change: 1 addition & 0 deletions content/about/roles/_index.md
Original file line numberDiff line numberDiff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-07-biomni.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-11-biocontextai.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.
Expand All@@ -15,21 +15,21 @@ This project was recently published as a [Nature Biotechnology correspondence][N

<img src="/img/blog/biocontextai_overview.webp" style="max-width: 100%;" alt="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].

Expand Down
8 changes: 4 additions & 4 deletions content/blog/2025-anndata-012.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand All@@ -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)!
Expand All@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2025-conference-summary.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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.*
Loading