- Python 84.7%
- HTML 14.1%
- Dockerfile 1.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Flask + SQLite single-page planner for the 2025/2026 Computer Science master's curriculum: embedded course catalogue, major/minor track selection, planned/current/completed workflow, ECTS progress tracking, and semester statistics. Vanilla JS frontend, no build step. Includes input-validation hardening for non-finite ECTS values, non-integer grades, and strict boolean parsing of the passed flag. |
||
| docs | ||
| static | ||
| templates | ||
| .dockerignore | ||
| .gitignore | ||
| AGENTS.md | ||
| app.py | ||
| compose.yaml | ||
| curriculum.py | ||
| Curriculum_Master_Computer_Science_EN.pdf | ||
| database.py | ||
| Dockerfile | ||
| progress.py | ||
| README.md | ||
| requirements.txt | ||
| test_core.py | ||
| test_web.py | ||
| web_app.py | ||
Master Plan
A browser-based degree planner for the TU Graz Master's Degree Programme Computer Science, Curriculum 2025 (version 2026).
Pick a fixed major and minor, assemble your courses from the embedded curriculum catalogue or add your own, and track ECTS progress, grades, and semester workload from one page.
Screenshots
| Degree progress | Study statistics |
|---|---|
![]() |
![]() |
Features
- Fixed track selection — choose one of 11 majors and 14 minors on first run (they must differ).
- Full catalogue — 280 courses from the 2025/2026 curriculum, searchable by name or module.
- Custom courses — add anything not in the catalogue with its own title, type, and ECTS.
- Planned → current → completed workflow — double-click a lecture to advance it; record grades and pass/fail on completion.
- Requirement classification — each course counts toward major, minor, seminars & projects, interdisciplinary, free-choice, or thesis, and can be reassigned at any time.
- Progress tracking — ECTS bars per requirement plus a checklist of still-missing compulsory major/minor courses.
- Semester statistics — ECTS by semester, completed courses, weighted average, strongest semester, and grade distribution.
Tech stack
| Layer | Choice |
|---|---|
| Backend | Flask 3.1 |
| Database | SQLite via the Python standard library (sqlite3) |
| Frontend | Server-rendered Jinja shell + vanilla JavaScript (no bundler, no npm) |
| Server | Gunicorn (Docker) |
| Container | Docker / Docker Compose |
Getting started
Prerequisites
- Python 3.13+, or
- Docker with the Compose plugin.
Run locally
Linux / macOS:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python app.py
Windows (PowerShell):
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe app.py
Open http://localhost:5000. Existing data in master_plan.db is retained between runs.
Run with Docker
docker compose up --build
Open http://localhost:5000. Compose bind-mounts the project directory at /data, so the container and local runs share the same master_plan.db; it is created on first start if it does not exist yet. The container runs as your host user (${UID:-1000}) so the bind mount stays writable — override UID/GID if your account differs.
Prefer a dedicated data directory over the repo file? Build the image and mount a host folder:
docker build -t master-plan .
mkdir -p data
docker run --rm --user "$(id -u):$(id -g)" -p 5000:5000 -v "${PWD}/data:/data" master-plan
Usage
- First run — choose your major and minor on the setup screen. Both are fixed for the plan.
- Add courses — click + Add course, search the catalogue (optionally filtered by module) and pick a result, or fill in a custom course. Set the semester (
SS26–SS29), course type, ECTS, and what it counts toward. - Work through your degree — double-click a planned lecture to move it into current, then double-click a current lecture to record its result.
- Track progress — the Progress tab shows ECTS earned vs. required per category and lists any compulsory major/minor courses you have not passed yet.
- Review your performance — the Statistics tab aggregates ECTS and grades by semester.
Configuration
| Variable | Default | Description |
|---|---|---|
DATABASE_PATH |
master_plan.db |
Path to the SQLite database file. Docker sets this to /data/master_plan.db. |
Project structure
app.py Dev-server launcher (also re-exports the app for tests)
web_app.py Flask app factory, routes, and request validation
curriculum.py Embedded course catalogue, majors/minors, and ECTS requirements
database.py SQLite access layer; creates the schema on first connect
progress.py Pure functions for progress and statistics calculations
templates/ Jinja templates (setup + dashboard shell)
static/ app.js and styles.css — vanilla, no build step
test_core.py Unit tests for the database and calculations
test_web.py HTTP/API tests via the Flask test client
Testing
The test suite uses the standard-library unittest runner (no pytest needed):
python -m unittest -v
Run a single test:
python -m unittest test_core.CoreTests.test_tracks_must_differ
Notes
- Single-user, no authentication. Master Plan is designed to run locally or on a trusted network; it does not implement logins or access control.
- Changing the schema does not migrate an existing database. Delete
master_plan.dbto start fresh with a new schema.


