Thanks for your interest — contributions are very welcome, and adding a new concurrency pattern is a great first PR.
Open a GitHub issue for questions, bugs, or ideas. There's no separate forum or chat.
PRs are accepted and appreciated. There are no CLA or commit sign-off requirements — just:
- Fork and branch off
master. - Keep the change focused and match the surrounding style (the code leans on the Go standard library only; the frontend is dependency-free React + Vite).
- Make sure it builds and the checks pass (see below).
- Open the PR with a short description of what and why.
# backend
cd backend
go build ./...
go vet ./...
go test ./... # includes the source-mapping coherence test
# frontend
cd frontend
npm install
npx tsc --noEmit # type-check
npm run buildEach demo is one self-contained, real piece of concurrent Go that narrates itself through the tracer so the UI can animate it.
-
Create
backend/internal/patterns/my_pattern.go. -
In an
init(), register it:func init() { register(&Pattern{ ID: "my-pattern", Name: "My Pattern", Category: "Core Patterns", Order: 99, File: "my_pattern.go", Summary: "One-line description.", Docs: "Markdown: how it works.", Interview: "Markdown: what an interviewer probes.", run: runMyPattern, }) }
-
Write
func runMyPattern(ctx context.Context, t *trace.Tracer) errorusing the tracer helpers (t.Spawn,t.NewChan,t.Send,t.Recv,t.Lock,t.Pace,t.Exit, …). Uset.Pace(ctx, d)for the watchable delays — it's the one call that also honours cancellation. -
Restart the backend; the pattern appears in the sidebar automatically, with the trace hooks stripped from the "Go source" tab so learners read only the concept.
The tracer API is small — read internal/trace/trace.go and copy any existing
pattern (goroutines.go is a good template).
Please keep demos correct, idiomatic, and interview-defensible: this is a learning tool first.