Section content is GitHub-flavored Markdown, extended with a small set of directives for challenges, solutions, and callouts. Each directive is a block delimited by three or more colons; the opening and closing fences must use the same number of colons:
:::directive_name
Any markdown content can go here
:::
Nest a directive inside another by using one more colon on the outer block than the inner one (see the Solution example below).
Challenge
::::challenge{id=dot_product title="Example challenge"}
This is an example challenge.
::::
id must be unique within the section; title is shown as the challenge heading. A challenge renders a notes/completion UI backed by the student’s progress record, keyed on id.
Note: Course/event progress pages and stats (not the challenge itself) rely on a stricter pattern-match over the raw markdown to discover which challenges exist in a section, and it requires
title="..."in double quotes withidpresent, in either order. Get the syntax slightly wrong — single quotes, a missingid— and the challenge will still render and work on its own, it just won’t show up in course/event progress tracking or completion tables. When in doubt, copy the example above exactly.
Solution
:::solution
The answer is 42.
:::
Renders as an initially-collapsed block the learner clicks to reveal. Solutions can nest inside a challenge:
::::challenge{id=big_question title="Hitchhikers question"}
What is the answer to life, the universe, and everything?
:::solution
The answer is 42.
:::
::::
Note: Unlike
challenge,solutiondoes not currently support a customtitleattribute — it always renders as “Solution” (tracked upstream).
Callout
:::callout
More information on Douglas Adams' "The Hitchhiker's Guide to the Galaxy" can be found on [its Wikipedia entry](https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy).
:::
Add a variant to style it for a specific purpose:
:::callout{variant="warning"}
Text
:::
Available variants: danger, warning, tip, discussion, note, keypoints. Leaving variant off renders a plain, unstyled callout box.
| variant | use it for |
|---|---|
danger | an action that could break the learner’s environment or lose data if done wrong |
warning | a risk of a breaking change, or a precaution worth taking |
tip | a useful tip that helps with the task or in a wider context |
discussion | a discussion prompt or thinking point |
note | extra information worth bearing in mind |
keypoints | a summary of the most essential takeaways |
Internal links
Ordinary markdown links work as usual, but since the deployed base URL varies, links between sections are rewritten automatically rather than needing a full URL:
[internal link](theme.id/course.id/section.id)
[with leading slash](/theme.id/course.id/section.id)
[if you forgot to strip .md](/theme.id/course.id/section.id.md)
You can also drop an internal URL straight into text using {{ base_url }}:
{{ base_url }}/theme.id/course.id/section.id
All of these are prefixed with the deployment’s base URL and material repo automatically, so the same markdown works unchanged in development and production. A relative link (./other-section or ../sibling-course/section) resolves relative to the current section’s position in the theme/course/section tree.