Back to projects

CITU Course Builder

A schedule planner for CIT-U students with conflict-aware filtering, optimization, and export.

2stars1forksTypeScriptLive from GitHub
CITU Course Builder

Overview

CITU Course Builder came out of a recurring problem at my own university. Every term, students at Cebu Institute of Technology - University spend hours manually piecing together class schedules from PDFs and spreadsheets, trying to avoid time conflicts and balance load. I wanted a tool that did the boring math for them so they could focus on what actually matters - which sections, which professors, and what schedule shape suits their week.

What it does

The app pulls in available course offerings and lets students filter by program, year level, and preferences. The conflict-aware planner detects overlaps in real time, so you never end up with two classes at the same hour. There's an optimization mode for stacking sessions early, late, or with deliberate gaps. The final schedule exports cleanly so it can be saved or printed without losing formatting.

Technical approach

I built it in Astro with React and TypeScript because the data model needed real type safety - sections, time slots, conflicts, and preferences all interact in ways that loose typing would have made painful. Tailwind kept the UI consistent across the planner, the filter rail, and the export view. State management stayed simple on purpose - schedule logic is complex enough that adding a heavy state library would have been the wrong abstraction.

What I learned

What I learned from this project was the difference between a tool that helps and a tool that automates. Course planning at CIT-U has a lot of personal preference baked in - some students want compact mornings, others want long lunch breaks, some want specific professors. The first version of the tool tried to optimize too aggressively. The version that actually got used was the one that gave students room to nudge the schedule themselves. Building tools for a real audience always means leaving the last decision to the user.