GitInspire

A platform to discover new repositories and bring life back to abandoned ones.

Device mockup of GitInspire

This was the application I made for my Senior Project in my last year of college, spanning over 2 semesters. The first semester's goal was to settle on an idea. The second semester's goal was implementing the idea and presenting it.

The overall idea of this application came from the general lack of ideas with producing an idea for the project. Project suggestions online were repetitive and exploring for repositories on GitHub was a mixed bag. One of the first results in the "Front end" topic on GitHub was the "facebook/react" repository, which was not helpful.

With that in mind, my goal with my application is to provide a centralized resource for discovering ideas and repositories backed by the input of developers that use our application.

Features

GitInspire's aim is to provide users the ability to:

  1. Search for "random" repositories directly from GitHub through a simple interface.
  2. Search through our database of labeled repositories.
  3. Authenticate with their GitHub accounts to contribute repositories and labels.
  4. Contribute repositories they label to GitInspire if their GitHub account age is >3 months old.
  5. Suggest tags/labels to GitInspire if their GitHub account age is >1 year old.

Planning and Implementation

For this application, I planned to use the GitHub Rest API. The stack I chose to implement this application was decided on a combination of what I was comfortable with and what I learned during my time in this class. What I chose was:

The first challenge with the application is deciding how authentication was going to be done. Initially, I wanted to use the Authlib library, however that did not really work as I ended up getting CORS errors on each authentication attempt. This resulted in me creating an authentication strategy from scratch by using a GitHub OAuth app with the help of Flask-JWT-Extended.

Another challenge was figuring out how I can increase the rate limit to the GitHub API for my back-end server. GitHub provided a guide on how we can increase the unauthenticated rate limit using our OAuth app secret, however that utilized CURL. After doing some research on how CURL works and what its equivalence is, I landed on this document going over the CURL flags and found it to be just the "Authorization: Basic {base64string}" HTTP header.

With this application, testing was one of the key requirements and I ended up doing extensive testing on all my back-end API routes on Flask using the pytest and WebTest Python libraries. Testing was a bit difficult on the front-end due to having a global context that wrapped all the routes, making it difficult to test components and routes as it was tightly connected.

One of the things I am most proud of was figuring out how I could implement Continuous Integration & Deployment (CI/CD). CD was something I was aware of from my time of using Netlify and Vercel as hosts for my applications. What was new to me was CI, which involved automatically running tests on code once pushed. With the default configs on Vercel (where I deploy my Next.js apps), any pushes made will get deployed, which is something we do not want as it does not run the tests.

The solution ended up being the combination of GitHub Actions and deploy hooks, which are a way of manually triggering deploys. The first thing I had to do was disable the default behavior of automatically pushing code to Vercel. Then, I created a GitHub action file which runs the tests on the code once it is pushed and based off the results, run the deploy hook to push the changes to our hosting provider.