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?

Starting DuckDB…SQLAbout 2 min

Compare the two cohorts

Ten users of a fictional developer tool. Some took its onboarding course. Did the course move activation?

  1. Group the users by took_course.

  2. Select took_course and round(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

Starting Python…PythonAbout 2 min

Print who finished what

  1. 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.

courses/duckdb-speedrun/course.yaml
YAML
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
courses/duckdb-speedrun/lessons/your-first-query.md, first 24 lines
Markdown
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
Example data

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.

Trained means completed every published lesson. Correlation, not causation, and the product says so too.

How it starts

  1. 1

    Match your docs in one paste, then point your domain. No CSS.

  2. 2

    Write or import your first course, then add a lab block.

  3. 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.