AI-powered student assistant for TUM that unifies scattered university systems into a single agent-driven interface.
TUM students juggle 5+ disconnected systems daily — Moodle for assignments, TUM Online for lectures and grades, email for deadlines, iCal for schedules, NavigaTUM for rooms, MVV for transit, and Mensa for food. Coordinating all of this manually is tedious, error-prone, and wastes hours every week. There's no single place to see your week, catch conflicts, or act on deadlines.
AssisTUM connects to all TUM systems through a single interface with an AI agent that can read your data, plan your week, and take actions on your behalf. You chat with the agent, invoke skills like /plan-week, and it handles the rest — importing lectures, pulling Moodle assignments, scanning emails, scheduling study sessions, resolving conflicts, and checking commute times.
- Moodle — auto-login via Shibboleth SAML, browse courses, view assignments, extract PDFs
- TUM Online — lectures, grades, course sync via API token
- Calendar — iCal import, drag-and-drop rescheduling, color-coded event types
- Email — IMAP inbox monitoring, send via SMTP, agent turns emails into todos
- Canteen — daily Mensa menu, live occupancy
- Transit — real-time MVV departures, agent-powered commute planning
- Study Rooms — live availability via ASTA API
- Campus Navigation — NavigaTUM room and building search
- Student Clubs — event scraping and calendar integration
- Dashboard — at-a-glance stats, upcoming events, today's lunch, urgent todos
- Task Management — priority-based todos linked to courses and assignments
See features.md for detailed feature descriptions.
Watch the demo video:
Slash commands that trigger multi-step agent workflows:
| Skill | What it does |
|---|---|
/plan-week |
6-phase automated weekly planning: lectures, assignments, emails, meals, clubs, conflicts |
/course-brainstorm |
Discuss course strategy, fetch Moodle materials, create study sessions |
/schedule-study-sessions |
Find calendar gaps and block study time based on deadlines |
/conflict-resolver |
Detect overlapping events and suggest resolutions |
/commute-helper |
Plan commute using live MVV departures + NavigaTUM |
/find-study-room |
Search for available study rooms near your location |
Frontend (React 19 + Vite)
├── Calendar (FullCalendar)
├── Chat panel (SSE streaming)
├── Dashboard, Todos, Settings
└── connects to backend via /api/*
Backend (Express 5 + SQLite)
├── REST API (events, todos, courses, auth, settings)
├── SSE broadcast (/api/stream)
├── MCP tool server (15+ tools)
├── Shibboleth SAML for Moodle
└── connects to OpenCode agent engine
OpenCode (agent runtime)
└── executes MCP tools, manages sessions, streams responses
Frontend: React 19, TypeScript, Vite, Tailwind CSS, FullCalendar, TanStack React Query, Radix UI
Backend: Express 5, TypeScript, SQLite (better-sqlite3), MCP SDK, OpenCode SDK
Agent: OpenCode (open-source agent engine), 15+ MCP tools across actions, fetch, and live categories
git clone <repo-url>
cd assistum
cp .env.example .env
npm installtask devThis starts three processes concurrently:
- OpenCode agent engine on port 4096
- Express backend on port 3001
- Vite frontend dev server on port 5173
Open http://localhost:5173 and configure your TUM credentials in Settings.
task build # builds frontend + backend
task start # starts Express serving API + static frontend| Command | Description |
|---|---|
task install |
Install dependencies |
task dev:backend |
Start backend only |
task dev:frontend |
Start frontend only |
task typecheck |
Run TypeScript checks for both workspaces |
task clean |
Remove build artifacts and database |
task kill |
Kill stale dev processes on ports 3001, 4096, 5173 |
Environment variables (.env):
| Variable | Default | Description |
|---|---|---|
PORT |
3001 |
Express server port |
OPENCODE_URL |
http://127.0.0.1:4096 |
OpenCode agent engine URL |
DB_PATH |
./assistum.db |
SQLite database path |
COGNEE_URL |
— | Cognee Cloud tenant URL for agent memory |
COGNEE_API_KEY |
— | Cognee Cloud API key |
TUM service credentials are configured via the Settings dialog in the UI.
AssisTUM can run as a managed project inside Appx — a self-hostable platform for hosting agentic applications. Appx handles TLS, auth, subdomain routing, and egress control.
appx (443/8080)
└── assistum.<baseDomain> → reverse proxy → Express (<assigned_port>)
Express (<assigned_port>)
├── /api/* → REST API + SSE
├── /health → health check (appx polls this)
└── /* → React SPA (frontend/dist/)
OpenCode (4097)
└── MCP tools (actions, fetch, live)
Assistum runs its own OpenCode instance on port 4097, separate from appx's OpenCode on 4096. Appx treats assistum as an opaque app — no appx code changes needed.
-
Create project in the appx dashboard — name it
assistum, note the assigned port (e.g., 10000) -
Replace the scaffolded directory with assistum code:
cd <appx-project-root>/assistum rm -rf * git clone <assistum-repo-url> .
-
Install and build:
npm install npm run build -w frontend npm run build -w backend
-
Start:
task start:appx APPX_PORT=<assigned_port>
-
Verify — appx dashboard shows green health,
assistum.<baseDomain>loads the UI
| Process | Port | Configurable via |
|---|---|---|
| Express | 10000 (default) | APPX_PORT |
| OpenCode | 4097 (default) | APPX_OC_PORT |
| Appx's OpenCode | 4096 | N/A (separate) |
task start:appx overrides ports via Taskfile env vars — the default .env stays untouched so task dev works as before.

