Problem
Choosing an OMSCS path took more time than I wanted to admit. I kept reading course reviews, comparing workloads, and debating which specialization made the most sense, but the process still felt loose and subjective.
Course Planner started as a way to turn that decision into something more structured. Instead of juggling bookmarked reviews and half-formed preferences, I wanted a model that could encode the same tradeoffs I was making by hand and search for a valid plan more systematically.
Approach
The project is built as a small end-to-end pipeline. A browser-side script scrapes OMSCentral review data into a local JSON dataset, then a Python script uses PuLP to solve a mixed-integer optimization problem over that course set.
The model chooses exactly ten courses, enforces one specialization, and applies separate constraint sets for Interactive Intelligence and Computing Systems. On top of those rules, it scores each course using a weighted combination of rating, difficulty, workload, review volume, and a manual interest score:
That last term matters. I did not want a planner that blindly optimized for public averages, because the whole point was to guide my own decisions. The interest score keeps the model personal, while the rest of the inputs give it enough structure to stay grounded in real course data and program constraints.
Outcome
This is still a personal tool, but it is one I continue to use every semester when I want to revisit tradeoffs or compare how my priorities have changed. The current version is CLI-first, which is fine for the stage it is in. The useful part is the model itself: I can adjust weights, rerun the solver, and get a defensible plan instead of relying on intuition alone.
It also captures the kind of project I like building. I start with a real decision problem, reduce it to a workable model, and turn it into something practical enough to keep using after the first prototype.