# 0xdun0/duno architecture

> Architecture diagram of the GitHub repository 0xdun0/duno, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/0xdun0/duno
- Repository: https://github.com/0xdun0/duno

## Overview

DUNO is a Flask-based hands-on security training platform. Learners work through graded OWASP labs, isolated CTF challenges, and DUNO Kids lessons; community members can submit machine packages for validation and administrative review before publication. Core authentication and SQLite support these experiences. The graph preserves the README’s major product areas; some relationships for documented but unsampled features are omitted where the excerpts do not establish their callers.

Main entry points: [`modules/challenges/routes.py`](https://github.com/0xdun0/duno/blob/main/modules/challenges/routes.py) (Challenge Routes), [`core/database.py`](https://github.com/0xdun0/duno/blob/main/core/database.py) (SQLite Access), [`modules/brute_force/routes.py`](https://github.com/0xdun0/duno/blob/main/modules/brute_force/routes.py) (Lab Routes), [`modules/kids/routes.py`](https://github.com/0xdun0/duno/blob/main/modules/kids/routes.py) (Kids Lessons)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_platform["Platform Core"]
  node_auth["Authentication<br/>[auth.py]"]
  node_sqlite[("SQLite Access<br/>[database.py]")]
end

subgraph group_labs["Security Labs"]
  node_classic["OWASP Labs"]
  node_lab_routes["Lab Routes<br/>[routes.py]"]
  node_lab_logic["Lab Logic<br/>[logic.py]"]
  node_levels["Security Levels<br/>[security_levels.py]"]
end

subgraph group_ctf["CTF Challenges"]
  node_challenge_routes["Challenge Routes<br/>[routes.py]"]
  node_catalog["Challenge Catalog<br/>[catalog.py]"]
  node_runner_client["Runner Client<br/>[runner_client.py]"]
  node_runner_service["Challenge Runner<br/>[app.py]"]
  node_runner_core["Runner Core<br/>[runner_core.py]"]
  node_solves["Flag &amp; Solves<br/>[solves_service.py]"]
  node_events["Challenge Events<br/>[events.py]"]
end

subgraph group_community["Community Machines"]
  node_submission_routes["Submission Routes<br/>[routes.py]"]
  node_validator["Package Validator<br/>[validator.py]"]
  node_scanner["Dockerfile Scanner<br/>[scanner.py]"]
  node_worker["Audit Worker<br/>[worker.py]"]
  node_submission_state["Review State<br/>[state_machine.py]"]
  node_admin_routes["Review Console<br/>[admin_routes.py]"]
end

subgraph group_learning["Learning &amp; Docs"]
  node_kids_routes["Kids Lessons<br/>[routes.py]"]
  node_kids_content["Lesson Content<br/>[kids_content.py]"]
  node_kids_db[("Kids Progress<br/>[kids_db.py]")]
  node_docs["Documentation<br/>[docs_manager.py]"]
end

node_learner(("Learner"))
node_contributor(("Machine Contributor"))
node_admin(("Administrator"))

node_learner -->|"signs in"| node_auth
node_learner -->|"uses labs"| node_lab_routes
node_lab_routes -->|"gets level"| node_levels
node_lab_routes -->|"runs lab"| node_lab_logic
node_lab_routes -->|"serves labs"| node_classic
node_lab_routes -->|"reads user state"| node_sqlite
node_learner -->|"starts challenges"| node_challenge_routes
node_challenge_routes -->|"looks up challenge"| node_catalog
node_challenge_routes -->|"controls instance"| node_runner_client
node_runner_client -->|"calls API"| node_runner_service
node_runner_service -->|"dispatches runtime"| node_runner_core
node_challenge_routes -->|"stores instance"| node_sqlite
node_challenge_routes -->|"submits flag"| node_solves
node_challenge_routes -->|"emits events"| node_events
node_solves -->|"records solves"| node_sqlite
node_contributor -->|"uploads package"| node_submission_routes
node_submission_routes -->|"validates package"| node_validator
node_submission_routes -->|"records submission"| node_sqlite
node_admin -->|"reviews machines"| node_admin_routes
node_admin_routes -->|"reads review data"| node_sqlite
node_worker -->|"scans image config"| node_scanner
node_worker -->|"advances review"| node_submission_state
node_learner -->|"studies lessons"| node_kids_routes
node_kids_routes -->|"loads lesson data"| node_kids_content
node_kids_routes -->|"updates progress"| node_kids_db
node_kids_routes -->|"reads lesson records"| node_sqlite
node_learner -->|"consults guides"| node_docs

click node_auth "https://github.com/0xdun0/duno/blob/main/core/auth.py"
click node_sqlite "https://github.com/0xdun0/duno/blob/main/core/database.py"
click node_classic "https://github.com/0xdun0/duno/tree/main/modules"
click node_lab_routes "https://github.com/0xdun0/duno/blob/main/modules/brute_force/routes.py"
click node_lab_logic "https://github.com/0xdun0/duno/blob/main/modules/brute_force/logic.py"
click node_levels "https://github.com/0xdun0/duno/blob/main/core/security_levels.py"
click node_challenge_routes "https://github.com/0xdun0/duno/blob/main/modules/challenges/routes.py"
click node_catalog "https://github.com/0xdun0/duno/blob/main/modules/challenges/catalog.py"
click node_runner_client "https://github.com/0xdun0/duno/blob/main/modules/challenges/runner_client.py"
click node_runner_service "https://github.com/0xdun0/duno/blob/main/services/challenge-runner/app.py"
click node_runner_core "https://github.com/0xdun0/duno/blob/main/services/challenge-runner/runner_core.py"
click node_solves "https://github.com/0xdun0/duno/blob/main/modules/challenges/solves_service.py"
click node_events "https://github.com/0xdun0/duno/blob/main/modules/challenges/events.py"
click node_submission_routes "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/routes.py"
click node_validator "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/validator.py"
click node_scanner "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/scanner.py"
click node_worker "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/worker.py"
click node_submission_state "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/state_machine.py"
click node_admin_routes "https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/admin_routes.py"
click node_kids_routes "https://github.com/0xdun0/duno/blob/main/modules/kids/routes.py"
click node_kids_content "https://github.com/0xdun0/duno/blob/main/modules/kids/kids_content.py"
click node_kids_db "https://github.com/0xdun0/duno/blob/main/modules/kids/kids_db.py"
click node_docs "https://github.com/0xdun0/duno/blob/main/core/docs_manager.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_auth,node_sqlite toneBlue
class node_classic,node_lab_routes,node_lab_logic,node_levels toneAmber
class node_challenge_routes,node_catalog,node_runner_client,node_runner_service,node_runner_core,node_solves,node_events toneMint
class node_submission_routes,node_validator,node_scanner,node_worker,node_submission_state,node_admin_routes toneRose
class node_kids_routes,node_kids_content,node_kids_db,node_docs,node_learner,node_contributor,node_admin toneIndigo
```

## Components

### Platform Core

- [Authentication](https://github.com/0xdun0/duno/blob/main/core/auth.py): `core/auth.py`
- [SQLite Access](https://github.com/0xdun0/duno/blob/main/core/database.py): `core/database.py`

### Security Labs

- [OWASP Labs](https://github.com/0xdun0/duno/tree/main/modules): `modules`
- [Lab Routes](https://github.com/0xdun0/duno/blob/main/modules/brute_force/routes.py): `modules/brute_force/routes.py`
- [Lab Logic](https://github.com/0xdun0/duno/blob/main/modules/brute_force/logic.py): `modules/brute_force/logic.py`
- [Security Levels](https://github.com/0xdun0/duno/blob/main/core/security_levels.py): `core/security_levels.py`

### CTF Challenges

- [Challenge Routes](https://github.com/0xdun0/duno/blob/main/modules/challenges/routes.py): `modules/challenges/routes.py`
- [Challenge Catalog](https://github.com/0xdun0/duno/blob/main/modules/challenges/catalog.py): `modules/challenges/catalog.py`
- [Runner Client](https://github.com/0xdun0/duno/blob/main/modules/challenges/runner_client.py): `modules/challenges/runner_client.py`
- [Challenge Runner](https://github.com/0xdun0/duno/blob/main/services/challenge-runner/app.py): `services/challenge-runner/app.py`
- [Runner Core](https://github.com/0xdun0/duno/blob/main/services/challenge-runner/runner_core.py): `services/challenge-runner/runner_core.py`
- [Flag & Solves](https://github.com/0xdun0/duno/blob/main/modules/challenges/solves_service.py): `modules/challenges/solves_service.py`
- [Challenge Events](https://github.com/0xdun0/duno/blob/main/modules/challenges/events.py): `modules/challenges/events.py`

### Community Machines

- [Submission Routes](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/routes.py): `modules/machine_submissions/routes.py`
- [Package Validator](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/validator.py): `modules/machine_submissions/validator.py`
- [Dockerfile Scanner](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/scanner.py): `modules/machine_submissions/scanner.py`
- [Audit Worker](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/worker.py): `modules/machine_submissions/worker.py`
- [Review State](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/state_machine.py): `modules/machine_submissions/state_machine.py`
- [Review Console](https://github.com/0xdun0/duno/blob/main/modules/machine_submissions/admin_routes.py): `modules/machine_submissions/admin_routes.py`

### Learning & Docs

- [Kids Lessons](https://github.com/0xdun0/duno/blob/main/modules/kids/routes.py): `modules/kids/routes.py`
- [Lesson Content](https://github.com/0xdun0/duno/blob/main/modules/kids/kids_content.py): `modules/kids/kids_content.py`
- [Kids Progress](https://github.com/0xdun0/duno/blob/main/modules/kids/kids_db.py): `modules/kids/kids_db.py`
- [Documentation](https://github.com/0xdun0/duno/blob/main/core/docs_manager.py): `core/docs_manager.py`

### Other components

- **Learner**
- **Machine Contributor**
- **Administrator**

## Connections

- Learner → Authentication: signs in
- Learner → Lab Routes: uses labs
- Lab Routes → Security Levels: gets level
- Lab Routes → Lab Logic: runs lab
- Lab Routes → OWASP Labs: serves labs
- Lab Routes → SQLite Access: reads user state
- Learner → Challenge Routes: starts challenges
- Challenge Routes → Challenge Catalog: looks up challenge
- Challenge Routes → Runner Client: controls instance
- Runner Client → Challenge Runner: calls API
- Challenge Runner → Runner Core: dispatches runtime
- Challenge Routes → SQLite Access: stores instance
- Challenge Routes → Flag & Solves: submits flag
- Challenge Routes → Challenge Events: emits events
- Flag & Solves → SQLite Access: records solves
- Machine Contributor → Submission Routes: uploads package
- Submission Routes → Package Validator: validates package
- Submission Routes → SQLite Access: records submission
- Administrator → Review Console: reviews machines
- Review Console → SQLite Access: reads review data
- Audit Worker → Dockerfile Scanner: scans image config
- Audit Worker → Review State: advances review
- Learner → Kids Lessons: studies lessons
- Kids Lessons → Lesson Content: loads lesson data
- Kids Lessons → Kids Progress: updates progress
- Kids Lessons → SQLite Access: reads lesson records
- Learner → Documentation: consults guides
