Text Based Desktop

Sometimes, I find it useful to have most of the basic features of a full desktop environment from an interface that doesn't require more than 24-25 lines of 80 columns text. This article lists a few programs that can be useful in such an environment.


Two words: remote access. It is true that it isn't hard to setup a graphical environment for that, using things like vnc or X forwarding in ssh, but then you need a decent server (i.e. a pc, not a low-power no-noise small box) and quite some bandwidth. Text based applications are perfectly fine running on any computer and can be easily accessed via ssh even from a slow, painful, gprs connection.

Beside, I've found that I work better with a set of small, well integrated, text-based programs in the *nix style than with huge suites that try to everything and usually fail at some of it. I use most of these applications even when working locally on a full-powered pc: my typical (graphical) desktop is full of urxvt windows with software from this list.


It is correct to mention that there is another way to do it: emacs probably offers most of the functionalities and some more, and I've heard that they've even managed to add a decent text editor :) but I feel more confortable following the unix way than the emacs way.

Desktop management and shells

Of course, my window manager of choice is GNU screen, with a statusbar on the bottom line that vaguely resembles my taskbar in fluxbox and includes a list of windows plus the date and time, using the following .screenrc configuration:

hardstatus alwayslastline
hardstatus string '%{= bw}%-Lw%{= KW}%50>%n%f* %t%{= bw}%+Lw%< %{= kB}%-=%D %Y-%m-%d %c%{-}'
nethack on

where the last line is of course optional, and included only on boxes where I can accept mildly unreadable errors.:)

As a shell I'm still using bash, the default under GNU/Linux systems, but I'm not religious about it and some day I may try some alternative. Sometimes I use ipython, but more for python work than strictly as a system shell, and I never had the courage to use it as a login shell.


Most of my 1-1 communications is done using jabber, so my client of choice is the ncurses based mcabber, which includes support for OTR and everything else I need. Back when I still received some non-spam message on the icq network i used centerim, an ncurses based multi-protocol client.

For channel-based conversations, of course, I still use IRC, with the irssi client, which is probably one of the two most popular ones in the tech channels I'm on.

I read and manage a few email accounts using mutt, after they have been downloaded with fetchmail, checked by SpamAssassin and sorted by procmail into sensible folders, as well as indexed with notmuch.

I used to use mcabber to manage my identi.ca account, but now that the xmpp interface is dead I'm using twidge; messages I receive are sent to my local email account (where procmail sorts them in proper directories), while my post are sent directly from the command line.

Other internet

Browsing the web is one of the few things I don't usually do from a text based interface, but the rare times I do I use links2. More often, I just configure my urxvt with the following lines in ~/.Xdefaults so that it recognises links and I can open them either with a click or by pressing ctrl-e:

urxvt.perl-ext-common: default,matcher,-option-popup,-selection-popup,-realine
urxvt.matcher.button: 1
URxvt.keysym.C-e: perl:matcher
urxvt.urlLauncher: /usr/local/bin/xxxterm-open-url.sh

Another interesting tool I've just known about is surfraw: a command line interface to some hundred search engines on the web, from google to package repositories, distribution wikis, books etc. The results are shown in a browser of choice, with support for both a default text based browser and a graphical one.

Another internet related topic where I've completely moved to text based tools, instead, is feed management. For plain blog and planet feeds I've tried newsbeuter, also called the mutt of feed readers, but I've noticed that its memory requirements tend to grow with time; now I use rss2email to receive post directly in my local mailbox, so that I can read them with the real mutt. In both cases, articles that don't include lots of images are read directly as pure text, otherwise I just open the article in xxxterm with the above urxvt configuration. For podcasts I had already configured podget, a bash script optimized for running as a cron job.


Multimedia management isn't something where one expects a text based interface to work well, but there are a few exceptions.

First of all, music doesn't require a graphical interface, and there are excellent text based audio players such as alsaplayer, a full featured tool that plays audio files, but doesn't try to do anything else like organizing your collection (I have bash and the filesystem for that, thanks). Unluckily, they have added a GTK based GUI, and most distributions install it and use it by default: when space is not an issue I just set the following option in ~/.alsaplayer/config to use the text interface by default:


It can be controlled from another command line, so if you have an extended keyboard with “multimedia” keys you can configure them to run commands like:

alsaplayer --pause

to control a running alsaplayer instance.

I believe I should mention that the multimedia player mplayer can work from a text interface using either aalibs or libcaca, but this feature isn't really practical for most videos. On the other hand, mplayer (and mencoder) can be used for many non-interactive tasks, such as saving a stream or reencoding videos, so it is useful even on strictly text only environments.

Another non-interactive suite of tools that is quite useful in a text only environment is ImageMagick, which is able to do quite complex graphical manipulation and supports almost every existing format.


Most of the productivity tools I use have been mentioned in the Life Beyond Office article.

What's missing

I'm still looking for a good text-based client for CalDav calendars.

I've found a python module called caldav that looks interesting; right now I'm using it with a quick and dirty script that reads my calendars, gets events for the current and following day and prints them in a way that resembles the old bsd utility calendar.

This may (or may not) in the future become the base for a full command line CalDav client, unless I find something readymade that I like better.

On the other hand, I'm not really sure I need a full CalDav installation to manage my calendars, and it is possible that my needs will be fully covered by remind, which I'm currently testing.

See also

There are other lists of text based lightweight applications around the net, some of them with alternatives to the software listed here that may prove more to your liking.

Send a comment: unless requested otherwise I may add it, or some extract, to this page.

Return to Top