People often look at me funny when I say I live in IRC. After reading this post, I hope you will be able to understand why IRC has continued to be a useful platform for me for many years. This is also an attempt to document the functionality it provides since I want to replace the underlying technology later.
I have lived in IRC for about 7 years. What I mean by this is that IRC has been my primary hub for reading information online and interacting with people and systems. I don't use an RSS reader, I visit Twitter and Facebook only occasionally, and I try to limit my email usage to only business. Instead, I have created filters from various sources that send notifications to various IRC channels about things I am interested in.
Interface
I typically use the open source WeeChat IRC client. The screenshot below shows a what I normally see when I am connected.
The numbers in the blue bar on the bottom correspond to IRC channels. If the number appears in the bar, it means there is new activity in that channel that I haven't seen yet. The numbers and colors tell me more about the type of activity in the channel.
The numbers in parentheses indicate the type of activity in the window. When someone mentions me, the window number turns pink, and the first number in parens indicates the number of messages that mention me, the second number is the number of other messages. When the channel number is yellow, it means someone has said something, the first number if parens is the number of messages, the second number (if present) is the number of join/part messages. If the channel number is just light grey, it means the only activity in the window is join/parts.
When there are no new messages in any channels the bar looks like this:
WeeChat runs on a server in a tmux session, so that I am always connected to the IRC channels, which means when I come back to my computer I can quickly scroll through recent messages to catch up. Lately, however, I've had an easier time skimming the web logs for the #indiewebcamp channel, since they are formatted much nicer than this terminal window: indiewebcamp.com/irc/today
Keyboard Shortcuts
WeeChat supports approximately a billion keyboard shortcuts. The few I typically use are:
- Alt + 0-9 to switch to the top 10 tabs
- Alt + h to clear all unread counts
- Alt + Left and Alt + Right to navigate between tabs
- Fn + Up and Fn + Down to page up and down in a window
- Typing "/b 13" lets me quickly navigate to specific channel numbers
Over time, I've built up a mental mapping of numbers to channels, so I know when I see the number "2" in the list, it means there is activity in the #indiewebcamp channel, but if I see the number "7" in the list, it's probably just logs from my web server. I don't have all of them memorized of course, but the most common ones and the ones I care most about I know.
Data Sources
Currently I have information from several different types of data sources.
IRC
There are several communities I am a part of where IRC is the primary means of communication. The #pdxtech and #indiewebcamp channels on Freenode, the W3C Social Web Working Group (on irc.w3.org), several groups on the internal Esri IRC server, and a few others. I also have a private IRC server I use for close friends who are willing to put up with terrible IRC clients to talk to me.
Twitter Searches
I rarely actually read my Twitter timeline. Instead, I follow several hashtags and search terms, which pipe to various IRC channels.
In the public #indiewebcamp channel, the resident IRC bot reports when people talk about "IndieWeb", "IndieWebCamp", "IndieAuth", and "Webmention" on Twitter. Similarly, in the public #microformats channel, I see tweets about "microformats" and a few other terms.
I have a search for a few Esri keywords that show up in some of the internal Esri IRC channels.
A search running for some of the names of my other projects show up in channels on my private IRC server.
Website Notifications
My website uses IRC as a logging mechanism so that I have an easy way to know when it does things like import my bike ride logs from Runkeeper or my sleep logs from Jawbone.
Some of my other web apps also report things to IRC, such as when someone buys credits on vanity-qrcode.com or notifications when disks are nearing full.
I also wrote a Wordpress plugin that sends a notification when new posts are published or new comments are posted.
GitHub notifications
Rather than needing to check github.com all the time, or turn on email notifications, I have IRC channels for various groupings of projects. Notifications about people opening issues or making commits are sent there, giving me an easy way of seeing activity on various repos grouped by category. I have a channel for #indieweb projects such as webmention.io, Teacup, Monocle, Atlas and many more. Several different private Esri channels give me notifications about the various projects we work on like the ArcGIS for Developers website, the Geotrigger Service, and previously, the Geoloqi repositories.
Home Automation
I've been hacking on various home automation projects for many years. It always ends up seeming that the easiest way to get notifications of things is through IRC. Over the years, I've used IRC to get notifications for many things such as
- a camera-triggered motion sensor, which sends a link to view the image taken from the camera
- someone used their thumbprint to open a door
- someone entered their code in my apartment building's call box
- the system updated the door code for my AirBnB lock
How does this work?
For every channel I use for notifications, I run an IRC bot that has an HTTP server and listens to a few UDP ports. The UDP ports allow me to "fire and forget" messages into IRC that might otherwise bog down the server that's sending them. This is actually how the original MediaWiki RecentChanges bot works, which is what this entire system is based on. I added the HTTP interface to give myself a more flexible and secure mechanism for sending messages to IRC as well.
At the core, the connection to IRC is really just this bot that listens for external messages. Everything that generates messages for IRC actually lives on many different servers depending on what it is.
Notifications
Weechat has several plugins for sending notifications to a mobile phone. I use the Prowl iOS app on my phone to receive push notifications. The Prowl service exposes an HTTP endpoint that Weechat uses to send me a push notification.
By default, it will send notifications whenever your IRC nickname is mentioned. This is handy for knowing if someone is trying to get a hold of me on IRC, but is also a quick way to have notifications from various server scripts sent to my phone. I will often add on "aaronpk" to the log message because I know that will cause it to send a notification to my phone.
If I am connected to the Weechat session, it knows not to send push notifications to my phone.
Components of a Notification
A single line in IRC has several pieces of information. Some of these are built in to the IRC network, but I have also developed a few conventions for what goes into a line of IRC as well.
- network (IRC, Twitter.com, Github.com)
- account (IRC user, Twitter user, etc)
- timestamp
- author (author name, or name + url)
- category (for my website logs, this is "runkeeper", "sleep" or "mention" for example)
- content (text)
- permalink
Examples:
[runkeeper:bikeride] 3.5km 15 minutes http://aaronparecki.com/metrics/2015/08/28/161857/
[github.com/aaronpk/Quill] kylewm opened issue #28: support identity URLs with non-trivial paths https://github.com/aaronpk/Quill/issues/28
[AirBnB] Michigan door code was set to 6932
[door] incoming call
[@patrickgrimard] Great article explaining #Oauth2 https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified (http://twtr.io/12zRXPmw37j)
Logs
Another major benefit of having Weechat be my primary interface and having it always signed in, is it stores logs of all channels as plain text files. It turns out text files are relatively easy to keep around in the long term, much more so than migrating databases between versions or different servers over the years. Text files are also very easy to search, you can use grep to find things very quickly!
Logs are grouped by IRC network, and in folders for each year, with one file per day.
irclogs/ /2014/ ... /2015/ /... /esri/ /... /#portland.08-25.log /#portland.08-26.log /freenode/ /... /#indiewebcamp.08-25.log /#indiewebcamp.08-26.log
Why do I keep coming back to IRC?
There are clearly much nicer interfaces than what I am currently using. Weechat is a terminal client, so I don't get things like inline images, and URLs that wrap multiple lines are cumbersome to open. There isn't a mobile interface, aside from mobile SSH. And yet, despite these shortcomings, it continues to be more useful than any alternative I've found yet.
Here is a summary of the key components of why I believe this setup has stuck around for so many years.
- My IRC bot gives me an HTTP endpoint to get messages into IRC channels from many different data sources
- Everything is logged as text, which is easy to search and has low storage requirements
- Weechat is always connected so I can always see scrollback when I come back to my computer
- Weechat has keyboard shortcuts making it very quick to navigate between all the open tabs
- Weechat sends push notifications to my phone
Shortcomings
There are, however, several shortcomings of this setup.
- Weechat is not easy to use on mobile (requires mobile SSH)
- Long URLs are not clickable since they wrap multiple terminal lines
- No inline images
- Adding new channels is more work than I'd like, since it involves making config changes to the IRC bot
Replacing IRC
At this point I am finding myself wanting some of the nicer features of a graphical interface, and I'm planning on finding or building a system that can replace my use of IRC. However, regardless of what this envisioned system could do, regardless of the grand vision, my current setup does this subset of things right now, which is enough for me to have kept using it for 7+ years.
That said, there are a few things I would like my new interface to do that would be challenging or impossible with my current interface.
- Better configuration of mobile push notifications (adding keywords or source matches, for example)
- Mobile-friendly view so that I use the same system with the same design and layout on both mobile and desktop
- Use channels as a "reader", e.g. adding h-entry/RSS/Atom feeds to a channel, being able to quickly add new sources from the interface
- Be able to post to my website (and reply to other posts) from within the channels