Aha! Develop is the agile tool that links strategy to delivery.


Learn more

Articles

A collection of technical posts written by the Aha! engineering team.


Nico Arias-Gonzalez · 2025-10-08 · javascript, typescript

How we de-risked our editor upgrade

Any seasoned software engineer will tell you that full rewrites are a bad idea. More often than not, they are abandoned after wasting a significant amount of resources on them. This is especially true if what you're pitching for a rewrite is the bac

Daniel Campbell · 2025-09-17

Solving impossible problems

If you've been working on software for any reasonable length of time, you might have had an experience like this: You're looking at a feature, and you have no idea how to build it. You have the context and understanding you need. But it's all pointi

Greg Brown · 2025-07-14 · ai

Is AI the end of coding as we know it, or just another tool?

The rapid advancement of AI tools has left many developers worried about the future of their careers. AI is either coming to take your job, or it's going to make you 10 times more productive — if you learn to use it effectively. Nobody wants to be i

Justin Paulson · 2025-04-30 · ruby, rails

Streaming LLM Responses with Rails: SSE vs. Turbo Streams

In the world of Rails development, integrating large language models (LLMs) like OpenAI's GPT has become increasingly common. One challenge developers face is streaming these responses efficiently to provide a smooth user experience. This post will

Maeve Revels · 2025-04-28 · engineering, ruby, rails, postgres

Partitioning a large table in PostgreSQL with Rails

Keeping a reliable history of changes is essential for our users. They need to know when a record was updated, who made the change, and why. They could be anxiously awaiting a notification about a dependency that is blocking their work. Maybe they w

Jeremy Wells · 2025-03-03 · engineering, ruby

Rails views, web components, React. Why make a choice?

How many times have you heard or read statements like these in tech discussions?"Everything needs to be a single-page app these days. Server-rendered templates are holding you back.""Web components are the future. Why tie yourself to any framework?"

Justin Weiss · 2024-12-20 · engineering, ruby

Make streaming APIs easy with enumerable methods

When you first discover Ruby on Rails, some things might strike you right away: namely the large number of enumerable methods and the blocks to run code in the middle of another method. Those features helped me translate my thoughts directly into c

Justin Paulson · 2024-11-14 · engineering

We love bugs (and you should, too!)

OK, maybe "love" is a bit strong. But the Aha! engineering team has a shocking confession: We embrace bugs in our software. Our CTO, Dr. Chris Waters, often says, "If your feature ships without any bugs, you waited too long to ship it." Having work

Phil Wilt · 2024-10-28 · engineering

Transparency, autonomy, responsiveness, and education: How the Aha! engineering team works

Organizations have many different ways to approach how teammates write code. You have individual silos, pair programming, team-based work, and black box interfaces where you have no idea how the other team is structured. We use a mix of these approa

Kira Tully · 2024-09-18 · ruby, rails

How we upgrade major Rails versions

As a company whose product is built on top of Ruby on Rails, conducting a major version upgrade of the underlying framework is just about the biggest upkeep item we regularly undertake. The whole process takes months — with multiple cycles of devel

Greg Brown · 2024-08-21

Interrupt-driven engineering: Working on what matters at Aha!

On the Aha! team, The Responsive Method (TRM) guides our interactions with customers and one another. Responding to requests quickly and thoughtfully maximizes the value we provide to customers and is a key pillar of our success. Part of this resp

Alex Bartlow · 2024-05-24 · platform, devops

The most important system to keep running

I heard a ring, and my heart rate spiked to 132. It was Tom Bailey, a colleague on the Product Success team. I prepared myself for a cheerful British voice to deliver bad news — the only reason for Tom to call me would be to get engineering's atten

Michael Shiel · 2024-04-08 · ruby, rails, postgres

Using calculated attributes to help users surface delivery risks

Feature delivery can be impacted by many factors. Some are readily visible, but others are more nuanced — or buried in mountains of data. What if we could show developers and project managers the factors that would affect feature delivery in real ti

Percy Hanna · 2024-03-14 · react, canvas

Building a dynamic Canvas rendering engine using JSX

Our product team is busy adding many great new features to Aha! Whiteboards and Aha! Knowledge — including wireframes, voting, and improvements to viewing Aha! Roadmaps data within a whiteboard. We added all of this functionality in just the last

José Guerrero · 2024-02-02 · ruby, debugging, rails

From many to one: Moving our JavaScript code into a monorepo

When I first joined Aha!, I was surprised by how well-structured the engineering onboarding program was. I spent several weeks getting to know all the teams and learning the pieces of our system. What I didn't realize at the time was these onboardi

Greg Brown · 2024-01-11 · ruby, debugging, rails

Improving the editing experience in Aha! whiteboards

Our team at Aha! loves using Aha! software. It's not only a great way to build our own lovable product, but it also helps us to find rough edges before customers do and develop empathy for our users. So when one of our principal engineers, Maeve Re

Kira Tully · 2023-12-14 · ruby, debugging, rails

Debugging Ruby the hard way

Normally when you encounter a bug with Ruby, or any other interpreted language for that matter, using the language's provided debugging tools is all you need to diagnose the problem and find a solution. Indeed that works 99% of the time. But what ab

Kyle d’Oliveira · 2023-11-16 · ruby, rails

More feedback! Quantity becomes quality

In David Bayles and Ted Orland's book, Art & Fear, there's a captivating story that has always stuck with me. This is a story that highlights a timeless argument: quantity versus quality. It goes like this:"[A] ceramics teacher announced on opening

Justin Weiss · 2023-09-29 · ruby, rails, refactoring

Ruby enumerables considered helpful

Ruby's Enumerable methods help you make powerful code simple — by filtering, transforming, and processing data like the best engineers do. These methods are available on Arrays, Hashes, and many (many) other objects, and similarly-named methods are

Kyle d’Oliveira · 2023-08-24 · ruby, rails, debugging, race conditions

Off to the races: 3 ways to avoid race conditions

I searched for a good definition of a race condition and this is the best I found: A race condition is unanticipated behavior caused by multiple processes interacting with shared resources in a different order than expected. This is quite the mouthf

Steve Lamotte · 2023-08-10 · engineering, platform, ruby, dev ops

CLI tools at Aha!

Ruby has always been a great general-purpose scripting language and is often used to create command-line utilities. Many of these use the excellent Thor gem to parse command-line options, but there's no escaping one fact: command-line utilities jus

Chris Zempel · 2023-06-27 · engineering, pull request, ruby, rails

12 Tools for Quality Pull Requests

As you stare into an empty text field, the blinking cursor invites you to engage in a crucial part of being a professional software engineer — writing a pull request. What will you write? Almost every idea you will come up with is downstream of the

Andrew Jones · 2023-05-08 · security, ruby, rails

Solving a critical bug in the default Rails caching library

On March 20th, ChatGPT users reported seeing conversations that were not their own. Just a few weeks earlier I had solved a bug where the default Rails caching library (Dalli) would return incorrect values. I thought, "this ChatGPT incident sounds

Jeremy Wells · 2023-04-27 · javascript, ruby, capybara, cypress

Migrating from Cypress to Capybara — a reluctant tale

Many months ago, our team had to have a hard conversation about Cypress. Cypress was the new kid in our CI pipeline, a browser integration testing framework. We had thought it would replace Capybara, our older way of driving a browser manically aro

Jonathan Steel · 2023-03-23 · css, remote, hiring

CSS is hard no matter how good you are at it

Let us start by saying that CSS is hard. It seems that no matter how skilled you get, you will still run into situations that completely baffle you. Sometimes you can hack around the situation, but other times you really need to figure it out. When

Jonathan Steel · 2023-01-26 · ruby, remote, hiring

Fully remote companies are better than hybrid

I have worked in many different environments throughout my career. I have worked in the same building as my teammates and even for a company that had us all in the same room. I have also worked in hybrid environments with a mix of in office and remo

Justin Weiss · 2023-01-12 · javascript, graphql

Building a composable query generator for GraphQL

In a lot of newer projects, we use our GraphQL API. This is the same API you use when you're building Aha! Develop extensions. GraphQL has given us a more consistent, more flexible, and often more efficient way to access the data inside an Aha! acc

William Lawrence · 2022-11-10 · ruby, rails, mobile, testing

Using Capybara to test responsive code

As more users opt for mobile browsing, responsive design becomes more important — even for applications that are primarily used on a desktop. Responsive design is a key consideration for Aha! Ideas because it's convenient to answer polls and submit

Kyle d’Oliveira · 2022-10-20 · ruby, rails, rubocop, testing

Writing and testing a custom RuboCop cop

Solving a problem is great — but keeping it from coming back is even better. As we resolve issues in our code base, we often consider how to keep that classification of issue out of the code base entirely. Sometimes we reach for RuboCop to help us

Jonathan Steel · 2022-10-06 · ruby, rails, hiring, onboarding

Service layer for business logic — Organizing code in a Rails monolith

Our engineering team builds the Aha! suite using a Rails monolith. We carefully weighed a number of options before determining that this would provide the most lovable solution for our users and our team. But the discussion does not end with choosi

Alex Bartlow · 2022-09-22 · ruby, rails, hiring, onboarding

Platform Engineering vs. Site Reliability Engineering

Striker and goalie. Offense and defense. Deploy and recalibrate. Many disciplines have dichotomy between the tasks that accomplish a goal and tasks that protect the ability to do so. Delivering features, building out user flows, and optimizing conve

Jeremy Wells · 2022-09-02 · technical debt

Technical debt isn't technically debt

The term " technical debt" has entered the standard lexicon of programming and software project development and has often been called out for being an incorrect metaphor. Yet it persists as a way to talk about the decisions made during software engi

Phil Wilt · 2022-08-04 · ruby, rails, hiring, onboarding

Engineering onboarding at Aha!

Software engineers are always eager to make major contributions upon joining a new company. But that's not always realistic with a large codebase. Aha! is a Rails monolith that has grown to quite a large codebase over the years. Navigating this new

Kyle d’Oliveira · 2022-07-21 · ruby, rails, resque

Making background jobs more resilient by default

When it comes to job processing, timing is everything. Running jobs in the background helps us remove the load from the web servers handling our customer's requests. However, we also want the background jobs to run in a reasonable amount of time for

Chris Zempel · 2022-07-01 · ruby, rails, billing

How we launched a smooth billing overhaul

Aha! has evolved significantly over the past several years. What began as a single-product offering is now a suite of world-class product development tools. To keep up with our growing userbase, we recently launched an overhaul of our billing system

Jeremy Wells · 2022-05-12 · develop, frontend, react, extensions, graphql

Creating charts with the Aha! Develop API and extensions

An important aspect of developer tools is being able to visualize work and progress in various ways. A well-known example is the burndown chart that agile teams use to track their progress through iterations. There are many other standard visualiza

Percy Hanna · 2022-04-28 · extending the monolith

Embrace the monolith: Adding a new product to Aha!

When our engineering team first began conceptualizing Aha! Develop, we were faced with a monumental question. How should we implement the architecture of adding a brand new product? We could start fresh with a brand new codebase, utilizing the lates

Michel Billard · 2022-04-27 · react, javascript, fullscreen

Using the Fullscreen API with React

Making something fullscreen in browsers is surprisingly easy. All you have to do is call requestFullscreen() on any DOM node. For example: document.body.requestFullscreen(); Note that the element that you choose to put in fullscreen matters. Only i

Alex Bartlow · 2022-04-22 · postgresql, devops, backend, logging

Optimizing with the PostgreSQL deterministic query planner

Of all the Aha! engineering tool expenses, the money I'm happiest to spend is on a big RDS instance running PostgreSQL. It powers our full-text search, our reporting, and even some of our analytics. If you run it at scale, I recommend dedicating a F

Steve Lamotte · 2022-04-14 · aws, backend, devops, dynamic staging, ec2, ecs, rails, rds, redis, resque, ruby, slack, staging, terraform, extending the monolith

Building a dynamic staging platform

Our team at Aha! recently gained the ability to quickly create and destroy dynamic staging environments. Our platform team maintains several general-purpose staging environments that our engineering and product teams use to test new features. These

Alex Bartlow · 2022-04-07 · ruby

Advent of Code, and the Amb Operator

There is nothing quite like friendly competition to refuel your passions. Our team at Aha! recently sponsored 2021's Advent of Code, an annual event posing a series of programming puzzles that can be solved in any programming language you choose. We

Justin Paulson · 2022-03-31 · extending the monolith

From One, Many — Building a Product Suite With a Monolith

Aha! has now reached $100 million in annual recurring revenue with three separate software products in our available suite. We did this all without taking money and without breaking our monolith into microservices. Modern web applications have used

Bill Rastello · 2022-02-11 · ecs, aws, platform

Migrating from EC2 to ECS Services and Tasks

Our old system architecture here at Aha! has served us well. On top of RDS, ElastiCache, and other AWS services, we had hundreds of EC2 instances running Unicorn to serve web traffic. We used nginx and AWS ELBs for load balancing, Resque / resque-

Michel Billard · 2022-02-08 · rails, javascript

Fiscal years and how JavaScript is wrong about months

Developers love working with dates. One day, someone asked themselves, what if the year didn’t start in January, but could start in any month of the year. Welcome to the fascinating world of fiscality. One of the neat things about fiscal months is t

Jonathan Steel · 2021-09-23 · frontend

How to build a dark theme

So you want to implement a dark theme for your app? All your favorite applications have it and your app should too. But will it be trivial or is it as daunting as it seems? Where do you even start? You can break the process down into three different

Kyle d’Oliveira · 2021-06-30 · rails, backend

90% of Rails N+1 queries solved with a drop-in fix

N+1 queries come up very often when working with Rails. N+1 queries are a silent performance tax both for your application and for developers. If a developer writes new code that introduces an N+1 query, it only slows down performance. It does not i

Nathan Wright · 2021-05-28 · web components, javascript, develop

Web components and implicit slot names

Since the dawn of the internet, web developers have had an unfulfilled desire. We've wanted "living elements" that can automatically react to state changes and user input. We've wanted something with the expressive and reactive power of Javascript,

Winfred Nadeau · 2021-05-27 · product engineering, develop, onboarding, new user experience

3 steps to an engaging new user experience for developers

First impressions matter a lot when you're launching a new product. Optimizing for time-until-Aha! is no easy feat. This is uniquely true for developer-facing software because your customer lives and breathes your medium. Designing a new user experi

Jeremy Wells · 2021-05-17 · develop, frontend, react, extensions

How we enable hot-reloading in production for extension developers

Aha! Develop is our extendable agile development tool. You can completely customize the UI, workflow, and integrations through extensions to create your team's ideal workspace. We made extensions with the goal of creating a lovable development expe

Justin Weiss · 2021-05-03 · graphql, develop, rails, api

Automatically avoiding GraphQL N+1s

Some people, when faced with an API problem, think “I’ll use GraphQL!” And now they have N+1 problems. N+1 problems occur when you want to find a deep tree of records and end up performing a SQL statement or API request for every record, instead of

Alex Bartlow · 2020-12-14 · athena, devops, backend, logging

Log management using AWS Athena

Many SaaS providers will happily sell you a turn-key log management system, and in the early days of a startup when you value time over money, purchasing one makes a lot of sense. AWS Cloudwatch logs are another good solution if you are already host

Michel Billard · 2020-09-01 · frontend, react

Building our new Gantt chart

Our old Gantt chart served us well for the past six years. It was doing what it was designed to do, but some of the things we wanted to add were either impossible or incredibly difficult to accomplish. For example, giving customers more control over

Zach Schneider · 2020-07-09 · javascript, npm

A treatise on JavaScript dependencies

JavaScript dependency trees are a bit of a punching bag in the programming world. Even in a small project, the node_modules directory can easily reach hundreds of megabytes in size, much to the chagrin of engineers who remember the days when an ent

Toray Altas · 2020-06-29 · quantum, development, cloud

Quantum computing in the real world

As we have recently entered a new decade, I have been thinking about the next leaps in computer science and where some of those areas may be. One such area that I have read a lot about in passing but never really explored is quantum computing. I bel

Andrew Vit · 2020-06-24 · rails, sql

Transaction deadlocks on ActiveRecord associations

Everyone is thrilled with the new feature you’ve just deployed! But as it starts to gain popularity, you wonder if there might be a bug despite all the testing and code review that you and your team have done. The more it gets used, the more you sta

Zach Schneider · 2020-06-02 · gatsby, javascript, netlify

Search on a static site with Netlify functions

Recently, our team at Aha! has been working on migrating our public marketing website from a traditional Rails app to a Gatsby application hosted on Netlify. Gatsby (and static sites in general) offer a large number of benefits: they are highly se

Justin Weiss · 2019-07-30 · node, javascript, testing

How do you test multiprocess code in Node?

A little while ago, I wrote about using Node's child_process library. child_process creates other processes to do work instead of tying up a single process. When you do work in child processes, you get some big benefits: You can avoid hangs when a

Zach Schneider · 2019-07-25 · support

Put your engineers on support

Let's talk about your bug backlog. You know you have it -- somewhere in your issue tracker, a stack of dozens or maybe even hundreds of bugs awaiting attention. Sometimes new engineers will pull a few off the stack while they're getting up to speed;

Justin Weiss · 2019-06-13 · node, javascript

Improve reliability with a Node.js library

A Node.js process runs a single thread. Single-threadedness isn't a problem if you run short pieces of code and let Node do other work in between. It can even be a huge benefit! One process can handle a lot of "simultaneous" work and you don't have

Alex Bartlow · 2019-04-29 · ruby, testing, development

Use `with` and `describe_instance_method`

Want specs that look like this? Read on. describe ServiceObjectUnderTest do describe_instance_method :a_long_and_descriptive_method do method_parameters(:subscription_class, :value) with subscription_class: :enterprise do with(value

Zach Schneider · 2019-04-17 · javascript, mobile, native, react

Our Secret Sauce Is React Native

It's been an up-and-down kind of year for React Native. Last summer, Udacity and Airbnb announced that they were moving off of the platform; Discord is sticking with React Native but still publicized a number of issues they experienced, and their

Zach Schneider · 2018-11-27 · development, javascript, security

event-stream vulnerability explained

If you work with JavaScript at all, you probably saw a ton of noise yesterday about a vulnerability in the event-stream npm package. Unfortunately, the actual forensic analysis of the issue is buried under 600+ comments on the GitHub issue, most o

Justin Weiss · 2018-04-18 · rails, collaboration, text editor

How to Build a Collaborative Text Editor Using Rails

It is a painful realization. You just added a beautiful, multi-page description into your bug tracker's text editor, complete with photos and a short screencast. Then your co-worker, who left their window open when they went to lunch, helpfully fixe

Zach Schneider · 2017-09-07 · frontend, javascript

Switching From CoffeeScript to ES6

Aha! is a Rails monolith. Although we have embraced front end technologies, such as webpack and React, Rails is the glue that holds everything together. And like many Rails monoliths, CoffeeScript made up the bulk of our front end code. It was the o

Chris Waters · 2017-06-06 · prioritization

Smash More Bugs

Drop everything. This is what our team does when a bug is found. Recently, a customer reported an issue in a new feature that had just gone live. We quickly identified the problem, fixed it, and sent an apology and an update to the customer. This w

Chris Waters · 2017-02-28 · mundane

This Developer Finds Joy in the Mundane

I love fast food. It started as a teenager when I worked at McDonald’s in New Zealand. There were only a few locations back then and we were amazingly busy, with lines usually out the door at lunchtime. We made Big Macs as fast as we could — 12 at a

Alex Bartlow · 2017-01-31 · standardization

The New Normal for Your Engineering Teams

I still remember the chaos of my first job. A new team with new challenges. Facing critical work decisions for the first time. But there was something else that added to the chaos — a cooked-up and manic code base. It made me feel more like a mad s

Chris Waters · 2017-01-06 · hiring

The 4 Qualities of Engineers This CTO Loves to Hire

When I first learned to program, I did not have a computer. I wrote everything out on paper and just imagined what would happen when it ran. (This was back in the days when magazines actually had code listings for you to type into your Commodore 64

Zach Schneider · 2016-07-07 · communication

6 Common Misconceptions About Engineers, Debunked

Most product managers develop a close working relationship with their engineering team over time. Although sometimes a little quiet, they're a lovable bunch of nerds — right? On weekends they probably go home to drink Mountain Dew and play online g

Alex Bartlow · 2016-06-29 · communication, process

How Much "Dev Speak" Should Product Managers Know?

Product managers need to be able to connect with the engineering team. But some product managers — and people in general — often feel excluded from the cultus of software development. I know because I am a software developer and I work with product

Zach Schneider · 2015-10-14 · college

Why You Should Not Major in Engineering

My college algorithms class was the final weed-out course in the computer science program. It covered advanced topics like computational complexity and graph theory. If you passed, you would likely graduate. If you didn’t, the universe might be hint

Zach Schneider · 2015-08-25 · frontend, ux

Perfecting a Smooth Scrolling Experience for Large Tables

Depending on who you ask, the <table> is a quintessential cornerstone of web development old and new; an outmoded curiosity from a time where CSS lacked floating elements; or somewhere in between. But even the biggest critics of the <table> must adm

Zach Schneider · 2015-08-10 · product management

How Engineers Want to Work with Product Managers

Engineers want to build the product. They do not want to manage it. So, you can see why a good product manager is an engineer's dream come true. They empower the engineers on their team to build things that matter by setting clear and comprehensive

Zach Schneider · 2015-07-20 · complexity, process

Code Complexity Metrics Suck — Use Them Anyway

I love contributing meaningful code to the open-source community; I do it every chance that I get. A few years back, I authored my first major open source project — a Rails application for developers to set up an anonymous bug report page. The bug

Zach Schneider · 2015-06-26 · activerecord, sql

Using Nested Selects for Performance in Rails

Databases are fast, even at performing fairly complex operations. This is easy to forget in the age of ORMs and abstraction and many of us haven’t written a line of raw SQL in months. But a solid, production-ready SQL database is mature, low-level,

Zach Schneider · 2015-06-19 · frontend

Making Magic with contenteditable="true"

I love this team. I love the product and engineering team at Aha! because we believe in objectively prioritizing work. To truly build what matters, you must identify which feature requests will help you achieve your goal and which ones will waste yo

Alex Bartlow · 2015-06-07 · reliability

3 Lessons From the Hacker Who Saved Apollo 11

I have been fascinated by rockets since I was young. As I get older, my appreciation has only grown for the amazing amount of engineering that goes into those majestic machines. I would like to share with you some insights from one of my personal he

Chris Waters · 2014-12-15 · frontend, text editor

State of the Art in WYSIWYG HTML Editors

A common feature request from Aha! users was the ability to include images and tables inline with feature descriptions. A year or so ago we embarked on a project to improve our editor with a more feature rich experience. When we originally chose an

Chris Waters · 2013-10-28 · devops

Why Does DevOps Think They Are the TSA?

So you are the DevOps Manager — gatekeeper of everything good — and the go-to-guy for smart code running on big iron. You help keep engineering from releasing the miserable code that QA was not able to sniff out. You see the big data center picture