This is a static site catalog that aggregates Nextflow modules and subworkflows from multiple GitHub repositories. It fetches module metadata from meta.yml files following nf-core conventions and generates a searchable, filterable catalog.
Tech Stack: Astro, Tailwind CSS v4, vanilla JavaScript
Deployment: GitHub Pages via GitHub Actions (daily builds)
npm install # Install dependencies
npm run fetch-modules # Clone repos and parse meta.yml files → generates src/data/modules.json
npm run dev # Start dev server at localhost:4321
npm run build # Build to ./dist├── repos.config.json # Repository sources configuration
├── scripts/fetch-modules.js # Clones repos, parses meta.yml, outputs modules.json
├── src/
│ ├── data/modules.json # Generated module data (do not edit manually)
│ ├── components/
│ │ ├── Header.astro
│ │ ├── ModuleCard.astro # Card view item
│ │ └── ModuleListItem.astro # List view item
│ ├── layouts/
│ │ └── BaseLayout.astro
│ ├── pages/
│ │ ├── index.astro # Home page with filters
│ │ └── modules/[slug].astro # Module detail pages
│ └── styles/global.css
├── astro.config.mjs # Site URL and base path config
└── .github/workflows/deploy.yml
repos.config.jsondefines source repositoriesfetch-modules.jsclones repos intorepos/(gitignored), findsmeta.ymlfiles- Parsed data written to
src/data/modules.json - Astro pages import and render the JSON data
interface Module {
name: string; // e.g., "cellpose"
slug: string; // URL-friendly: "janelia-module-cellpose"
description: string;
type: "module" | "subworkflow";
source: string; // e.g., "janelia"
sourceLabel: string; // e.g., "Janelia"
repository: string; // GitHub URL to module directory
keywords: string[];
tools?: { name, description?, homepage?, licence? }[];
components?: string[]; // For subworkflows - references other modules
authors: string[];
maintainers?: string[];
inputs?: { name, type?, description? }[];
outputs?: { name, type?, description? }[];
}The index page uses client-side filtering via data attributes (no external library):
data-org- GitHub organizationdata-type- "module" or "subworkflow"data-searchtext- Lowercase concatenation of all searchable fields
JavaScript in index.astro shows/hides elements based on filter inputs.
- Module type badge: Blue (
bg-blue-100 text-blue-700) - Subworkflow type badge: Purple (
bg-purple-100 text-purple-700) - Keywords/tags: Gray (
bg-gray-100 text-gray-600) - Component links: Styled by target type (blue for modules, purple for subworkflows)
In [slug].astro, the findModule() function matches component names to modules:
- Handles slash-to-underscore conversion (
spatial/cellpose→spatial_cellpose) - Prioritizes same-source matches
- Falls back to any source
- Edit
repos.config.json:
{
"name": "identifier",
"label": "Display Name",
"url": "https://github.com/org/repo.git"
}- Run
npm run fetch-modules
Repository must have modules/ or subworkflows/ directories with meta.yml files.
In astro.config.mjs:
site: Full URL (e.g.,https://bioimagetools.github.io)base: Path prefix (e.g.,/nf-module-aggregator/)
All internal links use import.meta.env.BASE_URL prefix.
Add a new field from meta.yml:
- Update parsing in
scripts/fetch-modules.js - Update TypeScript interface in
[slug].astro - Add display logic to detail page or cards
Modify filters:
- Filter UI:
index.astroFilters section - Filter logic:
applyFilters()function in<script>block - Data attributes:
ModuleCard.astroandModuleListItem.astro
Change color scheme:
- Type badges: Search for
bg-blue-100(module) andbg-purple-100(subworkflow) - Keywords: Search for
bg-gray-100 text-gray-600