WOLS v1.1: Better Genetics Tracking for Mushroom Cultivators
mbeacom
Author5 min read

mbeacom
Author5 min read

When we open-sourced the WeMush Open Labeling Standard in December, we wanted to solve a fundamental problem: mycology operates on spreadsheets, paper notebooks, and institutional knowledge that dies when cultivators move on.
The response validated that others feel this pain. Our Show HN post hit 39 points, the spec repo crossed 42 stars, and the feedback started flowing in. One request came up repeatedly: better genetics tracking.
Today we're releasing WOLS v1.1 with clonal generation tracking, JSON-LD format for interoperability, and production-ready client libraries for Python and TypeScript.
The v1.0 spec tracked filial generations (F1, F2, etc.) for sexual reproduction. But vegetative propagation—the workhorse of commercial cultivation—wasn't captured well.
Now the strain field supports both:
{
"strain": {
"name": "Blue Oyster PoHu",
"generation": "F2",
"clonalGeneration": 3,
"lineage": "wemush:parent123",
"source": "tissue"
}
}generation tracks filial generations from spore germination (P → F1 → F2). clonalGeneration tracks how many times you've transferred the mycelium—critical for monitoring culture health and senescence.
Every commercial grower knows the pain of a master culture degrading over time. Now you can track exactly how many transfers deep you are and correlate that with performance metrics.
WOLS v1.1 adopts JSON-LD format with semantic context:
{
"@context": "https://wemush.com/wols/v1",
"@type": "Specimen",
"id": "wemush:clx1a2b3c4d5e6f7g8",
"version": "1.1.0",
"type": "SUBSTRATE",
"species": "Pleurotus ostreatus",
"stage": "COLONIZATION"
}This isn't just about being trendy. JSON-LD means WOLS data can integrate directly with:
The context URL (https://wemush.com/wols/v1) publishes the full schema definition. Existing parsers that don't care about semantic context can ignore @context and @type—backwards compatibility is maintained.
Specimen IDs now carry the wemush: prefix:
wemush:clx1a2b3c4d5e6f7g8
This enables WOLS specimens to coexist in systems that aggregate data from multiple sources. When you're querying a research database with specimens from ten different platforms, namespace prefixes prevent ID collisions.
The spec is CC 4.0. The tooling is Apache 2.0. Both are free forever.
Full-featured implementation with optional modules for QR codes, encryption, and CLI:
# Core only
pip install wols
# Everything
pip install "wols[all]"from wols import create_specimen, SpecimenType, GrowthStage, to_json
specimen = create_specimen(
type=SpecimenType.SUBSTRATE,
species="Pleurotus ostreatus",
strain="Blue Oyster",
stage=GrowthStage.COLONIZATION,
batch="BATCH-2026-001",
)
print(to_json(specimen, indent=2))The CLI wraps everything for quick operations:
wols create --species "Pleurotus ostreatus" --type SUBSTRATE --json
wols validate specimen.json
wols qr specimen.json --output label.pngFor web apps, React Native, and Node.js:
npm install @wemush/wolsimport { createSpecimen, serializeSpecimen, toQRCodeDataURL } from '@wemush/wols';
const specimen = createSpecimen({
type: 'SPAWN',
species: 'Hericium erinaceus',
strain: { name: "Lion's Mane", generation: 'F2', clonalGeneration: 2 },
stage: 'COLONIZATION',
});
// Serialize for QR encoding
const json = serializeSpecimen(specimen);
// Generate QR code for web display
const qrDataUrl = await toQRCodeDataURL(specimen, {
size: 400,
errorCorrection: 'H',
});Both libraries support Zod (TypeScript) and Pydantic (Python) validation, encryption for proprietary data, and compact URL encoding for small QR codes.
For CI/CD pipelines or environments where you don't want to install dependencies:
docker pull ghcr.io/wemush/specimen-labels-py:latest
# Create a specimen
docker run --rm ghcr.io/wemush/specimen-labels-py create \
--species "Pleurotus ostreatus" \
--type SUBSTRATE \
--jsonA common concern with embedded formats: will the JSON actually fit in a QR code?
Yes. A typical v1.1 embedded specimen clocks in at 380-450 bytes. QR codes with error correction level M handle 2,000+ bytes comfortably. You have headroom for the custom namespace to carry vendor-specific data.
For petri dishes and tiny labels, compact URLs compress down to ~80 bytes:
wemush://v1/clx1a2b3c4?s=POSTR&st=COLONIZATION&ty=CULTURE
The tradeoff: compact format requires an API call to resolve full data. Embedded format works completely offline.
From GitHub issues and discussions:
We're listening. The governance process is public—submit issues, join discussions, or propose changes directly.
Specification: wemush.com/open-standard/specification
Open Standard Repo: github.com/wemush/open-standard
See the CLI in action

The spec is CC BY 4.0. The libraries are Apache 2.0. Use them however you want.
If you're building tools for cultivators, integrating specimen tracking into research workflows, or just want to track your home grows better—we'd love to hear from you. Star the repo, open an issue, or reach out directly.
Mark Beacom is the founder of WeMush and a 2025 Farmer Veteran Coalition Fellow. He builds cultivation infrastructure in Ohio when he's not writing specifications.