Contribute
The most valuable contribution is not code — it is a scenario or an incident nobody has written yet, drawn from a failure you have actually had to fix.
Four ways in
- No Go required
Author content
Scenarios, incidents, learning paths and challenges are YAML plus shell scripts. Go orchestrates, records and grades — it never encodes the content. No Go knowledge required.
Your first scenario - Go 1.24+
Fix code
The engine is a self-contained Go module under src/, with cobra commands as thin adapters, a durable run engine and SQLite persistence. Layering is documented in ADR-0005.
Read the architecture - Any level
Strengthen the tests
Four test layers are mandatory for every change: Go unit, shell (bats with kubectl stubbed), UI component (vitest) and end-to-end (Playwright). Coverage is gated in CI.
Testing guide - Any level
Report what broke
It is an early release with rapid iteration and the odd rough edge. A precise report with your labctl doctor output and the failing command is genuinely valuable.
Open an issue
From clone to running tests
Contributors need Go 1.24+ and Node 22+ — end users following the quickstart do not, because the released binary already has the UI embedded.
Build it
git clone https://github.com/sagar2395/snowopslabs.git
cd snowopslabs
cp config/.env.example .env
make cli-build # bin/labctl, UI embedded
make cli-install # …or onto your PATHProve it still works
make test # Go unit + shell, race, coverage gate
make test-ui # vitest component tests
make test-e2e # playwright journeys
make lint # every static-analysis gate
make validate # all content is well-formedAll four test layers are mandatory for every change — see the testing guide. Commits are signed off under the DCO; the contributing guide has the full PR bar.
The golden rules
Three principles that decide most review conversations before they start.
Everything is verifiable
Checks are the core primitive. A scenario without checks is a blog post.
Declarative content, orchestrating code
If it can be YAML, it is YAML. Go never encodes the content itself.
Every layer, every change
Unit, shell, component and end-to-end. Plus a runbook a human can follow.
The catalog has 6 faults. Production has thousands.
If you have debugged a failure that is not in the library — a certificate that expired at the worst moment, a DNS change that took out half a namespace, a CNI upgrade that went sideways — that is the contribution the project most wants. Faults must be realistic and reversible; everything else is detail.