Mastodon for iOS. Year One.

I've worked on Mastodon for iOS for over one year now. What happened during that year? What did I do? Time to look back!

A handdrawn picture. It shows a smartphone on the left, a laptop computer on the right and a blurry Mastodon-logo in the background.

After being employed as an iOS developer for six years or so, I decided in April 2022: I'd like to go freelance. I wanted to figure out, whether it's my thing. Give it a try. I told my boss, handed in my notice and went freelance in October 2022. In retrospect: It's been the right decision so far.

Fast forward to that October 2022. We went dancing to a club on a saturday evening. While being there, someone on the Internet pointed me to a post:

Looking for developers to work in tandem with our UX designers on our open-source iOS app on a contract basis. Please reach out to hello@joinmastodon.org if you're interested. — @Gargron

The next day, I remember it being a sunny and warm sunday, I sat in a park with a slight hangover. I thought: "There's nothing to loose" and applied for the job. After more communication back and forth, I was part of the team. I received the final email after a birthday lunch with a dear person (we went to an Indian restaurant on that day) and I considered this is an opportunity far too good to not give it a try. So yeah, this is how it all started. Nearly one year ago.


Mastodon is a German non-profit and relies on your donations and sponsorships to make the Internet become a better, friendlier place in this capitalist world and, speaking of capitalism, to pay people (like me) and bills (like mine). We're round about ten people working on Mastodon and its apps and we're grateful for all the support you've given us so far. I highly encourage you to continue!


Working on Mastodon for iOS isn't a full time position although it could be. During the last year, it wasn't the sole project I worked on. On average, I work around 40 hours per month on that app. This varies between one hour (like in August, when development was on hold due to financial struggles) and around 60. At the moment, this fits my life extremely well, as I have other things to deal with, but I'm always open to other gigs.

If you need an iOS developer based in Germany, let's have a chat! Feel free to head over to my German CV to find, well, my German CV and contact details. An English version is in the making and will be available in a few weeks from now. I still need to factor in some feedback, but I prefer procrastinating by writing blogposts and toots.

On Mastodon for iOS

Mastodon for iOS started a collaboration between different people: Back then, engineers from Sujitech teamed up with the folks from Lickabilty, who do UI/UX, and Eugen, well, who is responsible for Mastodon, to develop an official Mastodon-app. Sujitech already had exerience writing a Twitter-client called TwidereX (not to be confused with Twitter-X)  but for Mastodon, they started from scratch again. In September 2021, Mastodon for iOS hit the App Store. The original developers are no longer involved in development, while Lickability still handles UI/UX.

The app itself uses different technologies, but it's a native iOS-app. Due to that, it sometimes feels like an overengineered playground for new technologies or experiments. Dependencies are managed with Swift Package Manager and Cocoapods although we're in the midst of shifting to SPM only. Currently, we use Cocoapods only for swiftgen and Sourcery. The UI-code is a mix of SwiftUI and UIKit, two different ways to build user interfaces on iOS. For persistence, we still use Core Data. But as this is by far our number 1-source for crashes, we're working on replacing Core Data with a leaner, more robust approach. I feel really sorry for all the crashes you experience, it will get better eventually.

Development and bug tracking happens on Github, while some features are managed in Linear, which is also the source for the public roadmap. We (usually!) use pull requests on Github with the unwritten rule that the other person needs to review and approve the code. To ship the app to Testflight (we use Testflight for beta-testing) and finally to the App Store (we use the App Store for tests on production), we use Github Actions and fastlane. Whenever a PR gets merged into develop, a new release hits Testflight. When we feel ready, we check the specific milestone in Github to write our famous release notes (by hand) and send one build to the App Store-review. After being approved, we publish a new release on Github.

There's a Discord-chat for communication, and until a few months ago, we had a weekly call every monday with the entire team.

At the moment, it's two iOS-engineers working on the app, fixing bugs, developing new features: Shortly after I joined, Marcus came on board — and he's been a great developer and fun to work with  🚀 He's another freelance iOS engineer living in Berlin, but we've never met in person 😅 So, in case you need a very experienced iOS developer: He's your guy, go talk to him!

Last, but not least, there are numerous volunteers working on the code, improving bits and pieces here and there. Thank you so much for helping Mastodon a better app!

What I did achieved in Year One.

The first thing I did, after being granted access to the Github-repository, was diving into source code. Until a few days earlier, I wasn't even aware, that there's an official Mastodon-app! Since I joined Mastodon as a user in 2017, I've used Toot! — and will continue to do so. Well, next to the other four or five apps, one of them being, of course, the current beta of Mastodon for iOS.

Working with the entire world watching you write code was a bit frightening at first, but after a few days, I thought "Screw it, you know how to build apps". I remember that moment: I was sitting in a hotel in Mannheim (Germany) as my travel plans spontaneously changed due to Covid. Instead of visiting my best friend (who caught Covid) in Switzerland, I sat there in that very hotel at a desk and reworked the Onboarding-process for the first time.

To highlight some things I did and worked on during Year One:

  • Shipped 15 releases to the App Store and wrote 15 release rotes that hopefully made people smile, which made me smile in return. ChatGPT helps with translations from English to German, French, Spanish, Catalan, (Simplified) Chinese, Japanese and Italian.
  • Added an option to Show/Hide reblogs (This was my very first task!)
  • Improved the Onboarding (sitting in a hotel in Mannheim) and Login.
  • Changed the required iOS-version from iOS 14 to iOS 16 (okay, first from 14 to 15 and recently from 15 to 16).
  • Added Post-Editing/Edit-History.
  • Added the Hashtag-Widget. Marcus added the first few widgets, so for me, it was more of a copy, paste and change some details.
  • Updated the Welcome-screen. I'd like to say a few more words on this one, as this lead to some discussions — and even a blogpost! We were in a bit of rush, as SpaceX Karen fought Substack and we wanted to use this window of opportunity for a new release with an improved onboarding-experience.
    It was around the Easter-holidays, Marcus took a few days off. I, not having a family, spent those days working, when I was asked, how comfortable I was merging my own PR. After talking and thinking a bit about it, well, I merged my own code, which later lead to impression, that we wanted to have all new users on mastodon.social.
    Truth is: You want your onboarding for new users to be as smooth and frictionless as possible. If you'd explained them the Fediverse with its decentralized nature first and have them pick a server, well: Not as smooth and frictionless as possible.
    We're just some folks trying to make the entrance into Mastodon — and the Fediverse — as smooth and easy as possible. No bad intentions, especially not to sell a non-profit organization, nor to get as many people as possible to one server in a decentralized world. Just some people without a clue (but lots of skills, knowledge and opinions!) trying to make a better onboarding in the open. So, yeah, SpaceX Karen ruined my holidays and I was a bit surprised by the backlash this caused. Later, we added an option to randomly pick the default-server from a list but I haven't had the guts yet to just close #1023.
  • Better UI/UX for suggestions for new users.
  • Added Greek + Belarusian localizations. We manage translations on Crowdin and use a custom script to build Localizable.string-files (also: Thanks to all the people contributing to translations!)
  • Improved the Search-Screen. This went hand in hand with the release of Mastodon 4.2, which improved search.
  • Started to overhaul the Settings-screen and added Server Details to Settings. Both will be part of the next release.
  • Plenty of Improvements and Bug Fixes.
  • Code Reviews, triage and cleanups, you know: The usual, important chores, nobody talks about.

What next?

Right now, our main focus is to improve the app performance and stability. Replacing Core Data is a bit of a task, as this basically means replacing the basement of a building with people in the building. So we better do it slow and careful, piece by piece by piece by piece by...

A little side task is to enhance and enrich the new Settings-part of the app. Further down the road(map) are pinned posts, lists and UI-updates to profile, so yeah, plenty of stuff that needs to be dealt with. And then there're still those bugs waiting to be fixed.

In conclusion: It's been an amazing year and I'm very grateful for that opportunity. I've learned lots of stuff, met some friendly people and am really looking forward to the next year.

Thank you for reading!