From 3fde3d832efc1cf579698f73d5b3acd0adabee5a Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 12:26:36 +0200 Subject: [PATCH 01/10] Make the mission page readable The page was one column of prose at about 120 characters a line, with two links in the whole document and no way to navigate its four sections. The five goals move into front matter and render as cards: they are the most quotable thing on the page and were a plain bullet list. /about now uses the table of contents sidebar the packages page already has, which helps the governance page too, and prose gets a 46rem measure. Fix the copy while here: - the channel list named Discourse, Zulip and Twitter, none of them linked. It points at /join instead, which already lists every channel with a link, so a social account only ever changes in one place - "provide users to cutting-edge and varied selection" was missing a word; "silo'd" was not a word - the brand is lowercase everywhere else on the site, but four sentences here opened with "Scverse" - link core tools, shared maintenance and ecosystem packages to the pages that describe them, rather than leaving the page a dead end --- assets/main.scss | 51 +++++++++++++++++++++++++++++++++ content/about/mission/_index.md | 40 ++++++++++++++++++-------- layouts/about/list.html | 15 +++++++--- layouts/shortcodes/goals.html | 9 ++++++ 4 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 layouts/shortcodes/goals.html diff --git a/assets/main.scss b/assets/main.scss index a21c7c7..86e07ad 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3420,3 +3420,54 @@ body { } } } + +// Specific to /about — long-form prose pages + +#about-content { + // The column is sized for card grids; prose needs a readable measure inside it + > p, + > ul, + > ol, + > blockquote { + max-width: 46rem; + } + + .goal-grid { + display: grid; + // Three across, so five principles wrap 3 + 2 rather than stranding one on its own row + grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); + // Cards size to their text; stretching leaves the short ones mostly empty + align-items: start; + gap: 1rem; + margin: 1.5rem 0 2rem; + } + + .goal-card { + padding: 1.25rem 1.35rem; + background-color: white; + border: 1px solid $overline; + border-radius: $card-radius; + transition: all 200ms ease-in-out; + + &:hover { + border-color: $tilebg2; + box-shadow: 0 0.6rem 1.5rem rgba(0, 0, 0, 0.06); + transform: translateY(-2px); + } + + // Element selector included to beat the generic `#page-content .post h3` margins + h3 { + margin: 0 0 0.5rem; + font-size: 1.05rem; + font-weight: 800; + letter-spacing: -0.01em; + } + + p { + margin: 0; + font-size: 0.9rem; + line-height: 1.6; + color: $tiletext2; + } + } +} diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index 032e5ab..c331da8 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -1,6 +1,26 @@ +++ title = "Mission statement" description = "The goals, organization and vision of the scverse consortium." + +[[goals]] + name = "Interoperability" + text = "We focus on developing open, standardized, and efficient file formats to encourage data sharing and re-use." + +[[goals]] + name = "Diversity" + text = "We believe in removing barriers to participation in research, including economic factors and institutional culture. Our tools will have the most impact if they are developed by and for a diverse community." + +[[goals]] + name = "Transparency" + text = "We do our work as openly as possible and welcome our community to join the decision making process." + +[[goals]] + name = "Simplicity" + text = "Invent as little as possible and work with standard pydata types. We strive for easy-to-use interfaces that reduce mental overhead." + +[[goals]] + name = "Efficiency" + text = "Our tools should require as little computational resources as possible. This makes analysis of large datasets more accessible, and makes cutting edge research possible." +++ @@ -8,25 +28,21 @@ description = "The goals, organization and vision of the scverse consortium." We as scverse® want to make analysis tools for omics data in the life sciences as accessible as possible. This means: -* Interoperability -- we focus on developing open, standardized, and efficient file formats to encourage data sharing and re-use. -* Diversity -- we believe in removing barriers to participation in research, including economic factors and institutional culture. Our tools will have the most impact if they are developed by and for a diverse community. -* Transparency -- we do our work as openly as possible and welcome our community to join the decision making process. -* Simplicity -- invent as little as possible and work with standard pydata types. We strive for easy-to-use interfaces that reduce mental overhead. -* Efficiency -- our tools should require as little computational resources as possible. This makes analysis of large datasets more accessible, and makes cutting edge research possible. +{{< goals >}} ## Organization and vision The growing adoption of Python for single-cell omics data analysis has been catalyzed by [Scanpy](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1382-0) and [AnnData](https://anndata.scverse.org/). -Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be silo'd to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization -- scverse. +Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be siloed to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization -- scverse. -Scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. +scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. -Scverse provides high quality infrastructure for analysis of single cell omics data. These *core* tools are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. +scverse provides high quality infrastructure for analysis of single cell omics data. These [*core* tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. -These tools are placed under shared maintenance and development in the scverse GitHub organization. +These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). -Scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. Scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users to cutting-edge and varied selection of analysis methods. +scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users with a cutting-edge and varied selection of analysis methods. ## User engagement @@ -34,7 +50,7 @@ We are community-driven and committed to keeping the scverse community open. We * Clear documentation of code and usage via docs and tutorials. * Participation in development through issues and pull requests. -* Community forums, such as our Discourse, Zulip, and Twitter. +* Community forums and chat — our [Discourse](https://discourse.scverse.org/) and [Zulip](https://scverse.zulipchat.com/), alongside the other [ways to reach us](/join/). * Workshops at which we teach analysis workflows based on the scverse ecosystem. ## Developer engagement @@ -49,7 +65,7 @@ We support the development of these ecosystem packages by: * Providing stable APIs to build on top of. * Providing standardized and well-supported data structure to pass around data. * Making sure all contributions are recognized in our change logs and documentation. -* Promoting 3rd party packages that rely on scverse via our websites and social media feeds. +* Promoting [ecosystem packages](/packages/#ecosystem) that rely on scverse via our website and social media feeds. * Establishing open communication channels for: * Discussion and collaboration between developers. * A common forum for user support and engagement. diff --git a/layouts/about/list.html b/layouts/about/list.html index d8b4779..fb2d455 100644 --- a/layouts/about/list.html +++ b/layouts/about/list.html @@ -1,6 +1,13 @@ {{ define "main" }} -

{{ .Title }}

-
- {{ .Content }} -
+
+ {{ partial "toc.html" . }} +
+

{{ .Title }}

+
+
+ {{ .Content }} +
+
+
+
{{ end }} diff --git a/layouts/shortcodes/goals.html b/layouts/shortcodes/goals.html new file mode 100644 index 0000000..3522f13 --- /dev/null +++ b/layouts/shortcodes/goals.html @@ -0,0 +1,9 @@ +{{/* Article rather than div so the card titles stay out of the page's table of contents. */}} +
+ {{ range .Page.Params.goals }} +
+

{{ .name }}

+

{{ .text }}

+
+ {{ end }} +
From 9c3a30a0a7c5e5b406557611b0ca1ccca1346d3f Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 12:31:58 +0200 Subject: [PATCH 02/10] Redesign the goals, and add LinkedIn The goal cards were a grid, which with five items and uneven text left an orphan on the second row and half-empty boxes on the first. They are rows now: an icon in a tinted circle, then the name and the text. Rows align by construction whatever the copy does, and the tints come from the package palette already used for package and person avatars. Restore the sentence-initial capital on Scverse. Lowercase mid-sentence uses stay as they were. Add LinkedIn to /join and the footer. The join layout picked its icon through a nine-branch if/else on the entry id; the class travels with the entry now, so the next channel is a content change only. --- assets/main.scss | 56 ++++++++++++++++++++++----------- content/about/mission/_index.md | 11 +++++-- content/join/_index.md | 13 ++++++++ layouts/join/list.html | 33 +++---------------- layouts/partials/footer.html | 1 + layouts/shortcodes/goals.html | 21 ++++++++----- 6 files changed, 77 insertions(+), 58 deletions(-) diff --git a/assets/main.scss b/assets/main.scss index 86e07ad..3d168d5 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3432,32 +3432,34 @@ body { max-width: 46rem; } - .goal-grid { - display: grid; - // Three across, so five principles wrap 3 + 2 rather than stranding one on its own row - grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); - // Cards size to their text; stretching leaves the short ones mostly empty - align-items: start; - gap: 1rem; - margin: 1.5rem 0 2rem; + // Five principles with uneven text: any multi-column grid strands one card and leaves the + // short ones half empty, so these are rows, which align by construction. + .goal-list { + display: flex; + flex-direction: column; + gap: 0.35rem; + max-width: 52rem; + margin: 1.75rem 0 2.5rem; + padding: 0; + list-style: none; } - .goal-card { - padding: 1.25rem 1.35rem; - background-color: white; - border: 1px solid $overline; + .goal { + display: grid; + grid-template-columns: 3rem 1fr; + column-gap: 1.2rem; + align-items: start; + padding: 1.1rem 1.2rem; border-radius: $card-radius; - transition: all 200ms ease-in-out; + transition: background-color 200ms ease-in-out; &:hover { - border-color: $tilebg2; - box-shadow: 0 0.6rem 1.5rem rgba(0, 0, 0, 0.06); - transform: translateY(-2px); + background-color: $tilebg4; } // Element selector included to beat the generic `#page-content .post h3` margins h3 { - margin: 0 0 0.5rem; + margin: 0 0 0.3rem; font-size: 1.05rem; font-weight: 800; letter-spacing: -0.01em; @@ -3465,9 +3467,27 @@ body { p { margin: 0; - font-size: 0.9rem; + max-width: none; + font-size: 0.95rem; line-height: 1.6; color: $tiletext2; } } + + .goal-icon { + grid-row: span 2; + display: grid; + place-items: center; + width: 3rem; + height: 3rem; + font-size: 1.25rem; + color: $tiletext; + border-radius: 50%; + + @each $hue in $eco-hues { + &[data-hue="#{index($eco-hues, $hue) - 1}"] { + background-color: rgba($hue, 0.22); + } + } + } } diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index c331da8..e661152 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -4,22 +4,27 @@ description = "The goals, organization and vision of the scverse consortium." [[goals]] name = "Interoperability" + icon = "bi-arrow-left-right" text = "We focus on developing open, standardized, and efficient file formats to encourage data sharing and re-use." [[goals]] name = "Diversity" + icon = "bi-people" text = "We believe in removing barriers to participation in research, including economic factors and institutional culture. Our tools will have the most impact if they are developed by and for a diverse community." [[goals]] name = "Transparency" + icon = "bi-eye" text = "We do our work as openly as possible and welcome our community to join the decision making process." [[goals]] name = "Simplicity" + icon = "bi-boxes" text = "Invent as little as possible and work with standard pydata types. We strive for easy-to-use interfaces that reduce mental overhead." [[goals]] name = "Efficiency" + icon = "bi-lightning-charge" text = "Our tools should require as little computational resources as possible. This makes analysis of large datasets more accessible, and makes cutting edge research possible." +++ @@ -35,14 +40,14 @@ We as scverse® want to make analysis tools for omics data in the life sciences The growing adoption of Python for single-cell omics data analysis has been catalyzed by [Scanpy](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1382-0) and [AnnData](https://anndata.scverse.org/). Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be siloed to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization -- scverse. -scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. +Scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. -scverse provides high quality infrastructure for analysis of single cell omics data. These [*core* tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. +Scverse provides high quality infrastructure for analysis of single cell omics data. These [*core* tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). -scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users with a cutting-edge and varied selection of analysis methods. +Scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. Scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users with a cutting-edge and varied selection of analysis methods. ## User engagement diff --git a/content/join/_index.md b/content/join/_index.md index 8228600..477fb2a 100644 --- a/content/join/_index.md +++ b/content/join/_index.md @@ -4,36 +4,49 @@ description = "How to reach the scverse community on GitHub, Zulip, Discourse an [[resources]] id = "github" + icon = "bi-github" title = "GitHub" text = "Follow our organisation on GitHub" link = "https://github.com/scverse" [[resources]] id = "zulip" + icon = "i-zulip" title = "Zulip" text = "Chat with us on Zulip" link = "https://scverse.zulipchat.com/" [[resources]] id = "twitter" + icon = "i-xcom" title = "" text = "Follow us on X (fka Twitter)" link = "https://x.com/scverse_team" [[resources]] id = "bluesky" + icon = "i-bluesky" title = "Bluesky" text = "Follow us on Bluesky" link = "https://bsky.app/profile/scverse.bsky.social" +[[resources]] + id = "linkedin" + icon = "bi-linkedin" + title = "LinkedIn" + text = "Follow us on LinkedIn" + link = "https://www.linkedin.com/company/scverse" + [[resources]] id = "discourse" + icon = "i-discourse" title = "Discourse" text = "Ask questions on Discourse" link = "https://discourse.scverse.org/" [[resources]] id = "youtube" + icon = "bi-youtube" title = "YouTube" text = "Subscribe to our YouTube channel" link = "https://www.youtube.com/channel/UCpsvsIAW3R5OdftJKKuLNMA" diff --git a/layouts/join/list.html b/layouts/join/list.html index b7960a7..0c1efc4 100644 --- a/layouts/join/list.html +++ b/layouts/join/list.html @@ -8,35 +8,10 @@

{{ .Title }}

- {{ if eq $item.id "twitter" }} -
-  {{ $item.title }} -
- {{ else if eq $item.id "github" }} -
-  {{ $item.title }} -
- {{ else if eq $item.id "youtube" }} -
-  {{ $item.title }} -
- {{ else if eq $item.id "zulip" }} -
-  {{ $item.title }} -
- {{ else if eq $item.id "discourse" }} -
-  {{ $item.title }} -
- {{ else if eq $item.id "bluesky" }} -
-  {{ $item.title }} -
- {{ else }} -
- {{ $item.title }} -
- {{ end }} + {{/* Icon class travels with the entry, so a new channel is a content change */}} +
+ {{ with $item.icon }} {{ end }}{{ $item.title }} +

{{ $item.text }}

diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index d454093..c02d623 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -42,6 +42,7 @@
Join scverse
  • Zulip
  • X (Twitter)
  • Bluesky
  • +
  • LinkedIn
  • YouTube
  • diff --git a/layouts/shortcodes/goals.html b/layouts/shortcodes/goals.html index 3522f13..8893751 100644 --- a/layouts/shortcodes/goals.html +++ b/layouts/shortcodes/goals.html @@ -1,9 +1,14 @@ -{{/* Article rather than div so the card titles stay out of the page's table of contents. */}} -
    - {{ range .Page.Params.goals }} -
    -

    {{ .name }}

    -

    {{ .text }}

    -
    +{{/* Article rather than div so the goal titles stay out of the page's table of contents. */}} +
      + {{ range $i, $goal := .Page.Params.goals }} +
    • +
      + +

      {{ $goal.name }}

      +

      {{ $goal.text }}

      +
      +
    • {{ end }} -
    + From 3913b89647be43e0bd603ca83c271b137a20e9b6 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 12:35:50 +0200 Subject: [PATCH 03/10] Give the other three sections the same treatment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The engagement sections were the bullet lists the goals used to be, so they get the same icon rows. The shortcode takes a front-matter key now rather than being goals-specific, and the sub-bullets under "open communication channels" fold into their own row. Each list item gains a short label. The sentences already opened with the word that names them, so this is mostly promotion rather than new copy, and it makes the rows scannable rather than a paragraph in list clothing. Organization and vision is five paragraphs of prose and stays prose, but the definition of *core* tools is the sentence the rest of the section leans on, so it becomes a callout. Every section's opening paragraph is now set as a lead, which needs no markup — it is the paragraph after the heading. --- assets/main.scss | 29 ++++++++++++-- content/about/mission/_index.md | 63 +++++++++++++++++++++++------- layouts/shortcodes/goals.html | 14 ------- layouts/shortcodes/principles.html | 16 ++++++++ 4 files changed, 91 insertions(+), 31 deletions(-) delete mode 100644 layouts/shortcodes/goals.html create mode 100644 layouts/shortcodes/principles.html diff --git a/assets/main.scss b/assets/main.scss index 3d168d5..1c48662 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3432,9 +3432,32 @@ body { max-width: 46rem; } + // Every section opens with a lead sentence; give it the weight to act as one + h2 + p { + font-size: 1.15rem; + line-height: 1.65; + color: $tiletext; + } + + // Definitions and other asides pulled out of the surrounding prose + blockquote { + margin: 1.5rem 0; + padding: 1rem 1.25rem; + background-color: $tilebg4; + border-left: 3px solid $tilebg2; + border-radius: 0 $card-radius $card-radius 0; + + p { + margin: 0; + font-size: 0.95rem; + line-height: 1.7; + color: $tiletext2; + } + } + // Five principles with uneven text: any multi-column grid strands one card and leaves the // short ones half empty, so these are rows, which align by construction. - .goal-list { + .principle-list { display: flex; flex-direction: column; gap: 0.35rem; @@ -3444,7 +3467,7 @@ body { list-style: none; } - .goal { + .principle { display: grid; grid-template-columns: 3rem 1fr; column-gap: 1.2rem; @@ -3474,7 +3497,7 @@ body { } } - .goal-icon { + .principle-icon { grid-row: span 2; display: grid; place-items: center; diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index e661152..0d55c5c 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -26,6 +26,50 @@ description = "The goals, organization and vision of the scverse consortium." name = "Efficiency" icon = "bi-lightning-charge" text = "Our tools should require as little computational resources as possible. This makes analysis of large datasets more accessible, and makes cutting edge research possible." +[[user_support]] + name = "Documentation" + icon = "bi-journal-text" + text = "Clear documentation of code and usage via docs and tutorials." + +[[user_support]] + name = "Participation" + icon = "bi-git" + text = "Participation in development through issues and pull requests." + +[[user_support]] + name = "Forums and chat" + icon = "bi-chat-dots" + text = "Our [Discourse](https://discourse.scverse.org/) and [Zulip](https://scverse.zulipchat.com/), alongside the other [ways to reach us](/join/)." + +[[user_support]] + name = "Workshops" + icon = "bi-mortarboard" + text = "Workshops at which we teach analysis workflows based on the scverse ecosystem." + +[[developer_support]] + name = "Stable APIs" + icon = "bi-plug" + text = "Providing stable APIs to build on top of." + +[[developer_support]] + name = "Shared data structures" + icon = "bi-hdd-stack" + text = "Providing standardized and well-supported data structures to pass around data." + +[[developer_support]] + name = "Recognition" + icon = "bi-award" + text = "Making sure all contributions are recognized in our change logs and documentation." + +[[developer_support]] + name = "Promotion" + icon = "bi-megaphone" + text = "Promoting [ecosystem packages](/packages/#ecosystem) that rely on scverse via our website and social media feeds." + +[[developer_support]] + name = "Open channels" + icon = "bi-chat-square-text" + text = "Establishing open communication channels for discussion and collaboration between developers, and a common forum for user support and engagement." +++ @@ -33,7 +77,7 @@ description = "The goals, organization and vision of the scverse consortium." We as scverse® want to make analysis tools for omics data in the life sciences as accessible as possible. This means: -{{< goals >}} +{{< principles "goals" >}} ## Organization and vision @@ -44,8 +88,8 @@ Scverse is a consortium of tools with users and developers across the world. To Scverse provides high quality infrastructure for analysis of single cell omics data. These [*core* tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. -We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. -These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). +> We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. +> These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). Scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. Scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users with a cutting-edge and varied selection of analysis methods. @@ -53,10 +97,7 @@ Scverse *core* tools are expected to interface with and be supplemented by other We are community-driven and committed to keeping the scverse community open. We strive to actively foster a community where everyone is and feels welcomed, and where there are no barriers to contributions in any form. We welcome newcomers and pledge to build an environment where they can grow as contributors, developers, and community members. Together with technical and development support, we also support our users through: -* Clear documentation of code and usage via docs and tutorials. -* Participation in development through issues and pull requests. -* Community forums and chat — our [Discourse](https://discourse.scverse.org/) and [Zulip](https://scverse.zulipchat.com/), alongside the other [ways to reach us](/join/). -* Workshops at which we teach analysis workflows based on the scverse ecosystem. +{{< principles "user_support" >}} ## Developer engagement @@ -67,10 +108,4 @@ We encourage the creation of new methods and tools on top of the *core* packages We support the development of these ecosystem packages by: -* Providing stable APIs to build on top of. -* Providing standardized and well-supported data structure to pass around data. -* Making sure all contributions are recognized in our change logs and documentation. -* Promoting [ecosystem packages](/packages/#ecosystem) that rely on scverse via our website and social media feeds. -* Establishing open communication channels for: - * Discussion and collaboration between developers. - * A common forum for user support and engagement. +{{< principles "developer_support" >}} diff --git a/layouts/shortcodes/goals.html b/layouts/shortcodes/goals.html deleted file mode 100644 index 8893751..0000000 --- a/layouts/shortcodes/goals.html +++ /dev/null @@ -1,14 +0,0 @@ -{{/* Article rather than div so the goal titles stay out of the page's table of contents. */}} -
      - {{ range $i, $goal := .Page.Params.goals }} -
    • -
      - -

      {{ $goal.name }}

      -

      {{ $goal.text }}

      -
      -
    • - {{ end }} -
    diff --git a/layouts/shortcodes/principles.html b/layouts/shortcodes/principles.html new file mode 100644 index 0000000..aa2fa78 --- /dev/null +++ b/layouts/shortcodes/principles.html @@ -0,0 +1,16 @@ +{{/* Renders any front-matter list of {name, icon, text} as icon rows. + Article rather than div so the titles stay out of the page's table of contents. +*/}} +
      + {{ range $i, $item := index .Page.Params (.Get 0) }} +
    • +
      + +

      {{ $item.name }}

      +

      {{ $item.text | markdownify }}

      +
      +
    • + {{ end }} +
    From 4fd76739ce9a4deaf176b25346d866e6afabc52d Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 13:20:40 +0200 Subject: [PATCH 04/10] Stop prose sitting in the middle of a widescreen column MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The table of contents widens the page to 1400px, which suits the package card grid it was written for. On prose that width is unusable — the measure stays where it is readable and the extra 400px piles up on the right of every paragraph. /about keeps the normal column and the measure grows to 54rem, so the text fills the space beside the sidebar instead of hugging its left edge. --- assets/main.scss | 11 +++++++++-- layouts/about/list.html | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/assets/main.scss b/assets/main.scss index 1c48662..1d07163 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -1447,6 +1447,13 @@ body { width: $contentwidthwide; } + // The extra width is for card grids. Prose keeps the normal column, or the measure sits in + // the middle of it with all the slack pushed to one side. + #page-content:has(.with-toc--prose) { + max-width: $maxwidth; + width: $contentwidth; + } + .with-toc { display: grid; grid-template-columns: 13rem minmax(0, 1fr); @@ -3429,7 +3436,7 @@ body { > ul, > ol, > blockquote { - max-width: 46rem; + max-width: 54rem; } // Every section opens with a lead sentence; give it the weight to act as one @@ -3461,7 +3468,7 @@ body { display: flex; flex-direction: column; gap: 0.35rem; - max-width: 52rem; + max-width: 54rem; margin: 1.75rem 0 2.5rem; padding: 0; list-style: none; diff --git a/layouts/about/list.html b/layouts/about/list.html index fb2d455..ed12938 100644 --- a/layouts/about/list.html +++ b/layouts/about/list.html @@ -1,5 +1,5 @@ {{ define "main" }} -
    +
    {{ partial "toc.html" . }}

    {{ .Title }}

    From 6f2c065ba3730eac6785b57b501fe1b62e10d77e Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 13:24:28 +0200 Subject: [PATCH 05/10] Settle the typography in Organization and vision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inter ships as one variable face with no italic, so every *core* was a synthesised oblique and read as a second font. The term is italic where it is defined in the callout and plain on the five other mentions, which is the usual convention anyway. The closing paragraph said the same thing twice — core tools interface with the ecosystem, and scverse strives for interoperability with the ecosystem — so it is one sentence now. Two dashes were the wrong kind for a page that uses em dashes elsewhere. --- content/about/mission/_index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index 0d55c5c..df8e733 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -82,16 +82,16 @@ We as scverse® want to make analysis tools for omics data in the life sciences ## Organization and vision The growing adoption of Python for single-cell omics data analysis has been catalyzed by [Scanpy](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1382-0) and [AnnData](https://anndata.scverse.org/). -Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be siloed to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization -- scverse. +Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be siloed to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization — scverse. Scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. -Scverse provides high quality infrastructure for analysis of single cell omics data. These [*core* tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. +Scverse provides high quality infrastructure for analysis of single cell omics data. These [core tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. > We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. > These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). -Scverse *core* tools are expected to interface with and be supplemented by other tools in the ecosystem. Scverse strives for synergy and interoperability with the ecosystem of packages built around these *core* tools, to ultimately provide users with a cutting-edge and varied selection of analysis methods. +Scverse strives for synergy and interoperability with the ecosystem of packages built around these core tools, to ultimately give users a cutting-edge and varied selection of analysis methods. ## User engagement @@ -101,10 +101,10 @@ We are community-driven and committed to keeping the scverse community open. We ## Developer engagement -Tools within scverse are deliberately not unified under a single package, and instead form a consortium of *core* analytic tools with shared maintenance responsibilities. -Development of these packages is not restricted – contributions are welcomed and publicly acknowledged. +Tools within scverse are deliberately not unified under a single package, and instead form a consortium of core analytic tools with shared maintenance responsibilities. +Development of these packages is not restricted — contributions are welcomed and publicly acknowledged. However, scverse aims to support the external development of new approaches to analyze and work with single cell data. -We encourage the creation of new methods and tools on top of the *core* packages and data-structures. +We encourage the creation of new methods and tools on top of the core packages and data-structures. We support the development of these ecosystem packages by: From 81259501fde5fcfc03303e655ede064ae11859e3 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 13:28:19 +0200 Subject: [PATCH 06/10] Even out the type scale on the about pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The section stepped down through four sizes — 1.15rem lead, 1rem body from the browser default, 0.95rem callout, 0.95rem rows — so the lead read as a different document from the paragraphs under it and the callout was the smallest thing on the page despite being the part meant to stand out. #about-content sets its own body size now, the lead is one deliberate step above it rather than a cliff, and the callout matches the prose it interrupts with a rule dark enough to see. --- assets/main.scss | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/assets/main.scss b/assets/main.scss index 1d07163..ae0a86a 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3431,6 +3431,12 @@ body { // Specific to /about — long-form prose pages #about-content { + // Without this the body falls back to the browser default and the section reads as four + // descending sizes: lead, body, callout, rows + font-size: 1.05rem; + line-height: 1.75; + text-wrap: pretty; + // The column is sized for card grids; prose needs a readable measure inside it > p, > ul, @@ -3439,26 +3445,39 @@ body { max-width: 54rem; } + > p { + margin-bottom: 1.15rem; + } + // Every section opens with a lead sentence; give it the weight to act as one h2 + p { - font-size: 1.15rem; - line-height: 1.65; + font-size: 1.2rem; + line-height: 1.6; color: $tiletext; } - // Definitions and other asides pulled out of the surrounding prose + // Definitions and other asides pulled out of the surrounding prose. A callout set smaller + // than the text around it recedes, which is the opposite of the job. blockquote { - margin: 1.5rem 0; - padding: 1rem 1.25rem; + margin: 1.75rem 0; + padding: 1.1rem 1.35rem; background-color: $tilebg4; - border-left: 3px solid $tilebg2; + border-left: 3px solid $greydesc; border-radius: 0 $card-radius $card-radius 0; p { margin: 0; - font-size: 0.95rem; + font-size: 1.05rem; line-height: 1.7; - color: $tiletext2; + color: $tiletext; + } + } + + @media (max-width: 50rem) { + font-size: 1rem; + + h2 + p { + font-size: 1.1rem; } } @@ -3498,7 +3517,7 @@ body { p { margin: 0; max-width: none; - font-size: 0.95rem; + font-size: 1rem; line-height: 1.6; color: $tiletext2; } From 27dd462ae47bc318c1b45987984e41ac849fc17b Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 13:33:22 +0200 Subject: [PATCH 07/10] Give Organization and vision something to look at MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is the one section that is argument rather than a list, so it has no rows and nothing but paragraphs. Rather than forcing prose into cards, back its own claim — a consortium of tools with users and developers across the world — with the numbers behind it. Counts come from the package registry and the contributor list the people page already reads, so nothing is typed by hand and nothing goes stale. Each tile links to the page it counts. The hue rule was nested under .stat-value, where `&` carries the whole ancestor chain and produced `.stat[data-hue] #about-content .stat-value`, which matches nothing. Written as a descendant it works. --- assets/main.scss | 48 +++++++++++++++++++++++++++++++++ content/about/mission/_index.md | 2 ++ layouts/shortcodes/stats.html | 30 +++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 layouts/shortcodes/stats.html diff --git a/assets/main.scss b/assets/main.scss index ae0a86a..a6d258b 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3483,6 +3483,54 @@ body { // Five principles with uneven text: any multi-column grid strands one card and leaves the // short ones half empty, so these are rows, which align by construction. + .stat-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); + gap: 1rem; + max-width: 54rem; + margin: 1.75rem 0 2rem; + } + + a.stat { + display: flex; + flex-direction: column; + gap: 0.15rem; + padding: 1.1rem 1.25rem; + text-decoration: none; + background-color: white; + border: 1px solid $overline; + border-radius: $card-radius; + transition: all 200ms ease-in-out; + + &:hover { + border-color: $tilebg2; + box-shadow: 0 0.6rem 1.5rem rgba(0, 0, 0, 0.06); + transform: translateY(-2px); + } + } + + .stat-value { + font-size: 2rem; + font-weight: 800; + line-height: 1.1; + letter-spacing: -0.02em; + font-variant-numeric: tabular-nums; + color: $tiletext; + } + + // Written as a descendant rather than nested under .stat-value: `&` there would carry the + // whole ancestor chain and put .stat in front of #about-content + @each $hue in $eco-hues { + .stat[data-hue="#{index($eco-hues, $hue) - 1}"] .stat-value { + color: darken($hue, 15%); + } + } + + .stat-label { + font-size: 0.9rem; + color: $greydesc; + } + .principle-list { display: flex; flex-direction: column; diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index df8e733..fd2f8d7 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -84,6 +84,8 @@ We as scverse® want to make analysis tools for omics data in the life sciences The growing adoption of Python for single-cell omics data analysis has been catalyzed by [Scanpy](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1382-0) and [AnnData](https://anndata.scverse.org/). Around this infrastructure an ecosystem of packages has been created by various developers and institutions — extending single-cell analysis to different modalities and addressing challenges at the cutting-edge of single-cell research. We believe that progress in this field can't be siloed to a few groups. To further nurture the growth of this ecosystem, we've formed a new organization — scverse. +{{< stats >}} + Scverse is a consortium of tools with users and developers across the world. To sustain the utility and growth of the ecosystem, it’s essential that the core analytic tools are robust and well-maintained. This entails consistent support and improvement of tools beyond what's possible in the conventional single-lab academic setting. Scverse provides high quality infrastructure for analysis of single cell omics data. These [core tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. diff --git a/layouts/shortcodes/stats.html b/layouts/shortcodes/stats.html new file mode 100644 index 0000000..9b0aeac --- /dev/null +++ b/layouts/shortcodes/stats.html @@ -0,0 +1,30 @@ +{{/* Counts read from the package registry and the contributor list, so the section's claim to be + a worldwide consortium is backed by numbers that cannot go stale. */}} +{{ $pkgs := slice }} +{{ with resources.GetRemote "https://scverse.org/ecosystem-packages/packages.json" }} + {{ $pkgs = transform.Unmarshal .Content }} +{{ end }} +{{ $contributors := slice }} +{{ with resources.GetRemote "https://scverse.org/stats/contributors.json" }} + {{ $contributors = (. | transform.Unmarshal).contributors | default slice }} +{{ end }} + +{{ $core := len (where $pkgs "category" "in" (slice "core-datastructure" "core-framework")) }} +{{ $eco := len (where $pkgs "category" "ecosystem") }} + + From bd6bed84c72bcf77a42c079a8e9592834e482dfe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:33:36 +0000 Subject: [PATCH 08/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- layouts/shortcodes/stats.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/layouts/shortcodes/stats.html b/layouts/shortcodes/stats.html index 9b0aeac..0e5d8e9 100644 --- a/layouts/shortcodes/stats.html +++ b/layouts/shortcodes/stats.html @@ -1,5 +1,6 @@ {{/* Counts read from the package registry and the contributor list, so the section's claim to be - a worldwide consortium is backed by numbers that cannot go stale. */}} + a worldwide consortium is backed by numbers that cannot go stale. +*/}} {{ $pkgs := slice }} {{ with resources.GetRemote "https://scverse.org/ecosystem-packages/packages.json" }} {{ $pkgs = transform.Unmarshal .Content }} @@ -12,6 +13,7 @@ {{ $core := len (where $pkgs "category" "in" (slice "core-datastructure" "core-framework")) }} {{ $eco := len (where $pkgs "category" "ecosystem") }} +
    {{ $core }} From e1daf75a2b7b83999e8e3524e3ed26c7472eb60a Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Tue, 25 Aug 2026 13:37:45 +0200 Subject: [PATCH 09/10] Fold the core definition away, and settle on one prose size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep the definition — /about/roles uses "core packages" three times without defining it, /packages only glosses it, the registry has three core-* categories and the stat tile counts them, so this is the only place on the site that says what the word means. It folds into a details disclosure instead, so it is there for whoever wants it and out of the argument for everyone else. Drop the lead-paragraph size bump. Varying paragraph sizes inside one section reads as inconsistency rather than emphasis, and hierarchy is the headings' job. Every paragraph, list row and disclosure on the page is one size now; the only others left are the stat number, its caption and the icon glyph, none of which are prose. --- assets/main.scss | 59 +++++++++++++++++++++------------ content/about/mission/_index.md | 6 ++-- layouts/shortcodes/aside.html | 6 ++++ 3 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 layouts/shortcodes/aside.html diff --git a/assets/main.scss b/assets/main.scss index a6d258b..72a2bf4 100644 --- a/assets/main.scss +++ b/assets/main.scss @@ -3449,36 +3449,54 @@ body { margin-bottom: 1.15rem; } - // Every section opens with a lead sentence; give it the weight to act as one - h2 + p { - font-size: 1.2rem; - line-height: 1.6; - color: $tiletext; - } + // One size for all prose. Hierarchy is the headings' job; varying paragraph sizes within a + // section reads as inconsistency rather than emphasis. - // Definitions and other asides pulled out of the surrounding prose. A callout set smaller - // than the text around it recedes, which is the opposite of the job. - blockquote { - margin: 1.75rem 0; - padding: 1.1rem 1.35rem; + // Optional elaboration, folded away so it does not interrupt the argument + .aside { + max-width: 54rem; + margin: 1.5rem 0; background-color: $tilebg4; - border-left: 3px solid $greydesc; - border-radius: 0 $card-radius $card-radius 0; + border-radius: $card-radius; + + summary { + padding: 0.8rem 1.1rem; + font-weight: 700; + color: $tiletext; + cursor: pointer; + list-style: none; + + &::-webkit-details-marker { + display: none; + } + &::before { + content: "›"; + display: inline-block; + width: 1rem; + font-weight: 400; + color: $greydesc; + transition: transform 200ms ease-in-out; + } + &:hover { + color: black; + } + } + &[open] summary::before { + transform: rotate(90deg); + } + } + + .aside-body { + padding: 0 1.1rem 1rem 2.1rem; p { margin: 0; - font-size: 1.05rem; - line-height: 1.7; - color: $tiletext; + color: $tiletext2; } } @media (max-width: 50rem) { font-size: 1rem; - - h2 + p { - font-size: 1.1rem; - } } // Five principles with uneven text: any multi-column grid strands one card and leaves the @@ -3565,7 +3583,6 @@ body { p { margin: 0; max-width: none; - font-size: 1rem; line-height: 1.6; color: $tiletext2; } diff --git a/content/about/mission/_index.md b/content/about/mission/_index.md index fd2f8d7..1b9a1c8 100644 --- a/content/about/mission/_index.md +++ b/content/about/mission/_index.md @@ -90,8 +90,10 @@ Scverse is a consortium of tools with users and developers across the world. To Scverse provides high quality infrastructure for analysis of single cell omics data. These [core tools](/packages/) are well documented, tested, and provide broad functionality. They work with standardized data structures which use common Python numeric types and have interchange-friendly on-disk formats. -> We define *core* tools as those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. -> These tools are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). +{{< aside "What counts as a core tool?" >}} +Those which facilitate sharing data through common formats, or provide foundational support for single cell datatypes (e.g. modality-specific IO, toolkits) and analyses. +They are placed under [shared maintenance](/about/roles/) and development in the [scverse GitHub organization](https://github.com/scverse). +{{< /aside >}} Scverse strives for synergy and interoperability with the ecosystem of packages built around these core tools, to ultimately give users a cutting-edge and varied selection of analysis methods. diff --git a/layouts/shortcodes/aside.html b/layouts/shortcodes/aside.html new file mode 100644 index 0000000..fe12e3d --- /dev/null +++ b/layouts/shortcodes/aside.html @@ -0,0 +1,6 @@ +{{/* Optional elaboration: available to whoever wants it, out of the way of everyone else. + Native
    , so it works without JavaScript and is searchable in-page when open. */}} +
    + {{ .Get 0 }} +
    {{ .Inner | markdownify }}
    +
    From ec7e66304b9316101b4127f915d6afb5dd649d32 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:38:09 +0000 Subject: [PATCH 10/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- layouts/shortcodes/aside.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layouts/shortcodes/aside.html b/layouts/shortcodes/aside.html index fe12e3d..e9567fd 100644 --- a/layouts/shortcodes/aside.html +++ b/layouts/shortcodes/aside.html @@ -1,5 +1,6 @@ {{/* Optional elaboration: available to whoever wants it, out of the way of everyone else. - Native
    , so it works without JavaScript and is searchable in-page when open. */}} + Native
    , so it works without JavaScript and is searchable in-page when open. +*/}}
    {{ .Get 0 }}
    {{ .Inner | markdownify }}