Issue #100 - Quentin Zervaas and Riley Testut
Happy Wednesday, everyone!
We made it to Issue #100! Thank you to everyone who read last week’s issue ❤️
We have the Two Year Anniversary coming up next month so I’ll probably gush more about my feelings in that issue about all the good feels Indie Dev Monday has brought me but… I also want to celebrate making it to the 100th issue 😅 This feels like such a huge win for me. I’m terrible at doing things consistently. I get sidetracked and start a lot of new projects but this one has been different. It’s something I’m always excited to come back to on Sunday evening.
Writing Indie Dev Monday is always a perfect start to my week. It brings me motiviaton and inspiration seeing what other indie developers have created. I take that motivation and inspiration and try to apply it to whatever I’m working on that week. Everyone one of the indie devs I’ve interviewed in this 100 issues has positively effected my life and made me better in some way. I’m so grateful for everyone that has been involved in Indie Dev Monday 🥰
I think that is all for me! Please continue on to read about two more awesome indie devs that inspire me 🙂
Deep Dish Swift is the best pizza themed iOS and Swift conference being held in Chicago May 5th to May 7th in 2024. The conference brings togethe Swift and iOS developers of all experience levels and backgrounds in an inclusive environment to share knowledge and experience from a diverse set of speakers. There are talks and a live podcast recording specific for indie development and also two full days of Swift and iOS talks!
Today’s Spotlighted Indie Devs
📆 Today I’m featuring Quentin Zervaas and Riley Testut.
I am notoriously bad at using to do lists. Especially ones for daily tasks. To do lists and notifications overwhelm me but Streaks and Streaks Workout have both been on my phone and working pretty well for me for years 😇 I still sometimes slip up but Streaks’ delightful interactions always keep me coming back! I can easily keep track of water intake, walks, and healthy habits on my phone and watch. Streaks Workouts makes exercising at home fun and easy to do. It helps me reform my workout habit and routines and makes me excited to workout!
I highly recommend checking out Streaks and Streaks Workout if you do not already have them on your phone 💪
I am such a huge fan of Riley and all the work that he has put into Delta and AltStore. Delta and AltStore cover a lot of the things I love. I love classic video games, I love open sourced projects, and I love solving code signing problems 😛 Even though I love all of these, I don’t know if I’d be able to make what Riley has made. Delta and AltStore are very high quality apps that I can’t imagine not using. I highly recommend following the work the Riley does and checkout out Delta and AltStore if you are into playing class video games 🙌
👉 Please make sure to follow them or support them anyway you can! 😇 I’m excited to share their indie dev stories.
Indie Devs
Quentin Zervaas
Q&A
1) What is your name? Where do you live?
- Quentin Zervaas
- Adelaide, Australia
2) Introduce yourself. Education? Background? Main job? Interests outside of tech? Interests inside of tech?
I’m an indie app developer from Adelaide, Australia. Developing my apps Streaks and Streaks Workout is my main job.
I got my degree in Computer Science in 2001 and have been developing software ever since. Web development for a long time, then iPhone development now for even longer.
Outside of tech I play the guitar, watch NBA and Formula 1, and I have two little kids that pretty much take up all of my time.
3) Have you ever considered yourself an indie developer?
Definitely! I’ve been building apps on iOS since about 2009, and working full time on my own apps since about 2016. In-between then I made a number of apps both for myself and other organisations - each of varying levels of success.
Even though now I mainly work on Streaks and Streaks Workout, before then I worked on public transport apps (before Google and Apple Maps offered that data), then built a game with my sometimes-collaborator Isaac Forman. It’s called Hexiled, and it’s a space-themed word game where you try to “escape” from a big hexagon before time runs out. It’s actually super addictive, but unfortunately didn’t reach the levels of success we were hoping (you can still download it - hexiledgame.com)
4) What got you started/interested in creating your own applications outside of your “normal” job?
I got started working for myself in about 2004, when the company I was working as a web developer for shut down.
Obviously the iPhone was huge when it came out, and I was super interested in building apps for it. Originally, the reference everybody used was the Stanford iPhone course, so I muddled my way through the material in that course and eventually it all clicked.
From there I starting building apps that I immediately tried to publish and monetise. I think the turning point for me though was attending WWDC in 2013. Being able to speak to Apple employees - engineers, developer relations, etc, was hugely beneficial. There’s still conversations from then I distinctly remember that really changed my thinking about how to build apps and that helped hone my skills.
And it was also great to meet a bunch of local (Aussie) developers (travel around the world in order to meet all the developers that live near me!)
5) How do you balance your time between friends/family, work, hobbies, and indie dev?
This is the constant struggle! I have two young children, so that’s been a huge adjustment, since their demands are pretty unrelenting and take precedence over pretty much anything else.
When it comes to development, I really try to focus on shipping, and not getting too bogged down or making excuses to not ship. So when balancing time, I often try to structure my development work in such a way that allows me to ship as quickly as possible. There’s obviously downsides to this though, so you have to balance this quality (bugs, polish, etc..).
6) Streaks - I’m such a big fan of Streaks! I’m so bad at doing anything consistently and especially if there is a lot of friction involved around tracking it. But Streaks just works for me! It’s the perfect amount of fun and easy to use. When did you get started working on Streaks? What problems were you facing and what were your initial goals for Streaks?
Me and another designer/developer, Isaac Forman, started building Streaks in March 2015. It was first released 1 June 2015.
There were two primary goals: firstly, I wanted to learn Swift. It was announced in June 2014, and so by March 2015 I already felt left behind on it! The second reason was that I had a bunch of things I needed to do every day - the list didn’t really change, I just need to get them done. I was tracking these in a text file, so figured there was a more interesting way to track this.
The initial prototypes look remarkably similar to where the app is now (minus some polish). One thing we stumbled across really early on was to not make the app a simple checkbox app. We wanted there to be a really satisfying feeling - or as Apple would put it - a “moment of delight” when completing your task.
So even in our very first prototype, you had to long press on a task to fill the circle and mark the task as complete. This act makes completing a task feel much more like an achievement.
The component in the app that manages this interaction, internally called “checkable task view”, is the single most complicated part of Streaks. Even to this day, we’ve been converting the Apple Watch app to SwiftUI and this component is what’s held us up.
There’s just so many edges cases to consider - multiple completions, timers, exceeding 100%, negative tasks, themes - there really is a lot to it.
7) Streaks - I might be a few years late saying this but… congrats on the 2016 Apple Design Award 🥳 That is a huge accomplishment! The design and interactions in Streaks are like no other. It’s so unique, clean, and such a delight to use. What was the process like in getting Streaks to have the design and interactions it has today? Did you go through a lot of iterations and customer feedback?
Thanks! Winning an Apple Design Award was (and still is!) hugely satisfying and humbling.
The app really does look extremely similar now to the first prototypes. We’ve put a strong focus on keeping the design consistent. There is a lot of functionality within the app, which is always a tough challenge. We call the buttons and actions on the main screen the “first class” actions, so there’s been a lot of discussion about which features get promoted to first class, and which ones are hidden behind a menu. This evolves based on pain points our users face and contact us about.
The other key thing the app does is limit the number of tasks you can create. The constraints we put on this is what really makes it work for habit forming.
Originally you could only create 6 tasks, since there’s such a diminishing return with todo lists as they grow longer. And the other great thing is that if you finished, say, 5 of your tasks, having just that last one left is super motivating.
We’ve evolved this part of the app - you can now create up to 24 tasks now (4 pages of 6 tasks), but the same concepts apply.
8) Streaks - Streaks has been around for quite a few years! What’s it been like adapting Streaks across all the new OS versions and platforms? Were there any platforms or OS versions that were particularly harder than others?
Streaks is now available on iPhone, iPad, Apple Watch and Mac. Each of these has had its own challenges, so it’s hard to say which was harder:
- For iPad we put a lot of focus on adapting sizing and layout
- On Apple Watch we put of a lot of focus and simple interactions, managing data state and cross-device communications
- On Mac the challenge has been trying to make it feel like a Mac app, while also trying to make it look and feel like Streaks. That is tough one, since much of the design was specific to how an iPhone looks and feels.
9) Streaks Workout - I’m so in love with this app! I’ve always been a fan of at home and bodyweight workouts but I’m not creative and then I get bored and then I stop working out 🙈 Streaks Workouts does an amazing job of motivating me by giving me exercises and keeping that streak. How did this app evolve from Streaks? Was this something that users were manually doing instead of Streaks or did this come from a personal need?
We actually released Streaks Workout in late 2015 - the same year as Streaks. In that year, tvOS was announced, so we wanted to bring Streaks to the new Apple TV. However, habit-forming isn’t really a type of app that lends itself to being on TV, so we decided that the “TV version” of Streaks would be a workout app.
From there we ported it to iPhone, then Apple Watch, then iPad. Both Streaks and Streaks Workout came out not long after Apple Watch, so they were a natural fit on there with the health and fitness tracking.
The original concept for Streaks Workout was called “Deck of Pain”, modelled after a workout where you use a deck of cards: the suit determines the exercise and the pip determines the rep count. The other popular type of workout app back then was “7 minute workout”, so Streaks Workout is a hybrid of these two workout models. It’s evolved massively over the years to a point now where you can create your own workouts and exercises (great for physiotherapy) - and we have a huge update coming out soon!
10) Streaks, Streaks Workout - I’m always curious what everyone’s favorite part of working on an app is. I like initial problem solving and launching but I’m so bad at design stuff. What has been your favorite part of Streaks and Workouts to work on?
As I’m sure it is for many other developers, WWDC is a really exciting time of the year. It feels like you’re gifted a whole bunch of new capabilities and you then need to figure out how best to use (or not use) them.
I also really like thinking about how the app is structured internally, so this year with the new Lock Screen shortcuts and App Intents, I’ve spent the past week since WWDC just thinking about how the app should be structured: what can be refactored into packages, what’s the migration path for existing users, and so on.
Thinking about App Intents, I think this is also why I really like developing on Apple Watch, and on Siri Shortcuts. They both force you to think of your app in terms of small single interactions, and how it all fits together overall in a cohesive package.
11) Streaks, Streaks Workout - What’s next?! Do you have any future features that you can share with us?
A ton of ideas for both apps - there’s updates coming out all the time. The backlog is so long now it’s really hard to decide what’s next. A lot of time is spent revisiting existing features and screens and trying to constantly add polish (“bug fixes and performance improvements”).
I’ve experimented with many other app ideas - some of them have features that ultimately get added to Streaks or Streaks Workout. There’s two prototypes I’ve been working on for about 5 years, but just can’t either of them to click right - so for now I stew on those! One thing that does really fit the model of what Streaks and Streaks Workout do is related to food tracking. I have a few unique ideas on this I’ve been exploring for a long time but just haven’t managed to put it all together just yet.
12) What’s been the hardest part of being an indie dev? What the most fun part of being an indie dev?
It’s often just the sheer workload - there’s always a million things to do, so you really have to prioritise. Do I fix this bug? Do I add this feature everybody’s asking for? Do I answer support emails?
This can sometimes be frustrating, as you can’t work on the things you really want to work on, but it can also be useful in figuring out which features to add - you can’t add everything, so which feature is the most important?
13) Is there anything else you’d like to tell the indie dev community about you?
Not about myself necessarily, but as an indie developer I wanted to point out how helpful the Apple-related news sites are in supporting indie devs. For example, Streaks has had a lot of great coverage over the years from MacStories.
14) Do you have any other indie devs that readers should follow / lookout for?
I try and speak with a lot of developers, but there’s a handful of other Aussie developers that I bounce ideas and questions off way too often: Russell Ivanovic (Pocket Casts), Marc Edwards (iStat Menus & Snowflake), David Walsh (AutoSleep & HeartWatch), and Zach Simone (Petty). Poor Zach gets all of my SwiftUI questions!
Riley Testut
Q&A
1) What is your name? Where do you live?
My name is Riley (Shane) Testut, and I’ve been living in LA for the past 8 years — but about to move to Dallas, TX next month!
2) Introduce yourself. Education? Background? Main job? Interests outside of tech? Interests inside of tech?
Hi y’all 👋 I’ve been developing iPhone apps since iOS 2, and since graduating from the University of Southern California in 2018 I’ve been lucky enough to turn that into my full time job. My first “serious” app was Camera Prime (released in 2010), which added a bunch of basic features Apple’s Camera app didn’t yet have (such as digital zoom, a grid, burst mode, etc.). Today though, I’m mostly known for making Delta, an all-in-one Nintendo emulator for iOS devices, and AltStore, an alternative app store that lets you sideload non-App Store apps (like Delta).
Perhaps unsurprisingly, my apps also happen to strongly align with my non-programming interests: filmmaking and playing video games! In high school I was part of my school’s film magnet, which meant a lot of my homework was just making short films with friends (and often “shot on iPhone”™). As for video games, I’ve been a huge Nintendo fan ever since my dad played Super Mario Bros. with me as a kid on his NES…and I ESPECIALLY loved the GBA Pokémon games.
Also, I’m very proud to be a kiwi 🇳🇿
3) Have you ever considered yourself an indie developer?
Exclusively!
4) What got you started/interested in creating your own applications outside of your “normal” job?
I got my first iPhone (the 3G) when I was still in junior high, and was blown away by everything I could do with it — especially all the third-party apps I could download! I was so inspired to learn how to build my own apps that one day I bought myself “Beginning iPhone Development: Exploring the iPhone SDK” by Jeff LaMarche and Dave Mark (there were no online resources back then 🙃), and slowly started going through the tutorials until I felt I was ready to start building my own app.
5) How do you balance your time between friends/family, work, hobbies, and indie dev?
Honestly, that’s something I’m still trying to figure out. I didn’t do a good job defining boundaries between my work and personal life for the first couple years running AltStore, and as the project grew my personal life ended up taking a backseat. I finally fully burned myself out last year, and my mental health suffered from feeling both overwhelmed (due to everything on my plate) and guilty for not being able to be productive.
The good news is I realized something needed to change, which is why I brought my best friend Shane Gill on board full time earlier this year to help me manage everything. Since Shane has come on board I’ve finally started feeling like myself again, and having someone to offload extra tasks onto makes it much easier to stop at the end of the work day because I don’t need to stress about getting everything done anymore!
6) Delta, AltStore - I don’t even know where to start! I’m a huge fan so I just wanted to say thank you for agreeing to be in this issue of Indie Dev Monday ☺️ I love the indie app developer life but you also hit another passion of mine… open source. Was maintaining two big open source projects ever in your life plans? What pros and cons have you experienced with open sourcing your apps?
I’m honored to be chosen! 😄 And no, not at all; when I first started iOS development the thought of making everything I do public — dumb mistakes and all — was really daunting to me, and I didn’t understand why anyone would “reveal their app secrets” to the world. Honestly, the primary reason I open sourced these apps in the first place was just to comply with the software licenses of my dependencies (emulator cores, codesigning library, etc.), but running these projects for the past few years has completely changed my mind about open source.
For AltStore in particular, open sourcing the app played a big role in building trust. AltStore literally asks you to hand over your Apple ID email address and password — probably one of the shadiest things an app could do! However, because people were able to inspect the code themselves and verify I wasn’t doing anything nefarious, they felt more comfortable providing that confidential information.
As for Delta, it’s been really fun to see people fork the project and prototype cool new features. For example, Ian Clawson’s fork of Delta adds a bunch of features I plan to add at some point (such as local multiplayer and AirPlay support), as well as several features I never thought to add like “rewind” support!
Thankfully, I haven’t noticed any real downsides to open sourcing my apps — so going forward I plan to make all my apps open source by default 🎉
7) Delta - I believe that Delta is what started your journey down your “side loading” (???) path. I don’t even know if side loading is the correct term for what AltStore does but… when did your love for classic video games and emulators start? Did Delta start off as a fun experiment or was it always your plan to create the best iOS emulator?
Technically, my sideloading journey began almost 10 years ago with the predecessor to Delta, GBA4iOS :)
In 2013 I came across the (outdated) GitHub repo for the then-popular jailbreak-only Game Boy Advance — aka my favorite game system growing up — emulator gpSPhone, and the thought of replaying Pokémon Emerald on my iPhone was WAY too good to pass up. Jailbreaking never really appealed to me, but since I was an iOS developer I could compile the project myself! Or at least I could in theory…but the codebase was somewhat outdated, and relied on a bunch of private APIs that couldn’t be used without jailbreaking. So I spent the next few months hacking away at the project, and eventually had a fully-working GBA emulator for non-jailbroken iPhones 🙌
After installing my hacked-together app — which I named “GBA4iOS” in the vein of other iPhone emulators at the time (nes4iphone, snes4iphone, etc.) — onto several friends’ phones, I wondered if there was some way I could distribute GBA4iOS to more people. Low and behold, I discovered a service that allowed anyone to install open-source iOS apps over-the-air (OTA) by signing them with an enterprise certificate, so on a whim I decided to promote that as the “official” way to install GBA4iOS. Unfortunately, Apple eventually revoked the enterprise certificate I was using to distribute it (and patched the subsequent “Date Trick” that allowed it to keep working by setting your iPhone’s date back), ending my brief but exciting time working on GBA4iOS.
Coincidentally, earlier that same year Apple announced Swift. Now that GBA4iOS was dead I was ready to start a brand new project, and what better way to learn an entirely new language than by using it to build an app from scratch? I brainstormed some ideas, and eventually settled on what I thought would be a fun pet project: rebuild GBA4iOS in Swift, but make it modular to support more systems and give me practice designing Swift framework APIs. To symbolize this modularity and the change from Objective-C to Swift — as well as to pay homage to GBA4iOS’ icon — I named this app Delta, and made my first commit in March 2015 🎉
8) Delta - App rejection is so tough. I get why there is a review process for the App Store but spending so much time building Delta to not be able to release it must have been heart breaking. Did you have any expectation this would happen? What were your initial reactions/plans after this happened?
Oh man…I just felt completely blindsided. Back when I still considered Delta a pet project, I actually met with the App Review team at WWDC 2015 and explicitly asked them if it would be possible to get Delta in the App Store somehow. To my surprise they said yes — as long as I made certain changes (primarily, limiting emulation to an allowlist of games that Apple could separately review with each app update to ensure they were “appropriate”).
This pre-approval convinced me to start treating Delta more seriously than a pet project, and I decided to spend almost all my free time working to finish it ASAP. So when a year later the same App Review person told me at WWDC 2016 he talked with his bosses and they told him “emulators aren’t allowed in the App Store, period,” I was extremely frustrated that I had wasted so much time building an app I could never release.
Eventually though, I had an epiphany: all my hard work didn’t HAVE to go to waste if I was able to find another way to distribute Delta…and thus AltStore was born :)
9) AltStore - I believe that AltStore was born from the need to find a good way to distribute/install Delta. How does AltStore work and how did you discover it? Did you have any other solutions that you were trying out?
The same WWDC that App Review originally told me Delta would be approved, Apple also announced Xcode 7 which allowed developers to install apps they’ve written themselves onto their personal devices without paying Apple $99/yr. This was intended to help students learn iOS/Swift development, but on a technical level it meant anyone with an Apple ID could now “sideload” open-source apps just by compiling them with Xcode.
That is essentially how AltStore works: whenever you sideload an app, AltStore uses your Apple ID and password to sign in to Apple’s Developer portal and perform the same steps Xcode does when “Automatic Provisioning” is enabled (e.g. register App IDs, generate provisioning profiles, etc.), before then re-signing the app with your own signing certificate and provisioning profile to make it appear as though you developed the app yourself. Once resigned, AltStore sends the app over WiFi to AltServer, which then uses the iTunes WiFi Sync protocol to actually install the app onto your iOS device (which is necessary because apps signed with free development teams can’t be installed OTA via itms-services:// like apps signed with paid developer accounts or enterprise certificates).
10) AltStore - What have been some of the biggest challenges keeping AltStore working? Trying to bring together a side loading hack with a great user experience and support is probably one of them 🤷♂️
Oh definitely. Before I committed to making AltStore a native app, I had been prototyping various solutions for years trying to nail down the perfect mix of hacks-and-hand-wavery. Originally I planned for AltStore to be a website, and I successfully made a prototype where you could resign and sideload apps directly from Safari. The problem with this approach was that I am not at all a web developer, so building a good website that people would want to use was…realistically impossible. So instead, I decided to lean into my strengths as an iOS developer and make AltStore a native app too — which was definitely the right choice in the end.
Then for the first ~year or so after launching AltStore, it really felt like I was playing cat-and-mouse with Apple. Every once in a while Apple would do something that would break AltStore in some way — such as shutting down the legacy auth endpoint I was using, updating the code signature format, blocking requests coming from Windows computers, etc. — and I would have to scramble to fix it ASAP to avoid people abruptly losing access to their apps.
Thankfully the frequency of these breakages has slowed down recently, so I’ve been able to spend more time actually improving AltStore instead of constantly fixing it. In fact, I think iOS 16 is the first major iOS release that didn’t break AltStore in some way, which means I can now spend the whole summer just playing with new iOS 16 APIs and building cool things 🙌 knocks on wood
11) AltStore - What kind of feels would you have if Apple allowed side loading? On one hand it makes installing Delta easier! But would it also mean the end for AltStore?
Honestly, it really depends on how exactly Apple ends up allowing sideloading. At the end of the day Delta is my passion, so all I want is to make the experience installing/updating Delta as convenient as possible. If Apple lets users sideload apps directly through Safari (and allows apps to update themselves), it’s very possible AltStore wouldn’t be necessary any more — but that just means I could finally spend all my time working on new Delta features instead of maintaining AltStore 🙏
That being said…I really hope Apple doesn’t make sideloading that convenient if and when they do allow it. I strongly believe a central App Store plays a huge role in protecting iOS users, and I’m worried that if sideloading were too convenient then several big apps (such as Facebook, Spotify, etc.) would almost immediately leave the App Store. In my opinion, sideloading should be cumbersome enough that it wouldn’t make strategic sense for apps already in the App Store to leave…but for the few apps that can’t be in the App Store in the first place like Delta, anything is better than having to refresh them every 7 days to prevent them from expiring 😅
12) Delta, AltStore - What’s next?! Do you have any future features that you can share with us?
Absolutely! We just released the first beta of Delta for iPad earlier this month, and I’m excited to spend the next few months really optimizing the app for a first-class iPad experience. The next beta will add full Stage Manager support, and now that iOS 16 supports Switch Joy-Cons and Pro Controllers you’ll finally be able to use real Nintendo controllers to play classic Nintendo games 🥳 Down the road, there’s even more exciting features we can’t wait to get to — such as online support for DS games and even a Mac Catalyst port!
As for AltStore, we’re about to start development on a big 2.0 update — which will allow people to add third-party app “sources” in order to curate their own AltStore browsing experience. This is what AltStore was imagined to be from the beginning, but there were several under-the-hood improvements that needed to be implemented first before I was comfortable opening sources up for everyone (especially related to security). The good news is we released AltStore 1.5 last month which includes a bunch (but not all) of these improvements, and is why AltStore 1.5 now includes “trusted sources” — which is basically a preview of AltStore 2.0, but without the revamped browsing UI and limited to sources we trust and can verify are safe.
13) What’s been the hardest part of being an indie dev? What the most fun part of being an indie dev?
I’ll start with the good: I LOVE the freedom of experimenting with new ideas and shipping features without having to get approval. Sometimes taking a break from what I’m working on to try out something new is exactly what I need to stay energized, and often will spark even more ideas to try out. Plus I just feel more attached to apps that I built by myself, and thus more motivated to work on them.
As for the hardest part, that’s easy: it’s the “indie” part! While I love iOS development, I really hate dealing with managerial tasks…but when I’m the only one working on a project I have no choice but to take care of everything. I struggled with this a lot as AltStore grew, and is a major reason why I eventually burned out. Thankfully, bringing Shane on board has made things significantly easier, allowing me to once again focus on what I love most: programming 💜
14) Is there anything else you’d like to tell the indie dev community about you?
Fun Fact: Not only do Shane and I share a name (my middle name is Shane), we also have the same birthday 🎂 🎈
15) Do you have any other indie devs that readers should follow / lookout for?
Ending with the hardest question 😅 The whole indie iOS dev scene is incredible, so really hard to say anything other than “all the devs I follow!” But if you happen to like Apple nostalgia and open-source SwiftUI projects (which I’m sure a lot of people reading this newsletter do 😉), I strongly recommend following Zane Kleinberg (@zzanehip) and his amazing OldOS project, which is a complete recreation of iOS 4 written in SwiftUI!
Newly Released and Updated Indie Apps
Here are some newly released and newly updated apps from this past week! If you would like to possibly see your app in this list, please submit your app to the look at me form 👀
Thank you to everybody who made it to this footer! You either spent the time to read or took the effort to scroll 😊
Make sure to visit https://indiedevmonday.com/subscribe to get an email of future issues!
And go to Twitter and give @IndieDevMonday a follow… or multiple follows if you manage more than one Twitter account 😜