This article is my attempt to explain our journey over seven years to launch a stable and private version of 1SE on Android. I’ll be sharing the mistakes I made, why I made them, and some lessons learned along the way.
Our Android saga began in the fall of 2012 when 1SE was first going from dream to reality with the help of a hugely successful Kickstarter campaign. Right from the jump, there was interest from the community in having an Android version: Hey, man. I’m a lonely Android guy. Please help. I believe in Cesar, and I believe in the idea of 1SE. Based on overwhelming feedback, we made an Android version a stretch goal. And why not? Let’s make 1SE for everyone!
We blew past the stretch goal and went to work on building the Android version with Touchlab, a rock star dev shop in NYC run by Kevin Galligan. Eight months later, the app launched and was well received by the community.
We naively thought, Whelp, done with that. On to the next thing!
Almost immediately, the bugs started to bubble up — big bugs. An OS update, adorably named Jellybean, had broken a good chunk of the app’s ability to put videos together, which at its core, is what 1 Second Everyday does. Weird, unknown alien Android devices from the deeps were descending upon us like the spawn of Cthulhu. While there are many articles about how Android has thousands of different devices available in the market, which the industry calls “the fragmentation issue” (Open Signal report), I always find visuals help best explain the situation.
This is why so many companies don’t launch an Android version early. What we did was stupid – a great example of our naivety and hope: “People want it! I like people! They should have it! Let’s build it!” Not thinking about the ramifications down the road.– Schoneck Shoaf, COO, 1SE
The difference in the device landscape between Android and iOS means much more work for supporting an app on Android. The chart below shows that for less than a quarter of the installs of iOS, Android requires a codebase that functions on over 16 times the number of device models. The wonderful world of fragmentation was our first hard lesson in developing a video app on Android.
Snapchat historically hacked together its camera for Android because of this fragmentation issue. “Given the sheer volume of different Android handsets used to access Snapchat, we have had to establish new processes to ensure that our quality efforts can be maintained.” says Snapchat CEO Evan Spiegel.
Winning Battles; Losing the War
For the next four years, we funded development through brand partnerships. These partnerships provided us with a desperately-needed development budget, but each only lasted for a short window of time. We had to make the best use we could of limited resources while on someone else’s dime.
1SE became sort of like Cinderella’s carriage: We had to load it up with as many fixes and features as we could as fast as possible, because at midnight our fairy godmother (our current brand partner) would bounce, and we’re back to being a pumpkin. This was basically the cycle for our Android app: A couple months of pure bliss for everyone, and then the rest of the year, poor Android is over in the corner. On fire. Peeing itself.
Our biggest ongoing battle was our reliance on Google Drive for backup. Let me clarify this right up front: Drive works great for most apps and is a service used by millions around the globe without issue. But for us, as a video app trying to sync a ton of video and photos daily, it was problematic and not what the API was intended for. The decision to use Drive for backup was based on the situation at the time: we couldn’t afford our own servers for backup, and we knew that if a user stuck with 1SE for a long time, storage on their devices would quickly become a problem.
To understand why it was such a bad decision, picture Google Drive like this: you have a dark closet that you want to put all your most precious items into. When you try to put, say, your favorite sweater in the closet, you don’t actually know if it was moved successfully. The only way to find out what is really in the closet is to negotiate with a grumpy old troll named Google Play Services(GP). She controls passage over the Google Drive bridge. Maybe she’ll give you a list of what’s in the closet in a timely fashion – if you’re patient and she’s feeling friendly. You might even get permission to try to pull that sweater back out of the closet, but you still have to reach in blind, hope it’s in there at the right place, or you’ll be pulling out a dirty old pair of gym socks instead.
What does that look like for the 1SE app? GP collects all the changes 1SE wants to make in a local cache on your device. These changes could be anything from new snippets to a request to restore a backup. At this moment, 1SE is told everything is done, but that’s a lie – sadly, we’re nowhere near being done. Next, GP sends these change requests up to the mothership to process. This could take minutes, hours, or even days to complete. 1SE can’t force or expedite the process, nor are we told the current progress of it. That means we can’t message users about what’s happened, if an error occurs, or how long sync will take. Brutal. This is also problematic because if Drive settings are changed or updated, if GP crashes, or if that local cache gets reset, we have to start ALL over. That pretty much makes consistent syncing impossible.
Understandably, our customers became frustrated and confused at this process and our inability to fix it.
Our reliance on Drive for backup was probably the worst decision we ever made for Android. That decision haunted us for over five years, but I learned a critical second lesson. Don’t integrate third party APIs for key functionality without a clear plan for long-term support.
At this point, 1 Second Everyday was one bad day away from vanishing forever. It was being propped up by a small group of people (in June of 2016, we hired our fourth team member) who believed in Cesar and who had faith that the app could make people’s lives better. These were the dark days of 1SE.
By early 2017 we had stopped all brand partnerships. The game plan was to get Android stable first, then try to monetize via in-app purchases. I found a reputable dev shop that had produced a very stable video-editing app on Android. After reviewing the 1SE codebase, they felt that there was hope that they could get the job done by holidays 2017. Finally, Android will be stable for the holidays – our busiest season. I was so pumped.
It quickly became apparent that even with the improvements to Google Drive’s API, our core app was just in shambles after years of the coding equivalent of band-aids and duct tape. By January 2018, we had blown past our holiday deadline and were burning through cash. At this time, we hadn’t made a cent on Android in years and were funding all expenses through iOS revenue.
The time had come to ask the hard questions: Do we abandon ship entirely? To stop the financial bleeding, do we end all Android development, apologize profusely, and eat the losses? Or do we push through and figure out a way to make 1SE work on Android?
Cesar and I decided on three things. First, we couldn’t ditch Android as a platform. Second, 1SE needed to have a higher standard for backing up our customer’s memories. Lastly, we had to fire the dev shop and hire an in-house developer, someone who would eat, sleep, and breathe 1SE. With that last realization, our third lesson was unlocked: go in-house ASAP.
Priority numero uno: find a world-class Android developer to fix our Android app. Easier said than done.
Difficult Answers to Hard Questions
If it’s not apparent yet, let me lay this out plain and simple: The only thing harder than working with video on Android is finding someone who wants to work with video on Android. After countless interviews, it became clear most folks either had no experience or didn’t want anything to do with video on Android. We needed someone scrappy who hadn’t yet become jaded or beaten down by countless compiling errors.
Enter stage right, Dima Petrov (our hero), a young gentleman from Russia with an eye for FFMPEG. Dima knew as much about video codecs as anyone we’d met. But he was also able to crack jokes, was excited about 1SE, and had a deep love for cinema – our kind of guy. On March 15th, 2018, I brought him in to lay out the situation, our options, and where we need to go. No pressure, but we need you to fix all this mess. ASAP.
We finally had good news for the Android community. “WE HIRED SOMEONE! Yay!”.
I actually first met Dima face-to-face at our Portland retreat in June 2018. It was great to see his excitement for diving right into the project and proving himself to the team. He even brought his lovely mother, Irina, along for his first trip to the US. We talked, ate, drank, and watched the July 4th fireworks. Dima felt confident in his ability and thought that by Christmas of 2018, we could release a stable version of 1SE, which we were already calling v3. It didn’t sound completely crazy to me and I had full faith in Dima.
But I didn’t think about the possibility that a new hire didn’t want to let us down or fail in the eyes of his family. Saying “No, we shouldn’t do that” isn’t easy for someone who started yesterday. At first, we started to distract Dima with fixes for the existing version of the app – can we just quickly put this band-aid on a Drive bug? Oh, and this Play Services bug too! Then we started moving the goal line for the v3 launch. New features came in, other features became bad features and went out. Dima was trying to carry the new app into the future while we kept one of his toes tied to the past. We’re not a large software company with hundreds of developers; this was a massive undertaking for just one person. In the end, we handicapped him and missed the goal of the 2018 holiday release.
In the new year, we finally had to unhitch Dima from the old version and let him run. Our long-term goal is to be the trusted shepherd of our customer’s memories. That means backing up 1SE onto our servers so we could provide quality support, have actual privacy control, and debug any sync issues we might run into. Going forward, Google Drive will not be used in 1SE in any fashion. Sadly, this also means we can’t offer the ability to restore from a Drive backup. The same reasons why we decided to stop using Drive for backup apply to building out a way to restore from Drive in our new app. There’s no way to know the status of how sync is going. GP prevents us from being able to confirm a backup’s size or if it even exists. Fragmentation means inconsistent device support of GP, the bridge troll who controls access to Drive. It wasn’t due to lack of effort – we tried to figure out a way to play nice with Drive for over a year. But with only one developer building Android, we had to make the difficult decision to focus on the future.
With that, Dima was given a clear list of requirements for v3. The rest of 2019 was a blur of endless testing, building account flows, our server integration, setting up in-app purchase support, QA-ing everything under the sun, and too many betas to count. Then, after months of work, while sitting in the Frankfurt airport on October 27th, Dima clicked a button. Sparks flew, servers rumbled, and we finally unleashed v3 to the masses. It took longer than expected, cost more than budgeted, but we launched it and it’s beautiful. Oh, and it’s our most stable Android version ever. 😉
Where Do We Go From Here?
After seven years, we’ve finally arrived at a long-term strategy. We let iOS blaze the trail, learn from any mistakes, test the UX thoroughly, and then let Android come in and build the perfect version for our Android customers. To maintain the high standard of quality our customers deserve, we have to move a little slower on Android. We hope you’re ok with that and see the hard work our team puts into every pixel.
Developing for Android has been a crazy journey for us but we’re no longer alone in the dark. We have Dima, who now has a jolly coding partner, Jordon de Hoog, to help us find our way and bring 1SE to the beautiful world of Android. One quick personal note: a warm Thank You to those loyal Android folks who stayed with us for this long and helped me work through bugs in the early years. I’m sorry it’s been a little rough at times but I hope you’ll stay with us for the rest of the ride.