Articles - RareSloth Games
raresloth_team

A story about discovering a dream and finding freedom.

We had both just moved to Kansas City to start working at a corporate job at a healthcare IT company. Austin and I became friends at our company’s orientation and we started hanging out, partying, and playing video games. We were both new in town and happened to live a mile or so apart. He was an iOS developer and had a few years of work experience, I was a fresh grad from Indiana University’s Human-Computer interaction and design program. Neither of us realized we would eventually combine our skills to start a video game company. I am grateful to have found a motivated co-founder that I can be friends with and also work with, a harmony that I understand is quite rare.

The right conditions

On a cold winter weekend in 2013 we were recovering from our demanding corporate life. My memory is fuzzy on the exact conversation, but we decided that we should try making a mobile game. Austin already had some experience making small apps and I had some design experience.

We watched indie game the movie, and I think we were subconsciously unlocked. We could make games too if we really wanted to, we would just need to stay passionate and persistent. We both recognized that successful artists don’t give up easily.

The first product

Our first game was inspired by a movie called “The Grey” by the universally recognized badass Liam Neeson. In the movie Liam continually stares death in the face when his plane crash lands in a snowy mountain range. As soon as we started putting together some ideas and prototyping, the seed of an idea started to grow. We created a simple winter themed action-platformer on iOS which we named Yukon Warrior.

We sacrificed many weekends and weeknights chipping away at this novice sculpture of a game. For me, making games on the weekends and weekdays felt like an escape and a creative release. I was unhappy with many things going on in my life, but working on Yukon Warrior felt important. This first game took 1 year to create part-time and we made around $200. This barely covered the AppStore developer fee.

In the process of creating Yukon Warrior, I could feel the passion and dream being cultivated. It was a slow process that grew with every goal being accomplished. We didn’t meticulously plan any of this out, I don’t think many things in life work that way.

*We removed Yukon Warrior from the AppStore in 2016.

Quitting the rat race

6 months before our 2-year mark at our corporate job, we discussed leaving and becoming full-time indie game developers. For many it’s terrifying to leave a secure income for something as unpredictable and volatile as the game industry. Young and without dependents, I was not very concerned. I was happy making games. By the time we left the corporate world, we didn’t have anything finished except a decent prototype of an iOS game. We saved our money and moved into an inexpensive apartment in Bloomington, Indiana (my hometown). Our budget and overhead was lean.

Indie success, commercial failure

We released the iOS game Furdemption in June, 2015 — 5 months after leaving corporate life. It was released as a $3.99 premium app and was featured by Apple in best new games. It did OK for an indie game, bringing in a little over $20k in proceeds. It took over a year to develop Furdemption and our savings were dwindling fast. $20k between us didn’t give us much time to create a new product from scratch. I would consider Furdemption an indie success but commercially it wasn’t enough.

We were in a tough spot — we needed to create something with high value as fast as possible, or we’d have to go back to slinging code and pixels for someone else. Players loved Furdemption and there was a lot more we wanted to do. We decided to make a sequel.

Enter King Rabbit

king_rabbit_header
We spent 9 months of grinding and sometimes neglecting other aspects of our lives to bring this sequel to life. The bank accounts were drying up.

In March, 2016 we released King Rabbit. A fresh theme, new levels, and tons of improvements. King Rabbit started as a paid app with optional In-App purchases like level hints and customization options. We eventually made it free with the support of interstitial ads. These business model changes weren’t planned from the beginning but we pivoted as the game evolved. King Rabbit turned out to be a success. In 2016 we had over a million downloads and our net income for 9 months exceeded $100k.

King Rabbit isn’t finished

Austin and I have been working on the same codebase for the past few years, and we want to start developing another product. At the same time we really want King Rabbit to live on.

The biggest problem with King Rabbit is the content bottleneck. We’d spend weeks and months building levels to have players complete them in a single sitting. To solve this problem we decided we should take the time to build out and release a level builder. This will also make King Rabbit a deeper experience where you can exercise your creativity.

I think many developers would have just moved onto the next game, and we almost did. Creating a level builder with good production quality takes a ton of time and effort. Here we are almost a year after the King Rabbit release and now we’re about to release the level builder to the public. After beta testing for a few weeks, 191 players have built almost 500 levels. To put that into perspective, King Rabbit only has 256 levels in total. When we release this month, everyone will get to build and play unlimited content for free.

Our monthly active user count tends to fluctuate between 50k and 100k depending on feature spots and release cycles. With our current player base, if only 2% of players build a level there will be 1k–2k new free levels each month. I believe this will exceed the goal of a constant flood of free content for everyone to enjoy. This update will birth a community of builders and players and an avenue for creative expression. Our plan is to hire another person to help maintain and update King Rabbit, so that we can get another game in the pipeline. We believe it is important for apps to live and evolve!

The level builder will be released for free on iOS on January 26, 2017.
Get notified when its ready.

Game Developer Conference 2017

At the end of February, we’ll be in San Francisco attending the game developers conference. After the conference Austin and I will be heading to Puerto Vallarta, Mexico to live and work until further notice. I will be ridding myself of all material possessions except for two bags and a carry-on.

No dependents, no investors, and no flashy offices. We’ll be digital nomads with complete freedom to work how and where we want. There’s nothing wrong with keeping things simple and taking it one step at a time. Sloth and steady wins the race.

Thanks for reading. If you like, you can follow our company on twitter.

Slothily,

Brian Oppenlander
Co-Founder of RareSloth

Using Sendy

Using Sendy for subscriber emails

Maintaining and communicating with your subscriber base is a great way to make news travel about what you’re doing. However, if you’re not careful you could be spending much more for your email service than makes sense. This post will guide you through our experience with subscriber emails and how we ended up using Sendy.

In the beginning…

We started collecting email addresses using Mailchimp, a user friendly service that’s trusted by loads of companies. They have a great free tier that allows you to collect up to 2,000 subscribers before paying anything. They give you multiple ways of integrating sign up forms in many places and they have a bunch of great features. It’s a great way to get started.

Volume hike

We didn’t have many subscribers for the first several months so Mailchimp’s free tier was perfect for us. Then came the Free App of The Week feature.
Using Sendy
When King Rabbit got the FAOTW feature, we gained 14K subscribers in one month. That put us in Mailchimp’s $150/month tier, which isn’t cost effective for how often we send emails (once a month). After 25K subscribers the rate increases at $5 every 200 subscribers. We didn’t like where this was going so we rethought how we were going to send emails.

Using Sendy

Sendy will save your wallet. It’s a $59 one-time fee and all additional costs are based on Amazon AWS’ SES service. We chose to use Sendy because we already used AWS for our servers, so getting their SES service setup was a piece of cake. AWS SES is cheap and has an awesome free tier. We’ve used Sendy for a few months now and we’ve sent about 60K emails. It’s been reliable and has a solid WYSIWYG editor for drafting emails. It took a day to setup on our server (you host your subscriber database and Sendy frontend). Using Sendy has cut down our monthly email cost to about $0.01 so I can’t say I know of a cheaper way to send mass emails.

Drawbacks

We came from using Mailchimp, so we had high expectations from our mailing service. Needless to say, you won’t get all of Mailchimp’s features in Sendy. We are primarily missing the ability to send emails to segments of lists. Sendy can maintain separate mailing lists, but you can’t send emails to a particular segment of a list (i.e. subscribers in the past month, subscribers who clicked a link, etc.). Also, Mailchimp’s editor is amazing so Sendy’s felt like a step down, but it works well. We are sending really basic html emails, which don’t require assets or tables so it’s not much of a complaint for us.

Localizations

Neither Mailchimp nor Sendy have a good way of sending localized emails. In Mailchimp, you would have to put in a bunch of if/else conditional blocks and check the subscriber’s language in order to send an email in a subscriber’s language. Sendy just doesn’t have a way of doing it. It’s important to us to be able to communicate with our subscribers in their native language so we patched in some code to allow it. We’re now able to send emails in 14 different languages with the click of a button. Contact us if you have interest in our localization code and we’ll publish it if there’s enough interest.

Our switch to using Sendy is saving us $150/month right now and will continue to be affordable as our subscriber list grows. It was a no brainer for us, we hope this post helps you make your mailing decisions!

ReplayKit Implementation Notes

I spent two days digging into ReplayKit’s simple API to discover undocumented subtleties that caused me to write more code. There is very little documentation on ReplayKit aside from the WWDC video’s example code, so it can be hard to find any good information. This is a guide of what to look out for when doing your ReplayKit implementation.

I’m on XCode 8.0 and my devices are an iPad Mini 2 and an iPhone SE, both running iOS 10.0.2. We support iOS 8.0 and up in King Rabbit so we had to do iOS version checks to make sure none of this code was called if ReplayKit (iOS 9.0+) wasn’t available. This means weak linking (making Optional) the ReplayKit framework in the project. We tested some of these issues out on other App Store games and they seemed to have similar failures/stuck points.

Recording

If you’re looking to record video on the device, you’ll use the instance of [RPScreenRecorder sharedRecorder] to call either startRecordingWithMicrophoneEnabled:handler: (deprecated) or startRecordingWithHandler: (iOS 10+).

startRecordingWithMicrophoneEnabled:handler:

If you want to support iOS 9.0, you’ll have to use this deprecated method to start your recording.

Microphone recording

If you deny access for microphone recording (choosing ‘Record screen only’) in the permissions alert view when starting a recording, you can’t turn on the microphone until starting a new recording. Just keep this in mind for your UI, since your “mic” button will be useless.

startRecordingWithHandler:

If you want the front facing camera preview as most streamers have in their broadcasts, you’ll want to look at the isCameraEnabled and isMicrophoneEnabled flags on RPScreenRecorder. I found that I had to set these flags to YES on the [RPScreenRecorder sharedRecorder] instance before calling startRecordingWithHandler:.

Then I found that you have to request video permissions before the flags you just set are honored. Otherwise, the flag will be unset when the handler argument is called. Also, if you try asking for permissions after you’ve already started recording and you try to setCameraEnabled to YES when granted, it’ll stop the recording without letting you know!

Do something like this:

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (granted)
		{
			[[RPScreenRecorder sharedRecorder] setCameraEnabled:YES];
			[[RPScreenRecorder sharedRecorder] setMicrophoneEnabled:YES];
			[[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^{
				// Recording started
			}];
		}
    });
}];
Remove CFBundleDevelopmentRegion

From this simple use, I found that the handler wasn’t getting called on my iOS 10 devices (apparently is works fine on iOS 9). I found a tip on the Apple developer forum where someone removed the CFBundleDevelopmentRegion key from their Info.plist so I tried the same thing. And it worked! I don’t know how that could possibly tie in with ReplayKit, but there’s a bug in there somewhere.

Broadcasting (iOS 10+)

Broadcasting allows you to stream your recording directly to a third party service that you have installed on your device. I used Mobcrush and Periscope for testing.

To start a broadcast, you call:

[RPBroadcastActivityViewController loadBroadcastActivityViewControllerWithHandler:^(RPBroadcastActivityViewController * _Nullable broadcastActivityViewController, NSError * _Nullable error) {
}];

Presenting the broadcastActivityViewController allows the player to choose which service he wants to stream with. An important thing to note – when presenting this view controller on an iPad, you have to present it in a popover, otherwise it just won’t do anything. There’s no documentation and no obvious logs that let you know this! You’ll need something like:

broadcastActivityViewController.modalPresentationStyle = UIModalPresentationPopover;
broadcastActivityViewController.popoverPresentationController.sourceView = myView;
broadcastActivityViewController.popoverPresentationController.sourceRect = myView.frame;
broadcastActivityViewController.delegate = self;
[myViewController presentViewController:broadcastActivityViewController animated:YES completion:nil];

The delegate method

- (void)broadcastActivityViewController:(RPBroadcastActivityViewController *)broadcastActivityViewController didFinishWithBroadcastController:(RPBroadcastController *)broadcastController error:(NSError *)error

gives you an RPBroadcastController instance, which you call startBroadcastWithHandler: on to start up the broadcast.

Broadcasting simply did not work on my iPad Mini 2 until I used the CFBundleDevelopmentRegion key hack from above. However, even with that, the broadcast had unusable quality. We’re limiting our broadcasting to only newer devices to try to mitigate these failures. When it fails to broadcast in this manner, it won’t call the handler with an error – it just won’t call it so you’ll be stuck in a loading screen if you have one.

If you want to enable the microphone and/or camera during a broadcast, you’ll have to figure it out. It doesn’t seem like RPScreenRecorder should be dealt with when you’re broadcasting, but it might provide the cameraPreviewView for you. You’ll also have to ask for mic/camera permissions yourself since initiating a broadcast doesn’t ask by default.

Some other notes

We tried starting a recording after finishing a broadcasting, but found that the handler wouldn’t be called on the startRecording methods. The same issue occurs in the opposite direction, finishing a recording and trying to start a broadcast. Just keep this in mind if you want to allow players to do either. We’re simply going to hide the other option for the lifetime of the running app so players don’t get stuck.

If you’re a third party streaming service that wants to implement the broadcasting extension, good luck. There are some classes in the ReplayKit documentation, but you’ll find no written documentation on what they do.

There might be some other gotchas I’ve forgotten, but hopefully this guide will help get you started more quickly than we did!

King Rabbit 90 days stats

King Rabbit indie mobile game sales stats

Indie mobile game sales stats for King Rabbit, the sequel to Furdemption. This game was made by the two sloths at RareSloth.

Read More

King Rabbit Free App of the Week

King Rabbit Free App of the Week Figures

This past week we were featured as Apple’s Free App of the Week. It also marks the first time we’ve gone the freemium route with one of our games. We’ve previously had a $3 app, a $1 app with IAP, and now a free app with ads and IAP. As before, we want to share some figures with other indies out there so you can get a better idea of what to expect. Keep in mind we were also featured in numerous other places in the App Store like the Games page, Games > Puzzles, 15 Most Huggable Heroes, etc. We also have screenshots and descriptions localized in 15 languages.

Read More