Steve Ridout
Indie software creator

Readlang: 2023 Year In Review

December 21, 2023

It’s been an eventful year for Readlang! This a quick update of the last year running the bootstrapped language learning web-app which I bought back from Duolingo in February.

Goal

After buying Readlang back, I set its goal to be:

The best reading tool in the world for language learners

Furthermore, I want it to stick around for the long term. To stay profitable. I’m not looking for an exit. As long as Readlang remains useful and keeps growing I don’t mind if the growth happens to be slow.

Revenue

Revenue is up +50% from ~€4K / month to ~€6K / month.

Contributing factors (attribution is hard so there’s some guess-work here):

I’m very happy with the increase in the short time I’ve had Readlang back. It already makes enough so that it could support my lifestyle if I didn’t reinvest any of the profits, but I look forward to looking for ways to reinvest the extra income back into improving the product.

New signups

There’s a baseline of 200 signups per day, with a bunch of spikes. Digging into it a bit more we see that the spikes are often country specific:

Signups by country

After asking a bunch of users I found that both the Brazil and Turkey spikes were driven by Instagram reel videos (link and link). Makes me wonder if I should look into influencer marketing? (Right now I don’t do ANY marketing at all.)

Despite getting more signups from Turkey and Brazil than the US, the revenue from Turkey and Brazil combined adds up to only 10% of the revenue from the US.

Spanish company: Readlang SL

Starting and running an Spanish SL is far more hassle than a small UK limited company (Readlang was run by a UK limited company before it was bought by Duolingo). In the UK up until 2016 I used to pay about £900 / year to an accounting firm to file the end of year reports using simple cash basis accounting. In Spain I pay €99 / month to Quaderno and €380 / month to an accounting firm to file the more detailed relevant quarterly and end of year reports (this is just for the business, doesn’t include my personal accounting). On top of that, the minimum social security contributions here are a lot more than the equivalent minimum national insurance payments in the UK. At my current stage I don’t mind so much, but for someone just starting out, sorry Spain, but the UK is a lot more friendly to tiny bootstrapped startups.

Lowlight: The first accountants I worked with this year did a bad job which caused me to stress and waste time for a couple of months. In retrospect there were warning signs that should have triggered me to fire them earlier: a couple of sloppy mistakes and unresponsive communication. I ended up staying through multiple mistakes and miscommunications until after filing the Q1 reports, after which I found the firm I’m currently using who I’m very happy with so far.

Infrastructure

This was easier than last time when I moved Readlang from Linode to Duolingo’s AWS account. Now I was just moving it back to its original home of Linode/Akamai. It’s still nerve wracking though since I wanted to both minimize downtime and the amount of effort that Duolingo needed to spend on this, and make absolutely sure that I wasn’t breaking anything or losing any data. Luckily it went smoothly!

Analytics

I ripped out some hacky, homemade event tracking code, and replaced it with Mixpanel. Mixpanel offer a very generous free tier allowing up to 20M events per month. The main restriction is that they only allow saving of 5 reports, but it turns out that you can bookmark as many reports as you like in your browser, which I’m happy with for now. With a little bit of my own code I can now run AB tests and analyze the results using Mixpanel. Obviously there’s some risk that they nerf the free plan, and if I were to pay for the number of events I’m using it would be over €400 / month, which would sting!

Tech debt

In the past few years I’ve gotten used to coding in strict mode Typescript, using React for the front end views. So going back to a Javascript and Backbone.js code written by a n00b web developer (me from 10 years ago!) is a big step backwards. I’ve started refactoring here and there, and new modules are in Typescript and use Preact for the views. So things are improving, but it still feels brittle with lots of room for improvement. I’m going to continue cleaning up old code, but I can’t spend my life refactoring, I also need to ship stuff that users will benefit from!

I’ve done 3 MongoDB updates so far: from 3.0 -> 3.2 -> 3.4 -> 3.6. I still need to do 5 more upgrades (!) to get to version 6.0 (3.6 -> 4.0 -> 4.2 -> 4.4 -> 5.0 -> 6.0), which is where I’d like to be next year. Boring work but it should be done.

Features

The two most impactful features I’ve launched are:

I’ve had a lot of positive feedback about this feature and have personally found it very useful. The explanations from OpenAI often include better translations than the ones displayed within the text from Google Translate.

The new daily streak goal focuses on reading 500 words instead of translating a certain amount, making for a more predictable amount of time required per day. It also comes with a better reminder email encouraging users to keep coming back so as not to lose their streak.

Since releasing this feature, you can see that the number of users with a streak of 7+ days has been growing steadily:

Users with 7+ day streak

These numbers are miniscule compared to what I was used to at Duolingo. Then again, they’re moving in the right direction!

Monetization

I’ve increased the price of the monthly plan from $5/month to $6 / month. I took a look at other popular consumer subscription services and $6 / month still seems on the cheap side. As well as increasing per-user revenue from the monthly plan, it also has the effect of pushing more users to the yearly plan which remains at $48 / year.

The context-aware explanations are monetized, with the free plan limited to 10 / day, incentivizing more users to upgrade for unlimited explanations.

Design

Since leaving Duolingo in 2021 I’ve missed working with other people, so I’m happy to have started working with a local design studio (Bridge Studio) to work on Readlang. So far we’ve worked on improving the look of the texts in the public library, and I’m hoping there’ll be a lot more to come in the new year.

Use of AI (specifically OpenAI’s LLMs)

Here are all the ways I’m currently using OpenAI’s LLMs in Readlang:

Compliance

I’ve had few requests from large government institutions and school districts asking me to sign documents and to provide evidence of compliance with various standards. I’ve signed a couple of these documents but there are many questions I can’t answer right now and I’m not compliant with FERPA, COPPA, PPRA, etc… In the new year I may contact a lawyer about this since it could unlock more user growth in the US.

Future work

There are so many user suggestions to consider and areas to improve! Some areas on my mind at the moment are:

If revenue continues to increase, I’ll be looking for ways to use it to reinvest into the product.

I look forward to further refining the best reading tool in the world for language learners in 2024!