Supercharge Beta by Crashlytics with fastlane: automate app testing to save more time

By Hemal Shah, Product Manager

Supercharge beta by Crashlytics with fastlane

Feedback that comes early and often is the best way to improve your app experience. Your users are your greatest source of learning (what can I do better?) and inspiration (what should I build next?), which is why it’s such a shame that beta testing is a tedious, tiring, and hair-pulling process.

We built Beta by Crashlytics to fix this by making it easy and straightforward to distribute beta builds to your users. Simplified beta distribution is awesome, but imagine how much more time you’d save if you could also automate it in seconds. Now, all iOS apps using Beta by Crashlytics can harness the power of fastlane to automate beta deployment with a simple, guided setup process!

 

Less tedious work, more time to innovate

A successful beta release involves a lot of steps – you have to bump version numbers, compile the build, append the release notes, distribute it to your testers, alert your team that a build went out, and the list goes on and on. And if that wasn’t enough, sometimes only one person knows how to distribute a beta build, which means you’re tied to their schedule and there is a bottleneck for delivering value to your app users.

Beta by Crashlytics takes the pain out of this process and makes it intuitive and efficient. By installing fastlane, an award-winning mobile deployment toolset, you can automate the tedious tasks that slow down your app development. Say “goodbye” to manual work and spend more time innovating, while still getting a healthy stream of user feedback.

Beta distribution takes only seconds using fastlane:

Beta distribution with fastlane

 

Instant access to all the power and benefits of fastlane

As an added bonus, with fastlane, you’ll also unlock new tools to help you customize your build process and effortlessly release your app to the App Store. Plus, fastlane is fully extensible so you can create and consume actions that automate all aspects of your mobile development – whether it’s working with Git, posting to Slack, etc. – there are 170 built-in actions and 50 third-party plugins to choose from!

Here’s an example of fastlane’s extensibility: We noticed that developers are increasingly forced to use multiple beta distribution services to address different needs. With fastlane, you can use the same process to automate beta deployment to Beta by Crashlytics and stage your build on iTunes Connect. fastlane integrates with the services you already use and love, so everything will still work exactly as you designed it – it’ll just be light years faster and you’ll have more flexibility and control.


lane :beta do
 increment_build_number
 gym                  # Build your app
 testflight           # Upload to TestFlight
end

lane :appstore do
 snapshot             # Generate screenshots for the App Store
 gym                  # Build your app
 deliver              # Upload the screenshots and the binary to iTunes
 slack                # Let your team-mates know the new version is live
end

 

The fastest set-up process, ever

We know that one of the biggest hesitations to adopting a new tool, no matter how incredible it looks, is the fear of a terrible and time-consuming onboarding experience. Nobody wants to spend days connecting everything and making sure it’s set up properly. That’s why we worked hard to make it easy as pie to enhance Beta by Crashlytics with fastlane. This will be the smoothest onboarding process you’ve ever seen.

Want to see for yourself? All you need to do is open up the Fabric Mac app and click on the “fastlane” tab in the top menu. Then, click the “Automate your beta” link and we’ll use existing information about your app to auto-generate your single instruction file (called a Fastfile). From there, just build your app and you’re good to go.

You can even use the same Fastfile to automate taking screenshots and deploying to app stores. And once fastlane is setup, everyone on your team can use it out of the box (no extra knowledge transfer needed!) and it seamlessly works with your CI server.

fastlane + beta onboarding process

 

A better beta experience awaits

User feedback can reveal app issues and opportunities that even the most astute development team may miss – it is the key to meaningful iteration. We care about your success, which is why we invested time and resources to drastically improve the beta testing process. With the combined power of Beta by Crashlytics and fastlane, you can get all the feedback you need in a fraction of the time and effort. And it only takes a few seconds to save precious hours. Upgrade to fastlane today and let us know what you’re building with all of your extra time!

For more information about doing beta deployment through fastlane, check out our quick setup guide.

Fabric September Update

by Brian Lynn, Sr. Product Marketing Manager

Now that fall is here and school’s back in session, we’re studying up on how to make life easier for you and your app development team. This month, we released three new features to help you understand your users and strengthen your app quality:

Your key performance indicators — now available on the go

Many of you are already tracking Answers Events and your key performance indicators (KPIs) via your Fabric dashboard. Now, with the latest version of our Fabric iOS app, you can easily track those KPIs and monitor user actions even when you’re away from your desk. By combining these additional insights with your adoption and stability metrics (e.g., DAU, MAU), you’ll know exactly where to focus your app improvement efforts.

Get the latest update:

(Android coming soon!
Follow us on Twitter so you don’t miss it)



See the most critical issues across builds or by device/OS

To help you fix crashes even faster, we added a new build selector as well as device and OS filters to your Crashlytics dashboard. Now, you can easily find and prioritize issues that are affecting multiple builds and increase stability across the spectrum.

On top of the new build selector, you can even filter crashes by device or OS. Want to focus in on crashes happening on iPhone 7 or Android 7, or compare crashes on iOS 10 vs. iOS 9? These new filters make it easy to search, compare and address your app's stability.

See these in action on your Crashlytics dashboard!

New fastlane docs: automate your app releases

Earlier this month, we launched docs.fastlane.tools, our new docs website for fastlane. This new site will walk you through fastlane’s set-up process and show you how to streamline tedious work when releasing your app, like taking screenshots, beta distribution, code signing, and more. Check it out!

Sidenote: we’re also happy to share that fastlane has now surpassed 500 contributors on GitHub. We continue to be humbled by your support, and we can’t wait to keep moving fastlane forward!

Here’s our internal changelog:

Fabric

  • iOS

    • Update upload-symbols for macOS Sierra compatibility

    • Warn on projects built for ≤ iOS 6 and ≤ macOS 10.7 that Fabric compatibility with those version is deprecated

  • Android

    • Update the Fabric dependency to update Crashlytics Core

Crashlytics

  • Android

    • Improved support for Android M & N

    • Facilitated improved NDK support on Android M & N

    • Updated Crashlytics Core dependency

    • Fixed issue which prevented sending crash reports in the rare case battery level info is not available

Answers

  • Android

    • Fixed a bug that caused Answers to undercount the number of Daily New Users Daily New Users count may be temporarily higher when you first launch a version of your app with this SDK

    • Updated Answers dependency

Digits

  • Android

    • Fixed error inflating StateButton when requesting email

    • Introduced new logger events to obtain errors while submitting phone number or confirmation code

Twitter Kit

  • Android

    • Bump dependencies

    • Added translations

    • Removed pseudo locales from translations

    • Updated proguard rules for Okhttp3 and Retrofit2

    • Removed pseudo locales from translations

    • Moved TwitterCollection from internal package to models

    • Minor bug fixes

    • Removed pseudo locales from translations

MoPub

Fabric August Update

By Annum Munir, Product Marketing Manager

Summer’s almost over but we’re not taking any breaks from shipping new features. In August, we focused on expanding your view into app stability, updated a few of our Android SDKs, and added new functionality to our mobile app. We also celebrated a major milestone for fastlane! Read on for more details:

Introducing OOM reporting: a new dimension to app quality

We extended our crash coverage to include out-of-memory (OOM) reporting on iOS. An OOM event is an unexpected app termination that occurs when a mobile device runs out of memory. However to your users, OOM events look just like crashes, which makes them detrimental to your stability and also extremely difficult to detect. This month, we used intelligent heuristics to bring OOM reporting to Crashlytics. Now, you can monitor your OOM-free sessions, immediately see when they become a problem, and get valuable direction on where to start your troubleshooting.

Don’t let OOMs disrupt your user experience! Learn how on the Crashlytics blog.

Launched Twitter Kit 2.0 and Digits 2.0 for Android

We upgraded our Twitter Kit and Digits SDKs for Android to keep them stable, predictable, and reliable (we already did this for Twitter Kit for iOS a few months ago). In version 2.0, we refined our libraries based on your feedback, updated major underlying dependencies, and also enhanced performance and aligned with modern Android tools. To get these latest versions, simply click the “Update” buttons within your Android IDE plugin - we’ll take care of the rest.

For more specifics, check out the Twitter Developer blog.

Fabric mobile app updates: Crashlytics-only mode & account switching

The Fabric mobile app helps you keep tabs on your app when you’re on the go. While our app gives you a wealth of real-time analytics data, if you want to focus solely on stability you can now switch to a “Crashlytics-only” mode. This way, you have visibility into all of your crashes even if you don’t have Answers enabled!

On top of the new mode, you can also easily switch between your Fabric accounts within our mobile app. In just a few clicks, you’ll be able to monitor all of your releases across all accounts — even if you’re away from your desk. 

Update the app today to get these upgrades:



fastlane surpasses 10,000 stars on GitHub

fastlane automates the tedious, repetitive tasks of mobile deployment so you can spend more time doing what you love: creating amazing user experiences. Over the past months, we’ve worked with our community to make fastlane even better. Today, we’re excited to share that fastlane has surpassed 10,000 stars on GitHub. In fact, fastlane now has more GitHub stars than the language it was written in. We’re humbled by your support and we can’t wait to keep moving fastlane forward!

Here’s our internal changelog:

Fabric

  • iOS

    • Added logging of a warning if Fabric +with: is incorrectly invoked multiple times

    • Improved beta support when Fabric is embedded in a dynamic library

  • Android

    • Fixed issue causing the Crashlytics privacy prompt to not be shown in rare cases

Crashlytics

  • iOS

    • Improved defensiveness when handling Custom Keys and Logs data

    • Added support for Answers 1.3.0

  • Android

    • Updated Crashlytics Core dependency

    • Improved crash reporting efficiency when handling stack overflow errors

Answers

  • iOS

    • CPU/networking are now reduced when in Low Power mode on iOS, or under thermal pressure on macOS

    • Adopted NSURLSession background uploads, making for much more efficient and reliable networking

    • Adopted NSBackgroundActivityScheduler, which results in improved background behavior on macOS

    • Improved compatibility for macOS apps that use Automatic Termination and Sudden Termination

    • Improved visibility of Answers background operations by adopting NSActivity APIs

    • Improved on-disk event storage, reducing I/O and CPU overhead

    • Fixed a bug that could cause Answers to send a report with no events

  • Android

    • Updated Crashlytics Core dependency

Digits

  • Android

    • Clarified external api by defining "internal" package

    • Clarified events generated by defining "events" package

    • Enabled unique user counts per custom attribute by updating the sample application's logger to use custom events

Twitter Kit

  • Android

    • Removed Digits dependency

    • Dropped support for API versions before API 14 (ICS)

    • Updated Twitter Core dependency

    • Removed previously deprecated methods and classes

    • Added contentDescription for media based on altText field

    • Migrated to Retrofit 2.0 and OkHttp 3.2

    • TwitterApiClient now automatically refreshes expired guest tokens

    • Removed all public reference to Application Authentication

    • Fixed issue parsing withheldInCountries field in User objec.

    • Added altText field to MediaEntity object

    • Added Quote Tweet to Tweet object

MoPub

Fabric July Update

By Brian Lynn, Product Marketing Manager

With summer in full swing, we turned up the heat this month by shipping two major releases to help you further engage and retain your users!

Quickly recognize and solve user retention problems

To build a successful mobile business, app development teams need to keep a close eye on user retention, which is crucial for their app’s growth. What’s the point of spending time and money to acquire new users if they churn the next day? That’s why in July, we released Answers activity segments to help you understand how engaged your current users are and how many are at risk of abandoning your app. More on the Answers blog.

Engage users with a seamless Vine viewing experience

We also added Vine support to Twitter Kit so you can easily engage users by bringing creative and quirky video content into your app. Now, Twitter Kit will automatically play a Vine that is embedded within a Tweet, expand these videos within the timeline, and seamlessly play them on loop within the video player. More on the Twitter Developer blog.

Easily build real-time apps with PubNub and Digits

Besides shipping major releases, we also co-hosted a webinar with our friends at PubNub to help developers accelerate real-time data delivery for their apps. During the webinar, their team showed you how to build a real-time mobile chat app in Android using Fabric and PubNub. And, Chris Oryschak, a Fabric product manager, demonstrated how you can easily and securely verify users using Digits without any cumbersome passwords or complex 2-factor authentication setups. Check out the webinar here or grab the slides!

Here’s our internal changelog:

Crashlytics

  • Android

    • Beta now works for apps using the v2 signature in the latest Android Gradle Plugin, on devices running Android N

    • Beta kit’s startup time is now even faster

    • Fixed a bug to prevent false negatives when determining whether an app was installed by Beta

    • Removed logging when the Beta by Crashlytics app cannot be found

Answers

  • iOS

    • Released activity segments feature

  • Android

    • Released activity segments feature

Digits

  • Android (bug fixes):

    • OSS gradle files breakages in v 1.11.0 to help customers continue using our OSS project as an example

    • Crash caused when digitsLoginFailure event was reported without countryCode

    • Users being unable to login when guest auth expires on the service but not on the client

    • Delete contacts throws exception in okhttp 2.3.1+

Twitter Kit

  • Android

    • Bump Digits and tweet-ui dependencies

    • Allow non-filtered search results for SearchTimeline

MoPub

Fabric June Update

By Brian Lynn, Product Marketing Manager

While the Copa America fever catches on this June and excitement looms around our office, we still hunkered down and shipped a ton of new upgrades on Fabric for you -- even if that meant missing a game or two! Here’s the low down:

Understand your phone verification conversion funnel

If you use Digits to onboard users, you may have been looking for more insights into your conversion funnel and more flexibility in testing the Digits flow. That’s why in June, we’re excited to release two major upgrades for Digits: an integration with Answers and the Digits sandbox. Now, you can easily track login events and even log specific user actions within the Digits flow. Also, you can now run tests without triggering any rate limits -- more on the Digits blog!

Powerful, real-time analytics on the go

Since we launched the first Fabric mobile app, we’ve been heads down building out more functionality to help you dive deeper into your data and understand how your apps are growing. This month, we released a major upgrade to the app: the ability to drill into your most impactful adoption and stability metrics, such as DAU, MAU, and retention, so you can stay on top of your new releases on the go. Check them out in the original announcement!

Grow your app with mobile deep linking

User acquisition data for mobile apps is often fragmented between different marketing channels. And it’s even harder to understand which organic channels are most effective in driving new installs. To solve this, we released our integration with Branch: a powerful, multi-channel deep linking and attribution tool for growing your app and effectively tracking the source of your most engaged users. See what you can do with Branch in the original announcement.

Build your game into a successful business

As few months ago, we released Fabric support for Unity to solve the common challenges game developers face. In June, we made it even easier for you to turn your game into a thriving business with a brand new native MoPub integration. We also gave you more control to customize the setup process with manual initialization and deferred SDK activation during onboarding. See more in the original announcement.

Create powerful actions with fastlane plugins

We love developing fastlane with you and want to empower you with more freedom to help mobile developers and strengthen your bond with them. That’s why we also released fastlane plugins in June – a new, faster way to create actions and connect directly with the fastlane community. More here!

 

Here’s our internal changelog:

Fabric Platform

  • Android

    • Added the name of the exception to the Answers Crash event

Crashlytics

  • Android

    • Wrote the exception name to Answers when sending a Crash event

    • Updated Crashlytics Core and Answers dependency

    • Updated Fabric Base dependency for Beta by Crashlytics

Answers

  • Android

    • Facilitated sending the exception name with Crash events

Digits

Twitter Kit

  • iOS

    • Add SFSafariViewController support for login

    • Fix bug when Tweet includes a newline character

    • Add methods for getting tweets from `TWTRTimelineViewController`

    • Support `extended_tweet` mode for Tweet objects

    • Fix non-module header issue with CocoaPods and Swift

  • Android

    • Updated Twitter Core Dependency

    • Fix Fake ID exploit

MoPub

 

Introducing fastlane plugins: A new way to create powerful actions

By Hemal Shah, Product Manager

Introducing fastlane plugins

The beauty of open source software is that innovation can come from anyone, anywhere, and at any time. Over the past year and a half, the fastlane community has embraced this opportunity to make fastlane even better. These community-contributed additions, including approximately 80% of all fastlane actions and spaceship, have already saved millions of precious developer hours!

We love developing fastlane with you and want to empower you with more freedom to help mobile developers and strengthen your bond with them. Today, we’re introducing fastlane plugins – a new, faster way to create actions and connect directly with the fastlane community.

 

A whole new way to move fastlane forward

fastlane is comprised of hundreds of actions that make app deployment a breeze. From helping you distribute your beta builds to posting notifications in Slack channels, the possibilities of what you can automate to save time are endless! And because fastlane is open, everyone has the power to build on top of it.

Up until now, new actions that were proposed by our passionate community were merged into the main repository. To use them, all fastlane customers would need to upgrade their gems to the latest version. We’re excited to announce we’ve made this process even smoother with the new fastlane plugins architecture.

Think of fastlane plugins like building blocks; they’re a new, modular way to create and distribute actions independently of fastlane itself. In other words, these plugins allow actions to be added faster because they aren’t bundled into the main fastlane repository. Everyone has the power to invent, share, and deploy new plugins in this new architecture without waiting for PRs to be approved and gems to be updated – they’re your fast pass to making a dent in the mobile development universe! And everyone also gets instant access to tons of new actions. So, whether you’re a plugin creator or consumer or both, fastlane plugins are a win-win for the entire fastlane family.

I’m pumped to see where developers take fastlane via plugins. This gives people the chance to quickly create actions useful to their workflow, and then easily share them with the world.


Complete ownership of your masterpiece

You’re the boss of your plugin. From concept (what cool actions can you dream of?) to coding (#shipit) and promotion (share it with the world!), you’ll have control of your plugin’s design and destiny. Once your plugin is live, you’ll get to hear feedback from other fastlane customers and interact with them directly. This is your golden opportunity to showcase your talent and collect some good karma by giving back to the community!

To start creating new plugins, simply type fastlane new_plugin in your terminal and fastlane will walk you through the whole set-up.

fastlane new_plugin

Once you’re done, fastlane will generate the code that is necessary to activate your plugin and get it ready to publish to the world! Plus, this code will be all set to run on CI for automatic build and testing.

 

Easily discover actions

Rest assured, new and existing plugins won’t be buried out of sight because fastlane can quickly discover external plugins created by community contributors.

To see the wealth of new actions available to you, type “fastlane search_plugins” in your terminal. If you have a specific problem or task in mind, just add a keyword to the end of this query (type fastlane search_plugins [keyword]) for more targeted search results.

fastlane search_plugin

We also regularly update this page on GitHub with a list of all fastlane plugins. Some of our favorite plugins include github_status (to check on the status of GitHub’s APIs), and upload_folder_to_s3 (to store assets and artifacts in S3 on AWS). There’s even a fastlane plugin that plays victory music called tunes!

 

Instant access to new plugins – no updates needed!

You can create, use, and update plugins independently of the fastlane release cycle. There’s no need to update fastlane first, these plugins will work seamlessly with your existing version!

To install new plugins, just type fastlane add_plugin [name]. Within seconds, fastlane will retrieve the necessary code and generate the configuration files so you can immediately add the new plugin action into your local project.  

fastlane add_plugin

 

Onward and upward to a brighter future

We built fastlane plugins to empower you to make a meaningful and immediate impact. Together, let’s make fastlane even better. We can’t wait to see the amazing new actions our community builds! And remember, we love seeing your work so Tweet us a link to your new plugin once it’s ready to rock.

 

Fabric for Unity updates: Empowering game developers to build successful businesses

By Hemal Shah, Product Manager

Fabric for Unity Updates June 2016

Life is more fun when you get to play games. Games immerse us in new worlds, energize our competitive spirits, and provide endless hours of entertainment.

But building profitable mobile games is hard. We’re on a mission to fix that. In March, we released Fabric support for Unity (one of the world’s most popular game development platforms), to solve the common challenges game developers face. Our goal was to give you more time to create those delightfully addictive gaming experiences we all know and love. Since we launched, we’ve been blown away by your feedback:

As a publisher with developers worldwide, we use Fabric across our entire portfolio of games. We love that Fabric for Unity is incredibly simple to implement, free to use and provides us with powerful tools to make great games.


Today, we’re making it even easier to turn your game into a thriving business with a brand new native MoPub integration. Plus, we’re giving you more control to customize the setup process with manual initialization and deferred SDK activation during onboarding. Learn how to get started with these features below:

 

Transform your app into a thriving mobile business

Who would say “no” to earning more money for their smash game? For years, game developers have used MoPub to maximize their ad revenue. Now, the MoPub Kit is available directly in the Fabric for Unity plugin. There’s no need to install it separately – we’re bringing it to your IDE. With just a few clicks, you’ll be able to integrate a comprehensive monetization platform into your game and transform your app into a business.
 

Fabric for Unity MoPub ad

 

MoPub will give you ad serving for cross promotion or direct sales, free ad network mediation, and instant access to over 175 demand partners through the MoPub Marketplace, a leading real-time bidding exchange for mobile advertising. And you’ll never have to worry about compromising your user experience because MoPub allows you to create a customized native interface that fits naturally within your game. This is the easiest and fastest way to grab your piece of the $43.6 billion mobile advertising pie.
 

How MoPub's Ad Exchange Works

More control over initializing kits

Over the last few months, we worked closely with our customers to fully understand their game development process. One big takeaway was that some apps need to update their Terms of Service, or take care of other nuanced items, before being ready to initialize Fabric kits. To help with this, we’re giving you more control over the initialization of our kits to suit your unique app setup.

By default, Fabric kits will initialize automatically to ensure you get the best performance as early as possible, but if you need a little extra time at startup, you can enable “manual initialization” in the plugin and start Fabric whenever your app is ready.
 

Fabric for Unity Manual Initialization


Activate your app at your own pace

Building your app on Unity can take a long time - sometimes more than an hour! Yikes. We always want to save you time, so you now have the freedom to install as many Fabric kits as your heart desires with no pressure to build and run your app immediately. With deferred activation, you’ll be able to complete the kit installation process later, and build and run your app as it fits with your natural workflow.

 

Built-in dependency management you can depend on

Let’s be real: dependency management on Unity is not easy. You should be able to download updates without stressing over compatibility problems. That’s why we built an intelligent solution that will automatically manage dependencies for Fabric kits. For example, if you try to download a new kit that puts another at risk of breaking, we’ll alert you and tell you what you need to update first.

Basically, we’ll manage these kit relationships for you so you have peace of mind that everything will always work smoothly. Dependency management is a built-in safety mechanism for our Fabric for Unity plugin.

 

Making game development pain-free and fun

With Fabric, building mobile games is as fun as actually playing them. We’re passionate about helping you create new, imaginative, and interactive experiences that flourish into healthy businesses.

To take advantage of these enhancements, simply update the Fabric plugin directly in Unity. If you’re not using Fabric for Unity, just click the button below to get started. As always, we’d love to hear your feedback on what you’re up to and how you like our plugin!

 

Branch now available on Fabric: Grow your app with deep linking

By Jonathan Zazove, Product Manager

Since launching Fabric in 2014, we’ve partnered with some of the best mobile app tools to help you solve the biggest challenges in building your mobile business. Some of the challenges we’ve heard from you is that user acquisition data is often fragmented between different marketing channels, and sharing your app across those channels is really cumbersome. This makes marketing your app difficult, and you wouldn't know if you're converting users effectively.

To solve that, we’re announcing a brand new integration today: Branch, a powerful, multi-channel deep linking and attribution tool for growing your apps, is now available on Fabric.

Know which marketing channels work for your growth

While in-app analytics tools help you understand user engagement within your app, they don’t tell you which channels your users actually came from nor give you the ability to track that data. Branch’s deep links have solved this by carrying your referral data through multiple channels (i.e., web, app store) and the app install process. Now, by integrating Branch with Answers – our mobile analytics tool within Fabric (ranked #1 by SourceDNA) – you can easily start using mobile deep links to gain insights about where your user growth is coming from and how to optimize your marketing campaigns right within your Fabric dashboard.

Because Branch works with Answers right out of the box, you can instantly see which channel/content is driving the most installs – without any additional work on your part. You’ll also know right away how your current users are sharing your app which is vital to your business’s growth (we know first hand how important evangelists are from our own community!)

See Branch’s announcement to learn more about how it works.

Seamless installation for engineering teams

As with our other partner SDKs (e.g., Amazon, Stripe, Optimizely), we'll automatically provision your Branch keys so you can easily onboard your app if you already have an account with  Branch (if not, we can create one for you here). You can also install the Branch SDK or update to the latest version with a simple click on Fabric.

From our friends at 8Tracks:

Fabric's one-click-install and update functionality allows us to be sure that we’ll never miss a critical update for our SDKs. It’s the platform we trust when managing our SDKs!

 

We’re absolutely thrilled to get this into your hands so you can start optimizing your campaigns and get the most bang for the marketing buck. We look forward to continue helping you build and grow your mobile business!

Powerful, real-time analytics on the go with the Fabric mobile app

by Meekal Bajaj, Product Manager

Just a few months ago, we launched the Fabric mobile app so you always have visibility into your app’s stability and usage even on the go. Since then, many of you have requested more functionality within our app that can help you dive deeper into your data and understand how your apps are growing. We’ve listened!

Today, we’re releasing a major upgrade to the app: the ability to drill into your most impactful adoption and stability metrics, such as DAU, MAU, and retention, to stay on top of your new releases — all in real-time.

Your most important metrics, always at your fingertips

The questions driving key product decisions are often asked in meeting rooms and hallways. However, the lack of access to data in the moment means those questions are often left unresolved. This delay can impede even the best of teams from making the call on how to grow the business!

With today’s update, you can now quickly understand how your app’s user activity is changing over time by drilling into the daily active users graph. We’ll show you how many new users you are acquiring every day. By benchmarking your active and new users against the same time last week, you can immediately understand how your app is growing.

Don’t wait to open your laptop to investigate changes in user behavior. Now you can know right away how your retention and new users rates are influencing your monthly active user counts, directly from your phone.

Inform your decisions with the #1 mobile analytics & crash reporting solutions

To build the most engaging and stable apps, you not only need total visibility, but also data that you can trust. The data within the Fabric mobile app is powered by Answers and Crashlytics, the leading real-time mobile analytics and crash reporting solutions. With our latest update, you’ll have the freedom and confidence to make informed product decisions for your mobile apps -- anywhere, anytime.

From our friends at Instacart:

We love the Fabric mobile app. Its real-time analytics makes it the first place we look to when we need to get a pulse on how our apps are doing. Our team checks it at least several times a day!


Keep your latest release at the forefront

Launch day is stressful for any app. With so many moving parts, the risk of something going wrong is high. With the Fabric mobile app, you can stay on top of new releases by monitoring the adoption and stability of your latest version on the go. Also, you can explore the top issues by day through the crash-free users graph. And if you see your stability diverge from what it should be, you can easily filter down to the specific issues and take action.

We’re thrilled to ship this new update and are excited to continue helping you make informed decisions about your app wherever you are. To get the latest features, just update your app through the Apple App Store or Google Play Store. We can’t wait for you to try it!

Productionizing GraphQL.js: How we protect customer data & site uptime

By Sam Neubardt, Software Engineer

We recently released Fabric mission control, a new dashboard on fabric.io that shows the pulse of all your apps. In order to build mission control, we needed to query for metrics across multiple apps, which would’ve been very difficult to integrate into our existing REST endpoints. Therefore, we decided to create a new service to handle GraphQL queries (Fin Hopkins went over GraphQL basics and introduced our usage of it in a previous post). To do this we used GraphQL.js (a library that serves as the reference implementation of the GraphQL specification) as our core query resolver. We were incredibly happy with GraphQL.js as it’s flexible and easy to work with, however, little is prescribed in terms of production operation.

Before putting this new tool into production, we needed to solve two common problems that almost all developers face: how can we protect our customer’s data and be confident that abuse will not impact the availability of the site?

Infrastructure context

Let’s start by defining exactly what proper access control is: it is knowing both who is making a request (authenticating them) and if they’re authorized to perform the operation they’re requesting. GraphQL.js can easily be exposed as an HTTP service using express-graphql (an adapter library that provides an Express handler). Express is a popular framework for writing HTTP services with Node.js, so we had plenty of options for common concerns like authentication, logging, and CORS. We used OAuth 2 to authenticate requests, but still needed to figure out how to authorize access to fields in our schema to ensure that we protect our customer’s data.

For some extra context, we store data across a number of backend systems. Rather than embed access rules in each of them, we decided to consolidate authorization logic in our GraphQL server. Having a single set of access rules for resources reduces the responsibilities of the services that own those resources. The flexibility of GraphQL.js allowed us to integrate these rules with our schema to build a single representation of the available data and the conditions that allow access to it.

Schema basics: GraphQL.js 101

Before we dive into our solution, here’s a refresher on GraphQL.js. GraphQL requires a schema that describes the entities in your system and their relationships with each other. You can define a new type with GraphQL.js using the GraphQLObjectType constructor:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
   },
 }),
});
 

Each field on a GraphQL type has an associated function (called its resolver function) to fetch the value for that field from the input data (called the source). Many resolvers are simple — they just perform a field lookup off the source data (this is the default behavior and in this case the resolver can be omitted). Resolvers can also perform arbitrary complex operations — such as making a request to another service and parsing the response.

In addition to the source data, resolvers are also called with a context object. It contains data specific to an individual GraphQL request. We use it to inject caches, a logger, and information about the authenticated account.

Authorizing access to the GraphQL schema

Now that you’re all caught up on GraphQL.js let’s take a look at how we added authorization to our schema.

A schema’s resolvers are the key abstraction through which its behavior is defined. So we modified the resolve functions in our schema to check authorization. Given this type in our schema:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: (source) => source.identifier,
   },
 }),
});
 

Here’s how we added authorization checks to the resolve function:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: (source, _args, ctx) => {
       if (ctx.account.canViewApp(source)) {
         return source.identifier;
       }
     },
   },
 }),
});
 

And since resolvers are just functions we can modify their behavior using function composition, which allows us to abstract this pattern:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: makeAuthorizedResolver(
       (source, _args, ctx) => ctx.account.canViewApp(source),
       (source) =>  source.identifier
     ),
   },
 }),
});
  
function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  return function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  }
}
 

We even factored the authorization checker out so it could be reused:

export default new GraphQLObjectType({
 name: ‘App’,
 fields: () => ({
   identifier: {
     type: GraphQLString,
     resolve: makeAuthorizedResolver(hasAccessToApp, (source) => {
       return source.identifier,
     }),
   },
 }),
});

function hasAccessToApp(source, _args, ctx) {
 return ctx.account.canViewApp(source);
}

function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  return function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  }
}
 

The authorization primitives we wrote are highly reusable which makes it easy to check access across the schema. Using makeAuthorizedResolver ensures that we’re checking authorization consistently across the code base. We’ve found that the best way to prevent errors is to build systems that make it easy to do the right thing. But we wanted to take things a step further; to not only make it easy to check authorization on every field but to require it.

Mandating authorization in GraphQL schemas

Requiring explicit authorization on every field in the schema gives us a strong guarantee that we’re controlling access to our customer’s data. To do this we took advantage of the flexibility of JavaScript to build a new abstraction into our resolve functions. Since functions are objects we can assign new fields to them at runtime — in this case information to mark them as a special “authorization” function:

function makeAuthorizedResolver(authorizationCheckFunc, resolveFunc) {
  const resolver = function authorizedResolver(...args) {
    if (authorizationCheckFunc.apply(this, args)) {
      return this.resolveFunc.apply(this, args);
    }
  };
  resolver.checksAuthorization = true;
  return resolver;
}
 

If a field in a type we define is missing a resolve function tagged as one that checks authorization, then tests will fail. This moves authorization to the forefront of an engineer’s mind as they make changes to the schema.

We even generalized this into a facility for checking arbitrary properties on our resolvers by “tagging” additional fields onto the resolver function and verifying their presence in tests. This is a shared code base (meaning engineers may not have all the necessary context when making changes), and people make mistakes. Verifying our schema in tests helps us ensure that the appropriate guard rails are in place to prevent human error from taking down the site, and has proved to be an effective strategy as we’ve increased the number of developers working on our GraphQL server.

Preventing abuse without sacrificing agility

After implementing authorization in our schema we moved on to figure out how to protect our GraphQL server from abuse. Since it handles queries for arbitrary data served by multiple backend services a bad query could impact other systems that our customers rely on 24/7. Even if no one makes intentionally malicious requests, there’s still the chance that we’d accidentally ship a bad query to production (could you imagine taking down the site due to a preventable mistake?). However, we didn’t want to put up fences that would get in the way of product development. We identified and implemented a couple of key techniques to protect the availability of our system while maintaining the properties that allowed us to work fast with GraphQL.

First, we restricted the total concurrency of a single request. Since our GraphQL server is dispatching requests to other services asynchronously a single query can result in many concurrent downstream requests. We’re primarily concerned with limiting the impact to other services, and preventing requests from getting made felt more straightforward than parsing a query to attempt to infer its impact statically. Large queries have little effect on our GraphQL service itself as it’s a service composition layer with little logic of its own. We can easily scale it out if needed since it’s totally stateless (our backend services require more attention to increase the capacity of their data stores as well).

To enforce this restriction, requests to other services must first acquire a permit on a per-query semaphore before executing. The total concurrency per query is limited by the number of available permits.

We also added a limit to the total execution time of a request. Long running queries are stopped after this timeout elapses. This, along with the concurrency limit, places an upper bound on the concurrent work allowed by a single inbound request — in effect limiting the “breadth” of a query.

We can use these limits to understand the worst case performance of our system. Understanding and limiting the work that could be done by the service allows us to be good clients. These restrictions are all instrumented so we can keep track of their impact and understand if we need to adjust them. We’ve found that these techniques have provided a good degree of safety against overwhelming the server, without getting in the way as we write queries. The instrumentation we added makes it clear during development if a query gets restricted, giving the developer the chance to improve it before going to production.

Success!

Overall we’ve been really pleased working with GraphQL. It was great to quickly integrate GraphQL with other services that allowed us to rapidly iterate on customer features, rather than non-user facing infrastructure. Head over to fabric.io to see it in action!

 

We're helping our customers build the best apps in the world. Want to be a part of the Fabric team and build awesome stuff? Check out our open positions!

Building Fabric mission control with GraphQL and Relay

By Fin Hopkins, Software Engineer

A few weeks ago, we shipped mission control, a new dashboard for Fabric that shows you the most important information across all of your apps on the same page. To build it, we turned to two fairly new technologies, GraphQL and Relay, because of the flexibility they bring to fetching data. Although investigating and productionizing these new technologies added an upfront cost to the project, we found that they paid off over the course of development and we’re excited by their potential as we develop more for Fabric.

What does it take to responsibly dive headfirst into a new technology and framework? Here’s how we went about it:

Bringing together the data

Just from the description of mission control (“all your apps, all their important information”), we knew that we were going to faceplant into the limitations of our existing API architecture. Before mission control, pages on fabric.io were limited to showing one kit’s worth of information for one app at a time, and our RESTful APIs and backend data providers reflected that design. If we were going to show you the most important data for any of your kits, for all of your apps, in under 500 network requests from the browser, we’d need to build something new.

That “new” could have been mission control–specific endpoints in our Ruby on Rails API layer, but, as we’ll see, that would have been forcing an architecture we already weren’t satisfied with to do something it wasn’t suited for. Instead, we took this as an opportunity to vet GraphQL, a technology that, on its surface, was tailor-made to our problem. If this experiment went well, we could see ourselves adopting GraphQL for more features, bringing its benefits to all Fabric teams.

Rendering a page with the information diversity and density we were going for requires making multiple API calls to a variety of backend systems, such as those for Answers, Crashlytics, and Beta. A RESTful public endpoint that combined those sources would actually spend most of its time waiting for those API responses, something our existing Ruby on Rails setup is decidedly poor at. Making the API calls in serial would take far too long, but parallel requests in Rails would require bringing in a concurrency library like EventMachine, and even then we’d still be tying up one of our limited Unicorn processes for the duration of the request.

GraphQL for a better server

GraphQL, developed at Facebook, is a query language for, well, graphs of data. You start with a strongly-typed schema of your data, which is defined principly as objects and their fields. A user Account might have strings for name and email address, but it might also have a “connection” to a list of Apps. Those Apps will have their own fields, like name, icon, or current number of active users. An App might also have a connection back to a list of member Accounts. GraphQL lets you start at a “root” in your schema — say, the current account — and query for the subset of fields you’d like returned. In our case, one query might be for the account’s starred Apps, their names, icons, and the timestamp / value pairs of their daily and monthly active user data.

It’s important to note that the queries come from the client. For mission control, that’s a webapp written in JavaScript. The server is a general engine that can fulfill any query that matches the schema. That flexibility will be very important later on.

By using the reference GraphQL implementation, graphql-js, we would have access to Node’s native concurrency, giving us the “wait fast” behavior we want. Backend API requests could happen in parallel, and running out of Unicorn workers during those waits wouldn’t be a concern. This has since been proven in production: loading the mission control details for an app can approach two dozen internal API requests but still return in only a few hundred milliseconds to the browser.

Relay for a better process

Adopting GraphQL would also give us the opportunity to adopt Relay, another Facebook library that integrates GraphQL and React (we love React). Relay essentially annotates React components with a GraphQL query that describes the data they need for rendering. Defining the query next to the rendering code allows a component to be developed and maintained in isolation, rather than in concert with server-side API changes. That means it’s faster and easier to make changes during development.

We knew we would be rapidly iterating mission control in response to usability studies and beta tester feedback, so anything that reduced what we needed to change to bring in new data would pay off and speed those cycles up. Having new data available with just a tweak to the GraphQL query and a hot reload in the browser changed how we were able to work. We iterated on mission control in mob sessions with our product manager and designer, and Relay let us instantly respond to their feedback and see changes working live.

“Go slow to go fast”

After kicking the tires of graphql-js and Relay (“Does it do what it says it on the tin? Can we do development / testing / logging / monitoring / deploying / &c. up to our standards?”), we got a thumbs up from other Fabric engineers and buy-in from our product manager to give it a shot for mission control. We were upfront that this was a “go slow to go fast” strategy: getting a GraphQL server and Relay frontend infrastructure up-and-running was going to take some initial time that wouldn’t be spent shipping new features to our customers, but once it was in place, we were betting we’d be able to write our feature (and hopefully many more) much more quickly than we could have on the old stack.

Adopting graphql-js

Though we’ll have more to say later about specific productionization and hardening steps we took, putting graphql-js on top of our JSON-returning backend services was straightforward. Though any unification of previously-disparate data sources will require some smoothing over of inconsistencies, on the whole we were able to craft a solid schema out of the most important Crashlytics, Answers, and Beta data.

Our best advice to new graphql-js users is to build your schema out slowly, so you can see how your data model will get consumed by a frontend client, and also to lean heavily on DataLoader to dedupe, cache, and adapt multiple one-off requests to use bulk endpoints. We also have become fans of marking any field we can as “not-null,” for reasons we’ll explain in a future post. (Spoiler: you can automatically generate valid Relay data for testing and development.)

Speed bumps in production

Development was going swimmingly against development backends and fixture data, but once we got mission control loaded up in production we saw that it actually took quite a long time to see any apps on the page. Despite all of the parallel fetches and concurrent processing in our GraphQL server, we’d see the loading spinner for sometimes as long as 10 seconds! It was a terrible experience for what was due to become the new fabric.io home page.

In that first iteration, our by-the-book use of Relay and GraphQL led us to an extreme that was ill-suited to our backend’s characteristics. Relay works by gathering up the data requests for all the (transitive) sub-components of a particular root component and combining them into a single query to the backend. That meant that we were making a single request for all of the mission control data at once: metrics, issue counts, velocity alerts, and so on, our first page of 25 apps. To fulfill such a query, our GraphQL server was making scores of requests to our backend services, and, even though they were mostly in parallel, it couldn’t return anything to the browser until they had all completed.

In an ideal world, these requests would all be consistently performant, but in our situation the backend services would occasionally hit a snag that would add a few hundred milliseconds or even a couple of seconds to their response times, delaying the rendering of anything in the browser. As we added to mission control and the GraphQL query grew, the number of internal requests — and the chance of this happening — grew along with it.

An even worse case would happen when one of the dozens of internal requests timed out or had an otherwise transient error. This would add an error to the response — which Relay interprets as a failure — requiring a second attempt from the client while the loader still spun. Of course, there was no guarantee that this next attempt wouldn’t have its own transient errors, leading to a sort of starvation by flakiness.

Though Relay’s mega-query was an efficient use of client-side network connections, it was trading that against the time-to-first-render of the page. Luckily, while Relay and GraphQL were leading us into making these giant, flaky queries, they also provided the tools we needed to fix them.

Smaller batches of data

Our solution was easy enough: split up the queries. We knew we could request the basic information about your apps in a small number of bulk requests to backends that had very predictable performance. With that data, we could start rendering rows for each app and make the page functional for navigation while we brought in the metrics and highlights information. Separating each app’s detailed data into its own request would isolate a slow response to just a single app, not the whole page.

To accomplish this in Relay, we made our AppRow component take “app” and “appDetails” props, each with its own fragment. The former fragment requested the bare-bones data and was referenced by our page’s top-level RootContainer. We then wrapped each AppRow in its own RootContainer to load the “appDetails” fragment (while passing through the “app” prop).

// MissionControl.jsx
render() {
  return <Relay.RootContainer route={appListRoute} Component={AppList}/>;
}

// AppList.jsx
render() {
  return <div>
    {this.props.account.apps.map((app) => <AppDetailsLoader 
appId={app.id}><App app={app} appDetails={null}/></AppDetailsLoader>)}
  </div>;
}

// AppDetailsLoader.jsx
render() {
  const appView = React.children.only(this.props.children);

  return <Relay.RootContainer
    route={new DetailsRoute({appId: this.props.appId})
    Component={App}
    renderLoading={() => appView}
    renderFetched={(data) => React.cloneElement(appView, {appDetails:
data.app})}
    />;
}

 

It’s important to note that this refactor of the queries was entirely done client-side. Because of GraphQL’s flexibility, we were free to make the connection / responsiveness tradeoff that was appropriate to the experience we wanted. If we had resigned to make this change with a legacy-style, fixed API, we would have had to split out the code on the server and then maintain two endpoints instead of one. Furthermore, a different frontend client (on mobile, perhaps) wouldn’t have been able to choose its own performance tradeoff without writing yet another endpoint to the same data.

GraphQL is not a magic wand

This was an important lesson for us and one that anyone adopting GraphQL will have to pay attention to: combining data from multiple sources is a big advantage of using GraphQL, but the more distinct backends or internal requests that go into servicing a single query, the more you will have to consider the case where one of them fails.

This experience also caused us to rethink how we wanted to handle retries and backoff. We were hoping to keep all retry logic on the client for operational simplicity, but, if just one internal request had a transient failure, a client-side retry would not only waste all the work that did succeed from the first request, it would be at risk for its own transient failure. Since most of our backend failures and timeouts were transient, rather than consistently slow, we added a retrying wrapper around request-promise in our GraphQL server to re-do those requests. This simple change eliminated 99% of the errors when resolving queries, and the expense of a second or two of extra latency in cases where a retry occurred after a timeout.

Going fast

While we can’t compare our GraphQL / Relay implementation to mission control built with RESTful endpoints on Ruby on Rails, we’re satisfied with both the pace and the experience of developing mission control. We’re confident that “go slow to go fast” paid off. Even if the “go slow” made things take longer than just following our old API pattern, we can now be in “go fast” mode from here on out, as can everyone else doing client development at Fabric. GraphQL has let us build a platform for ourselves that is delightful to build upon.

We took Relay to production with eyes open about its pre-release status. We expected a few rough edges, and we found some: pulling in connections a page at a time was awkward; after the page was open for a while polling for updates, running a mutation (starring an app, for example) could generate a query with 30K of duplicate fields. We were able to write workarounds in both cases (a mixin for paging in connections, and an alternate query tracker that continuously collapses), and we’ve found the maintainers at Facebook are very responsive and helpful when we run into things.

For a project like mission control, GraphQL and Relay were a near-perfect solution, and the cost of building it any other way justified the investment. Now that we have these pieces in place, we see ourselves using them again and again.

Stay tuned for our next post, where Sam Neubardt is going to share more about how we extended graphql-js to make a productionized GraphQL server.

 

We're helping our customers build the best apps in the world. Want to be a part of the Fabric team and build awesome stuff? Check out our open positions!

Fabric May Update

By Annum Munir, Product Marketing Manager

May is an exciting time for mobile developers. Whether it’s the start of summer or the kick off of conferences, app development teams are spoiled with new products and improvements. In May, we shipped a bunch of features to save you time, speed up user login, shed more light on user behavior, and make it even easier to monetize and grow your app. Here’s a roundup of what we released:

Bringing powerful PRs, one-click installation, and enhanced deployment options to fastlane

Going forward, you don’t need to locally compile your app just to test and preview a change. With fastlane, you can now do it straight on GitHub from the pull request! We also introduced one-click installation (so it’s even easier to get started with fastlane) and added support for two-step verification for stronger security. On top of that, fastlane now supports uploading of APK expansion files and you can quickly promote existing beta builds straight to production on Google Play.

P.S. Try deploying fastlane with the rocketship emoji! You can totally do this.

Read the full announcement.

Dynamic routing supercharges Digits login performance

With Digits, we released dynamic routing to further improve SMS delivery and boost login conversion rates. Dynamic routing allows us to intelligently send your Digits SMS confirmation code through the best quality route (to thousands of carriers in over 217 countries) with greater speed and ironclad confidence.

If extenuating circumstances delay an SMS confirmation code from arriving quickly, Digits voice fallback will save the day and deliver the codes via a voice call. Dynamic routing is completely free and automatically enabled for you!

Read the full announcement.

More visibility into business-critical user actions with Answers

With our latest update for Answers’ event attributes feature, you will now see the top 10 categories for each category event attribute! This update helps you easily discover the most popular categories, and see how they change and trend over the past 30 days. We’ve also added new drill-down options so you can toggle and customize your graphs to suit your unique app goals.

Read the full announcement.

Seamlessly monetize your app with Twitter Kit + MoPub

This month, we officially launched our integration of Twitter Kit and MoPub, making it easy for developers to insert MoPub ads directly into the Twitter content they display in their Android and iOS apps. Now, with just a few lines of code, you can engage your users with a dynamic timeline of Tweets and build your business with native MoPub ads that fit seamlessly into the stories you want to tell.

Doing more with 140 characters

In addition, we announced an upcoming set of changes (rolling out over the next few months) to enable people to express even more within 140 characters on Twitter. These changes will allow for richer public conversations that are easier to follow, and ensure people can attach extra elements, media, and content to Tweets without sacrificing the characters they have.

Read more about these changes and how to transition your products in our Twitter Developer Blog.

Here’s our internal changelog:

Fabric Platform

  • Android

    • Improved Fabric SDK initialization time

Crashlytics Kit

  • Android

    • Updated Fabric Dependency

Answers Kit

Digits Kit

  • iOS

    • More specific error types around contact upload error

    • More verbose debug console logging

    • Updated Fabric Dependency

  • Android

    • Updated Fabric Dependency

Twitter Kit

  • iOS

    • Fixed non-modular import error in Cocoapods

    • Monetize your app by seamlessly displaying native ads from MoPub’s ad exchange in-line within your Twitter timelines

    • Fix bug where retweets are not filtered properly when using `TWTRUserTimelineDataSource`

    • Better error handling around web auth

    • New convenience method for requesting Twitter user email

    • New delegate methods on Tweet detail view controller

    • Linkification in Tweet detail view controller

    • Updated Fabric Dependency

    • Allow #hashtags to be pre-filled in Composer

  • Android

    • Initial release of twitter-mopub

    • Monetize your app by seamlessly displaying native ads from MoPub’s ad exchange in-line within your Twitter timelines

    • Allow #hashtags to be pre-filled in Composer

    • Updated Fabric Dependency

MoPub Kit

Bringing powerful PRs, one-click installation, and enhanced deployment options to fastlane

By Hemal Shah, Product Manager

launching-fastlane-prs-one-click-install-deployment-upgrades-header.png

We know that time is your most precious asset. Our goal is to help you and your team spend more time creating amazing user experiences — not waste it by drudging through cumbersome, repetitive deployment tasks.

That’s why, eight months ago, we welcomed fastlane into the Fabric developer toolbox streamlining the entire app deployment process. Since then, fastlane has already saved over 1 million developer hours! Here are some more exciting updates from the fastlane family:

Introducing device grid: painlessly preview app changes from PRs

Constantly improving your app is awesome. You know what’s not awesome? Having to manually attach screenshots to every feature change, being forced to download remote changes and compile a new build locally, and having to test a beta build and then fiddle through app screens just to make sure a new feature works.

Instead of doing all this work, wouldn’t it be nice to test your app directly from a pull request? Imagine the amount of time you could save if you were able to interact with code changes in the same place where you already give feedback. Well now you can!

Device grid by fastlane takes the grunt work (and the guesswork of how app changes will look and feel) out of this process by allowing you to easily stream your latest app changes on a virtual simulator right from a browser. With fastlane, GitHub, danger, and Appetize.io, you can interact with your new code straight from a PR. Get started with device grid today.

One click and you’re done: install fastlane via the Fabric Mac app

fastlane makes app deployment fast and simple. So naturally, installing fastlane should be just as fast and simple too, right? Up until now, you could only install fastlane from the command line via Ruby. Moving forward, we’re giving you another, quicker option: fastlane can now be installed with one click from the Fabric Mac app.

We’ll bundle everything you need to run fastlane and even check to make sure you don’t have an existing version installed, so you don’t need to worry about any dependency conflicts.

Two-factor authentication support for greater security and control

We understand that you want extra security when deploying builds using fastlane. Recently, Apple allowed support for two-factor authentication for iTunes Connect, and we’re pleased to announce that all fastlane tools now support two-factor authentication. If you choose to use 2FA for your developer portal or CI systems, we’ve got your back.

Here’s how to use 2FA on a CI system.

Android expansion files and Google Play build promotion

We’re incredibly proud of the open source community around fastlane. Every day, developers contribute amazing things that make fastlane more powerful and efficient. Two particularly awesome community contributions we want to highlight are: support for uploading APK expansion files and a new option for promoting APK between tracks.

These updates will help you better manage your APK expansion files and quickly promote beta builds straight to production on Google Play, skipping the online submission process.

Here are the release notes for uploading APK expansion files and promoting APK between tracks.

More time = more power

Our mission is to solve and automate the tedious aspects of mobile development and give developers more freedom to innovate and create. We can’t wait to see what you build and deploy next with lightning speed!

P.S. As a bonus treat, you can now trigger and run fastlane with the rocketship emoji. Seriously. Give it a try and let us know when your next deployment is underway!

Introducing Fabric mission control

by Meekal Bajaj, Product Manager

Since we launched the Fabric mobile app for developers in February, we’ve been using Fabric’s web dashboard (fabric.io) to stay on top of how our own app is performing. Many times we found ourselves switching back and forth between different dashboards for our production and dogfood builds. Knowing that many of you monitor a lot more apps every day, we set out to build something that can make this experience completely seamless and empower you to know your apps’ performance easily at any moment.

Today, we’re thrilled to introduce Fabric mission control — the pulse of all your apps on a single, intuitive dashboard.

One stop to keep up with all your apps

When key information about your apps lives across different dashboards, it’s hard for the team to have the context they need to make the best decisions. While Fabric today gives you the #1 crash reporting and mobile analytics tools that show you the pulse of your apps, those insights live on different dashboards on fabric.io. We wanted to take that experience to a whole new level.

With Fabric mission control, we bring together the critical top level information across all your apps onto one single dashboard. Now, you get a complete view to easily see the pulse of your apps at a glance.

We’ll be rolling out access and enabling the mission control dashboard for all customers over the next few days. Once it’s enabled on your account, it will automatically be set as your default starting page when visiting fabric.io. You can easily toggle mission control on and off to chose the dashboard experience that works best for you.

From our friends at BuzzFeed:

Fabric’s new mission control is the first thing we look at everyday. We have it up on the TVs at our office so we can monitor our DAU, crash rate etc. across all of our key apps at any given moment.

 

Data that truly matters — front and center

It’s important to stay on top of the most critical issues affecting your apps. Fabric sifts through millions of issues and events every day and brings you the most important information about your apps. We’ve distilled all that data on your mission control so you can hone in on the areas that need your attention right now.

On your new mission control, you can jump straight to critical issues or see a summary of how your top build is performing. If you’re wondering how well-tested your latest beta is, you can see that as soon as you open your web dashboard.

Key apps and data points —instantly accessible

Fabric lets you decide which apps you want to focus on, and in which order on mission control. Simply favorite an app to pin it to the top or reorder your apps so that the most important ones are the first you see. 

You can also easily locate an app or a number of apps via the search bar built right into your mission control. When searching, we filter the list in real-time to only show the apps that match what you are looking for. Clicking on each metric takes you directly to the details you need.

We couldn’t be happier to get this into your hands. We truly believe that the new Fabric mission control is yet another huge step toward our mission to help you build the best apps. Sign into fabric.io and check out the new mission control!

New milestone achieved: over 2 billion active devices

By Rich Paret, General Manager, Developer Platform

Ever since we launched Crashlytics four years ago, our mission has always been and remains the same: to build tools that mobile app development teams love. That’s why we built Fabric, which reached a huge milestone last July by serving over one billion active devices around the globe.

Today, just nine months after reaching our first milestone, we’re proud to share that we’ve doubled our previous achievement: Fabric is now serving over two billion active devicesmeasured on a 30-day basis — on both iOS and Android.

It’s been an amazing journey to see Fabric being used and trusted by tens of thousands of top apps around the world. Thank you for trusting your business to Fabric and Twitter; we take that commitment seriously and look forward to continue supporting you in building the best experiences for your customers. Let’s put a dent in the universe together.

Cheers,



fastlane has saved over 1 million developer hours

By Felix Krause, Founder of fastlane

Four years before joining Fabric, I was building an iOS app with two other developers. We were so excited to push the latest update to our customers, but we had to spend an entire day taking & uploading screenshots and figuring out how to use iTunes Connect. It was incredibly frustrating and I knew there had to be a better way.

Fast forward to 2015: I wanted to solve this pain for myself and other developers once and for all, so I built fastlane to streamline the entire app deployment process. What use to take days or weeks now takes minutes — or even seconds — using fastlane. Then 8 months ago, I had started monitoring how much time fastlane is saving for the community.

Today, I’m thrilled to share that fastlane has saved over 1 million developer hours. On behalf of the Fabric team, I’m humbled by the incredible response for fastlane thus far. I never imagined its impact would be this large.

With 1 million hours being equivalent to over 114 years, my Fabric colleagues and I were excited just thinking of all the cool things developers could do with all that time back. A few ideas we had:

  • Build 28 more Golden Gate Bridges in San Francisco
  • Circle the globe 15,000 times in an airplane
  • Watch all Star Wars movies 75,000 times
  • Make a round-trip flight in a space shuttle from Earth to Pluto almost 4 times

We look forward to continue supporting you in your app development journey. In the meantime, let us know what you've done with the time you saved — we’d love to hear it!

Fabric March update

By Jonathan Zazove, Product Manager

Between the holidays and celebrations in March, we haven’t forgotten our mission to build the best developer tools to make your lives easier. During March, we hunkered down and shipped a number of major releases: Fabric for Unity, Nuance Kit and fastlane for Android v1.0, among other upgrades and enhancements.

Doubling down on games with Fabric for Unity

For years, Twitter has helped game developers deliver amazing experiences through rich content and app distribution tools that drive discovery and conversation about your content. Within the Fabric team, we doubled down on that support by releasing Fabric for Unity earlier this month. Now, you can easily build, distribute, and monetize your games with best-in-class tools all readily accessible in one place.

Read more on the full announcement.

Nuance SpeechKit now available on Fabric

Today, we're thrilled to share that Nuance have made their SpeechKit SDK available via Fabric. Nuance gives you tools to quickly develop a natural speech interface for applications. They offer highly-accurate cloud speech recognition, an extensive portfolio of natural sounding text-to-speech voices, and the flexibility to use their speech with a variety of platforms and languages. Just like all of our kits on Fabric, you can install or update the SpeechKit with just a few clicks. We take care of all the grunt work like provisioning your keys, so if you already have an account with Nuance, you can easily onboard your app.

fastlane for Android: now official

Since we opened beta access to fastlane’s support for Android a few months ago, we’ve been expanding its capabilities and doubling down on serving the mobile ecosystem. Today, we're thrilled to share that we're officially releasing fastlane for Android v1.0. Now, you’ll get the same award-winning app deployment experience as on iOS. We’re really grateful for the strong fastlane community whose contributions helped bring a stable, reliable version for us to release. We're excited to continue helping you build, test and release the best apps and updates to the Google Play Store!

 

Here’s our changelog:

Fabric Platform

  • Unity

    • Released Unity plugin with Crashlytics, Answers and Twitter Kit integrations.

  • iOS

    • Shipped the Nuance SpeechKit.

  • Android

    • Shipped the Nuance SpeechKit.

    • Released fastlane for Android version 1.0.

Crashlytics Kit

Answers Kit

Digits Kit

Twitter Kit

  • iOS

    • Fixed issue using a `TWTRTimelineViewController` as the root view controller of a Storyboard.

    • Deprecated support for iOS 7.0.

    • Added TWTRTweetDetailViewController for showing full size images.

    • Added `geocode_specifier` property to `TWTRSearchTimelineDataSource` to allow filtering by location.

    • Added `topTweetsOnly` property to `TWTRSearchTimelineDataSource` to allow the default filtering of Tweets.

    • Changed `TWTRTimelineViewController` to use automatic cell heights.

    • Shipped automatic update on the timestamp on `TWTRTweetView` every 30 seconds.

    • Shipped support for Dynamic Type for accessible text sizes in `TWTRTweetView`.

    • Removed deprecated methods on `Twitter` class.

    • Removed methods from `TWTRTweetViewDelegate` in favor of `NSNotifications`.

    • Added TWTRLoginMethods enum to allow developers to decide which login method they would like to use.

    • Made `-[TWTRAPIClient uploadMedia:contentType:completion:]` public.

    • Remove the TWTRShareEmailViewController.

    • Improve image size selection logic for Tweets with attached media.

  • Android

    • Removed Verisign Class 3 Certificate from pinning list.

    • Fixed JavaDocs.

MoPub Kit

Doubling down on games: introducing Fabric for Unity

By Hemal Shah, Product Manager

Think back to the first game you ever played. Do you remember your high score or the feeling when you beat the level you spent all night trying to get past? We do too. For years, Twitter has helped game developers deliver amazing experiences through rich content and app distribution tools that drive discovery and conversation about your content.

Within the Fabric team, we want to double down on that support, and make it even easier to help you build, distribute, and monetize amazing games with best-in-class tools. That’s why today we’re thrilled to announce that Fabric now supports Unity, one of the most popular game development engines in the world.

 

Focus on building. We’ll help take care of the rest.

In building Fabric for Unity, we worked with hundreds of amazing game developers and learned that a wide variety of teams are facing many of the same challenges:

  • building a stable game for every user
  • surfacing metrics that matter
  • acquiring more customers
  • generating revenue

As we set out to build Unity support for Fabric, we wanted to bring our award-winning SDKs to game developers that leverage the Unity engine. We crafted a streamlined onboarding and update experience through one unified Unity plugin that would give you time back each week to focus on building your game.

Integrated straight in your Unity IDE, there are no extra steps required when you want to install or update any of our SDKs. We know that you're comfortable in your IDE, so with Fabric, you never have to leave it.

With Fabric, the idea of a single tool that will not take long to implement but give us a broad reach in terms of capabilities in Unity, is a huge offering.


A great game starts with a stable base. Using Crashlytics, the #1 crash reporting tool, you get the best of iOS and Android crash reporting to your native and C# code. We perform a deep analysis of each stack trace to identify the most important frames so you can see the exact cause of the crash and immediately address the issue.

Crashlytics was integral to the development of our hit mobile games Star Trek Timelines and Game of Thrones Ascent, and vital to the live operations of both titles. The detailed crash data empowers our engineers to quickly drill down on specific issues, and the visualization tools provide product managers and producers a clear picture of how our crash metrics shift with each new game update. A minimal crash rate means happier players, and Crashlytics is our tool for achieving that goal!



We also know that game analytics can be a hassle. With every chart, graph and filter imaginable, finding the data you need can be time-consuming. Having real-time insights about what your customers are doing in your app will save you time and overhead costs. That’s where Fabric comes in.

Answers, part of the Fabric suite of tools and seamlessly integrated with Crashlytics, is a perfect match for game developers. Out of the box, it has events that match directly to your game milestones, including:

You can even log any custom event for the unique situations and player scenarios your game has. Our analytics support for Unity gives you the easy wins when it comes to getting the most important metrics you need to make key business decisions -- all in real-time. And with the Fabric mobile app, available on both iOS and Android, you can be notified about key stability and performance alerts on the go.

 

Unlock growth with Twitter – globally

Building a great game means attracting and retaining as many users as possible. As you know, you need to find the most efficient ways to get new customers excited and continue that emotional high for current users.

With Fabric, you can tap into the power of Twitter and attach rich photos, videos and other media experiences to Tweets that drive traffic to your website or app. Victories are sweetest when celebrated. Twitter provides a unique platform to let your players celebrate their triumphs in real time. The Twitter feed is live, public, and conversational; our tools give you the ability to make your game a part of that conversation. With Twitter through Fabric, you can create a way for players to quickly Tweet in a way that feels natural to your game.

To make sure you’re getting the widest and most effective distribution possible, you can even leverage Twitter’s mobile app promotion ecosystem.

Twitter was my virtual leaderboard. 100 percent of the initial discovery of my game came through Twitter because of the 'Tweet your score' button.



Build a business. Maximize ad revenue.

MoPub has been used by game developers since its inception five years ago to help maximize the value of ad supported games. The system offers a single, comprehensive monetization platform that can be seamlessly integrated through Fabric. You can take advantage of all the major ad formats in mobile to create a customized experience that fits naturally with the content of your game.

Our system gives you free ad serving for cross promotion or direct sales, free ad network mediation, and immediate access to over 175 demand partners through MoPub Marketplace, a leading real-time bidding exchange for mobile advertising.

From our friends at FEO Media:

Moving to MoPub for network mediation has been one of the most positive steps this year for the company; not only for increased revenue, but because of the additional controls and transparency.

 

The most seamless game development experience

Our passion is to build developer tools and services that make your life easy. For Unity, we set out to craft the most seamless plugin in the market. With just a few clicks you can easily onboard our kits into any Unity project. We’ve even built in a few extras that we think all Unity developers will appreciate:

  • Proper dependency management is baked in so you’ll have a hassle-free experience from conception to monetization.
  • Elegant notifications when your tools are out of date; we even automate the update process so when you’re ready, you can always ship the most up-to-date code.
  • Pain-free downloading and updating. No more removing files manually.

To get started, simply download and import the Fabric plugin into your project. We're excited to help you through your game development journey and can’t wait to hear what you think!

 

Fabric February Update

By Hemal Shah, Product Manager

For the past month, we’ve been focusing on customer love. Rather than giving our customers some of those awesome candied hearts, we spent our time shipping some things we knew would win your hearts.

Introducing the Fabric mobile app

Since we launched Fabric in 2014, our mission has been to make tools that let you focus on building the best apps. We heard from you that some of the most impactful crashes and performances updates don’t always happen when you’re in front of a laptop.

With the Fabric mobile app, it’s never been easier to know what’s going on with your app on the go. We sift through millions of events every day to intelligently give you the most important information.

See the original announcement here!

Full support for tvOS with Fabric

Over the past few months, we’ve made major enhancements to the Fabric platform, adding things like tvOS support for Digits and Crashlytics. In February, we wanted to be able to bring the power of Answers that you’ve come to know and love to tvOS as well! This includes instant visibility into critical performance metrics, such as DAUs, MAUs, and crash-free users — all in real time.

Read more on the Answers blog!

Introducing screengrab on fastlane: automating screenshots on Android

Taking app screenshots is a ton of work and a huge time sink. The process usually requires capturing the shots, making sure each one is lined up correctly, and then localizing them for your customers’ needs — not to mention, you have to do this on every device, for every language you support. With fastlane, we solved this for iOS with our snapshot tool, and this month we brought the same magic to Android with screengrab!

See the original announcement.

The most powerful and intelligent crash reporter

In February, the Crashlytics team released a dashboard feature that highlights significant and unique bits of information about particular issues with badges! Now after a new release, you'll easily be able to identify if you have any issues that stand out against the rest.

Read more on the Crashlytics blog.

 

Here’s our changelog:

Fabric Platform

  • iOS, OS X and tvOS
    • Fix: Corrects a bug that could prevent Multipart MIME encoding from succeeding if the payload contained a zero-byte file

    • Fix: Improved stability when running on OS X 10.7

    • Enhancement: upload-symbols tool is now bundled within the CocoaPod

    • Improves README for CocoaPod users

    • Improves handling of paths with spaces in them

Crashlytics Kit

Digits Kit

  • Coming soon!

Twitter Kit

  • Android

    • Fixed retrieving auth token when using OkHttp 2.3+

    • Added gif or duration badge to media view

MoPub Kit

fastlane wins “Outstanding Performance” in Fukuoka Ruby Award Competition

By Felix Krause, Founder of fastlane

When I started fastlane, I never imagined that I’d be so fortunate to work with a community so passionate about developer tools. Since fastlane joined Fabric a few months ago, we’ve been working on making fastlane a best-in-class automation toolset that developers love, on both iOS and Android. Part of this journey involved my participation in the 2016 Fukuoka Ruby Award Competition, where creators and innovators showcased the companies, apps, and services that they built with Ruby.

I’m honored to share that fastlane won theOutstanding Performance award!

fastlane uses advanced Ruby features, and even defines its own custom Ruby DSL, to offer highly optimized configuration files for mobile app developers. It’s a privilege to be celebrated by the creators of Ruby, and for fastlane, it’s a big stamp of approval to show that we’re building tools that have a real impact.

Congratulations to all the other award winners; it's great to see so much innovation happening around the world!