Telescope: a pants-off approach (🔭🚫👖)

During our last sprint—titled Goodbye Random Pants—the Telescope team largely focused on slimming down our back end, as well as beautifying our front. That disclosed, please allow me to unpackage my own contributions to these efforts.

No more dateless pin-ups

For quite a few weeks, Telescope was placing one particularly-broken post on a pedestal (atop all other posts) just because it refused to give us a date:

Issue #757 – Telescope was ‘pinning’ a post without a publication date

This infamous post in question was being ‘pinned’ to the top of the Telescope’s feed list due to it being provided with a new date of publication upon being processed. As such, this post was provided with a publication date more recent than any other processed posts, which consequently caused it to be hoisted to the top of Telescope.

The solution that I presented simply involved preventing posts without a publication date from being processed:

PR #823: reject posts without a publication date

Implementing a fix for this issue required adjusting the logic within post.js involving the handling of missing or invalid publication dates. I did this by writing a robust ensureDate() function, which now validates each the two dates associated with each blog post (dates of publication, and of last update):

An ensureDate() function is now used to validate post dates

This function ensures that posts with an invalid publication date do not get processed (via throwing an error), while all other posts do. Notably, this function allows posts that lack a valid date of last update to be processed if they possess a valid publication date to fall back on.

Never drop trou(bleshooting)

Within my last blog post, I described how I “ventured into [four] aspects of Telescope that I had previously had zero interaction”. During this last sprint, I continued my streak, touching three aspects of Telescope completely new to me: authentication (passport.js), GraphQL, and releasing.

Gatsby.js authentication: graphql-passport

As Telescope appears to drift closer toward a serverless future, the team has been slowly enabling our Gatsby.js GraphQL to perform duties that previously required sending a request to one of our many backend REST API routes.

One such key duty was authentication—more specifically, querying user information from our passport.js implementation:

Issue #701: Add authenticated user info to GraphQL via passport.js
The (very-necessary) background reading I was kindly suggested

Although I had previously zero experience with GraphQL, this issue seemed fairly straightforward to resolve: all that needed to be done was (do some reading and then) install an npm package… right?

Well, it so happened that those steps were just the beginning of a lengthy learning experience.


My initial installation/implementation of the graphql-passport module went fairly smoothly. This involved simply involved installing the module, importing the buildContext() function, and adding a context: ({ req, res }) => buildContext({ req, res }) property to the object used to construct our ApolloServer. The only challenge, here, was determining whether or not we needed to pass some User schema to buildContext(), as suggested by some of the author’s code examples (we do not).

Now, with the installation out of the way, a final, crucial step remained: testing it all; ensuring everything actually worked…

and, it did not (for quite some time).


Within the description of my penultimate pull request (#824), I detailed the exact method that I used to test our graphql-passport implementation:

PR #824: Add graphql-passport to Telescope

Again, in text, here was the method used to test this pull request:

  1. Check out this PR locally.
  2. Run npm install, installing the added graphql-passport module.
  3. Within src/backend/web/graphql/index.js, add context as the third parameter of a GraphQL resolver of your choice.
    • e.g. The parameters of getPosts would be updated as such: (parent, { filter, page, perPage }) -> (parent, { filter, page, perPage }, context)
    • (It is not necessary to make any changes to typeDefs)
  4. Within the function body of your chosen resolver, add a statement to log context.isAuthenticated() and/or context.getUser() to your console.
    • e.g. console.log(context.isAuthenticated(), '\n', context.getUser());
  5. Run docker-compose up redis login elasticsearch (Telescope’s SAML server needs to be running)
  6. Run npm start (the backend must be run locally)
    • (Ensure that API_URL is set to http://localhost:3000 within your .env file)
  7. Navigate to http://localhost:3000/auth/login and log in with the credentials user1/user1pass (as per our login documentation)
    • (You can confirm logged-in status by visiting http://localhost:3000/user/profile)
  8. Navigate to http://localhost:3000/graphql and write a query of choice corresponding to the updated resolver.
    • e.g. a query for getPosts: { getPosts(page: 0, perPage: 1) { id } }
  9. Execute the query.
  10. Observe the statement logged to Telescope’s console, which should look something like this: true, { ... email: 'user1@example.com' }

For quite a long time, Step #10 instead returned false, undefined for me—and I could not, for the life of me, figure out why.

Thankfully, from the start, I have been collaborating on this issue with the extremely-knowledgeable @manekenpix. Unlike the other mystifying issues I’ve dealt with in the past, I did not spend long dwelling on it alone, and soon reached out privately to @manekenpix for a sanity check as well as for “hints” that may push me towards a solution.

@manekenpix was extremely accommodating of my sporadic requests for “clues” in lieu of an outright answer to my issues over the course of a few days. Ultimately, he (and then I, eventually) discovered two problems with backend/web/app.js as it was:

An excerpt of backend/web/app.js, as of commit c1eb65d

The first problem can be observed within this code excerpt: passport.js was being initialized after our GraphQL middleware was being applied. Moving lines 50 to 52 up to before line 35 resolved this particular problem.

However, making this single change resulted in no different output than before: still false, undefined. This problem ended up being extremely difficult to track down, and was only resolved by @manekenpix and he delved past the author’s documentation and into two sample implementations.

Despite receiving a hint that these implementations held the key to resolving the remaining problem, I was still having difficulty singling out the remaining change I needed to make to backend/web/app.js. As such, I requested that @manekenpix publicly share his solution to our two problems:

A comment by @manekenpix within PR #824

As it turns out, the elusive ‘second problem’ that I was experiencing was not, per se, an issue with any of the code that we had added to backend/web/app.js (or its positioning). Rather, it was an issue stemming from how our GraphQL Playground is configured by default.

It turns out that GraphQL Playground, by default, omits cookies sent in response to cross-origin requests. (Of course, this ended up being yet another CORS issue… and, it is worth noting that this default behaviour is the exact opposite of what we may be are accustomed to.)


Configuring our GraphQL Playground to accept cookies (via the playground property shown in @manekenpix‘s comment, shown above) resolved the final problem, allowing me to finally confirm that graphql-passport was working.

With that, I marked my draft pull request as ready for review, adding testing/reviewing instructions to its origin post, and the rest is history.


Now that PR #824 has been merged into Telescope, I plan to utilize our new graphql-passport functionalities within my work during the current sprint (more details to follow within in a subsequent blog post!)

Now released: Telescope v0.8.0 v0.8.1 v0.8.2

“We don’t speak about 0.8

Well, perhaps, except right now.

I was fortunate enough to experience Telescope’s releasing workflow firsthand, volunteering to perform a GitHub release for Telescope v0.8.0, officially ending that sprint.

Our releasing process is made very simple thanks to release-it, essentially entailing running a script and answering a few questions. The end result of our release process should result in a fully-fledged GitHub release being added as Telescope’s current release (as was the case with our previous releases).

However, this was not the case for Release 0.8.0: it failed due to a history conflict between my local master branch and the upstream/master branch. Although this conflict was easily resolved by resetting my local master, this failed attempt added a v0.8.0 GitHub tag, necessitating that my subsequent second attempt at releasing specify a new tag, i.e. “0.8.1”.

My second release attempt (v0.8.1) also failed, but in a different and strange way: this time, the release ended up being fully performed on my fork of Telescope, but not on the upstream repository (as before, only the 0.8.1 release tag was added to the upstream).

This result was puzzling, and indicative of a bug with release-it. As such, @humphd opened an issue with release-it, which was very quickly confirmed and patched by their dev team. Not missing a beat, @humphd updated our release-it configuration, which enabled me to finally successfully release Telescope v0.8.2.

“Hold onto your butts…”

…as Samuel L. Jackson put it in Jurassic Park (1993). Telescope is currently experiencing a feature bombardment prior to a code freeze. It’s a rocky time, both here on Earth and up in the cloud.

During this current sprint, I plan to use utilize some of the tools I talked about within this blog post to finish implementing the ‘My Feeds’ page (which I discussed within my last blog post)… details to follow within a subsequent blog post. Stay tuned, and stay safe. 🔭

Telescope: that was not-too-uneasy!🔭

Within my last blog post, I stated:

“From now on, I really do plan to make much better use of our communication tools, including Slack, to seek out help when I need it!”

In that spirit, I am proud to state that I shared three of my greatest headaches during this sprint with our wonderful development team!


All Jests aside—this is the first sprint that I did not focus on tests!—I really am proud to detail what I have accomplished over the last three weeks: collaboratively tackling outstanding issues as well as and developing innovative solutions for both back- and front-end matters.

I am particularly happy about my increased presence within Slack during this iteration (having sent about 200 more messages than I did last sprint), and look forward to showcasing my collaborative troubleshooting efforts I made to overcome several development environment dilemmas I ran into.

Four new frontiers

During this sprint, I ventured into several aspects of Telescope that I had previously had zero interaction with: Redis, SSO and our Gatsby frontend. I also introduced a new technology to Telescope: Material UI. Within this blog post, I will recount my adventures with each!

Frontier one: Redis (and rate limitations)

In order to tackle an outstanding issue—Issue #624: Deal with 429 responses from medium.com, and other feeds—I had to have my first dance with Redis.

Issue #624: Telescope needed a way to handle rate limiting when fetching feeds

However, my initial fumbling attempts to configure my environment led me to inadvertently running Redis locally, as a service, on my virtual machine (which I am no longer using). As a result, my attempts to run a Dockered instance of Redis naturally failed, due to the Redis port being in use by the other instance. After failing various attempts to kill -9 my local Redis process, my plea for help on Slack was swiftly answered by @manekenpix, who was kindly willing to walk me through troubleshooting until we determined exactly what was going on, and what needed to be done!

After I was able to get Redis cooperating, I was helpfully set on task thanks to the introductory Redis walkthrough and issue-specific guidance provided via Slack by @humphd. With this knowledge in hand, I was well-equipped to tackle the issue:

PR #726: addresses rate limitation by delaying processing of rate-limited feeds

Thanks to the coaching I received in configuring my development environment, prerequisite knowledge, and implementation strategy, I was able to implement a solution (with tests) in a pull request.

I owe a very special thanks, here, to @c3ho for carefully reviewing my code and noticing that a piece was missing (perhaps lost during a rebase)… Embarassingly, this was a ‘connecting piece’ of code, and ‘connecting things’ was a stated interest of mine… No harm done; I added it within a second pull request. (Speaking of connections, I may be repeating myself, here, but I really am extremely grateful for the connections our team has forged, that allow us to collaborate so closely and effectively.)


Frontiers two and three: (reviewing) SSO and Gatsby

Before I chat about my next assigned issue / pull request, I want to take a moment to talk about a significant pull request review that I undertook.


During our last sprint, @Grommers00 went out of his way to review my OPML-related changes—willingly delving into an unfamiliar domain of Jest tests and backend routes. When he needed someone to review his Gatsby login functionality, I decided to return the favor and venture into his domain; a technology that sends shivers through many of the development team at the mention of its name: SSO.

What I set out to review – PR #672: connecting to our Gatsby frontend to our SSO

Of course, before I could begin to test the login component, I needed to first answer an important question: “so… how do I run the Gatsby frontend?” Not only had I never touched any of the SSO functionalities, but I had never even started the Gatsby development server before. I knew I was a bit out of my depth, here, and shamelessly leaned heavily on the assistance of @Grommers00, @humphd and @manekenpix in getting my development environment set up.

Of course, once I learned how to run the Gatsby development server in tandem with the backend, I also learned that doing so completely maxed out my virtual machine. It was time to ditch the VM, and, thanks to @humphd, doing so was easier than ever:

Saying ‘goodbye’ to my VM was as easy as that! (Well, almost…)

Once I was VM-free and able to run the frontend locally, during my review of the login functionality, I uncovered a redirection-related bug. Once this was filed as a separate issue, I was able to complete my review! It was very cool to witness some of the workings of Seneca’s SSO functionality (although, admittedly, most of it still goes over my head).

Frontier four: Material UI

Two weeks ago, a discussion was held regarding choosing a React library for use as a UI toolkit. Around this same time, @yatsenko-julia was scheduled to deliver a sketch/mockup of the ‘Add Feed’ component—a functionality that myself, @Grommers00 and @c3ho were tasked to deliver during this sprint:

Issue #725: a frontend component for our ‘Add Feed’ functionality was needed

Once the aforementioned discussion appeared to favor of Material UI, I decided to cement this choice (as well as contribute to the aforementioned task) by introducing a prototype of an ‘Add Feed’ component that was based on @yatsenko-julia‘s work but fully implemented using Material UI components:

PR #735: adds a /myfeeds page wireframed with Material UI components

Simply running the Gatsby development server was one thing, but writing a component for it was an entirely different beast—especially as the first non-index page, and with obviously zero pre-existing components to base component structure off of. (As a silver lining, I learned that Gatsby can automatically implement routing for Gatsby Pages, which I took full advantage of…) Nonetheless, I did prevail in the end, and would like to think that my work helped pave the way for the all of the Material UI-based components that are now beginning to populate Telescope!


One of my favorite things about contributing to Telescope is the opportunity to gain hands-on experience with very new technologies. I was always amazed when I observed contributors just plugging in new libraries and tools into Telescope and seeing those tools grow to become essential parts of the project. I am very satisfied that I received my own opportunity to do just that with Material UI.


Hello and goodbye, Docker Toolbox

After my prototype of the ‘My Feeds’ component landed, @c3ho took on the task of connecting it to the backend. During the process of reviewing his PR, I, once again, ran into issues that I suspected stemmed from my environment setup, specifically regarding Docker. Previously, on my virtual machine, I had no problems running Telescope’s backend via Docker. However, on my laptop (which runs Windows 10 Home), without my VM, I am forced to utilize legacy software (Docker Toolbox) to run Docker. Thanks to this software, I encountered a unique issue preventing me from working: apparent communication issues between my Redis and Telescope Docker containers. After exchanging over one hundred messages between @Grommers00 and @manekenpix in an attempt to troubleshoot this puzzling issue, we decided that it would be best if I ran Redis locally (via WSL) instead of via Docker. Since moving away from Docker Toolbox, I have yet to experience any more issues with my development environment (fingers crossed)!

5-min fix: for the sake of emoji-sized emojis

I suppose I should quickly touch on a quick styling fix I added to the frontend. Knowing that it would be prime time for Telescope reading soon, I wanted to help @lozinska get our blog posts looking fresh (and proportial). I followed up on her pull request with a quick one of my own. I hope that this little 5-min fix saves more than five minutes of painful reading, as emojis should no longer take up one’s entire screen!

From collaboration to delegation

In addition to the collaborative efforts that I’ve touched on throughout this post, I wish to also briefly outline an experience where I was approached and requested to delegate Telescope work—to determine reasonably-sized work for a contributor for the current sprint, and to help guide them through its completion (much like what @humphd does for the other members of the Telescope team).

Shortly after I adapted their wireframe for the ‘Add Feed’ page into a React component, I was contacted by @yatsenko-julia, who requested that I write up an issue to substantiate their contribution to the current sprint—an issue that pertained to the newly-implemented ‘My Feeds’ component.

Not wanting to open an issue that could conflict with @c3ho‘s then-in-progress work on updating the component’s behaviour, I decided that it would be most appropriate to come up with an issue related to the component’s styling. I was then reminded on an ‘annoyance’ that I had observed during my work on the component (and even noted as a footnote in my pull request for the ‘My Feeds’ prototype):

I took this little annoyance of a styling qualm, investigated it, and wrote it into a new issue (alongside a secondary annoyance that I subsequently discovered):

Issue #741: exempt the ‘My Feeds’ component from two overbearing styling rules

This is certainly not a trivial issue (and is one that I myself do not know how to immediately solve). Complicating the completion of this issue is, of course, the prerequisite environment setup (one that I have just finished documenting my struggles with!) as well as the need to familiarize one’s self with the technologies and components/stylesheets involved.

I have and will continue to make efforts to lend my support in helping @yatsenko-julia resolving this issue (including differentiating the strange quasi-frontend—which @cindyledev observed, here—being served locally on port 3000 versus the hot-reloading Gatsby development server that serves on port 8000… very strange…).

Setting up the Gatsby development configuration can be tough… take it from me!

Overall, I am glad I had a chance to delegate some work during this sprint. Project and community management are interests of mine, and I value every opportunity to practice them while working on Telescope.


The next frontier?

Currently sitting in our short stack of open pull request lies one of my own, one that we determined to be blocked pending the implementation of ‘feed ownership’ functionality:

One lonely pull request colorfully stands out from the rest

This blocked PR was opened in an attempt to address an ancient issue that I had signed up for during a previous sprint—Issue 294: Keep feeds in Redis synchronized with wiki over time.

Issue #294: Redis feed set should always equal wiki feeds plus other feed datastores

In order to fully address this issue, each feed added to Telescope (i.e. via the ‘My Feeds’ component we implemented) that is not in the wiki needs to be first associated with additional metadata, including information associating that feed with the Telescope user that added it.

Tackling this issue will present another challenging Redis-related task that I am looking forward to chewing on in the weeks to come. Stay tuned (and check out my status report presentation for a preview)!

#Hacktoberfest 2019: documenting my first-ever Hacktoberfest contribution

In my last post, I identified three GitHub issues to kick off my participation in Hacktoberfest 2019. Today, I am happy to showcase my resolution of one of those issues, marking my first-ever Hacktoberfest contribution!

Layer5.io

Before I continue on, I want to acknowledge the project that I have contributed to. In an article discussing their participating in the Google Summer of Code 2019 program, Layer5 is described as a community which represents “the largest collection of service mesh projects and their maintainers in the world”. RedHat.com helpfully defines a service mesh as “a dedicated infrastructure layer” of an application that controls how different parts of that application (“services”) share data with one another (i.e. ‘mesh together’).


Selecting my first Hacktoberfest issue

As I mentioned my last post, I came into contact with Layer5 after discovering (through the Hacktoberfest Issue Finder) its issue regarding table filtering—and subsequently discovered an unreported styling issue:

A styling issue with a collection of lists hosted on Layer5's Landscape page.
A styling issue affected a collection of lists hosted on Layer5’s Landscape page.

Of the three GitHub issues I’ve scoped out, the resolution of this styling issue (i.e. tweaking CSS) represents the simplest of tasks that I have lined up—and an ideal candidate for a first-time Hacktoberfest contribution!

As far as I could tell, no open issues concerned the styling problem that I discovered. So, as instructed both Layer5’s website (and encouraged its extremely-welcoming development team), I opened my own issue:

https://github.com/layer5io/layer5/issues/191
Issue – Enhance landscape categories section wrapping (#191)

Identifying a solution

To address this issue, I came up with the idea of realigning the category list items horizontally, transforming the poorly-behaving columns of category ‘cards’ into rows in a responsive and easily-scalable vertical stack.

Implementating this idea proved quite simple, requiring only a few added CSS rules, which I first accomplished by tinkering with the live webpage’s styling (with the help of the Stylish browser extension):

.card .card-content li {
  float: right;
  width: 200px;
}
.card .card-content {
  border-right: unset;
  padding: 0 0 5px 0;
}
.card .card-content:not(:last-child) {
  border-bottom-width: 1px;
  border-bottom-style: dashed;
  border-bottom-color: var(--main-dark-grey);
}

The vertical stack is implemented by the rules in the first selector: list items are floated right and assigned a fixed width, which aligns them neatly. The dashed borders and padding used to separate category lists was also adjusted to accomodate the new design (pictured below):

https://github.com/layer5io/layer5/issues/191#issuecomment-537304508

The above image is one of the two mockups of the redesign that I produced for the consideration of the project’s developers. As luck would have it, Layer5 project lead Lee Calcote provided a lightning-quick response, welcoming a pull request to it!

https://github.com/layer5io/layer5/issues/191#issuecomment-537310179

Future research area: Materialize CSS

I discovered that the ‘cards’ comprising the category section are styled using Materialize CSS. I considered using this framework in my solution, but ultimately decided to opt for a simple, intuitive solution. This framework appears interesting, and would definitely merits research were this a more-involved styling task.

Implementing the solution

While using my browser’s developer tools to tinker with styling, I discovered an inline style tag that serviced the categories section. I determined that this tag would present the best place to add the styling rules that I wrote (following the coding style of a prior contributor).

Finding the location of this style tag (i.e. of the “Service Mesh Landscape” page) in the source code was a lot more trouble than I thought it would be. After paging through too many HTML documents, I gave in and used Visual Studio’s global search functionality to locate it.

Testing the solution

Although I knew that my styling worked well when loaded from a browser extension, before I could contribute code, I needed to ensure that the styling worked equally-well when loaded inline from an HTML document. Little did I know, at that time, what I would be getting myself into…

Ruby, Gems and Jekyll? rvm, bundle and make?

Picking through my ~/.bash_history file, here is the sequence of Bash shell commands that I issued (via WSL Ubuntu) in order to execute a local copy of the layer5 website (annotated for your convenience):

## Install dependency packages ##
sudo apt-get install build-essential
sudo apt-get install software-properties-common

## Install specific version of Ruby via Ruby Version Manager ## 
sudo apt-add-repository -y ppa:rael-gc/rvm
sudo apt-get update
sudo apt-get install rvm
rvm install "ruby-2.6.3" # install specific version of Ruby specified in Layer5's Gemfile
                         # (Yes, it must be that exact version.)

## Configure RubyGems ##
echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

## Install Jekyll and dependencies ## 
gem install jekyll bundler
bundle install           # install dependencies listed in Gemfile

## Execute project! ## 
make site                # references Layer5's Makefile
                         # alias for "bundle exec jekyll serve --drafts --livereload"

Stray thoughts on documentation

Reflecting back on the process, a question has stuck with me: how much should projects hold the hands of novice contributors? Setting up the means to run make site is not included within Layer5’s CONTRIBUTING.md file. As such, for the most novice of contributors, like myself (who have never even heard of make before), setting up the prerequisite development environment presented a lengthy and piecemeal (albeit ultimately valuable) learning experience.

How much documentation is too little? Too much? How high should the bar be set for contribution? I suppose it is up to the project’s community to decide upon the answers to these questions themselves (and write documentation, accordingly).

Creating a pull request

After successfully testing and fixing the styling on my local fork, I created a pull request:

https://github.com/layer5io/layer5/pull/192
Pull request – Restyle landscape categories (#192)

…and it got merged! First Hacktoberfest contribution, completed!

Up next!

I ended my last post by stating that I have yet to gain any experience with makefiles. Well, thanks to my work on Layer5, that is no longer true: I have since used a makefile (to launch a Jekyll executable)! This experience will undoubtedly save me some time with resolving the Comcast issue I found! However, the next Hacktoberfest issue I resolve will be the first one I blogged about.

Stay tuned!

Planning for #Hacktoberfest 2019

With Hacktoberfest 2019 almost upon us, I wanted to share some insight into my own approach to preparing for this month-long open source community event (and encourage others to join me!)

“What do I want to get out of Hacktoberfest?”

I asked myself this question to start my preparations — what accomplishments do I want to end October with? After some thought, I came up with two answers:

Goal: contribute to ‘close-to-home’ projects

I have determined that I am interested in contributing to projects that personally matter to me. More specifically, I would like to contribute to projects that:

  • affect the software that I use,
  • are relevant to the Toronto open source community, or
  • are being developed by one of my peers at Seneca College

I really like the idea of being contributing to software that I use daily. I also value the connections that I have to projects being developed by my peer group as well as the greater tech scene in my city, and would like to use Hacktoberfest as an opportunity to deepen and strengthen those connections.

Goal: progressively challenge myself

On top of contributing to projects that matter to me, I have decided that I want to use Hacktoberfest as an opportunity to build up to tackling issues that are more difficult than the ones that I am currently accustomed to handling.

Many GitHub project owners open to contributions from newer members of the open source community (e.g. new Hacktober entrants) make use of GitHub’s labeling system to advertise issues that can be handled by novice programmers. These labels include “good first issue” and “hacktoberfest“.

In order to progressively challenge myself during Hacktoberfest, I plan to ensure that the latter half of the issues that I work on do not include either of the two aforementioned labels (or similar indicators).

As an alternative challenge, I like the idea of resolving an issue within a (currently-active) project that has since been abandoned by its initial assignee. Locating and identifying such issues is a challenge in and of itself, and I will have to be tread very carefully to ensure that I don’t step on anyone’s toes.

In summary

To summarize my goal setting methodology: after asking myself what I value about open source, I reframed the answers that I came up with as goals. To remain flexible, I supplied each goal with more than one way to achieve them.


H(a)unting GitHub projects and issues

In order to hunt down GitHub projects and issues worth haunting during Hacktoberfest, I have made good use of GitHub’s search tools on top of some old-fashioned brainstorming.

“Close-to-home” projects

After compiling a list of applications that I regularly make use of (mostly those that have earned a spot on my laptop’s task bar or system tray), I picked out a few apps that are (at least partially) developed as open source projects on GitHub (and which accept pull requests):


Regarding Toronto-based projects: I’ve stumbled upon a GitHub account run by the City of Toronto’s Big Data Innovation Team (BDIT) that hosts a number of active open source projects. While these projects (such as the Traffic Internal Dashboard) appear open to outside contribution some communication would be required on my part before I could assist the small and busy development team.


Regarding projects led by my peers: I am currently looking into connecting with students creating project in conjunction with Seneca’s Centre for Development of Open Technology (CDOT) and its Open Source Technology for Emerging Platform (OSTEP) project. I hope to be able to contribute toward a fellow student on their open source project during Hacktoberfest!

Building a progressive challenge

Several of the projects I’ve listed use the “good first issue” label: VS Code, Node, React and Angular. As these types of issues are highly sought after (apart from those concerning docs, it seems), securing one may prove much more difficult than actually resolving it. Regardless, I do want to try to find and secure such an issue as my first, and I’ve found a few resources that may help me do so:

Getting started

Using the above resources, coupled with GitHub’s search functionalities, I’ve found a nice ‘good first issue’, which I’ve asked to take over:

This issue involves adding filtering functionalities to database-populated tables. Although this issue was previously worked on, it has recently been relabelled, which indiates to me that it is up for grabs, and I have now also received a go-ahead from one of the project’s devs.

While investigate, I discovered a display bug, which will comprise my second Hacktoberfest issue:

As for a third, more challenging issue, I’ve found one (in a Comcast project named RestfulHttpsProxy):

I’m familiar with RESTful APIs, but have yet to gain any experience in the Go programming language (nor with dockerfiles or makefiles)! As such, resolving this issue would definitely prove a good challenge for me!

Wish me luck!