Inspiration
Every semester, students waste countless hours fighting with clunky university portals and 2FA logins just to figure out what room their next lecture is in. We realized that if we could extract our schedules from the walled garden of the university's portal (MyHud) and put them directly into our personal calendars (Google, Apple, Outlook), we could stop checking the portal and start actually managing our time.
What it does
MyHudSync (or ical-export-uni) is a proof-of-concept desktop application built with Python and tkinter. It acts as a bridge between the university's database and your personal life. By supplying a session Bearer token, the app securely queries the MyDay calendar API (https://api.myday.cloud/legacy/api/aggregate/v2/calendaritem). It previews your fetched schedule data in a table based on your specified timeframe. With a single click, it exports the schedule to an .ics (iCalendar) file, allowing you to easily import your timetable into external calendars.
How we built it
We built the application entirely in Python.
- Backend Logic: We used the
requestslibrary to interface directly with the endpoint. We also utilized Python's built-indatetimeanduuidmodules to dynamically parse the API data and construct compliant iCalendar (.ics) files from scratch. - Frontend UI: We designed a graphical user interface using
tkinterandttk(Themed Tkinter). We implemented a custom dark/light mode toggle that dynamically updates widget styles, and included an embedded "Help" guide to walk non-technical users through retrieving their tokens. - Concurrency: To prevent the UI from freezing during network requests, we offloaded the API calls to background threads using Python's
threadingandqueuemodules, allowing for a smooth, responsive loading animation.
Challenges we ran into
- The "Wall of Text" Error: Initially, when an API request failed, the script blindly dumped the server's raw response into a tiny popup box, creating a massive, unreadable wall of code that spanned the entire screen. We had to build an intelligent error parser that detects HTML vs. JSON responses and extracts only human-readable context.
- UI Freezing: Using
requests.get()on the main thread completely locked up the application while waiting for the server. Implementing the thread-safequeueto pass data back to the Tkinter main loop without crashing was a significant learning curve. - iCalendar Strictness: Formatting the
.icsfiles required strict adherence to timestamp formats (e.g.,YYYYMMDDTHHMMSSZ) and ensuring unique event IDs so calendar apps wouldn't overwrite or duplicate classes.
Accomplishments that we're proud of
- Successfully building a robust, thread-safe desktop app that doesn't freeze under load.
- Creating a genuinely clean UI that supports both Light and Dark modes seamlessly without requiring external image assets.
- Building something that solves a real, everyday annoyance for students. Getting that first
.icsfile to successfully populate an Apple Calendar with all our classes was an incredible feeling!
What we learned
We learned a massive amount about desktop app development, specifically how to manage state and concurrency in Tkinter. We also gained deep practical experience working with REST APIs, handling HTTP status codes gracefully, parsing complex JSON structures, and encoding data into universal standards like the iCalendar protocol.
What's next for MyHudSync
Since this was built rapidly as a hackathon proof-of-concept, we have big plans for the future:
- Automated Authentication: Currently, users must manually extract a Bearer token via browser developer tools. We want to integrate a proper login flow or browser automation to fetch the token automatically.
- Direct Calendar Integration: Instead of just downloading a
.icsfile, we plan to implement direct API integrations (like Google Calendar API or Microsoft Graph API) to sync events seamlessly without a manual import step. - Live Calendar Sync: We want to convert the static
.icsdownload into a subscribed calendar feed so schedules update live via a URL. - Modern UI Framework: We aim to migrate from
tkinterto a modern cross-platform framework (like Electron, Tauri, or PyQt) for a richer, more polished UI. - Pagination & Robust Error Handling: Adding pagination cursor handling for extremely large timeframes, and improving API error handling with automatic retry logic for network timeouts.
Log in or sign up for Devpost to join the conversation.