Inspiration
Every semester starts the same way: five syllabi in five different formats, and an hour of copying due dates into a calendar by hand. Grade weights get lost too, so by finals week most students have no idea what score they actually need. I wanted a tool that reads a syllabus the way a student does and does the busywork for them.
What it does
- Upload a syllabus PDF. Gemini reads it directly, including tables and messy layouts.
- Extracts every graded item (exams, quizzes, homework, labs, projects) with dates, times, and grade weights.
- Flags problems: weights that don't add to 100%, "TBA" dates, and dates it had to compute (like "Thursday of Week 13").
- Review & edit: every item is editable because AI can make mistakes, and the student should have the final say.
- Exports a
.icscalendar with reminders that imports into Google, Apple, or Outlook Calendar. - Crunch weeks: highlights the weeks with the most grade weight due.
- Grade calculator: enter your scores so far and see the average you need on the remaining work.
- Ask your syllabus: questions like "What's due in the next two weeks?" are answered by Gemini using only the extracted data.
How I built it
- Google Gemini API is the core. The PDF goes to Gemini as raw bytes, and I use structured output with a Pydantic
response_schema, so Gemini always returns JSON of the exact shape the app expects. - Python + Streamlit for the web app, which let me build a working UI quickly as a solo builder.
- Plain Python for the math. The LLM handles the fuzzy part (reading documents); deterministic code handles calendar generation and grade arithmetic, so the numbers are exact:
- Unit tests cover everything that doesn't call the API.
- Deployed on Streamlit Community Cloud. All prompts are documented in
PROMPTS.md.
Challenges I ran into
- Syllabi don't agree on how to write dates. "Oct 14," "Week 7 Thursday," and "TBA" all show up. The prompt has explicit rules: compute week-based dates and flag them, and return null instead of guessing.
- Stopping the model from inventing things. Allowing null fields and a
warningslist gave Gemini a way to express uncertainty instead of hallucinating. - Double-counted weights. The first "crunch weeks" calculation counted the Final Project's 10% twice because it had two deliverables. A unit test caught it.
Accomplishments that we're proud of
- Going from a prompt to a working, deployed product in one day.
- Reliable structured output: every Gemini response matches the schema, so the app never breaks on a malformed reply.
- Keeping a human in the loop. Students can review and fix anything before it reaches their calendar.
- Exact grade math, because it's done in code instead of by the AI.
What I learned
- Structured output with a schema is what makes LLM results reliable enough to build a product on.
- Let the LLM read; let code calculate.
What's next
- Direct Google Calendar sync
- Multi-course semester dashboard
- Canvas integration to pull in real scores