Challenge Authoring Quickstart
This template (netsim-template) ships with only one canonical example challenge: 01 — Ethernet Basics. After you fork this template downstream, follow the workflow below to add your own challenges.
Directory layout
docs/challenges/
├── index.md ← This file (challenge index)
├── 01-ethernet-basics/ ← Canonical example
│ ├── config.yaml ← Challenge definition (topology, protocols, events, flag, win_condition)
│ └── index.md ← Challenge story and hints
├── flags.secret.yaml.example ← Flag secret template (copy to flags.secret.yaml and add it to .gitignore before committing)
└── <your-new-challenge>/ ← Add new challenges following the example structureSteps to add a new challenge
- Copy
01-ethernet-basics/into a new directory (we suggest theNN-slugnaming pattern, e.g.02-arp-poisoning/). - Edit
config.yaml: write the metadata, topology, protocols, events, and win_condition following the DSL v2 spec indocs/dev/extending.md. - Edit
index.md: write your challenge story, objectives, and hints. - Add the new challenge's flag mapping to
flags.secret.yaml. - Run
pnpm validate:challengesto confirm the schema passes. - Add a link to the new challenge under
sidebar['/challenges/']in.vitepress/config.mts. - Run
pnpm docs:devto preview locally.
Further reading
- System architecture — SimNet's core engine and data flow
- Adding new challenges — Full DSL v2 reference and every available field