PROMPT (Project-Oriented Modular Platform for Teaching) is a course management tool built to simplify the administration of project-based university courses.
Originally developed for the iPraktikum at the Technical University of Munich, PROMPT is now a modular and extensible platform that adapts to the needs of instructors and scales across different teaching formats.
- Course Configuration: Build custom course flows using reusable course phases.
- Student Management: Manage participant data and applications.
- Application Phase: Streamlined workflows for student applications.
PROMPT supports custom course phases as independently deployable modules:
- 🗓 Interview Phase – Schedule and manage student interviews.
- 🧑🤝🧑 Team Phase – Allocate students to projects and teams.
- 📄 TUM Matching Export – Export data in TUM-compatible format.
- 🧩 Custom Phases – Easily extend PROMPT with your own logic.
Explore the live system here 👉 https://prompt.aet.cit.tum.de/
PROMPT is built for teaching teams who run complex project-based university courses. This guide gives you a first impression of the product, its modules, and typical workflows.
PROMPT lets you define courses by combining reusable “phases”:
- Add application, interview, matching, and many more phases
- Define prerequisites and outcomes for each phase
PROMPT provides powerful tools for handling student participation throughout your course:
- Track incoming applications and monitor their progress
- Schedule and conduct interviews with applicants
- Form teams and assign projects using manual or semi-automated workflows
- Evaluate student performance on a per-phase basis, enabling you to decide who passes or fails at each stage of the course independently
Each course phase can be developed and plugged in independently—ideal for institutions with evolving or specialized workflows.
This section is for developers and contributors looking to run PROMPT locally or contribute to its development.
- Built with React, TypeScript, and Webpack Module Federation
- Micro-frontends for each course phase
- Shared design system using
shadcn/ui
- Developed in Go
- Core service + modular service architecture for each course phase
- PostgreSQL for data storage
- Keycloak for authentication
| Tool | Version | Installation |
|---|---|---|
| Go | 1.26+ | go.dev/doc/install |
| Node.js | 22.10.0 - 22.x | nodejs.org |
| Docker | Latest | docker.com |
| golang-migrate | Latest | github.com/golang-migrate/migrate |
| sqlc | Latest | docs.sqlc.dev |
# macOS with Homebrew (Homebrew strips corepack from Node)
brew install corepack
# Other platforms (included with Node 16.9+)
npm install -g corepack
# Enable corepack
corepack enablegit clone https://github.com/prompt-edu/prompt.git
cd prompt
# Create environment files from templates
cp .env.template .env
cp .env.dev.template .env.dev # Local development overridesThe .env file contains Docker/production configuration. The .env.dev file contains local development overrides (localhost instead of Docker hostnames) and is loaded by make server.
docker compose up -d db keycloak-
Navigate to http://localhost:8081
-
Login with username
adminand passwordadmin -
In the top-left dropdown, select Create Realm and upload
keycloakConfig.json -
In the new Prompt realm, create a user:
- Go to Users → Add user
- Fill in all required fields (these are needed for token claims):
- Username
- Email (required)
- First name (required)
- Last name (required)
- Click Join Groups and select
PROMPT-Admins - Go to Credentials tab and set a password
- Go to Attributes tab and add:
university_login→ab12cdematriculation_number→01234567
-
Configure client mappers (to include user attributes in tokens):
-
Go to Clients →
prompt-server→ Client scopes tab -
Click
prompt-server-dedicated -
Click Add mapper → By configuration → User Attribute
-
Create mappers for each attribute:
Name User Attribute Token Claim Name Claim JSON Type university_login university_login university_login String matriculation_number matriculation_number matriculation_number String -
Ensure Add to ID token and Add to access token are enabled
-
-
Generate a client secret:
- Go to Clients →
prompt-server→ Credentials - Click Regenerate and copy the secret
- Paste the secret into your
.env.devand.envfiles asKEYCLOAK_CLIENT_SECRET
- Go to Clients →
The .env file is not automatically loaded by Go. Use one of these methods:
-
Use Make (recommended, works in any shell):
make server
-
Manual export (bash/zsh only):
set -a && source .env.dev && set +a cd servers/core && go run main.go
make clients
# or manually:
cd clients && yarn install && yarn run devThis launches all micro-frontends simultaneously using Lerna. The app runs at http://localhost:3000.
To start a specific micro-frontend only, navigate to its subdirectory and run yarn run dev there.
# Generate sqlc code (after changing SQL queries)
cd servers/<service> && sqlc generate
# Run Go tests
cd servers/<service> && go test ./...
# Lint clients
cd clients && yarn eslint "core" --config "core/eslint.config.mjs"
# Add shadcn/ui component
cd clients/shared_library && yarn dlx shadcn add <component-name>We generate and commit swagger specs for the Go servers. To avoid forgetting this, install the repo-managed git hooks:
./scripts/install-githooks.shWhen you commit changes under servers/core/ or servers/template_server/, the pre-commit hook regenerates and stages the swagger docs. Ensure swag is available on your PATH:
go install github.com/swaggo/swag/cmd/swag@latest| Service | Port |
|---|---|
| Core Client | 3000 |
| Keycloak | 8081 |
| Core Server | 8080 |
| PostgreSQL | 5432 |
We are building a community around PROMPT! Whether you are an instructor using the platform or a developer looking to contribute, we'd love to have you.
- Discord: Join our Discord Server for real-time discussion and support.
- GitHub Issues: Report bugs or request features on our Issue Tracker.
- Documentation: Visit our Documentation Portal for detailed guides.
We welcome contributions of all kinds! Please see our Contributing Guidelines to get started.
PROMPT can be customized for your course by composing it from different modular phases. These configurations are handled at the course level and dynamically loaded on demand.


