A mobile-friendly Progressive Web App (PWA) for students at the University of Milano-Bicocca (UNIMIB). View lecture timetables, check real-time classroom occupancy, track exam sessions, search professors, export to calendar apps, and coordinate study groups.
- π Lecture Timetables: View weekly schedules for any degree programme and year of study. Highlight followed courses ("I Miei Corsi") and spot cancelled lectures automatically.
- ποΈ Classroom Occupancy: Real-time room status across all campus buildings (U1βU28). See whether an aula is free or occupied and until what time.
- π§βπ« Professor Schedules: Directory search across UNIMIB faculty with weekly lecture schedules, semester events, and institutional contact info.
- π Exam Calendar: Track upcoming exam appeals for your degree with session filters (Winter, Summer, Autumn) and individual calendar downloads.
- π₯ Study Groups & Shared Calendars: Create or join multiple study groups via code or link. View combined schedules, overlapping courses, and automatic common free slots to coordinate study sessions or lunch breaks.
- π₯ Calendar Export & WebCal: Export schedules to iCalendar (
.ics), CSV (Excel), or JSON. Subscribe via a live WebCal feed (webcal://) to automatically sync with Apple Calendar, Google Calendar, or Outlook. - π€ Cloud Profile & Multi-Device Sync: Optional lightweight account (nickname + PIN) backed by Redis to keep your courses, exams, and group memberships in sync across devices.
- π± Mobile-First PWA: Dark mode, swipe gestures, and offline support via Service Worker.
- Frontend: Vanilla JavaScript (ES6+), CSS3 (Mobile-First responsive dark theme), PWA Service Worker.
- Backend: Python serverless functions on Vercel (
api/*.py, Python standard library only). - Storage: Upstash Redis (REST API) for user profiles and shared groups.
- Scraper Source: Live queries to official UNIMIB EasyCourse endpoints (
grid_call.php,combo.php,bookings_call.php).
.
βββ api/
β βββ calendar.py # Weekly lecture schedule scraper
β βββ exams.py # Exam appeals scraper
β βββ export.py # .ics, .csv, .json, and WebCal export engine
β βββ group.py # Study groups and membership management
β βββ options.py # Degree and course options dropdown data
β βββ profile.py # User profile sync and PIN authentication
β βββ rooms.py # Real-time classroom occupancy scraper
β βββ shared_calendar.py # Combined multi-student timetable generator
β βββ teachers.py # Faculty directory and professor timetables
βββ public/
β βββ css/
β β βββ style.css # Responsive dark-theme styling
β βββ js/
β β βββ app.js # SPA logic, state management, and export helpers
β β βββ sw.js # PWA Service Worker (offline asset cache)
β βββ icons/ # App icons (PWA)
β βββ index.html # SPA entry point
β βββ manifest.json # Web App Manifest
βββ scratch/
β βββ test_edge_cases.py # Backend unit tests
βββ vercel.json # Serverless routing and rewrites
βββ README.md
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/options |
Academic years, departments, degree programmes, and study years |
GET |
/api/calendar |
Weekly lectures for degree and study year (date=DD-MM-YYYY) |
GET |
/api/rooms |
Classroom occupancy and day schedule for a building (sede=U01) |
GET |
/api/exams |
Exam appeals filtered by course and session |
GET |
/api/teachers |
Faculty directory search (?anno=YYYY) or teacher schedule (?docente=ID) |
GET |
/api/export |
Calendar export in .ics, .csv, .json, or WebCal feed |
GET |
/api/shared_calendar |
Merged weekly timetable for multiple student codes |
GET, POST |
/api/group |
Group creation, join, leave, rename, and member listings |
GET, POST, PUT |
/api/profile |
Profile creation, authentication, PIN recovery, and cloud sync |
Run the frontend and serverless API locally using the Vercel CLI:
# Install Vercel CLI if needed
npm i -g vercel
# Start local development server
vercel devThe app will be available at http://localhost:3000.
Run the Python unit test suite:
python3 -m unittest scratch/test_edge_cases.pyTo enable cloud profiles and study group syncing, configure your Upstash Redis credentials in .env.local (or in Vercel Project Settings):
| Variable | Description |
|---|---|
UPSTASH_REDIS_REST_URL |
Upstash Redis REST endpoint URL |
UPSTASH_REDIS_REST_TOKEN |
Upstash Redis REST bearer token |
This project is open-source and available under the MIT License.