TabNine's first month in review
First, some background. I’m an undergraduate at the University of Waterloo. I started working on TabNine in February 2018, in my spare time while working as an intern at Jane Street. TabNine was born out of mild annoyance with the development workflow there: I wanted a middle ground between Merlin, which was very accurate but occasionally took several seconds to produce its results, and hippie-expand, which was fast but missing key features such as fuzzy matching. The goal was to use TabNine for low-latency, as-you-type suggestions, then trigger Merlin manually with a keystroke when I needed it. I never achieved the goal of using TabNine at work because my internship ended before I could get TabNine to handle the size of the internal code repository: indexing code is hard, but indexing only some of the code (to avoid running out of memory) is harder.
I went back to university in June and continued to spend my spare time on TabNine, asking my friends to test it and provide feedback.
In August I had a few weeks of free time as I waited for my visa to get approved before I could start my next internship. I had always been curious about uISVs (micro independent software vendors – software companies with very few employees) and wondered what it would be like to operate one. Plus, it said on my visa that I was going to learn about American culture, so I decided to get an early start by charging for my software. I built a basic website, created a licensing system, and integrated with Stripe and SendGrid to process payments and send registration emails.
A couple months later, I launched.
I launched by posting on Hacker News and Reddit. The Reddit posts did ok, but the Hacker News post did extremely well: it was briefly #1 and it stayed on the front page for around a day. This led to a lot of traffic, and in the first 48 hours, over 2,000 people downloaded the editor plugin.
This was very surprising. My expectations for the post were somewhere between “gets no attention whatsoever” and “briefly reaches front page, one person buys it, then asks for a refund shortly afterwards”. I’m very grateful to all my users for the positive response, and especially grateful to the people who wrote TabNine clients for new editors:
- Tommy Xiang, who wrote a client for Emacs.
- Theodore Dubois, who wrote a source allowing TabNine to be used with Deoplete, an autocompletion framework for Vim.
Lots of people wrote to me asking questions. The most common was a request for an invoice, and I quickly realized that I needed to automate the invoice creation process. I stuck to what I knew. Many companies have automatic invoices, but I bet most companies don’t create them with LaTeX:
The most common feature request went something like: “I get that TabNine is language agnostic, and that’s great, but I would really like it if my autocompleter knew something about my programming language”. I had always planned to fulfill this feature request by allowing TabNine to use other autocompleters to produce its suggestions, but it turned out to be surprisingly easy because I was able to adapt kak-lsp, the Language Server Protocol client for Kakoune, to handle the communication. I released semantic completion about 2 weeks after the original launch. This is just one of many instances where TabNine benefited from the open source community.
I experimented with online advertising. Google AdWords was very expensive — around $10 per click. I didn’t think that it would be so expensive, since I didn’t see any competing ads when I tested search queries containing ‘autocomplete’. Facebook ads targeted at professional software developers were much more cost effective, at around $1 per click. Around the beginning of December, I started running ads on Stack Overflow, but the click-through rate has been very low: around 0.1%. This is probably because my ads are poorly designed and because developers are unlikely to click on ads in general.
I also changed the price after a couple weeks. Originally TabNine cost $29, and I felt this was too low because users typically fall into one of two groups:
- People who don’t like TabNine enough to use it in place of their existing tools.
- People who like TabNine and use it whenever they write code.
The first group would not buy TabNine even if it cost $1. The second group gets a lot of value from TabNine and might be willing to pay more than $29. So I decided to raise the price. At first I tried to be like Sublime Text by raising the price to $99 but offering features for free, only charging to remove a mildly annoying message. I spoke to my friend Ben about this:
Jacob: I’m raising the price to $99 but offering features for free, only charging to remove a mildly annoying message.
Ben: That’s a terrible idea.
Jacob: You’re right.
So I undid the change and raised the price to $49 instead. I refunded everyone who bought TabNine at $99. This was easy because no one bought TabNine at $99.
After the launch, revenue decreased each week, which was not too surprising. Moving forward, blog posts seem like a much better way to promote TabNine than online advertising. This seems like a good way for the world to work since blog posts directly create value for readers. The nice thing about TabNine is that its target audience is software developers, which means I can create relevant content by simply blogging about developing TabNine.
I originally planned to share my revenue numbers like Bingo Card Creator, but I decided not to do so. I plan to share them after TabNine has been around for a year or so.
Plans for the future
Currently TabNine looks like this:
I want it to look like this:
The great thing about as-you-type suggestions is that you don’t need to take action to show them: you only need to take a physical action once you’ve decided to accept the suggestion. But as-you-type suggestions shouldn’t be limited to code completion. We should have them for documentation and code examples as well. This information is available already, since you can search online for code examples and documentation. The problem is that this requires a conscious decision: you need to decide to search for the information before you can access it. Some editors show documentation when you hover over an identifier, but this only mitigates the problem and doesn’t solve it: you still need to make a conscious decision to access the information.
While developing TabNine, there have been many times when I’ve typed something like
Regex, and then shortly afterwards opened Google and searched for ‘rust regex’.
In the future it will just take a single click to go from your text editor to the Regex documentation.
Since TabNine has no externally imposed deadlines, I will impose one on myself: I intend to build this functionality by the end of January 2019, and release it to the public by the end of February. I don’t expect it to be perfect, but on balance it should save users time. Using tools like TabNine has a cost in that you need to spend time looking at the suggestions and judging whether they’re relevant, so they must meet a baseline level of suggestion quality in order to be worth it.
2020 Jacob: This “plan for the future” didn’t happen. However, a Chinese-language publication pulled my mockups and said they were real features. Moral: over-promise and under-deliver?