The Finger protocol was first written in 1971, making it a whopping 51 years old at the time of my writing this. It is a simple network protocol for the exchange of status information. A finger daemon runs on TCP port 79, and responds in an unspecified manner to simple requests. Back in the day, it was used to see who was online at a UNIX system, and some implementations even allowed custom user-provided text.
This protocol has long been obsolete. In an era of terminals and mainframes, it was used in a way similar to micro-blogging or for humorous purposes. But now, with the rise of the internet and social media, there's hardly any use for this protocol. Although, I think I have found a rather creative use for it, over half a century after it was first written.
I maintain a todo list as a plain text file in my home directory. When I complete items, I simply delete them from the file. Likewise, I use OpenBSD's built-in calendar(1) program to keep track of events. These files are all synced via cvs(1) between all my computers and my server. But my phone was excluded. I could not view my calendar or my todo list on my phone. I can also not check my email on my phone because I don't run a normal IMAP server.
Enter finger(1) and fingerd(8). Combined with inetd(8), I can run a finger server on OpenBSD without having to install any extra software. The default finger server displays a bit of useful information, such as whether or not I have unread email. It also can display a custom file in my home directory called `.plan'. If this file exists, it is copied verbatim to the output of the finger daemon.
With this information, I thought I could use finger to output my todo list and my calendar. All I have to do is write a script that generates my .plan file by checking out the calendar directory from my CVS repository and combining the output of calendar(1) with my todo file. Then, I can add that script to my crontab(5) and have it update my .plan every few minutes, so that when I push new changes to my calendar or todo list to CVS, they're automatically reflected in the output of finger.
So that is exactly what I did. The next step was to figure out how to ping my finger server from my phone. Luckily, I found an app called FingerList, which is an open source finger client for Android. I just input my finger URL, and it automatically updates it. Now I can see my calendar, todo list, and whether or not I have unread emails right from my phone.
At this point, you're probably asking: why finger(1) instead of a text file on your website or something? Or why not just use CalDAV and IMAP like a normal person? My answer is this: simplicity. I ran a CalDAV server once. I ran an IMAP server once too. But those are both extremely complicated pieces of software that solve a problem that I don't have. They're complicated to set up and require complicated server and client software. That means lots of potential for bugs and resource hogging. Finger solves my problems perfectly, for a much lesser cost. It follows the UNIX philosophy of doing only one thing well. It chucks information over a TCP connection. And that information is my calendar and todo list. That's it.
Plus, believe it or not, all the major operating systems still provide finger clients. Even Windows has a finger client built in to it! So, despite being old and obsolete, finger is still a viable solution. To answer the question of why I don't just bookmark a cron(8)-updated text file on my web server, I don't think that's the purpose of my web server. My web server is used to issue content that, once present, is static and not changing. I don't run any CGI scripts on my web server. Everything is all flat files. The purpose of my web server is to serve static content, or content that doesn't change very frequently at all.
Additionally, it seems rather sloppy to have a file served over HTTP that is updated by cron(8) constantly. Using finger(1) seems like a more appropriate way to get up to date scheduling information, because it was designed for that very purpose. Just as httpd(8) is for serving public, mostly static content such as blog posts and other pages, finger(1) is used for displaying a very specific set of information.
I'm not too concerned about the fact that my finger information is all public, because all the information displayed by it is public anyway. My phone number and email address are already listed on my resume. My calendar is just my school schedule. There's nothing really personal about it. And my todo list is just homework assignents. Privacy is very important to me, but I believe more in controlling my data. If I choose to make data publically available, that's up to me, and that's really what I care about when it comes to privacy. I only trust myself to share my data. And that's why I run everything on my own server.
© 2019-2023 Jordan Bancino.