CMU Unified Planner: Our Story
What Inspired Us
As CMU students, we struggled with fragmented schedules across Google Calendar, Canvas, and SCS Careers—making it impossible to see our complete schedule. Simultaneously, finding research professors and crafting outreach emails was time-consuming and intimidating. We realized AI could solve both problems: intelligent calendar synthesis and automated research matching. This became CMU Unified Planner.
What We Learned
Prompt Engineering: Getting AI to generate structured output (like .ics files) required explicit formatting markers (ICS_CONTENT_START/ICS_CONTENT_END) and clear constraints. Token optimization was critical—we balanced:
$$\text{Total Tokens} = \text{Resume} + \text{Faculty Data} + \text{Calendar Sources} + \text{Prompt} + \text{Response Buffer}$$
Web Scraping: The CMU SCS LTI faculty page structure varied, requiring multi-strategy parsing (heading tags, links, text patterns) with robust error handling.
Multi-Provider AI: Supporting Claude, Gemini, and GPT required an abstraction layer. Our call_ai_api_shared() function unified different APIs while allowing users to choose based on speed vs. quality needs.
Calendar Formats: iCalendar (.ics) timezone handling was complex—different sources use different formats, requiring explicit normalization to EST/EDT.
How We Built It
We built a multi-page Streamlit app with three components:
Unified Planner: Merges Google Calendar, Canvas, and SCS Careers into one prioritized calendar
- File uploads for .ics files
- AI synthesis with user preferences (priorities, daily hours, commitments)
- Timezone normalization to EST
- Downloadable .ics output with audio summary
Research Matchmaker: Matches resumes with CMU SCS LTI professors
- Scrapes faculty directory with multi-strategy parsing
- Analyzes resume for skills, courses, projects
- AI-powered matching with ranking
- Generates personalized outreach emails
Shared Utilities (
utils.py): Multi-provider AI support, file processing (PDF, .ics, text)
Technical Stack: Streamlit, Claude/Gemini/GPT APIs, BeautifulSoup4, PyPDF2, gTTS
Key Decisions: Stateless architecture (privacy-focused), multi-provider AI (flexibility), structured output parsing (reliability), timezone normalization (consistency)
Challenges We Faced
1. Parsing Unstructured AI Output: AI doesn't always follow formatting. Solution: Multi-layer parsing with regex markers, fallback to .ics structure detection, error handling with raw response display.
2. Token Limits: Large inputs hit limits. Solution: Strategic truncation (resume: 3000 chars, faculty: 8000 chars), prioritize structured data, progressive enhancement.
3. Web Scraping Reliability: Inconsistent page structure. Solution: Three parsing strategies (headings → links → patterns), graceful degradation, clear user feedback.
4. Timezone Handling: Different sources use different formats. Solution: Explicit prompt instructions for EST conversion, format specification, validation.
5. Matching Quality: Initial matches were too generic. Solution: Enhanced prompts requesting "specific connections," structured output with reasoning, quality-based ranking.
Learning: Always design for failure—robust fallbacks, clear error messages, and user feedback are essential when working with AI and web scraping.
The Result
CMU Unified Planner successfully addresses both pain points: students can see their complete schedule in one place with intelligent prioritization, and find research matches with personalized emails in minutes instead of hours. The platform demonstrates AI as a productivity multiplier—transforming manual tasks into automated, intelligent processes.
Future Enhancements
Direct API integration (Google Calendar, Canvas), expanded faculty coverage (all SCS departments), enhanced resume parsing, email tracking, and schedule optimization suggestions.
Built With
- cursor
- openai
- python
Log in or sign up for Devpost to join the conversation.