Teach your product the way developers learn: by doing.
The academy platform for dev-tool and data startups. Courses your team writes in markdown. Labs where learners run real code, right in the lesson. Dashboards that prove education moves activation, retention, and support load.
No demo call required. Flat pricing, unlimited learners.
This is a real lab. Click Run.
Lab: Did the course move activation?
Compare the two cohorts
Ten users of a fictional developer tool. Some took its onboarding course. Did the course move activation?
Group the users by
took_course.Select
took_courseandround(100 * avg(activated::int)) AS activation_pct.
SELECT email, took_course, activated FROM users;
Hint 1
avg(activated::int) is the share of a cohort that activated: true counts as 1, false as 0.
Hint 2 unlocks after your next attempt
Your options today are all bad
- The enterprise glue-stack
- An LMS that starts at $50k/yr, a labs platform at $28k more, and an iframe holding them together. “The sales demo was smoke and mirrors,” said one reviewer. We read hundreds like it.
- The starter kit you’ll outgrow
- Thinkific and friends are easy to start, which is why dbt, Redpanda, and others started there. Then the labs don’t exist, the analytics stop at completion rates, and you migrate. Everyone migrates.
- The custom build
- Apollo, HashiCorp, and SurrealDB built their own academies to get runnable code and a docs-like feel. Six engineer-months, then it’s a product your team maintains forever.
The code runs in the lesson
Python and SQL execute in the learner's browser. No VMs to provision, no environment to wait for, no $7k/yr add-on for labs that start fast. Click Run, it runs.
Exercises check themselves: assertions on output and state, with your own message when a learner breaks something. The moment real learning happens, and the moment every other LMS outsources to an iframe.
Lab: Read a webhook payload
Print who finished what
Change the last line so it prints the learner's email, the word "finished", and the lesson title:
ada@lumen.dev finished Your first query.
import json
# What your academy posts when a learner finishes a lesson.
body = """{
"event": "lesson.completed",
"occurred_at": "2026-09-23T09:14:02.118Z",
"learner": {"email": "ada@lumen.dev"},
"course": {"slug": "getting-started", "title": "Getting started"},
"lesson": {"slug": "first-query", "title": "Your first query"}
}"""
event = json.loads(body)
print(event["event"])
Hint 1
Nested keys chain: event["lesson"]["title"] is the lesson title.
Hint 2 unlocks after your next attempt
Markdown in, academy out
Your course is markdown. Write it in our editor or sync it from a GitHub repo and review lessons like pull requests. Drafts, version history, one-click rollback: when your next release breaks a lesson, fix it like you'd fix docs, not like you'd re-shoot a video.
Your content stays yours. It's markdown, and it can live in your own repo. We'd rather earn the renewal.
slug: duckdb-speedrun
title: DuckDB Speedrun
description: A two-lesson taste of courses-as-code, synced from GitHub.
image: https://demo.mastria.dev/cards/duckdb-speedrun.svg
tags: [sql, duckdb]
sections:
- slug: the-speedrun
title: The speedrun
lessons:
- slug: hello-duckdb
title: Hello, DuckDB
file: lessons/hello-duckdb.md
- slug: your-first-query
title: Your first query
file: lessons/your-first-query.md
Prove it works — run a real query, right here.
```lab
id: speedrun-query
title: 'Lab: One real query'
estimatedMinutes: 3
language: sql
setup: |
CREATE OR REPLACE TABLE users (id INTEGER, name VARCHAR, plan VARCHAR);
INSERT INTO users VALUES
(1, 'Ada', 'pro'), (2, 'Grace', 'free'), (3, 'Edsger', 'pro');
starterCode: |
SELECT * FROM users;
exercises:
- id: filter-pro
title: Find the pro users
brief: Two of the three users are on the pro plan. Select only them.
checks:
- type: sql_result_equals
columns: [id, name, plan]
rows:
- [1, Ada, pro]
- [3, Edsger, pro]
fail: 'Expecting exactly the 2 pro-plan rows — filter with WHERE plan = ''pro''.'
These two files are the DuckDB Speedrun course on the demo academy. A merge to main published it.
The chart your CEO keeps asking for
Learners auto-group into accounts by company domain. See how far each customer's team got, where they drop off, and, once you send any user-level metric (activation events, ticket counts, a CSV export), how trained users compare to untrained ones on the numbers that matter.
Education teams fight to connect education to ARR. This is that, built in: adoption for Product, account progress for Customer Success, ticket deflection for Support, and certificates learners share as public pages that link back to your academy.
Impact
- Course
- Getting started
- Metric
- activated
Completed the course — 180 of 250 learners (72%) with "activated"
Did not complete — 310 of 1,000 learners (31%) with "activated"
2.3× the rate of untrained learners.
How it starts
- 1
Match your docs in one paste, then point your domain. No CSS.
- 2
Write or import your first course, then add a lab block.
- 3
Share the link. Watch the account view fill up.
Live in a week. Really.
Flat. Published. Unlimited learners.
No per-learner pricing that punishes your growth. No contact-sales wall. No add-ons for things that should be included. Two tiers, listed on this page the day we launch, in the range a DevRel lead can expense, not a procurement cycle.
Questions
How is this different from Skilljar or Thinkific?
They’re video-and-quiz platforms; labs live elsewhere, glued in. Here the code runs in the lesson, content is versioned markdown, and analytics reach your product metrics: the three reasons dev-tool companies end up building custom.
Do you support SCORM?
No, deliberately. SCORM is packaging for corporate compliance content. Dev-tool academies need Git-reviewable markdown and runnable code. If SCORM is a hard requirement, we’re probably not your platform, and we’d rather tell you now.
What about SSO/SAML?
On the roadmap for the enterprise tier. v1 uses friction-free magic links, because your academy’s job is adoption, not access control.
Can we leave?
Yes. Your courses are markdown, and they can live in your own GitHub repo, so your content never exists only with us. Learners, progress, certificates, and metric events export as CSV from the admin.
Who’s building this?
Marc Lamberti: data engineering educator, 1M+ students taught. This is the platform I wished existed every year I’ve built developer education.
Three design partner slots. Then the waitlist.
We're building v1 with three dev-tool companies who get 50%-for-life pricing and a direct line to the founder. If your startup needs an academy this year, apply. If you'd rather wait for the doors to open, join the waitlist.
Apply for a design partner slot
Four questions about your customer education today.
Join the waitlist
We'll email you once, when Mastria opens to everyone.