Johnny Lodden Thinks

“Johnny Lodden Thinks” aka just “Lodden Thinks” is fun little game you can play while you’re sitting around with friends or family.

The game is named Johnny Lodden Thinks because it originated when two pro poker players, Phil Laak and Antonio Esfandiari, began betting on what fellow pro Johnny Lodden‘s answers to their questions would be. YouTube has a clip:

Here’s how it works:

The game requires three people. Lets say I’ll be playing with my friends Adam and Ryan. One of us comes up with a question whose answer is a number. It then begins like this:

Me: Ryan, how many countries do you think border the Pacific Ocean? Think of the answer in your head. Don’t say it out loud. Let us know when you have a number.

Ryan: Ok, I have a number.

Once Ryan has a number, Adam and I start going back and forth saying what we think his guess is. After one of us says a number, the other player can say “less” or say a higher number. If the person says “less”, then we ask Ryan what his actual guess was and if it is less then the person who said “less” wins. Usually you’d bet money on it, but you don’t have to.

Me: I’ll start with 5.

Adam: I’ll go 10.

Me: 20.

Adam: 25.

Me: 26.

Adam: Less!

Me: Ryan, what was your answer?

Ryan: My guess was 20!

In this example Adam would win because I had last guessed 26, he said less, and Ryan’s original guess was 20. Had Ryan’s guess been 30, I would have won.

The key when guessing is not to start off too high. Had I initially guessed 100, Adam would have immediately said “less” and assuming Ryan’s answer was less than 100, won that round. Also, the real answer doesn’t matter, only what the person guessing thinks the answer is.

After each round ends you start again, usually with a different mix of people guessing and answering the question.

A question like “How many countries border the Pacific Ocean?” is just one example, but any question with a numeric answer will do. Usually folks wind up getting pretty creative (and often NSFW).

Here are a few more examples:

  • Ryan, what’s the population of England?
  • Ryan, how much money would you require to completely shave your head?
  • Ryan, if our other friend Joel had to obtain a live chicken and started his search right now, how long would it take him?
  • Ryan, if Joel was in the middle of an infinite field with no trees and no weapons, how long would it take him to catch a squirrel that initially starts 20 feet away from him?

… and so on. The more creative the better. :)

Give it a shot next time you’re sitting around with some friends and looking for something to do; I think you’ll really enjoy it.

A Ruby script to download a backup of your Heroku app’s Postgres database

A little over 5 years ago I shared a script that I had written to download a local backup of a Heroku app. Heroku’s CLI and its capabilities have changed a lot since then so I want to share an updated version for anyone who might find it useful.

You can check it out on Github: Heroku Postgres Backup Downloader.

For example, I have a cron job set up to generate a daily backup of Lean Domain Search that uses it:

$ ruby heroku-pgbackup-downloader.rb leandomainsearch "/Users/matt/Projects/LeanDomainSearch/Heroku Backups/"
Running backup script for leandomainsearch...
 Capturing a new backup...
  New backup id: b282
 Downloading new backup...

Screen Shot 2015-11-27 at 9.16.28 AM.png

I’ve never had to use the backups and hopefully never will, but having them provides an extra layer of protection in case any of my sites are compromised and the data winds up corrupted or lost.

If you have a different backup strategy for your Heroku apps, I’d love to learn more – drop me a note or leave a comment below. Thanks!

How to subscribe to keyword mentions in HackerNews via RSS

If you’ve ever wanted to get notified via RSS every time a keyword is mentioned on HackerNews, there’s a neat service called HNApp that allows you to do just that. You can use it to follow mentions of your product or even just to follow discussions related to topics you’re interested in.

For example, I subscribe to a feed for the term “Strong AI”. This happens a few times a week and is almost always is part of an interesting discussion about the future of artificial intelligence.

If you search for “Strong AI” on HNApp, you’re presented with a list of recent discussions that include that phrase as well as links to subscribe via RSS or JSON:

Screen Shot 2015-11-25 at 10.11.08 PM.png

You can then plug the RSS URL into your favorite RSS reader and voilà, you’ll now be able to keep track of future discussions that use that term:

Screen Shot 2015-11-25 at 10.14.12 PM.png

I usually add the RSS URLs in the Feedly web app then use their iPhone app to read when I have downtime.

Here are a few other examples to get you thinking: WordPress, Calypso, Tesla, React.

HNApp searches occasionally time out so if you perform a search and it errors out, just try again later (RSS readers should automatically do this so there’s no issue there).

HNApp also supports following specific users which I use to learn from insightful commenters such as Patrick McKenzie, Ed Weiss, Jonathan Rockway, TokenAdult, and several others.

If you get use out of HNApp, give a shoutout to Nikita Gazarov on Twitter for the work he put into building it.

I’m going to write more often. For real this time.

One of my coworkers, Luca Sartoni, is trying an experiment this month: every day his goal is to publish a post on his blog but spend no more than 10 minutes writing it. He sets a timer when he begins and at the 10 minute mark he puts a quick final polish on it and hits publish.

I really like that approach because it forces you not to overthink things. The majority of recent posts on this blog took a long time to prepare (I’m looking at you, backpropagation tutorial) and while I enjoy writing longform technical posts like that, if I limit myself to those then it’s unlikely that I’ll post very often. This year, for example, I’ve only published 8 posts which is less than ideal considering I work for a blogging service :).

I’ve tried this before, but always wind up falling back into the trap of spending too much time on the posts which leads me to not write very often. So lets try this: Joel, Ryan, and Adam, oh great coworking buddies, if I go more than a week between posts or if I start only publishing long posts, I’ll buy you all coffee next time we meet up. Hold me to it!

Introducing Retentioneer, a retention analysis script written in R

In an effort to continue learning R and gain a deeper understanding of how various metrics are calculated, I’ve been working on a few scripts to analyze user behavior. The first was the script that let you visualize your active users by signup cohort and today I’m happy to open source a new one, a retention analysis script that I’m calling Retentioneer (cause everything needs a cool name, right?).

Retentioneer is a script that lets you measure how long your app’s users remain active after signing up broken down by which month or year they signed up in. You can check it out on Github for complete instructions on how to use it and the configuration options available.

If you’ve never seen a retention curve before, here’s an example that you might make it clearer:

My friend Adam Weeks cofounded Brewski Me, a popular iPhone app which helps users keep track of the craft beer they drink. By running Brewski Me’s activity data through Retentioneer we get the following yearly retention curves:


By combining a little bit of knowledge about the history of the app with this chart, we can learn a lot:

From 2011 through 2013 Brewski Me had about a 34% 90-day retention rate, meaning that more than 1 in 3 users used it for longer than 3 months (side note: you can configure the script to count only users who were active exactly n-days days after signing up or count them if they were active on or after n-days).

Why the drop in 2014 in 2015? Three possibilities:

  • In mid-2014, Brewski Me changed from a paid app to a free app. We suspect that users who paid up front were more likely to be engaged long term compared to later users who could try it out for free.
  • Because we’re counting a user as retained if they were active at any point after 30, 60, 90 days etc, users who signed up in 2011 – 2013 have simply had more time to come back to the app compared to users who signed up in 2014 and 2015.
  • Finally, the rise of its main competitor Untappd and the social network effects it created may have led some users to switch away from Brewski Me.

In future posts I’ll go into more detail on some of the things I learned working on this including the impact of using activities measured to the second vs measured by just the date and how segmenting your users before running their activity data through this script might make more sense depending on the type of app.

Visualizing Your SaaS App’s Monthly Active Users Broken Down by Signup Cohort

This week at Automattic I’ve been helping with a tool that will allow us to visualize the number of active users each month broken down by when those users signed up for an account. I think this type of chart and what you can learn from it are incredibly valuable so I wanted to show you all how to quickly create one for your own service.

Here’s an example of what this type of chart looks like courtesy of Buffer’s Joel Gascoigne:

What I really like about it is that for each month you can see how many active users there are and when those users signed up for an account. This not only gives you a sense how long ago your active users signed up, but also of your service’s ability to retain users over time.

If you’d like to create a similar chart to visualize your SaaS app’s active users, I put together a small R script on Github that will help you do just that.

The only thing that you need to provide the script is a CSV file that contains user IDs and dates that those users performed an action in your app.

For example, the test data set that comes with it contains user IDs and actions performed by users of one of my apps (Preceden, a web-based timeline maker) for the first year that the site existed (as determined by the automatically set created_at and updated_at values on the Ruby on Rails Active Record objects that each user is associated with):

2   2010-03-28
2   2010-04-09
2   2010-04-10
2   2010-05-16
3   2010-01-31
3   2014-05-07
3   2014-09-30
3   2015-04-11
4   2010-01-31
4   2010-10-06

In this example user IDs 2 and 3 each performed actions on four dates and user ID 4 performed actions on 2 dates. The script will analyze that data to figure out which cohort the user belongs to based on the earliest date the user performed an action and count that user toward the active users for each subsequent month that he or she performed an action:


As you can see there was a huge spike at the beginning of the year when Preceden launched on HackerNews and was subsequently covered on other tech sites, but by December only a fraction of those users were still active. On that note, I encourage you to strive to build a service like Buffer that delivers long term value so your chart doesn’t wind up looking like this one :).

If you have any questions or need help customizing the script in any way, please don’t hesitate to drop me a note.

Thanks Joel Martinez and Rob Felty for providing feedback on the code.

Lean Domain Search at 3½

Lean Domain Search, despite almost no work since its acquisition by Automattic two years ago, has continued to thrive, now handling more than 160,000 searches per month:


It’s monthly growth rate works out to be about 6.5%. Not huge, but not bad for maintenance mode. :)

I think its growth is still driven almost entirely by word of mouth so if you’ve ever shared it with anyone (I’m looking at you, Jay Neely), thanks!