Course Matrix is an AI-powered platform designed to streamline the course selection and timetable creation process for undergraduate students at UTSC.
By taking user preferences into consideration, Course Matrix is able to leverage AI to intelligently provide personalized course recommendations and generate optimized timetables.
At UTSC, students face challenges when it comes to managing their academic and personal schedules. The process of selecting the optimal courses and ensuring that course prerequisites are met can be time-consuming and overwhelming, especially for international and first-year students. The current systems for dealing with this problem are fragmented as they require students to check multiple websites. This leads to inefficiencies and potential errors in course selection.
Course Matrix addresses these problems by providing a centralized, user-friendly platform that integrates the course database with advanced AI features. Our goal is to help students reduce scheduling errors, save valuable time, and provide a flexible, personalized approach to course planning.
You will need to install the following prerequisites to get started: NodeJS version 20.10.0 or above
Follow these steps to install this application
- Clone this repo:
git clone https://github.com/UTSC-CSCC01-Software-Engineering-I/term-group-project-c01w25-project-course-matrix.git
- Install npm packages
cd ./course-matrix
cd ./frontend
npm install
cd ../backend
npm install
- Configure environment variables: Create a
.envfile in/backendand populate it with the following:
NODE_ENV="development"
PORT=8081
CLIENT_APP_URL="http://localhost:5173"
DATABASE_URL=[Insert Supabase Project URL]
DATABASE_KEY=[Insert Supabase Project API key]
OPENAI_API_KEY=[Insert OpenAI API Key]
PINECONE_API_KEY=[Insert Pinecone API Key]
PINECONE_INDEX_NAME="course-matrix"
BREVO_API_KEY=[Insert Brevo API Key]
SENDER_EMAIL="[email protected]"
SENDER_NAME="Course Matrix Notifications"
The DATABASE_URL variable should contain your Supabase project url and the DATABASE_KEY should contain your Supabase project’s API key. To learn how to create a new Supabase project: see here. Likewise, the OPENAI_API_KEY variable should contain your OpenAI Project API Key, the PINECONE_API_KEY should contain your Pinecone Project API Key, and the BREVO_API_KEY should contain your Brevo API Key. Note that for the purposes of this project, we will provide the grader with all necessary API keys and URLs.
- Configure environment variables for frontend. Create a
.envfile in/frontendand populate it with the following:
VITE_SERVER_URL="http://localhost:8081"
VITE_PUBLIC_ASSISTANT_BASE_URL=[Insert vite public assistant bas URL]
VITE_ASSISTANT_UI_KEY=[Insert vite assistant UI key]
To run the application locally:
- Run backend:
cd ./backend
npm run dev
- Run frontend
cd ../frontend
npm run dev
Navigate to the url given by the environment variable CLIENT_APP_URL in .env to access the frontend web page. This should be http://localhost:5173 initially.
- Tech Stack: We utilize the PERN (PostgreSQL, Express, React, and Node) tech stack.
- The frontend and backend codebases both use TypeScript as a common language, which provides type safety across both codebases.
- Additionally, we chose to utilize Supabase as a cloud-managed wrapper for our PostgreSQL database. There are many benefits of this such as built-in authentication and authorization, managed hosting and scalability, as well as team based project management.
- We chose to use a relational database instead of a NoSQL database due to the structured nature of our data models (Users, Courses, Offerings, Timetables).
- For more info about our tech stack, refer to this Google Docs document.
- Software Architecture Pattern: 3-Tier Architecture.
We use Jira as our ticketing website. Also, Course Matrix follows the git flow process. For more info, see the sections below for the Branch Naming Rules and the Contribution Steps.
- The
mainbranch holds the production-ready code. - The
developbranch is the integration branch where new features and non-breaking fixes are added and tested. - Feature branches and bugfix branches are created off the
developbranch and are merged back into it when complete. Both feature branches and bugfix branches follow the naming convention{initials}/{jira-ticket-number}-{descriptive-title}(e.g.ax/scrum-2-add-login-uicould be an example of a feature branch name andax/scrum-3-fix-unresponsive-login-buttoncould be an example of a bugfix branch name). - Release branches are created off the
developbranch and are merged into thedevelopandmainbranches when complete. Release branches follow the naming conventionrelease/{version-number}(e.g.release/1.0). - Hotfix branches are created off the
mainbranch and are merged into thedevelopandmainbranches when complete. Hotfix branches follow the naming conventionhotfix/{version-number}(e.g.hotfix/1.0.1).
-
Once you start working on a Jira ticket, set the status of that ticket to
In Progressand create the associated branch for that ticket on GitHub. -
Commit and push the necessary changes for your branch.
-
Create a pull request (PR) for your branch:
- For hotfix or release branches, create one PR to merge it into the
mainbranch and another one to merge it into thedevelopbranch. - For feature branches, create one PR to merge it into the
developbranch.
- For hotfix or release branches, create one PR to merge it into the
-
Get a PR approval from at least one other team member.
-
Merge the PR and mark the associated Jira ticket with a status of
Done.- Just as a FYI, our GitHub repo is configured to strictly use the Squash and merge option for PRs with the default commit message set as the PR title.
