Canary - The Incognito Mode of Twitter

Canary is an application that was built by our team for the Chirp Developer Challenge Hackathon. Our team consisted of 3 developers and 1 UI/UX designer. This application was built from scratch within 30 days and it aims to provide users with a hyper-personalized Twitter experience without the need for an account and with zero tracking.

Link to the project repository - https://github.com/PLG-Works/canary

Try it out! You can download the app here.

Features

  • Personalize your tweet feed from all your favorite topics.
  • Stay up-to-date with tweets from your favorite users with the help of Lists.
  • Revisit your favorite tweets and organize them however you want with Archives.
  • Discover trending topics from all over the world.
  • Access threads to learn more about any tweet.
  • Search by keywords, mentions, usernames, hashtags, etc.
  • Filter search results by popularity or recency.
  • Support for playing videos, viewing images, and playing GIFs.
  • Share tweets with your social circles.

All of these features without sharing your data or getting tracked by anyone -- Not even us.

Inspiration

When we started with the hackathon project couple of weeks ago, we were still exploring the possibilities for how to utilize the Twitter APIs. We wanted to focus more on content discoverability or an app that focuses on user privacy. While browsing the Twitter platform and some 3rd-party apps for inspiration, we noticed that none of them allowed browsing of content without signing up, while you could go to specific accounts via URL and browse without an issue. We finally decided on expanding this feature into a full-fledged app while keeping user privacy in mind — which is what Canary aims to be!

What it does

Canary is a privacy-focused app that lets users discover personalized public content without needing an account. The user can browse the home feed based on their preferences, search for specific topics, stay up to date with their favorite users, and archive tweets into multiple groups for the future.

Users can discover trending topics all around the world by choosing any country from a list of countries. The user can also opt to browse the most popular or most recent tweets on the topics or user accounts from the search results.

To make the app's content more relevant, we have reverse-engineered and implemented Twitter's Lists feature. In addition, we have improved Twitter's Bookmarks feature by enabling users to create multiple archives with custom names that will store tweets. So, while browsing through the Canary app, the user can add any of their favorite tweets to any archive.

Users can view media like GIFs, images and videos right in the applications and also share tweets among their social circles. Moreover, we offer a choice that redirects the user to Twitter to allow them to interact with tweets.

How we built it

We built our app on the React Native framework, which enables us to have a common code base and deploy the application on Android and iOS platforms simultaneously.

The app primarily uses the search/recent API to create the timeline. The preferences selected by the user are passed in the request query as contexts. To get the trending topics worldwide, we used the trends/place.json API with id as the WOEIDs from the list of locations received from the trends/available.json API. For search results, we get user account tweets by using the from operator in the query. Similarly, we use the @ and the # for mentions and hashtags search. We have also provided an option to switch between popular and new tweets in the search results. We achieve this by using the relevancy value in the sort_order property for getting the popular tweets and the recency value for getting the newest tweets.

For lists, we maintain an array of user accounts that have been added to the list by our users. This array is stored locally on the device. We use the search/recent API with a query formed with the from operator to get the tweets from the stored user accounts. In addition, we offer a user search, where we use the users/search.json API for getting a list of users who can be added to the list.

Archives have a similar implementation to lists, where an array of tweet IDs is stored locally and they are requested using the /tweets API with the ids property.

More details regarding the application can be found in our Github repository.

Challenges we ran into

Creating the timeline was especially difficult because we could not use the timeline API as it needs a Twitter account. So, we found a workaround and decided to use the search/recent API and tune it according to the user's needs by passing contexts in the API request. This fetched us the paginated list of tweets that we wanted but was only getting the recent tweets, which either did not have much interaction associated with them or were mostly spam or junk tweets. To overcome this challenge, we decided to pass the relevancy value in the sort_order property in the query. This fetched tweets with some interactions with them, and the feed looked significantly better. We decided to go one step further into improving the quality of the feed by providing the user with the option to get tweets only by verified users. This provides the user with very good quality tweets with almost none of the spam.

The next problem we faced was that since we filtered the request so much, we were getting only 2-3 pages of tweets as a result. To tackle this issue, we implemented API switching, wherein, if the user has opted for verified user tweets, they will first see those tweets with sort order as ‘relevancy’. Once the response pages are over, we hit the API with sort order as ‘recency’. After this response data is over, we start showing relevant tweets from all users, and after that ends, we show tweets from all users without the context filters. This ensures that there is almost a never-ending list of tweets on the user’s timeline.

Accomplishments that we're proud of

  • Allowing users to discover content while maintaining their privacy by not asking them to create an account, requesting device permissions, and storing the data only on the device.
  • Replicating the List feature offered by Twitter without using the /lists API.
  • Providing a quality timeline to the user according to their preferences.
  • Building the entire application without the need for a backend server.

What we learned

  • Using the Twitter API endpoints in many different ways to best suit our use case.
  • Creating complex components and storing data locally in React Native.

What's next for Canary

  • Exporting existing lists from Twitter and letting users save them in Canary
  • Creating and restoring backups
  • Sharing of Lists and Archives amongst social circles
  • Support for dark mode

We continue developing Canary and aim to add several more user-friendly features and release the app publically soon. So stay tuned for the updates!

Mohit Charkha

Mohit Charkha

Mobile Application Developer at PLG works
Pune, India
Vinay Harwani

Vinay Harwani

Hi, I am Vinay. I am a software engineer particularly interested in mobile application and backend development.
Pune, India
Harsh Siriah

Harsh Siriah

Hi, I'm Harsh! A geek with a love for dogs & mobiles.
Pune, India