How to write a workshop in Markdown
By the Workshopy teamUpdated 3 min read
A Workshopy workshop is one Markdown document. Every top-level # heading starts a new step and becomes its title; everything until the next # is that step's body. Text before the first # is the workshop description. That is the entire structural convention — everything else is ordinary GitHub-Flavored Markdown, which means you can write a workshop by hand, generate one with an AI, or import a document you already have.
The one rule: # starts a step
A top-level ATX heading — a single # followed by a space — begins a new step. The heading text is the step title. Everything from that line until the next # is the step body.
## and deeper are ordinary headings inside the step, not step boundaries. Text before the first # becomes the workshop's description rather than a step.
A short intro to this workshop. This text becomes the
description — it is not a step.
# Set up your environment
Install the dependencies:
```bash
npm install
```
## Troubleshooting
This is a heading *inside* the step, not a new step.
# Write your first component
Now create `src/App.tsx` and export a component.# inside a code block is ignored
The parser tracks fenced code blocks (three or more backticks or tildes), so a shell comment or a Markdown example inside a fence never splits a step by accident. This matters more than it sounds: a workshop about Git or Bash is full of lines starting with #.
# Configure Git
Run this — the `#` below is a comment, not a new step:
```bash
# set your identity
git config --global user.name "Ada"
```What you can put in a step
Step bodies are standard GitHub-Flavored Markdown, rendered the same way in your editor preview and in the live session — what you preview is what participants see.
- Paragraphs, bold, italic, inline code and links
- Fenced code blocks with syntax highlighting
- Ordered and unordered lists, and task lists
- Tables, block quotes and horizontal rules
- Images, including files you upload to your media library
- Interactive animations: a fenced block tagged
interactiveholds HTML, CSS and JavaScript that every participant plays with, sealed off from the internet and the rest of the page ##–######headings for structure inside a step
Import and export
Because a workshop is one file, moving it in and out is a single action. Import an existing .md and its # headings become steps. Export a template and you get the same single document back — the round trip is lossless, including quiz and practice steps.
This is also what makes AI drafting practical: ask any model for a workshop in this format, paste the result, and it becomes a running session. There is no proprietary structure to teach it beyond the markers on this page.
Editing during a live session
Starting a session snapshots the content, so editing a template never disturbs a session already running. Inside a live session the host can still edit a step's title and body, insert a step anywhere, hide a step reversibly, or delete one — and every participant's view updates without a restart.
One guard: you cannot hide or delete the step the session is currently on, so nobody can be stranded on a step that no longer exists.
Frequently asked questions
Does Workshopy use a custom Markdown dialect?
Almost none. It is GitHub-Flavored Markdown plus four conventions: a top-level # heading starts a step, #[quiz] marks a step as a quiz, #[practice] marks a practice step — exercises students answer and check, with answer:, hint: and mistake: lines and a worked solution under a ### heading — and a fenced code block tagged interactive runs as a live animation instead of showing its code. Everything else is standard, which is why an ordinary Markdown file imports cleanly.
How do I add images?
Upload them to your media library and reference them with standard Markdown image syntax. Uploads are stored privately, per account, and served to session participants through signed URLs rather than public links.
Can I keep my workshops in Git?
Yes — a template exports as a single .md file, so it version-controls like any other document. There is no two-way sync with a repository today; export and import are manual.
What happens to text before the first heading?
It becomes the workshop's description rather than a step. If you want that text to be visible to participants, give it a # heading of its own.
Keep reading
How to add a quiz to your workshop
Write graded quizzes in plain Markdown with #[quiz], ## questions and - [x] answers — and see how correct answers stay hidden.
2 min read · 12 Sept 2026
Using WorkshopyHow to run your first live session
From a Markdown file to a running session: starting it, how participants join with a 6-character code, and pacing the room.
3 min read · 12 Sept 2026
Using WorkshopyHow to track participant progress in real time
How the per-step status model works — in progress, done and stuck — and how the dashboard turns it into a live view of who needs help.
2 min read · 12 Sept 2026
Ready-made lessons from the library
Meet Workshopy — A Live, Interactive Product Tour
A live, interactive product tour of Workshopy for new users. It runs as a real Workshopy session, so the audience experiences the product as participants while…
16 steps · ~120 min · Free
OtherIntro to Git — Snapshots, Branches & Sharing
A short, hands-on first lesson in Git for complete beginners. Students build the mental model one idea at a time — snapshots, the three areas…
10 steps · ~65 min · Free
ScienceHow Epidemics Spread — R, Curves and Herd Immunity
An interactive first look at how infectious diseases spread through a population — and what stops them.
9 steps · ~60 min · Free
Learn any of them on your own, free, or copy one and teach it live. Browse the library
See it with a class of 45. No sign-up.
The live demo runs the real product with a simulated class. When you're ready, start free.
