Gorgeous details, and see who can reply, or detect sentiments
Compose tweets with a variety of media, polls, set who can reply, and add drawings, etc
Share tweets as images, and change up what's included in the previews
Powerful tweet filters, including users, keywords, hashtags, regex, clients, media, retweets, quotes, likes, negative and sensitive tweets
See breaking news, trending topics, and switch tabs quickly
Powerful tweet actions and context menus
Add drawings to tweets and translate composed tweets on the fly
Switch up how the app looks and feels with a variety of powerful settings options
Multi or single column layouts on iPad (and Mac) to see everything at a glance
This app was inspired by seeing other great third-party apps over the past decade or so growing up and wanting to build my own that excels in its set of features and design/usability. It was also fuelled by my desire to make something amazing for everyone to use, and become their go-to app throughout the day. It may seem over-ambitious attempting to create an app that uses all the available Twitter endpoints, and provides extensive functionality to use Twitter and its services without having to leave Aviary, but I wanted to make something that I can be proud of, and I think I've achieved that. If I was going to make a Twitter app, I was going to make the best one I could.
What it does
Browse Twitter without the distractions of promoted tweets or ads. Use filters to hide tweets using keywords, thresholds, regular expressions, and sentiment analysis. Tweak app icons, tints, gestures, tweet appearances, and more with the extensive list of settings options.
Quickly view lists, switch custom tabs, change accounts, respond to tweets, share content, and more. Siri Shortcuts, Action Extensions, iMessage Stickers, and Widgets means that the fun doesn’t stop when you leave the app.
- Browse Twitter in chronological order without the distractions of promoted tweets or ads
- Beautiful iOS-centric UI
- Share tweets as images (with fine-tuning to toggle on-screen elements and backgrounds)
- Picture-in-Picture to pin specific tweets to your screen
- Threader Mode to automatically chain long tweets (with custom separators)
- Undo tweets (within a custom duration)
- Compose tweets with media, GIFs, polls, drawings, and more
- Powerful tweet filters (words, hashtags, users, apps and clients, media, quoted content, retweets, tweets above or below certain thresholds, regular expressions, sentiment analysis, and more)
- View tweets and media in AR
- Save any timeline videos
- Widgets to display timeline feeds and latest tweets on your Home Screen
- Multiple scrollable columns on iPad (or single column if preferred)
Other exciting features:
- Context menus across the app to quickly perform actions
- Hashflags support
- View and attach polls when composing tweets
- Pinned tweets
- List creation and browsing support
- Trends and search support
- Extensive profile actions, including adding private notes
- View the relationship between any two users (follow, block, and message status)
- View and set who can reply to tweets
- Intuitive gestures (long-press tweets and tab bar items, pinch the screen to change themes, scrub videos, and more)
- Sentiment analysis when tweeting to add extra caution
- Sentiment analysis to determine the emotion of tweets
- Text and image text translations
- Image description alt text support
- Hide replies
- Siri Shortcuts to tweet
- Biometric app lock
- Pin users to your profile
- Translate tweets when composing them
- Switch between large/small media in timelines
- Autoplaying timeline videos
- Smart rotation lock
- Drag and Drop tweet and media support
- Extensive keyboard shortcuts
- Option to hide navigation bars when scrolling
- Custom compose button placement
- Custom app icons and themes to tweak the app to your liking
- Dark mode and high-contrast backgrounds
- Watch app to browse and post tweets
- Action and Safari Extensions to open Twitter links in the app
- Accessibility labels, dynamic font sizing, and VoiceOver support
- iMessage Stickers
- iCloud sync
- Push notifications
How I built it
I used the Swift programming language for Apple platforms coupled with Xcode on a MacBook Pro to create this app for iOS, iPadOS, watchOS, and macOS platforms. It's a universal app so it works across all of them with one download (but it's carefully crafted to be optimised for every screen size and orientation to make it feel the part on each specific device).
I closely adhered to both the Apple-provided Human Interface Guidelines and Twitter-provided Developer API documentation to see what was possible, what the best practices were, and what I believed I could achieve with my app. I experimented with APIs where applicable and played around with them to get them working as soon as I could, and then iteratively built upon them to enhance their abilities and build something that elevates the experience further.
Challenges I ran into
Along the way, I ran into various challenges, from trying to juggle both the V1 and V2 Twitter APIs alongside each other for timelines and other endpoints when some features hadn't yet made their way across to V2, to finding a way to layout the app that made sense and was easily usable by users of all capabilities and abilities.
I had initially built two models, one for V1, and one for V2 endpoints. This required ensuring that the correct parts of the app were decoded using the correct models, and data was transferred correctly between the two where needed (from home timelines to tweet details, and checking that some abilities were possible to do on the tweets in question such as hiding their replies, viewing polls, etc). This was made much easier once I switched to V2 for most APIs.
Sentiment analysis was also not 100% reliable, and could often give unexpected results, especially if only a few characters or words were composed. And so, I added in minimum character checks and disclaimer text to go around this issue. These features can also be disabled via the settings section of the app to not provide misinformation.
I also considered using filtered streams for some of the filter features, but opted for just manually filtering the timeline myself after receiving the data one time. This was mainly due to not wanting to run out of API calls and use up the monthly tweet cap quota. This issue was one that popped up a few times, but ultimately I resolved it by setting the maximum amount of tweets fetched per API call to the minimum amount required (which still seemed generous).
Accomplishments that I'm proud of
Building an entire feature-rich Twitter client app from the ground up in a few months as a solo independent developer is something I'm proud of for sure. But more specifically, I'm proud of various exciting features that the app offers:
- Sentiment analysis to see whether tweets are positive or negative
- See negative sentiments when composing tweets to see whether the tweet you're composing is contributing positively to the discourse (with a. subtle suggestion to reconsider the tweet if it's negative)
- Extensive filter abilities (users, keywords, hashtags, regex, clients, media, retweets, quotes, likes, thresholds, negative tweets via sentiment analysis, and possibly sensitive tweets)
- All the new V2 APIs included which I don't believe other apps have got round to adding yet (see and set who can reply to tweets, polls, view tweet details including quotes, hide replies, etc)
- Reminders to add image description alt text when composing tweets
- Autofill abilities to fill out image description alt text from text found within images
- Decipher text within any images and translate them (great for accessibility)
- Threader mode to automatically create threads and chain tweets when composing them (along with the ability to set how they're split and threaded)
- Undo tweets (with specific delay timer options)
- Sharing tweets as images (with the ability to toggle various on-screen elements)
- View tweets and media in augmented reality in the real world
- Translate tweets immediately from anywhere to see what's being said
- Translate composer tweets immediately to reply to someone in a different language and remain a part of the conversation
What I learned
I learned that Twitter is enormous in its set of offerings, and there's a lot of work and thought gone into all the APIs behind it. Trying to mirror this by making my own client app proved that many considerations have to be undertaken when building something that is to be placed in the hands of thousands/millions of users. Sentiment analysis also needed to be paired with a disclaimer suggesting that they aren't always accurate, which prevents disgruntled users from reaching out about misinformation. Improving the health and safety of the platform is a mammoth task, and it involves many smaller processes. Some of these are disclaimers where applicable, others are offering guidance with suggestions, and also filtering out negative and harmful tweets from timelines. Offering tools to do this is the correct step forwards, and offering options to tweak the intensity is a great way to onboard users and transition them to getting used to it (adding alt text to images for example).
I also learned that it's possible to make a fully feature-rich Twitter client app from the ground up within a few months of programming as a solo independent developer, albeit incredibly hard and demanding to do so. Also, users will reward you for listening to their requests, feedback, and bug reports (gathered along the way in TestFlight beta testing) with support and kindness.
What's next for Aviary
I plan to incorporate all the latest and greatest new Twitter endpoints as and when they get released over the coming months and years to stay up to date and at the forefront of any competition I may face. And who knows, maybe one day Aviary could get acquired by Twitter too. That would be incredible, as I imagine it to fit in and align well with the feature-set and goals that Twitter are striving towards themselves.
To use the app, first redeem a promo codes from the App Store. Head over to the iOS App Store and select your profile icon in the top-right, and then select 'Redeem Gift Card or Code', after which you can enter one of the following codes where it says 'Enter code' (I have provided 10 here, but please get in touch if they don't work):
P3AXNKTNPMN6 PRNXF4RWE77A NTT7HYF3EJTF R7EPPP9ALNFE 7XWHE7R9N6HW RNKYL4WAXHHM NE7X9RTXJM3T EXHK9LW3L66M 4YHYLJNY6P7A H64N9Y9EA7E7
The app can be downloaded from the App Store, and then select 'Already Purchased?' after signing in to Twitter and being faced with the in-app purchase screen (this uses the previously entered promo code).
You can long-press any of the tab bar items and swipe up to switch to a different tab. Filters are also available here. You can select the top-right compose icon to compose a new tweets, and select any of the toolbar options (to set who can reply too). Tap images after attaching them in the composer for the option to add image description alt text too. You can also drag the compose button to a different place on-screen if desired. When tapping to view tweet details, it will display who can reply, and you can tap the top-right icon to do emotion sentiment analysis. You can also translate any tweet via a long-press, and via the ••• button within the composer section to translate tweets. You can also long-press images to translate them if they contain any text.
The GitHub project needs the bundle identifier changed to make it work if it's going to be deployed from your end. And every instance of consumerKey and consumerSecret would need to be changed (use the search inspector in Xcode to change this).