Course 6 · Capstone

Start Here

This is the payoff course. You'll build a complete, running data platform — mini-GridDP — by assembling everything from Courses 2–5 into one system. This chapter lays out exactly what you're building, the architecture, and the repo structure, so every lab snaps into the same coherent project.

What you're building

Mini-GridDP is a laptop-scale data platform for a fictional GPU-rental marketplace (the same world as the Systems Design reference). It's small enough to run on one machine, but it has every part of a real platform:

  • A data generator that simulates the business — customers, GPUs, rentals, marketplace events, and a stream of GPU telemetry.
  • Ingestion that lands raw data into a bronze layer, incrementally and idempotently.
  • A modeled warehouse (medallion: bronze → silver → gold) with a star schema and a slowly-changing dimension.
  • A telemetry rollup that tames the high-volume firehose into an hourly fact.
  • Orchestration that runs it all on a schedule as a dependency-aware graph.
  • A test suite, a semantic layer of metrics, a BI dashboard, CI/CD, and docs.
The goal

One command — docker compose up plus a dagster run — should take you from nothing to a populated dashboard. When you can do that and explain every step, you can do the job. And you'll have a portfolio project that proves it.

The architecture

Here is the whole system. Every lab adds one box or arrow to this picture:

SOURCES INGEST STORE / MODEL (DuckDB) SERVE ┌─────────────┐ ┌───────────────────────────┐ │ Postgres │──┐ ┌──────────┐ │ BRONZE raw landed │ ┌──────────┐ │ rentals, │ ├──▶│ ingest │─────▶│ SILVER cleaned + SCD2 │──▶│ semantic │ │ customers, │ │ │ scripts │ │ GOLD star schema: │ │ layer │ │ gpus,prices │ │ │ (Python) │ │ dim_customer, dim_gpu, │ │ (metrics)│ └─────────────┘ │ └──────────┘ │ dim_date, fct_rentals, │ └────┬─────┘ │ │ fct_telemetry_hourly │ │ ┌─────────────┐ │ ┌──────────┐ └───────────────────────────┘ ▼ │ Redpanda │──┘ │ stream │ ▲ ▲ ┌──────────┐ │ events + │─────▶│ consumer │──────────────┘ │ │ Metabase │ │ TELEMETRY ⚡ │ └──────────┘ rollup (firehose) │ │ dashboard│ └─────────────┘ │ └──────────┘ dbt transforms ──┘ ───────────────────────────────────────────────────────────────────────────────── ORCHESTRATION: Dagster runs ingest → dbt → rollups on a schedule (Lab 05) QUALITY: dbt tests + freshness checks (Lab 06) · CI/CD: GitHub Actions (Lab 09) OBSERVABILITY: structured logs + Dagster UI (Lab 09)

The repo layout

Everything lives in your mini-griddp git repo (the one you started back in Course 1). By the end it looks like this — each lab fills in a folder:

mini-griddp/
mini-griddp/
├── docker-compose.yml      # the stack: Postgres, Redpanda, Dagster, Metabase  (Lab 01)
├── .env.example            # config template (real .env is gitignored)
├── README.md               # how to run it all                                 (Lab 10)
├── generator/              # synthetic data generator                          (Lab 01)
│   └── generate.py
├── ingest/                 # extract → bronze scripts                          (Lab 02, 04)
│   ├── extract_postgres.py
│   └── consume_stream.py
├── dbt/                    # dbt project: silver + gold + metrics              (Lab 03, 06, 07)
│   ├── models/
│   │   ├── staging/        # silver
│   │   └── marts/          # gold (star schema)
│   └── dbt_project.yml
├── dagster_app/            # orchestration assets                             (Lab 05)
│   └── assets.py
├── dashboards/             # Metabase notes / export                          (Lab 08)
└── .github/workflows/      # CI                                               (Lab 09)
    └── ci.yml
Keep it in git

Commit after every lab with a clear message ("Lab 03: silver + gold dbt models"). By Lab 10 your commit history is the story of how you built a platform — exactly what a hiring manager wants to see.

How the labs map to the reference

Each lab realizes, at laptop scale, a chapter of the Data Platform Systems Design guide. After a lab, read its mapped chapter to see how the same idea works at full scale:

LabBuildsSystems Design chapter
01Sources & the generator01 The Application Space
02Ingestion → bronze04 Ingestion & Pipelines
03Modeling, silver/gold05–06 Storage & Data Modeling
04Telemetry firehose04 & 14 (ingestion, scale)
05Orchestration07 Transformation & Orchestration
06Data quality10 Data Quality & Observability
07Semantic layer08 Serving & the Semantic Layer
08BI dashboard08 & 09 (serving, self-serve)
09CI/CD & observability10 & 11 (quality, governance)
10Ship & document15 The Reference Design

How the labs work

These are build-along labs, not reading. Each one:

  • Opens with a Setup box (what must be running) and a goal (what this lab adds to the architecture).
  • Walks you through runnable code — type it, run it, and confirm each "✓ You should see" checkpoint.
  • Ends with a commit step, a "✓ Check yourself", and an exercise that extends what you built.

Expect each lab to take an hour or two of focused work. Don't rush — the value is in building it yourself, hitting small problems, and fixing them. That struggle is the skill.

Prerequisites & setup

You need the full local stack from earlier courses: Docker, a Python toolchain (uv), Postgres + DuckDB, dbt, Dagster, and Redpanda — all introduced in Course 2 and Course 5. Lab 01 will have you assemble them into one Compose stack, but they should already be installed.

Don't skip the earlier courses

This course assumes you can already write a dbt model, define a Dagster asset, and run a Compose stack. If those aren't familiar, work through Courses 4 and 5 first — the labs move fast and won't re-teach the basics.

✓ Check yourself

  • Can you describe, from the diagram, the path one rental takes from Postgres to the dashboard?
  • Do you understand the repo layout and which lab fills each folder?
  • Is your full stack (Docker, uv, dbt, Dagster, Redpanda) installed and working from Courses 2 and 5?
Exercise — Create the project skeleton (5 minutes)

In your mini-griddp repo, create the empty folder structure from the layout above and commit it, so Lab 01 has a home for everything.

terminal
cd mini-griddp
mkdir -p generator ingest dbt dagster_app dashboards .github/workflows
touch README.md .env.example
git add -A && git commit -m "Capstone: project skeleton"

You should see a clean folder tree and a commit. You're ready to start building.

Next

Let's give the platform something to chew on: a marketplace simulator that produces realistic data. → Lab 01 — Project Setup & the Data Generator