← Back to project summary

Schedule Me

A closer look at what it is, what is in it, and what I built.

What the app does

  • Searches the course catalog by course, professor, time, and day, with Levenshtein-distance fuzzy matching so near-miss queries still land.
  • Builds a schedule by dragging courses onto a calendar, with conflict detection between time slots and custom events for work or practice.
  • Undo and redo on every schedule change, plus named saved schedules per user.
  • Answers academic questions through a chat advisor that reads the actual bulletin rather than making things up.

What I built

  • Worked across all three core services: the Java core and its Javalin controllers, the React frontend, and the Python advisor.
  • Built the LLM integration end to end, including the backend controller that fronts it and the chat interface that consumes it.
  • Implemented fuzzy search and the drag-and-drop schedule builder.
  • Built the schedule management page and a round of quality-of-life work on the interface.

The AI advisor

  • Reads the college bulletin and computer science degree sheets with PyMuPDF, splits them into chunks, embeds them with text-embedding-3-small, and stores them in a local FAISS index.
  • Serves a LangChain RetrievalQA chain over that index with GPT-4o-mini behind it.
  • The prompt keeps the model honest: it uses the student's schedule only when the question is about their schedule, answers course questions from retrieved documents alone, and says it could not find something rather than inventing it.

Shareable schedules (Ruby on Rails)

  • A separate Rails 8 API mints a share token for a schedule and returns a public /s/TOKEN link.
  • Anyone holding the link can view that schedule without logging in.
  • The same service stores user profiles, with avatar uploads handled through Active Storage.
  • Rails got the job done faster than adding sharing to the Java backend, and it was a chance to learn Rails 8 properly.

Engineering notes

  • The Java core is covered by JUnit 5 tests for search, time-slot conflicts, schedules, courses, and users.
  • Gson handles serialization, with a custom deserializer for the polymorphic calendar events.