A web application for tracking your progress through the Learn to Cloud guide.
Note: This project is open source under the MIT License.
- π All 7 phases of the Learn to Cloud curriculum
- β Progress tracking with steps, questions, and hands-on projects
- π Authentication via GitHub OAuth
- π Dashboard with progress visualization
- π GitHub integration for project submissions
- βοΈ Async verification jobs powered by Durable Functions
| Layer | Technology |
|---|---|
| Backend | Python 3.13+, FastAPI, SQLAlchemy (async), PostgreSQL |
| Verification | Azure Durable Functions + shared Python package |
| Frontend | HTMX, Jinja2 templates, Alpine.js, Tailwind CSS v4 |
| Auth | GitHub OAuth (Authlib) |
| Infra | Azure Container Apps, Azure Functions, Azure PostgreSQL, Terraform |
| CI/CD | GitHub Actions |
The fastest way to get started on Windows (WSL), macOS, or Linux is with VS Code Dev Containers. Everything β Python, Node, PostgreSQL, uv, pre-commit hooks β is configured automatically.
Prerequisites: Docker Desktop and VS Code with the Dev Containers extension.
Windows users: Install and run Docker Desktop via WSL 2. Clone the repo inside your WSL filesystem for best performance.
- Clone the repo and open it in VS Code
- When prompted "Reopen in Container", click it (or run
Dev Containers: Reopen in Containerfrom the command palette) - Wait for the container to build β this runs automatically:
- Installs Python 3.13, Node 20, uv, Azure CLI, GitHub CLI, Azure Functions Core Tools
- Creates a Python virtual environment and installs all dependencies
- Starts PostgreSQL 16, Azurite, Durable Task Scheduler emulator, and Aspire Dashboard
- Runs database migrations
- Installs
prekpre-commit hooks - Copies
.env.exampleβ.envif needed
- Start the API and verification worker:
For verification submissions, also run the "Verification: Durable Functions" VS Code launch configuration, or use the "API + Verification" compound launch configuration.
(cd api && uv run uvicorn learn_to_cloud.main:app --reload --port 8000)
| Service | URL |
|---|---|
| App | http://localhost:8000 |
| API Docs | http://localhost:8000/docs (requires DEBUG=true in .env) |
| PostgreSQL | localhost:54320 (user: postgres, password: postgres) |
| Durable Task Scheduler Dashboard | http://localhost:8082 |
| Aspire Dashboard | http://localhost:18888 |
If you prefer not to use Dev Containers, you can set things up manually.
- Python 3.13+ with uv
- Node.js 20+ (for Tailwind CSS build)
- Docker (for PostgreSQL)
1. Start local dependencies (Docker)
docker compose up -d db azurite dts aspire-dashboard2. API setup
cd api
uv sync --locked # Install API + shared Python dependencies
cd ..
cp api/.env.example api/.env # Create environment config (edit if needed)Run database migrations:
# macOS/Linux
cd api && uv run alembic upgrade head && cd ..
# Windows
cd api; uv run alembic upgrade head; cd ..Start the API:
# macOS/Linux
cd api && uv run python -m uvicorn learn_to_cloud.main:app --reload --port 8000
# Windows
cd api; uv run python -m uvicorn learn_to_cloud.main:app --reload --port 8000Or use VS Code's debugger with the "API: FastAPI (uvicorn)" launch configuration.
Start the verification worker when testing hands-on submissions:
cd apps/verification-functions
uv sync --locked
uv run func start --port 7071Or use VS Code's "API + Verification" compound launch configuration.
Notes:
- The API does not start local dependencies for you. Run
docker compose up -d db azurite dtsfirst. - Verification submissions require the Durable Functions host on port
7071. - Manage dependencies with
docker compose start/docker compose stop.
| Service | URL |
|---|---|
| App | http://localhost:8000 |
| API Docs | http://localhost:8000/docs (requires DEBUG=true) |
βββ api/ # FastAPI backend (serves HTML + JSON API)
β βββ src/
β β βββ learn_to_cloud/
β β βββ main.py # App entry point
β β βββ models.py # Compatibility imports for shared models
β β βββ schemas.py # Compatibility imports for shared schemas
β β βββ routes/ # API + page endpoints
β β βββ services/ # Business logic
β β βββ repositories/ # Database queries
β β βββ core/ # Config, auth, database
β β βββ templates/ # Jinja2 templates (HTMX)
β β βββ static/ # CSS, JS, images
β βββ tests/
βββ apps/
β βββ verification-functions/ # Durable Functions host for async verification jobs
βββ packages/
β βββ learn-to-cloud-shared/ # Shared domain, repositories, verification logic, and content
βββ infra/ # Terraform (Azure)
βββ .github/
βββ workflows/ # CI/CD
βββ instructions/ # Copilot custom instructions
βββ skills/ # Copilot agent skills
See the Contributing Guide for linting, testing, the dog-food QA agent, Copilot skills, and architecture conventions.
Push to main triggers automated deployment via GitHub Actions β Terraform β Azure.
Production verification uses the GitHub Actions secret TF_VAR_github_token
to populate the GITHUB__TOKEN environment variable used by verification jobs.
MIT License. See LICENSE.