-
All my courses in one calendar, with a weekly workload heatmap that flags "hell weeks" fire ahead of time.
-
Hover any week to see every exam and deadline due across all courses.
-
Subscribed on iPhone: classes, exams and reminders appear in the native Calendar app and stay in sync.
-
Review and edit anything the AI extracted: class times, exams, deadlines and no-class days.
-
Review and edit anything the AI extracted: class times, exams, deadlines and no-class days.
-
Drop in syllabi as PDF, Word, screenshots or pasted text, several courses at once.
-
Scan once to subscribe. Every edit on the site syncs to your phone automatically, on any network.
Inspiration
Every semester I get five syllabi, and each one hides 30+ dates inside a PDF: lectures, quizzes, midterms, homework, holidays. Copying them into my calendar takes an hour, and I still missed a quiz. Then a professor moves an exam and the whole thing is out of date again. I wanted a tool where the syllabus goes in once and my phone just knows.
What it does
Syllabus2Cal turns syllabi into a live calendar on your phone.
- Upload anything: PDF, Word, screenshots or pasted text. Drop several courses at once.
- AI extraction: finds weekly class times, exams, quizzes, deadlines and no-class days, and flags anything it's unsure about.
- Review & edit: a month calendar and a course editor. Click to edit an exam, add an event, or cancel a single class.
- Workload heatmap: combines all your courses week by week, so you can spot "hell weeks" before they arrive.
- Live phone sync: scan a QR code once to subscribe. Every edit on the site shows up on your phone, with reminders before classes and exams.
- Smart re-upload: if a professor sends an updated syllabus, re-upload it and only what changed is updated (e.g. "Midterm 1: Oct 7 → Oct 9").
- No sign-up, free, works on any network.
How I built it
- Backend: Python + FastAPI
- AI: Google Gemini API reads PDFs and images natively and returns structured JSON. Text-based PDFs and Word files are pre-extracted with pdfplumber / python-docx.
- Calendar: standards-compliant iCalendar feeds built with
icalendar. Weekly classes are recurrence rules with holiday exceptions, and time zones and daylight saving time are handled correctly. - Storage: Firebase Firestore
- Frontend: a single-page vanilla JS app (calendar view, heatmap, editor)
- Deployment: Render, with the calendar feed regenerated on every request so subscribed phones always get the latest version
- Domain: live at syllab.club (registered with GoDaddy Registry)
Challenges I ran into
- AI output isn't deterministic. Re-uploading a syllabus sometimes produced "MATH 2101" instead of "Mathematics 2101.001", creating duplicate courses. I fixed it by sending existing courses to the model as context, plus fuzzy matching of courses and event titles (while making sure "Midterm 1" never matches "Midterm 2").
- Unreliable free AI tier. Models were retired or overloaded mid-hackathon, so I added automatic retries and fallback to other available models.
- Campus Wi-Fi blocks device-to-device traffic, so my phone couldn't reach my laptop server. I deployed to the cloud and moved storage to Firestore so data survives restarts.
- Calendar edge cases: recurring classes, holiday exceptions, time zones and deadlines that end at 11:59 PM.
Accomplishments that I'm proud of
- Built and deployed solo in 24 hours, and it's live and usable right now.
- Tested on real Temple University syllabi: every exam was extracted correctly.
- Edits made on the website sync to a real iPhone calendar.
What I learned
AI extraction is powerful but never 100% reliable, so good design keeps the human in the loop: review before saving, clear warnings, and easy editing. I also learned a lot about calendar standards, cloud deployment, and handling flaky external APIs.
What's next
- Google sign-in, so your calendars follow you across devices
- One-click Google Calendar integration for Android users
- Canvas / Blackboard import
- Smart study-time suggestions before heavy weeks
Log in or sign up for Devpost to join the conversation.