Thanks for helping build an open cyber range. This document covers how work lands in the repository.
- platform code: API (Python/FastAPI), web (TypeScript/Next.js), worker, gateway, runner;
- content: rooms, modules, paths, authored as declarative bundles under
content/with automated solvers and tests; - reviews: technical, instructional, and security review of content;
- ops: CI, packaging, docs.
- Code is AGPL-3.0-or-later. Original prose and assets are CC BY-SA 4.0. Never copy proprietary platform content, branding, flags, or solutions from commercial training sites.
- Vulnerable targets stay inside lab scope. No real malware binaries in the repository; offensive technique rooms use purpose-built, inert simulations.
- Every room ships with a working intended-path solver and tests. A
bundle that fails
cyberrange content lintor its solver test does not merge.
- Branch from
main, name itfeat/...,fix/...,docs/...,content/.... - Commits follow Conventional Commits (
feat(api): ...,content(rooms): ...). The changelog is generated from commit messages. - One logical change per pull request. CI must be green before review counts.
- Content changes need at least one technical review and one instructional review before publish. Authors cannot approve their own public content (single-admin installs can disable this locally).
make bootstrap # installs Python (uv) and Node (pnpm) toolchains
make check # lint + typecheck everything
make test-unit # fast unit testsSee docs/ for architecture, authoring, and operator guides. The plan
of record lives at .hermes/plans/; current status is tracked in
docs/roadmap/implementation-status.md.
Reviewers check correctness first, then safety (scope, egress, flag handling), then instructional quality (objectives, hints, solution). "Works on my machine" is not verification; point to the test run or the solver output.