Insights from the Rainforest QA engineering team.

Building reliable systems out of unreliable agents
This is the process our engineering team uses to create reliable AI systems out of unreliable AI agents.
Three Ways to Draw Pie Charts without any JavaScript
In this post, we share three different approaches to drawing pie charts using only HTML and CSS.
The engineering hiring process at Rainforest QA
Here's the exact hiring process we use to evaluate candidates for the engineering team here at Rainforest QA.
Hunting a race condition in the Android 10 Emulator
How we found a race condition in the AOSP with the Android emulator that affected the amount of heap space available to apps. Rainforest supports testing native mobile applications on Android using the official android emulator from Google. Using emulators instead of real physical devices provides a bunch of benefits such as being able to […]
Discrete optimization for on-call scheduling
The engineering team of RainforestQA (YC S12) is remote and distributed around the globe, with developers in America, Europe, and Asia. We’re using PagerDuty to assign developers on-call and for contacting/escalating people in case of incidents. Our working hours cover almost all time-zones, about 22 hours from full time-zone coverage. Yet for distributing our on-call […]
A deep dive into macOS TCC.db
A deep dive into what the TCC database contains and the meaning of the various fields present in it. What is TCC? TCC (Transparency, Consent, and Control) is a mechanism in macOS to limit and control application access to certain features, usually from a privacy perspective. This can include things such as location services, contacts, […]
Selecting a finite state machine library for React
This article is going to look at different libraries providing finite state machine abstractions that can be used in React applications. I have used state machines on the backend in the past but I have never used one in a React application. I’m also going to share why I believe our codebase could benefit from […]
Upgrading our SaaS application to Rails 6
A sustainable Rails upgrade workflow that slowly but surely brought us to the point when all our apps run on latest Rails. Rainforest main application is a Rails monolith with 160k lines of code and tests. Bumping a major version of rails in a project this big has overwhelming results, in fact no rails command […]
Zero downtime database migrations
In this post we explain the basics of how to handle database migrations properly and show some real world examples. Learn how to achieve zero downtime database migrations.
How to remove Recompose and replace with Hooks
In our last post, we explored the pros and cons of Recompose and why we decided to remove it from our codebase. This post includes the strategy we used to approach the large task of implementing that refactor.
Why we decided to replace Recompose with React Hooks
We recently made the decision to remove Recompose entirely – which was a large endeavor. It touched over 200 files, and in some places was deeply coupled to core functionality of our app.This post covers why we decided to replace Recompose.
How and why we migrated from Heroku to Kubernetes
Here's how Rainforest QA made the decision to upgrade our DevOps teck stack and move from Heroku to Google Cloud Platform (GCP) and Google Kubernetes Engine (GKE).
How to Estimate a Software Project Timeline
In this post we explore how to develop a project timeline and some general best practices for smoother project management.
What I learned from Kaggle about real-world data science
Kaggle is a platform for data science competitions. I’ve spent about 3 months of my life competing on Kaggle, and that’s a lot of time! It’s about 1% of the working part of my life (in the best case scenario, without any meteorites or nuclear wars). So I need to justify this with some positive, practical […]
Common Pitfalls of Continuous Delivery: Deployment Raciness
A less obvious cost is your CD development is effort required to keep your application CD-friendly. This post covers one of the thorniest problems of the continuous delivery world: deployment race conditions, and two alternatives for solving this issue.
Implementing Continuous Delivery: How We Ship Code at Rainforest
Our basic process and tools for shipping code at Rainforest haven’t changed much in the last year or so (we use Github for hosting our code, CircleCI for CI and continuous deployment, and Heroku for our infrastructure), but we’ve been tweaking and improving things as needed. Most notably, we’ve recently automated a few more parts of our deployment process and open-sourced the results […]
How to do big refactors without losing your sanity
Big refactors are horrible. They are hard to estimate because they often contain unknown work. They are hard to review because there’s a lot of code. They often have unforeseen side effects and cause way too many merge conflicts because they touch so many different parts of your codebase. TLDR: Good test coverage can bring you […]
Introducing Http::Exceptions
Rainforest is built on open source and we’ve been doing our best to contribute back to it. I extracted Http::Exceptions from the main Rainforest application, since it’s a pain that we spent a lot of time dealing with and we figured it could be useful for the broader community. Click here to check it out on GitHub. Sometimes small things can end up […]
CI Servers: Should you self-host or rely on SaaS?
Lets compare the two approaches to continuous integration (hosted vs self hosted) and try to figure out which one is best for you.
Optimal Test Environment Setup
In this post we're going to look at optimal environments for webapps. This is part two in a series - the first post looks at what are environments for?
Testing your JavaScript with Jasmine
In this post I'll show you how to test some basic JS code with Jasmine.
Version control: best practices
Version control is something that every shipping team uses, but there's not a lot of talking about the right way to do it. Used properly it can improve your code culture and help you move faster.
MongoDB Gotchas & How To Avoid Them
Everyone should be able to benefit from MongoDB's power and simplicity, and so I've outlined some common and not-so-common things that hackers should know about MongoDB.