01 · Source
biochef-recipes
YAML source of truth. Each tool is a biochef.yaml file declaring inputs, runtime, and version.
Architecture
Three pieces ship today: recipes in Git, the Hub CI that signs and publishes, and the BioChef Registry that serves the WebAssembly app.
Shipped today
Four stations, left to right. Every artifact is content-addressable; every step is signed.
01 · Source
YAML source of truth. Each tool is a biochef.yaml file declaring inputs, runtime, and version.
02 · Build
CI on GitHub Actions: validate, build to WASM, run golden tests, generate SBOM and SLSA, sign with cosign.
03 · Distribute
Content-addressable OCI bundles at registry.biochef.app: bundle.json, WASM/JS layers, SBOM, signature.
04 · Runtime
Static SPA fetches tools by digest, verifies the signature, and runs them as WebAssembly inside your browser tab.
Every artifact is content-addressable · every step is signed
Deep dive
Open each card to see what biochef-recipes, the Hub CI, the Registry, and the web app each do.
Recipes declare tools/workflows; Hub validates, signs, and bundles them for Registry.
biochef.schema.json; linting; tiny golden tests.index.json.biochef-recipes; run hub validate before opening a PR.biochef-hub/.github/workflows/build-recipe.yml.name: aligner
version: 1.0.0
inputs:
- id: reads
type: File
format: fastq
steps:
- id: qc
uses: biochef/qc@1.2.0
- id: align
uses: biochef/bwa@0.7
outputs:
- id: bam
from: align
The BioChef Registry, live at registry.biochef.app, stores signed OCI artifacts (bundle.json + WASM/JS layers + SBOM) and the signed index.json that lists every published tool by digest.
index.json with cosign.index.json as the source of truth for what is publishable.The BioChef web app, a static React/Webpack SPA, runs every published bioinformatics tool entirely in the browser via WebAssembly. Has a Tools page for single-tool runs and a Workflow page for DAG-style chains.
npm run build-wasm.{
"runtime": "wasm",
"tool": "fastq2fasta@1.0.0",
"verify": true,
"source": "https://registry.biochef.app/.../sha256:..."
}