It's a web-app and browser extension to help people learn languages by reading texts or websites in the language they are learning, get helpful translation hints and definitions to aid comprehension, and then to practice the new vocab with flashcards.
To be that attached to your idea after all this time is also very impressive. Most people would have just abandoned it and moved on, even if it was making decent money.
At 4K MMR it was probably a pain in the ass for Duolingo to maintain and the reason for acquisition was hiring the developer and avoiding a potential concurrent (which in the end never realized) so I'd imagine it was a very easy buy.
And I'm not saying that as a criticism of ReadLang, I think it's a great tool actually.
As a viable language-learning app (on the freemium tier), it's mixed and getting worse. I'm a 3.5-year Duolingo user.
See the 2/2023 HN post "How Duolingo reignited user growth" [0] describing how they/ the former CPO aggressively traded off reducing the utility for actually acquiring language vs too much gamification (not all users want 'Candy Crush' levels of gamification), user growth, leaderboards, challenges, cutesy animations, inventing silly revenue streams like 'streak protect' (all prior to the 7/2021 IPO, ticker 'DUOL').
Duolingo locked the Chinese course mid-2022 [1], that means no more fixes ever, no corrections, the broken or missing audio (and answers, and hints) stay broken or missing, all discussions (users helping users, handy links to third-party sites) are frozen. For no good reason. They don't give a hoot for gamifying valuable user contributions which add/improve course content/fix mistakes. If any of you were contemplating paying for DL Chinese before they locked it on the charitable basis that they'd fix the broken bits someday after they'd banked the IPO loot, well obviously not now. (Here's e.g. Langoly's list of "The 11 Best Apps to Learn Chinese (Mandarin) Fluently" [2])
By comparison the Spanish course is alive and being improved; they added Stories.
TL;DR: optimizing the product to juice up metrics like DAU prior to the IPO is good for valuations, but is not a great long-term approach to a language learning app and its community.
[0]: https://news.ycombinator.com/item?id=34977435
[1]: https://www.reddit.com/r/duolingo/comments/zjnwmh/why_is_chinese_a_very_poorly_maintained_course/
Obviously Duolingo isn't perfect but they're very aware that there's still lots to improve. And sure, maybe their approach to gamification isn't for everyone, and that's fine, since there are many people who do like it!
User Kortaggio [0] talks about how Duolingo's claim “an average of 34 hours of Duolingo are equivalent to a full university semester of language education” is misleading because it's based on their long-discontinued SRS algorithm. Sounds like false advertising.
The gamification features are one-size-fits-all (whether you're age 13 or 30 or 65, occasional or dedicated user) and default-on: interstitial animations, success videos, chests of gems, then yet more 5/15/30-second ads... I challenge you to measure the % of time within a 10-minute segment that is actually spent on learning. Or at minimum, they could show me the cutesy stuff while I'm doing the language task, Super-Puzzle-Fighter style.
I'm a 3.5-year user (>1200 days), I clearly don't need somersaulting owls and faux-challenges to keep me going and I passed that point 1190 days ago, if not always.
Many (adult) DL users write about how the ever-increasing pushiness with leaderboards, quests, streaks ('create false urgency' per Candy Crush which the former CPO cites as a model) turn them off. Should have different use-modes for different segments of user.
I believe DL care about teaching effectively only up to a limit, and that limit is anything that might reduce their metrics, as a freemium app. They don't care about teaching Chinese effectively, not since back in 2021 if not earlier, they simply gave up. This is quite sad and weird for the world's second-largest language. There isn't "still lots to improve" on the Chinese course, they simply gave up and locked the forums permanently so that now not even well-intentioned volunteer users can fix that one.
Also, DL committing intentional trust and GDPR violations without any online opt-out doesn't sound ethical "Facebook Still Tracks People on Yelp, Duolingo, Indeed" [1]. Obviously tracking without user consent is for monetization of ads. Like I said, monetization trumps other considerations at DL.
(PS I signed up for your ReadLang, but for Tagalog it's pretty beta. Good luck with its second incarnation).
Considering that this will only apply to failing products, the price they can expect to get for it is negligible, more so considering the buyer is going to be a handful of regular employees rather than a big company. So selling vs killing makes no material difference to their bottom line.
On the other side, there’s a mountain of due diligence they have to do to make sure that the decision is sensible. Is the product tied to the company’s brand at all? Will it reflect badly on them if the new owners decide to take it in some different direction? Or can it be used to compete with the company in the future? Does it have user data? Are they in accordance with the TOS and a thousand data laws when selling it to someone else?
So from the business side the sensible answer is usually to just kill the product.
I think there's still a flip side to these decisions. Google has an established reputation as a product killer, I'm sure the effect of that won't bring them down but it's there and I doubt handing a product off to someone else would either.
Companies like Google often shut down products that would be called incredibly successful if they were a startup or small business. In $BigCorp, the yardstick is their main moneymaker, and if you are less profitable and don't fit in the larger strategy you can get cut simply to help the company keep focus on what's important.
You kind of stopped blogging as much when you joined Duolingo, what would you say were the biggest factors why? I'm assuming Duolingo weren't super restrictive on what you could post so that might not be the big reason, but I could be wrong!
I actually remember asking them how restrictive they would be when it comes to sharing when I joined and they said they weren't as secretive as Apple, but that they weren't completely open about everything either. If I had had the urge to post anything I would have run it past people before publishing details about what our team was working on, and it would have probably been fine. But in the end, like I said, I was always busy and blogging fell by the wayside. (I was never a naturally prolific blogger anyway)
The internal/external rift is so interesting and perfectly reasonable. Hard to spend time self editing after an exhausting day, and guess that's where places like Twitter really shined. Yet I wish that gap could be bridged somehow, it feels like many great posts with overlooked details are left unwritten because of the lack of external validation combined with internal hurdles.
Meandering now, but your blogs are enjoyable reads and that's the most envious quality I have of writers!
Funnily enough, in the original sale I negotiated for more cash and fewer options. Luckily for me they only moved a little bit in my direction since the options ended up being worth much more.
I've noticed a sort of bimodal distribution of prices in language companies with the sleek/modern looking ones centering around 5$/month, and more traditional companies going for 20$/month for seemingly the same service (so the latter not presented as a luxury alternative to the former). Wondering if you did any A/B testing or generally what your methodology was if you don't mind sharing.
I started at $10 per year, then gradually raised prices as the product got better, always keeping existing subscribers happy by grandfathering them. At one point it was $4.99 every 3 months, which is the plan my mum is still on :-) For a brief time I offered a lifetime subscription for $100 and sold a few but felt uncomfortable offering to keep the service running forever with no further payments so killed it.
I ended up at $5 / month or $48 / year. It's possible I might increase it a bit more in future but for now I think it's better to keep these prices and try to grow user numbers instead.
One thing I noticed with some companies was that the yearly plan was very heavily discounted compared to the monthly one. To me that gave the impression of lacking confidence that monthly users will stick around long term, so I didn't want to do that.
Yeah I think it's true that popular mainstream consumer products tend to be cheap and highly polished, and that more niche products tend to be higher priced and less polished.
It probably reflects reality, but I can see the point of showing lack of confidence in the product.
Not a language product, but Bumble (the dating app) at one point -- no idea if they still do it -- offered a lifetime membership priced at around 6 months of monthly subscriptions. I find looking for that kind of pricing can be highly instructive about a business and their competitive landscape, because presumably they'll have run their numbers and are expecting to earn more that way.
So it's not just signalling lack of confidence, but also giving away a very strong signal about the lifetime value of their customers.
But the overall principle that you should expect the discount to reflect their estimated lifetime value of a customer unless the amount is high enough that the investment return can exceed the regular income. With the exception, as noted by conradfr, that if someone suddenly offers a steep discount it could reflect an attempt to raise expensive capital fast
Assuming you're aware of those factors, it's a useful way of gaining insight into customer retention (assuming they're competent enough to run the numbers...)
They folded nationwide less than ten months later.
So how much did you pay?:-)
With Readlang the idea is that you read actual websites in the language you're learning. If you're learning Spanish you might read El Pais or BBC Mundo for example. And to aid you, you can click on the odd word or phrase you don't understand to get a translation in English. It's intended for intermediate and advanced learners. Unlike Tucan you need to seek out texts to read in your target language, and Readlang offers a list of popular sites in each language to help you there: https://readlang.com/es/links, but there's obviously more friction than something like Tucan which fits into your normal English language browsing routine.
Readlang - what would you say is the user persona you're going for? I need to learn (tourist) French. I'm not going to read sites about "where is the bathroom?", for example.
Readlang may not ever be appropriate for complete beginners. But it could do better at providing stories written in simple language appropriate for beginners in specific situations like yours. Right now there is a public library of shared texts: https://readlang.com/fr/library, and a list of popular websites: https://readlang.com/fr/links. But you're largely left to your own devices to find content, which adds friction for new users and isn't ideal.
I imagine it would have been a lot harder in my case if we'd actually integrated Readlang with Duolingo, sharing user accounts and that kind of thing. Luckily it was quite separate. I was a little stressed dealing with accountants and tax stuff here in Spain, and worrying that the technical transfer would go smoothly. But dealing with Duolingo was super easy.
> In general, the price per employee in an acquihire can range from $100,000 to over $1 million, with a more common range being between $250,000 and $500,000 per employee.
~ $ dig a www.readlang.com
; <<>> DiG 9.10.6 <<>> a www.readlang.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 65131
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;www.readlang.com. IN A
;; Query time: 62 msec
;; SERVER: 2406:3400:41e:5a80::1#53(2406:3400:41e:5a80::1)
;; WHEN: Fri Mar 24 10:06:36 AEST 2023
;; MSG SIZE rcvd: 45
Alternatively use the short format as suggested by another comment:
$ dig a www.readlang.com +short
readlang.com.
139.144.234.197
Although now it's a bit too short and you can't see the record types (CNAME, A). Sigh.I mean, sure I can decipher that "rcvd" stands for "received" but if I have my timeline correct there never was a time when such character count mattered and dig existed.
This output is the result of using the dig command to query the DNS (Domain Name System) for an A (Address) record associated with the domain name "www.readlang.com". Here's a breakdown of the output:
; <<>> DiG 9.10.6 <<>> a www.readlang.com: This line shows the version of dig being used (9.10.6) and the command executed (dig a www.readlang.com). The "a" argument is asking for the IPv4 address associated with the domain name.
;; global options: +cmd: This line displays global options for the dig command. "+cmd" is a default option that includes the initial command line in the output.
;; Got answer:: This line indicates that the DNS server has provided an answer to the query.
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 65131: This line shows details about the response header. "opcode: QUERY" means it's a standard query, "status: NXDOMAIN" indicates that the domain name does not exist (non-existent domain), and "id: 65131" is a unique identifier for this query.
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1: This line provides information about the response flags and the number of entries in each section of the response. "qr" means the response is a query response, "rd" indicates recursion was desired, and "ra" means recursion is available. The number of entries in the QUERY, ANSWER, AUTHORITY, and ADDITIONAL sections are 1, 0, 0, and 1, respectively.
;; OPT PSEUDOSECTION: and ; EDNS: version: 0, flags:; udp: 1280: This part shows information about the Extension Mechanisms for DNS (EDNS). The version is 0, and the UDP payload size is 1280 bytes.
;; QUESTION SECTION: and ;www.readlang.com. IN A: This part displays the question section of the query, which is asking for the A record (IPv4 address) associated with "www.readlang.com".
;; Query time: 62 msec: This line shows that the query took 62 milliseconds to complete.
;; SERVER: 2406:3400:41e:5a80::1#53(2406:3400:41e:5a80::1): This line displays the IPv6 address and port number of the DNS server that responded to the query.
;; WHEN: Fri Mar 24 10:06:36 AEST 2023: This line indicates the date and time when the query was executed.
;; MSG SIZE rcvd: 45: This line shows that the total size of the message received was 45 bytes.
The main takeaway from this output is that the domain name "www.readlang.com" does not have an associated IPv4 address (A record) in the DNS, as indicated by the "status: NXDOMAIN" and "ANSWER: 0" parts.
> dog A readlang.com
A readlang.com. 1h57m12s 139.144.234.197
> dog A someinvalidserver.com
Status: NXDomain
$ ping nxdomain.example.com
ping: nxdomain.example.com: Name or service not known
$ ping example.com
PING example.com(2606:2800:220:1:248:1893:25c8:1946 (2606:2800:220:1:248:1893:25c8:1946)) 56 data bytes
64 bytes from 2606:2800:220:1:248:1893:25c8:1946 (2606:2800:220:1:248:1893:25c8:1946): icmp_seq=1 ttl=52 time=93.2 ms
If you want a short summary, you use host: $ host nxdomain.example.com
Host nxdomain.example.com not found: 3(NXDOMAIN)
$ host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
example.com mail is handled by 0 .
or nslookup (from the same bind9-dnsutils package as dig): $ nslookup nxdomain.example.com
Server: 127.0.0.53
Address: 127.0.0.53#53
** server can't find nxdomain.example.com: NXDOMAIN
$ nslookup example.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: example.com
Address: 93.184.216.34
Name: example.com
Address: 2606:2800:220:1:248:1893:25c8:1946
If you want to debug DNS, with all the raw data, then you use dig.Also, the creator seems like it’s a simple sustainable business model - I give them money and I get a useful service without any advertising or dark patterns.
He will be getting my money.
I also send an automated "Readlang account renewed" email every time I receive a renewal payment. Most SaaS products don't do this for obvious reasons, but it sucks when I realize I've been paying a subscription for something I'm not using, and I don't want to do that to my customers.
Is it okay to ask, do you pay for the dictionaries you use? The homepage says "translate words and phrases" - do you use some kind of translation API, like Google?
You can also embed a custom dictionary of your choosing in an iframe in the sidebar: https://blog.readlang.com/2013/11/07/custom-dictionaries.html
And recently I've added a feature to get context-aware definitions from the ChatGPT API, but this is just for premium users in English, Spanish and French for now.
How does one fix the card testing fraud problem? Certainly you can refund people after the fact, but it seems to me any point where small-dollar service/product can be purchased by card is vulnerable and you'd have to kinda guess whether the usage makes sense?
- First I tried adding an IP address based rate limiter to the signup and payment routes, and required that all users had translated at least one word before being allowed to upgrade. It stopped the attempts for a few hours, but then they started back up again.
- Next, I used a more drastic approach, which would prevent all payment attempts from all IP address if we received more than 10 failed payment attempts within a 1 minute window. Still didn't work.
- Next, I changed the thresholds to 4 failed payment attempts within 5 minutes, and this finally worked!
Since buying Readlang back, I've updated the Stripe checkout to the latest version, turned off the circuit breaker, and haven't had any further problems.
Awww, this is such a precious sentiment <3 it always makes me happy to see people's lives changed like this online~
Nobody wants to admit it but it is basically the same language, heck was called Serbo-Croatian a few decades ago.
However, everyone I know has a common understanding about this, so I'm not sure who would be reluctant to admit that it is the same language... outside of the very few extremist groups of course :)
Also, here's the note from my list on what I wished Readlang would do: "check out how News in Slow Spanish (newsinslowspanish.com/) turns each word into a hyperlink. Hovering over it gives you an instant popup. This is a way better experience than Readlang, which requires you to click each word to get its translation."
My dream Readlang would have been one where I could quickly context-switch or change to see all of that, but it would probably require some significant client-side data and programming to achieve.
Cool to see Norwegian on the site, but the very first Library thing I went in to had an error in the Norwegian. I don't really understand how the site works, but that put me off a bit.
I did think that I might push to develop Readlang at Duolingo, but it never seemed like an attractive proposition for a bunch of reasons. I think it would have needed to grow at least 100X to start getting interesting within Duolingo. Not to say this was totally impossible but it seemed like a tough job. Also, some of the things that Readlang does, like browser extension and public sharing of texts, feel a bit "wild west" compared to the rest of Duolingo which is more curated and controlled, so it's not clear exactly how Readlang would have needed to change to fit in. I figured that if I tried this and integrated it tightly within Duolingo, and then failed to grow sufficiently, then the risk of it ultimately shutting down would have increased.
Also, I had other exciting projects to work on there which seemed more valuable for Duolingo, and therefore better for my reputation within the company, so I was happy to work on those!
Let me know if you are ever in Berlin and we can meet up again!
It works almost exactly the same as the Chrome Extension.