v1.0 — generally available

Self-hosted workshops,
labs, and CTFs.

Workshop Control is a portable platform for running technical training. Lab guide, challenge engine, and a real-time leaderboard — packaged so your team can stand it up on a Tuesday and run a workshop on a Wednesday.

Free Community edition · Hosted + Self-hosted Commercial available

Author

Markdown-driven labs

WYSIWYG editor that round-trips cleanly to markdown. Paste images, embed videos, drop in code blocks. Source-mode toggle when you want exact control.

Challenge

Three challenge types

Text match (with regex), multiple choice, and checklist. Hints with point cost, unlock dependencies, decay scoring, first-blood bonus, attempt caps.

Project

Leaderboard for the room

Polished projector view designed for the back of the room. 5-second polling, first-blood notches, configurable accent. Drop it on a TV during the session.

Portable by design

One directory.
Zip it. Move it.

Each workshop lives in its own directory — markdown chapters, challenge JSON, images, and a per-workshop SQLite for scoring. Export to a bundle, hand it to a colleague, restore on their box, run it tomorrow.

  • No external services required — Node, Caddy, SQLite, done.
  • Bundle export/import for content portability across instances.
  • Built-in backup + restore for full DR.
data/workshops/zero-trust-101/
├── workshop.json            # metadata + owner + publish_state
├── workshop.db              # per-workshop SQLite (scoring)
├── chapters/
│   ├── 01-intro/
│   │   ├── meta.json
│   │   └── content.md
│   └── 02-network-fundamentals/
│       └── ...
├── challenges/
│   ├── abc-find-the-port.json
│   └── def-tcp-vs-udp.json
└── images/
    └── <hash>-<uuid>.png
What's inside

Built for the real workshop loop.

A small product, not a platform-of-platforms. Every feature exists because the person running the workshop needs it on the day.

auth

Magic link or password

Participants register with email + display name. Magic-link mode via SMTP; password mode for offline events. Each workshop has its own cookie — one browser can hold concurrent sessions.

ctf

Jeopardy tile board

Toggle a workshop into CTF mode with a tile-grid challenge layout. Categories, point values, decay, first-blood bonuses, unlock dependencies.

admin

Multi-tenant admin realms

Multiple authors can run their own workshops on one box without stepping on each other. Per-admin branding, ownership boundaries, public + private templates.

export

PDF lab guide + certificate

Generate a take-home PDF of any workshop's lab guide. Auto-issue completion or progress certificates to participants based on score threshold.

lobby

Public-facing entry code

For internet-exposed instances, a single shared entry code gates every workshop behind a 14-day cookie. Speed bump for casual discovery — per-workshop auth still runs.

ops

One-click backup + restore

Full disaster recovery in one tarball. Hostname-gated restore, auto-restart via systemd. Workshop deletes archive-on-delete for 30-day recovery.

How it works

Three steps from zero to workshop.

  1. 1

    Deploy

    Stand up the platform on a Debian box (or your KVM appliance image). Caddy + Node + SQLite. systemd unit ships in the box.

  2. 2

    Author

    Write your lab guide in the WYSIWYG editor. Add challenges. Drop in images. Preview as a participant. Save it as a template for future cohorts.

  3. 3

    Run

    Share the URL with your cohort. Project the leaderboard. Watch the room. Export results when you're done.

Run your next workshop on your own terms.

Community edition is free forever. Pay only when you want a clean, watermark-free deployment with support.