awarm.spacenewsletter | fast | slow

Terminals aren't terminal

I returned this week to a previous take on fancynote: a command-line application. 1

I'm surprised it's taken me this long to get to it honestly, I've always been a big fan of CLIs. There was a period of time when every time I'd search for a tool it would perfixed with "terminal", i.e "terminal task manager", or "terminal email client".

So what's the appeal? Why ditch all the work I've been doing in the web browser for a clunky old terminal?

If you're not someone who does a lot of work in the terminal, this may seem strange to you. Don't worry, I'm not going to try and convince you to drop everything and run your entire life on the commandline. I'm more interested in why the space between terminals and everything else. There's this vast distance between the archaic terminal and the modern web-browser and it's absolutely insane to me that nothing exists in it.

I want the simplicity of the terminal with the power of the browser, the real programming language, the nice api's. I want to be able to build rich applications, but still have everything be text, on a standard grid that all applications can work with. I want more than a choice between a massive multi-media platform trying to be everything (and mostly being a tool for corporate content distribution) and an archaic platform that still works the way it did in the 70s.

Phew. Okay. Let's break that down a bit by bit, both why terminals are good, and where they fall short, and maybe how we could find a happy middle ground.

It's all about text

Ultimately that's the appeal of terminals. Everything is just text, conveyed to you in the simplest way possible. Your input is just text, and the output is just text. But, interfaces need to be a little bit more than just reading and writing text2, and to do that they need to get interactive.

Fundamentally, the entire thing is just a grid of characters. To build complicated interfaces you just describe what you want to put on the grid, and what you want to happen when the user interacts with it right? Easy! Well, not quite.

Manipulating a terminal works using this things called "escape codes" which are special characters that tell the terminal how to display things on that grid. Things like fonts, colors, the cursor and selection, even things like backspacing and entering new lines, all are escape codes.

Fundamentally a terminal really is just responding to a stream of input characters and nothing more. This is a kinda ridiculous way to make interfaces.

Of course that doesn't really stop people from trying, because ultimately a grid of text is a pretty solid basis for interfaces! You can navigate easily with a mouse or a keyboard, you can visually understand it at a glance. It's hard to make thing misaligned cause well, everythings on a grid!

There's an interesting parallel here with the web-browser3. Initially it was a tool for viewing documents, hypertext, just "marked up" to look a certain way. But then these documents got more and more complicated, and turned into applications.

Maybe, any sufficiently advanced way of displaying text eventually becomes an application platform.

So What?

I beleive there's a middle ground here that can have the benefits of both a terminal and a webbrowser. From a terminal we want to take the standard grid, the simplicity, and the all encompassing nature of text. We still want to allow rich media, but in way that conforms to the structure, as opposed to exploding it in complexity. For web-browsers we want to take the rich programming capabilities, proper APIs, and networking. Sharing entire applications with just a URL is something incredibly powerful that absolutely shouldn't be lost.

Could this actually happen today? Maybe?4 If someone were to do it I think they'd have to give up compatability entirely, and be some kind of new thing/ecosystem. But then people need a motivation to actually use this new platform. I hold a tiny hope that a note-taking tool could be that motivation.

For now I'm just going to be aiming for the lowest-common-denominator, and building Fancynote as a terminal application. Actually, more likely I'm going to end up bouncing between the two platforms, and it would probably serve me well to figure out a way to do that nicely. I shall have to ponder it!

P.S: Gary Bernhardt's talk A Whole New World talks about hte future of terminals and was a big inspiration for a lot of my thoughts here!


  1. I realize I never really described what I did, so I'm leaving it here in a footnote. I replaced the IndexedDB storage in fancynote with SQLite so it could be used from node and wrapped that up in a script to open a text-editor, and then write whatever from there into the log.
  2. basically all user interfaces are a loop of visual response -> user actions -> visual response. Reading text is a single (if very flexible) visual medium and writing is far from the only action people can take.
  3. Also interesting to note that the most advanced text-editors used to be based on terminals and now they're built on top of web-browsers.
  4. If you were going to do it, you 100% should leverge the browser stack. Pathfinder looks especially promising as a 2D rendering engine for text-heavy things.