Skip to main content
← Back to the trail log

2025

bldr

Live

Role Team project for KU EECS 581, four listed members. I built the schedule generator, busy blocks, public sharing and the CI pipeline.

A visual schedule builder that lets University of Kansas students plan a semester without juggling tabs or checking time conflicts by hand.

Stack: Next.js · TypeScript · Supabase · Tailwind CSS

bldr schedule builder showing a weekly calendar

The problem

Course registration means juggling multiple tabs and manually checking for time conflicts. bldr gives students a visual calendar with real-time class search, seat availability, and saved schedule variations.

The hardest stretch

Generating every conflict-free schedule for a set of courses. Each class has several components (lecture, lab, discussion), each with several sections, and no two chosen sections can overlap. I wrote a backtracking generator that picks one section per component and drops a branch the moment it conflicts with what is already chosen, so dead ends are never expanded. Pinned sections are fixed up front, and a pin that conflicts with anything makes the whole branch invalid.

Busy blocks were the second pass. Students can drag out times they are unavailable, and those became a hard constraint inside the same search: a section that overlaps a busy block never enters a schedule. The generated list can also get large, and persisting it overflowed the browser's localStorage quota. I stopped storing it and keep only the current index and a hash of the draft (classes, pins, busy blocks), then regenerate when the hash changes.

Decisions

Chose Regenerate permutations from the draft, storing only an index and a hash

Rejected Persisting the full permutation list in localStorage

The list can exceed the roughly 5 MB quota for large schedules and is always derivable from the draft. Hashing the classes, pins and busy blocks tells the app exactly when to regenerate.

Chose Busy blocks as a hard constraint inside the search

Rejected Filtering the results afterward

Pruning during backtracking skips whole branches early instead of building schedules only to throw them away, and a pinned section that overlaps a busy block correctly yields no schedule.
bldr course search with seat availability
Course search with seat availability.
bldr saved schedule variations
Saved schedule variations.