{"id":31756844,"url":"https://github.com/vikelabs/courseup","last_synced_at":"2025-10-09T19:25:56.942Z","repository":{"id":37056072,"uuid":"340229870","full_name":"VikeLabs/courseup","owner":"VikeLabs","description":"An open-source website built to simplify the experience of searching courses and building timetables for the University of Victoria.","archived":false,"fork":false,"pushed_at":"2024-06-21T20:31:36.000Z","size":12145,"stargazers_count":41,"open_issues_count":51,"forks_count":29,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-06-22T20:23:30.012Z","etag":null,"topics":["firebase","react","typescript"],"latest_commit_sha":null,"homepage":"https://courseup.vikelabs.ca/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VikeLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-19T01:52:49.000Z","updated_at":"2024-06-21T20:31:39.000Z","dependencies_parsed_at":"2024-03-08T03:29:29.630Z","dependency_job_id":"b604fad1-230e-43ce-8247-bd4a1660ae74","html_url":"https://github.com/VikeLabs/courseup","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/VikeLabs/courseup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VikeLabs%2Fcourseup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VikeLabs%2Fcourseup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VikeLabs%2Fcourseup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VikeLabs%2Fcourseup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VikeLabs","download_url":"https://codeload.github.com/VikeLabs/courseup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VikeLabs%2Fcourseup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001980,"owners_count":26083243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["firebase","react","typescript"],"created_at":"2025-10-09T19:25:55.569Z","updated_at":"2025-10-09T19:25:56.934Z","avatar_url":"https://github.com/VikeLabs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CourseUp\n\n[![Contributors][contributors-shield]][contributors-link]\n[![Stargazers][stars-shield]][stars-link]\n[![Issues][issues-shield]][issues-link]\n[![Website][website-staging-shield]][website-staging-link]\n[![Website][website-prod-shield]][website-prod-link]\n\nCourseUp is a website built to simplify the experience of searching courses and building timetables for the [University of Victoria](https://uvic.ca) (UVic). The website is a TypeScript app which uses React on the front-end and Firebase on the back-end.\n\n## Develop\n\nIf you're interested developing this application, follow these steps to get running a local version of the application.\n\n**Note**: These instructions are for developing the frontend (React). If you wish to develop the backend, please refer to the [README](./functions/README.md) located in `functions` directory in this repository.\n\n1. Fork the repository.\n2. Clone your forked repository:\n   ```\n   git clone https://github.com/\u003cYOUR_GITHUB_USERNAME\u003e/courseup.git\n   ```\n3. Run `npm ci`\n   - Tip: Avoid using `npm install` unless you're installing a package.\n4. Start the frontend using `npm start`\n   - This will start the [Create React App](https://create-react-app.dev/) development server.\n   - All requests to the backend will be routed to the **staging** environment of CourseUp. This can be overridden using the `proxy` property located within `package.json`.\n\nYou will now be able to develop the frontend React application. Any changes made to the code will hot-reload upon save.\n\nNote: If the above is failing to compile on a Windows machine, you will first need to run `git config --global core.autocrlf false`, then `git fetch --all` and then `git reset --hard`. After successfully running these two commands, you can then retry step 4 (`npm start`).\n\nIf you get stuck setting up the development environment, try Google **then** if you're still stuck drop a question in our [GitHub Discussions](https://github.com/VikeLabs/courseup/discussions/categories/q-a).\n\n### Next.js\n\nCourseUp is migrating to [Next.js](https://nextjs.org/) and thus the project is configured to be dual-stack as there's a create-react-app and Next.js project within the same repository.\n\nDuring the migration, the Next.js related scripts are prefixed with `next`:\n\n- `npm run next:dev` - Starts Next.js in development mode\n- `npm run next:build` - Builds the application for production usage\n- `npm run next:start` - Starts a Next.js production server\n- `npm run next:lint` - Sets up Next.js' built-in ESLint configuration\n\nThese prefixed scripts will be removed when create-react-app is removed.\n\n### Directory Structure\n\nCourseUp uses a defined structure for directories. Make sure you read up on our [frontend directory structure guidelines](https://github.com/VikeLabs/courseup/wiki/Frontend-Directory-Structure) before submitting contributions.\n\n### Chakra UI\n\nCourseUp uses the component library [Chakra UI](https://chakra-ui.com/), it's the main source of components, styling, and formatting. You will notice throughout the codebase there is _no_ use of raw HTML elements such as `\u003cdiv\u003e`, `\u003cli\u003e`, etc. as Chakra provides us with clean alternatives that help keep the code consistent and the website looking good.\n\n### Fetchers\n\nYou will notice there are React hooks like `useGetCourse`. This is provided by [restful-react](https://github.com/contiamo/restful-react/) to interact with our backend RESTful API. Please take a brief read of [restful-react](https://github.com/contiamo/restful-react/) to understand what it provides.\n\nWe use the [code generation](https://github.com/contiamo/restful-react/#code-generation-from-openapi--swagger-specs) capabilities to generate React hooks for all the resource routes to our backend. The generated code is located in [here.](./src/shared/fetchers.tsx). **DO NOT EDIT THIS FILE** as it is supposed to be generated from the OpenAPI spec.\n\nTo regenerate the fetchers, run `npm run fetchers:generate`. This is **only required if the backend controllers change**.\n\n## Contribute\n\nThanks for wanting to contribute! Make sure you read up on our [contributions guidelines](CONTRIBUTING.md) before submitting contributions.\n\n## Deployment\n\nHosting is provided by [VikeLabs](https://vikelabs.ca) using [Firebase](https://firebase.google.com/). CourseUp has a **staging** and **production** environment. Changes will be first deployed to staging to be verified before moving onto production.\n\n## Testing\n\nThis project uses [Jest](https://jestjs.io/) testing framework. You can execute tests by running `npm test`.\n\nThis will execute tests using Jest files with the extension `*.test*`.\n\n`npx jest --watch` will put Jest into watch mode, which will execute tests as files change.\n\n## UVic Course Scraper\n\nThe website uses the npm package [`uvic-course-scraper`](https://github.com/VikeLabs/uvic-course-scraper). The package is a web-scraping tool made with TypeScript that is the main way of extracting data from UVic. It is contributed to and maintained by the original development team of `courseup`.\n\nThe motivation of [`uvic-course-scraper`](https://github.com/VikeLabs/uvic-course-scraper) is to abstract away the parsing and scraping required to obtain data. It is not designed to do anything else.\n\n## VikeLabs\n\nThis project was developed by students at the [University of Victoria](https://www.uvic.ca) as part of [VikeLabs](https://vikelabs.ca), which is a student-led software development club.\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\n[contributors-shield]: https://img.shields.io/github/contributors/VikeLabs/courseup?style=flat\n[contributors-link]: https://github.com/VikeLabs/courseup/graphs/contributors\n[stars-shield]: https://img.shields.io/github/stars/VikeLabs/courseup?style=flat\n[stars-link]: https://github.com/VikeLabs/courseup/stargazers\n[issues-shield]: https://img.shields.io/github/issues/VikeLabs/courseup\n[issues-link]: https://github.com/VikeLabs/courseup/issues\n[website-staging-shield]: https://img.shields.io/website?down_message=staging%20offline\u0026up_message=staging\u0026url=https%3A%2F%2Fcourseup.vikelabs.dev\n[website-prod-shield]: https://img.shields.io/website?down_message=prod%20offline\u0026up_message=prod\u0026url=https%3A%2F%2Fcourseup.vikelabs.ca\n[website-staging-link]: https://courseup.vikelabs.dev/\n[website-prod-link]: https://courseup.vikelabs.ca/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvikelabs%2Fcourseup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvikelabs%2Fcourseup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvikelabs%2Fcourseup/lists"}