Inspiration

I wanted this app for myself long before I built it. Planning a semester at SMU meant opening five course outlines, copying deadlines into Google Calendar one by one, and then trying to work out what I actually needed to do before each assessment. Every term I'd do it once in Week 1 and never again, and every term Week 9 would arrive with three deadlines I'd half forgotten.

Two things stopped me: motivation, and not knowing where to start. AI Lodge gave me both.

I also knew I didn't want a spreadsheet. I wanted something I'd want to open.

What it does

Drop in a course outline. Patch reads the PDF and pulls out every assessment with its title, weight and date, plus what you cover each week and when your classes meet.

Then it shows your term three ways: a Week timetable with your real class times and deadlines pinned to their day, a Map where your semester is a path with each deadline a card along it, and a Month calendar.

The part I care most about is what it does before saving anything. Every extracted date arrives with the exact line of your syllabus it was read from. Anything uncertain is flagged with a reason you can read. Nothing goes on your map until you confirm it.

Beyond that: Onion breaks big assessments into study steps placed backwards from the due date. Tomato runs a focus timer you can pause. There's a grade calculator (arithmetic only, no AI). And there's a habit garden and a cabin where I log the books, films and shows I finish. Not strictly planner features, but I wanted one place for all of it.

How we built it

Solo, in about two weeks, with Claude Code as the implementer and a second Claude session as the planner and reviewer.

Stack: Next.js (App Router) + TypeScript, Tailwind, Supabase (Postgres, anonymous auth, row-level security), Google Gemini for extraction and planning, Vercel for hosting. Open Library, TMDB and RAWG for cover art.

The architecture rule that shaped everything: the AI reads, the code decides.

  • The model must return a verbatim quote for every item it extracts. Code then searches the document to confirm that line really exists. If it can't be found, the item is flagged.
  • The model never converts week numbers to dates. Code does that, from SMU's own academic calendar.
  • Every model output is validated against a strict schema, with one retry and then a manual fallback.
  • The uploaded file and its full text are never stored. Emails and phone numbers are stripped before the text is sent.
  • No veggie dialogue comes from the model. Every line is a fixed template filled in by code.

I wrote a PRD, an architecture doc and an AI safety plan before any code, including an evaluation set with adversarial fixtures: a prompt injection hidden in a syllabus, a document that isn't a syllabus at all, and items with TBA dates.

Challenges we ran into

An import that silently returned nothing. I uploaded a real course PDF and got an empty review screen. It wasn't the AI. The file was 35 pages and the importer refused anything over 30 before it even read it. Two lessons: the page cap was the wrong test for a text PDF, and a failure that shows nothing is worse than a failure that explains itself. Every failure path now says what happened and offers manual entry.

Different sections meet on different days. My syllabus says the lab test is Friday. My section is Tuesday. The app was showing Friday as fact. Since Patch now reads class times from the same file, it flags any date derived from a weekday reference: "Your section may meet on a different day. Check this one." It's the clearest example of the whole design philosophy — when the model can't be certain, say so instead of guessing.

Free-tier reality. Gemini's free tier returned 429s and 503s during testing, and some calls took over 30 seconds. I added a fallback model chain, racing after 4 seconds, tighter timeouts, and a template plan that needs no model call at all.

The design. This was the hardest part and it isn't finished. I went through roughly six full visual directions. Illustrated world, then stripped back, then too plain, then back toward character. Each round was faster than the last, and none of that speed gave me taste.

Accomplishments that we're proud of

Nothing the AI produces reaches my calendar unchecked. The quote verification, the code-owned date conversion, and the confirm step are the design, not a disclaimer at the bottom of a page.

The section flag. It's a small feature that took understanding the actual problem: that a syllabus is written for a course, not for your section.

It's deployed and it works on real data. My own SMU course outlines, not fixtures.

I built the thing I'd been wanting for two years, and I'm actually using it.

What we learned

AI has made building genuinely accessible to me. When Patch first worked end to end my honest reaction was "wait, I could have done this the whole time?" I'd had the idea for ages and never knew where to begin.

But the harder lesson: the difficulty with building on an LLM isn't making it work, it's deciding what it shouldn't be trusted with. Almost every design decision I'm proud of is a place I took something away from the model and gave it to code.

And making something work and making it feel right are two different jobs. I come from a graphic design background and I'm particular about UI, so I iterated a lot. AI made each iteration much cheaper. I could paste a screenshot and say what felt wrong, but it couldn't tell me what I wanted. That part was still mine, and it was slow.

What's next for Patch

  • Run the extraction evaluation on more real syllabi and publish honest accuracy numbers, including the failures.
  • The design, properly. The map still gets crowded when several courses share a week, and the three views don't yet feel like one app.
  • Paste-a-change: drop in an announcement like "Quiz 2 moved to Week 11" and have Patch propose an edit, with the same confirm-before-saving rule.
  • Beyond SMU. The calendar is the only part that's SMU-specific; other universities need their own.
  • Scanned syllabi. Photographed pages can't be checked word for word today, so everything from one is marked unverified. That's honest, but it isn't useful enough yet.

Built With

Share this project:

Updates

Submission history