Today's millennials are offended by almost anything. Let them choose which images to hide when they are surfing online, straight from their Chrome browser.

What it does

Images rendered on a web page are uploaded to the Microsoft Cognitive Services Computer Vision API to determine the features within them and if a feature matches with a user-defined filter then the image will not be displayed, either by blurring the image, replacing it with another image or hiding it completely.

How we built it

The backend API is implemented in Go and is distributed across multiple nodes using Nginx proxy, which load balances all the requests. All the nodes use a separate key to increase the number of requests made to Cognitive Services per second. These requests are cached using Redis for much faster future lookups. The Chrome extension is coded in vanilla JS and runs on every webpage served by the browser.

Challenges we ran into

The API is rate limited to 20 requests per minute so we had to run multiple nodes with distinct API keys to reduce the likelihood of exceeding our rate limit. The choice of not using an established web development framework such as React slowed down development of the front end extension. We were working with only three and a half laptops as Kian's charger broke and Paul's GPU kept "falling off the bus" however through pair programming we were undeterred.

Accomplishments that we're proud of

Building a highly accurate content moderator that uses modern technologies to ensure our extension works quickly and the server can handle filtering a page containing many images. The team overcame technical difficulties and pulled our resources together to produce a product that we are confident has genuine real-life use.

What we learned

How to work around upstream limitations such as the MS API rate limit and for several group members this was the first time using Go as an alternative to node for a backend server.

What's next for SafeSpace

Facial Recognition to identify individuals who should be blocked and predictive blocking based upon what a user has already blocked.

Share this project: