Meet Amaro: An Open-Source iOS Boilerplate

August 6, 2014 | By Tim Clem, Engineer

I write software. Until recently, saying that in public garnered only confused looks. At best I might have gotten a hesitant, “So you make things like Word?” But a few years ago, reactions started to shift. Now the most common response runs something like “Oh! I have an idea for an app!” Love it or hate it, there’s no denying that the iPhone has drastically changed how the world perceives and consumes software.

From my perspective as an engineer, things have also been changing. Apple has been a major contributor to the LLVM and Clang projects, adding many exciting features at a rapid pace. Xcode, Apple’s homegrown development environment, is likewise leaps and bounds above where it was a few years ago. iOS itself continues to develop rapidly. Five years ago, you couldn’t even copy and paste text!

That said, much of the innovation in iOS engineering is due to the influx of programmers from other disciplines. For a number of historical reasons, Mac (and by extension, iOS) software development had long existed in a vacuum. A comfortable and well-loved vacuum, but a vacuum nonetheless. The skyrocketing popularity of the App Store changed that – suddenly developers from the Ruby, Python, and C# communities took notice. And what they found didn’t always satisfy them.

A key feature of most modern software ecosystems is a package manager, a means to discover, include, and update third-party code. No such tool existed for Apple developers, so the community created one: CocoaPods. Simultaneously, there has been an outpouring of open source projects for iOS, from indie developers as well as major names like Facebook and Square.

So, in the spirit of solving problems, not solving the problems around our problems, we are announcing some goodies.

Amaro is a template designed to get your iOS project started on the right foot. After answering a few simple questions, Amaro generates skeleton application with a stable, featureful foundation. I’ve found that I spend a lot of the time at the beginning of a project solving the same problems: choosing a logging infrastructure, setting up tests, pulling in baseline CocoaPods, fiddling with compiler settings, wiring up analytics, and so on. Amaro does all that for you, and more, all through a convenient command-line interface.

Once upon a time there was a similar project, but it seems to have been abandoned. More recently, the lovely folks at thoughtbot released liftoff. Amaro takes a different tack than liftoff: more opinions, less scriptability. A spiritual successor to iOS Boilerplate, Amaro aims to set you up with all you need to write a beautiful, modern, well-tested app.

Sidecar is a small library of iOS utilities. Many others exist, but Sidecar is special. It’s minimal. Curated. The open-source community has reached the point that other people have probably solved pieces of the problem, better. The kitchen sink is definitely not included. Also, Sidecar is well-documented and well-tested (approximately 85% code coverage, and really 100% of what is feasible to test).

And finally, Aperitif fancifully checks for updates during the testing phase of your apps. It targets the superb Installr service, which dramatically simplifies the process of distributing apps to your testers. By adding a few lines of code to your app, you can automatically alert your testers when a new build is available for them to download. And, there’s a cool bubbling flask to play with!

Apple’s recent announcement of the next-generation Swift language promises to bring yet another wave of change to iOS development. As Swift matures, so will community’s support for it, and so will Amaro and the rest of this suite. Stay tuned.

We hope that these projects can make things a little easier on iOS developers. Let us know what you think, and please don’t hesitate to contribute on GitHub!

We believe in open source. We believe in responsibly swiping from the best. We believe in the importance of stewardship. Let’s build better software, together.