Recently I've been blown away with how good the AI models have become at helping me with my work. Over the past year, starting with ChatGPT conversations, then switching to Cursor as my primary editor, then diving into Claude Code, AI has become more and more useful in my day to day. But something changed in November-December... the models got much better at building web applications, and it has…
With the rise of Bluesky and setting my profile to point to my domain here, I was motivated to write a blog post for the first time in 6 years. 😀 In that time I picked up motorcycle riding as a hobby, I started a podcast with my business partners, and I've continued to plug away at Honeybadger . Honeybadger has been my day job for more than a decade, and it's still fun to show up every day and…
At Honeybadger we have standard retention periods for data from which our customers can choose. Based on which subscription plan they choose, we'll store their error data up to 180 days. Some customers, though, need to have a custom retention period. Due to compliance or other reasons, they may want to have enforce a data retention period of 30 days even though they subscribe to a plan that offers…
I can't recall having done a year-in-review type of blog post before, but when Patrick suggested it recently , it seemed like a great idea, so I thought I'd give it a shot. In short, 2017 was a great year! :) I moved all of our servers from a colocation facility to AWS in January, which helped me sleep a lot better at night. Over the course of the year I continued to improve our infrastructure,…
A while back I changed the stack I used for publishing this blog with the hope that I would write more because it would be easier to publish. Looking back at how little I've written since I've made that change, I can see that that didn't work out so well. :) I'm not going to change my stack again (just yet), but I am going to try and write a bit more. Hopefully it won't be another year before my…
At Honeybadger this morning we had a failure of our SolrCloud cluster (of three servers). Each of the three servers has a replica of the eight shards of our notices collection. Theoretically this means that two of the three servers can go away and we can still serve search traffic. Sadly, reality doesn't always match the theory. What happened to us this morning is that some of the shards became…
Rob Walling wrote a great post yesterday about building up your bootstrapped business over time by taking on smaller projects before diving into big ones. His post reminded me of Amy Hoy's Stacking the Bricks philosophy, and I think that taking the approach of learning to walk before learning to run makes sense. Rob's post made me reflect on my experience building products that have gone from…
At Honeybadger we use Help Scout to manage our customer support, and that has worked out well for us. One thing I've wanted for quite a while is more integration between Help Scout, our internal dashboard, and the Stripe dashboard. After taking a mini-vacation to attend MicroConf this week, I decided it was time to make my dreams come true. :) Help Scout allows you to plug "apps" into their UI,…
If you want to have a Postgres column (aside from created_at) that you want to be populated with the current date if no other date is specified, you may be tempted to create a migration like this: add_column :invoices, :paid_on, :date, default: 'now()' That will look like it works -- you create a record, it gets populated with today's date, and all is good. However, if you look at your schema, you…
I'm currently working on a client project where site adminstrators use the same UI that site users do, so there are permissions checks in the views and controllers to ensure the current user has the right to do or see certain things. CanCan provides the access control, which takes care of most of the issues with a simple can? check or load_and_authorize_resource . In one case I wanted to provide…