CS 346 · Full-stack term project · University of Waterloo

Build a conflict-free term, not a spreadsheet.

QuestFlow is a desktop course planner for Waterloo students. Search any course, drop it onto a live weekly calendar that catches time clashes instantly, let the optimizer arrange your perfect week, and compare timetables with friends.

Kotlin · Compose Desktop Ktor API OptaPlanner PostgreSQL
QuestFlow — Home
QuestFlow home screen with Course Search, Friends, Wishlist, and Calendars
What it does

Everything a term needs, in one window.

From first course search to a finished, shareable schedule — no browser tabs, no clashes, no guesswork.

Search & research

Research any course — the real, live data.

Fuzzy-search UW's catalogue (even "cs 34" finds CS 341), then open a full course page: description, prerequisites, and every section's time, days, and live enrollment for the term.

  • Typo-tolerant matching (forked fuzzywuzzy-kotlin)
  • Live sections & seat counts from the UW OpenAPI
  • Add straight to your calendar or wishlist
Course information page for CS346 showing description, prerequisites, and a table of sections with times and enrollment
Weekly calendar

Build your week — clashes are blocked on the spot.

Courses render as colour-coded blocks on a real weekly grid. On your current calendar, a conflicting section simply can't be added — a snackbar tells you exactly which class it collides with.

  • Automatic time-conflict prevention
  • Week-by-week browsing · calendar & list views
Weekly calendar with colour-coded course blocks
Custom calendars

Experiment freely on alternate calendars.

Spin up as many custom calendars as you like and drag-and-drop courses right onto the grid. Here conflicts are allowed on purpose — seeing the overlaps makes trade-offs easy to weigh.

  • Drag-and-drop course placement
  • Multiple what-if calendars per user
Alternate calendar in the OCEAN theme with an Optimize button
Schedule optimizer

Let the solver find your perfect week.

Pick the courses you want and a dedicated OptaPlanner service arranges them against real constraints — handing back an optimized, conflict-free timetable in a few seconds.

  • Hard: zero overlapping courses
  • Medium: fewer days on campus  ·  Soft: minimal gaps
Schedule optimization screen
Friends & sharing

Overlay a friend's week onto yours.

Send a request, and once it's accepted you can compare calendars: your courses in one colour, theirs in another, overlaps rendered darker. Finding shared free time takes one glance.

  • Friend requests — incoming, sent, accept/decline
  • Privacy by consent — only friends can view your week
Compare-calendars view overlaying two students' weekly schedules
Degree planning

Map the whole degree, not just next term.

The wishlist is a four-year board — a box for every academic term (1A through 4B). Park courses you're eyeing for the future and shuffle them as your plans change.

  • Add from any course page or right on the board
  • Per-term organization across all four years
Wishlist degree planner with course boxes for years one through four
Native macOS menu bar with a File menu and New Calendar shortcut
Native desktop

Real menus & hotkeys

A true desktop app with a native menu bar and shortcuts — Ctrl-N for a new calendar, Ctrl-S to jump to search.

Calendar theme dropdown
Personalization

Four calendar themes

Recolour the week with a tap — OCEAN, PASTEL, SUNSET, or EARTH. Your choice follows you across every page.

Fuzzy course search results
Browse

Explore by subject

Not sure what to take? Browse every course under a subject, sorted by level — 100s, 200s, and up.

How it's built

A three-tier system, end to end.

A native desktop client talks to a Ktor API, which persists to PostgreSQL and offloads the hard scheduling maths to a separate OptaPlanner service. Course data streams in live from the University of Waterloo's OpenAPI.

Client · presentation

Compose Desktop app

A Kotlin/JVM desktop UI built with Jetpack Compose — the weekly grid, conflict highlighting, themes, and a Ktor HTTP client for every request.

Kotlin · Compose · Material 3
Server · application

Ktor REST API

Routes for auth, courses, calendars, wishlist, and friends. Talks to Postgres through Exposed and calls the planner service for optimization.

Ktor · Exposed · Netty
Solver · data

OptaPlanner + Postgres

A standalone Spring Boot / OptaPlanner service solves the constraint model; PostgreSQL stores users, courses, calendars, and friendships.

OptaPlanner · Spring Boot · PostgreSQL
Kotlin Jetpack Compose Desktop Ktor Exposed ORM OptaPlanner Spring Boot PostgreSQL Gradle · multi-module Docker UW OpenAPI