I’ve tried over and over to get away from using a big-ass text file to jot down my thoughts, notes, ideas and tasks. The list is long: Mantis, Asana, Trello, Evernote, Apple notes, Todoist, Notion, spreadsheets, and mind map tools. Every time I tried one of these new and “improved” tools, I ended up coming back to my trusty, simple text editor, which, depending on the era, might have been BBedit, UltraEdit, Sublime, Atom, or VS Code.
Big UI productivity tools with hover reveals, popups, and submenus get in the way of my in-the-zone workflow. What I want is a fluid scratchpad to quickly visualize what I’m thinking, take notes, explore different technical ideas and keep track of microtasks. Since I already have my big-ass text file open all day, it makes no sense to enter my larger tasks into another system when it’s ready to take whatever I throw at it, no questions asked.
I also find those other tools “feel” uncomfortable, which is why I keep returning to a text editor. Somehow, I find joy in the basic user interface of a text editor. There is almost zero UI between my brain and the output of my fingers. It is malleable, ephemeral, instantaneous, and just works.
As wonderful as text files are, they don’t have structure. By using a text file over something with records and structure, I knew I was leaving a lot of personal utility on the table. For example, it’s hard to self-quant task completion statistics when the way I “check off a task” is to delete it!
So, I decided to build my own productivity tool. The challenge was simple: build a tool that is so good that the thought of returning to my trusted text editor wouldn’t even cross my mind.
I took my first stab at building such a tool and failed; a text editor was better. I tried again, same outcome. I tried a third time with a new UI approach, but again, it was not good enough. Once again, a simple text editor was better.
Then I had an interesting thought. Maybe the text editor is not the problem... maybe it is the solution! Could I build a tool that behaved and felt exactly like a text editor but had the underlying data structure required for a productivity tool?
I set out to build a better text editor where each line of text was its own atomic unit, with an ID, a place in the hierarchy, and a record in a database. At the time, I told a friend I’d have something ready for him to test in about a week. And it was — five months later...
I hadn’t quite grasped how building something like this would require me to build every tiny part. Take a simple action like “a user selects a few lines of text and hits delete.” I had imagined the browser would give me that for free. After all, if you select a few lines of text in a standard editable HTML element and hit delete, it just works!
Unfortunately, my “each line of text is an atomic unit” idea was such a radical reorientation that I had to build almost every part of every action from the ground up. By the time it was ready for my friend to test, I'd written over 15,000 lines of code.
I’m not complaining, though; building something so technically deep has been a huge amount of fun!
Keeping my personal challenge in mind, I obsessively tested every interaction and made sure that List (the name I gave the application) was at least as good as, if not better than, using a text editor to manage my tasks.
I did this by spending hours performing an action side-by-side in List and the other text editors. If there was even the slightest latency or lack of fluidity, I reworked the code until it felt like the other “real” editors.
I also became rather obsessed with speed, which led me to build a 3-layer data architecture: (1) an in-memory data manipulation system which I call FastNode. This is the primary data model. Then, (2) data is synced to indexDB (an in-browser local database), and then (3) to the cloud. Since all operations are executed in memory, they are very fast: most are completed in less than 5ms.
During my interaction testing, I also added features not typically available in regular text editors, like the ability to quickly move large chunks of text around the page with arrow keys, to create nested data structures with the tab key, to toggle any line of text into a real task with an actual checkbox, and so on.
I knew I was on to something when I was forced to stop using List while I performed open heart surgery on the data model. During those few days without List, I felt irritated and limited by using a regular text file to manage my tasks. It was missing so much of the new functionality I now take for granted in List.
In some ways, it is hard to define exactly what List is; it merges a text editor, a mind mapper, an outliner, a to-do list, and a powerful shortcut system into a new, unified type of scratchpad, throw-anything-at-it, store-it-for-the-long-term, productivity tool.
*Inner loop is a programming term that describes the most frequently executed code. In this context it refers to the most common tasks - typing and organizing.
List is very new. While the inner loop is tight, I still have a lot of utility to add. This is a quick overview of what I have built and what is coming soon (this may change depending on customer feedback).
*A node is a line of text.
I invite you to join me and help product-test List. Especially if, like me, you have loved using a text editor to manage your moment-of-work micro-tasks. Also, we have an active Discord where we discuss features, annoyances, and ideas. By becoming a product tester in these very early days, you will help shape the future of List!