Why I use a Linux workstation

My very first computer ran Windows 3.1. Not long after that Windows 95 was available, so I installed that. A few hacker movies later I decided that was my next move. I was going to be a hacker.

A few days of reading and searching and I had my first steps. Apparently to be a hacker you need two things. You have to know how to write code in C and you have to run a Linux workstation.

This is the honest truth. The motivation behind learning how to program and my Linux systems experience was hacker movies and stories I'd read on the internet. Funny how life works eh?

There I was, 15ish years old, downloading 12+ floppies overnight because during the day was too risky. See, someone may call the house and disconnect my internet connection. Yup, I was on a blazing 14.4k baud modem / dial up connection back then.

My first distro was Slackware, which at the time was considered pretty advanced. I had no clue what I was doing but I took a lot of notes, setup dual boot, and off I went. I frequently screwed something up, rebooted back into windows, researched the issue, booted back into Linux to try a fix and hope it worked.

Honestly it was so much fun I didn't really consider how ridiculous it was.

It didn't take long before I actually was pretty good with Linux and writing software in C. I distro hopped and eventually moved on to FreeBSD workstations.

I don't remember when but I guess around 2002ish. I got myself an Apple iBook. This was neat because it was from a big company, had a nice design, and ran something called OS X which was FreeBSD ported to their architecture and wrapped in a pretty interface. With OS X I could have the best of both worlds.

After that I was purely an Apple laptop user. I'd upgrade every few years and in general I was very happy with the computers and the operating system.

Note: At some point Apple renamed "OS X" to "Mac OS" but I'll just refer to it as "OS X" in this post because the name changed after I switched away from it.

Coming back to Linux

Summer of 2018 I was ready for a new laptop. As I looked at Apple and OS X I realized what had been in my head for a while now. I was totally bored and no longer impressed with Apple products.

I'd already ditched iPhones a few years earlier for lack of innovation. Well, the same thing was happening in OS X. The slow turn of the once fun operating system into a large iOS interface totally turned me off. Plus the writing was on the wall (placed there years earlier actually), and Apple was slowly locking down it's walled garden.

It was time to move on. I'd been wanting to return to a Linux workstation for some time but just hadn't pulled the trigger. My buddy Andrew constantly gave me shit about Apple and how terrible they were and I needed to stop talking and finally make the switch.

Well, he was right. I ordered a Lenovo Thinkad X1 Carbon (6th gen), installed Ubuntu Linux and was off and running. In hindsight I wish I'd thought more about my distro and chosen something more lean, perhaps Alpine Linux, but I just wanted to get up and running quickly. Once I had everything setup and tweaked how I liked it, I was to lazy to reinstall a different distro and do it all over again. So I'm still running Ubuntu today.

Why the switch?

More and more we're seeing big tech close in on all of us. The noose, that we ourselves placed around our necks, is slowly getting tighter and tighter. I saw the direction Apple was taking with OS X and I didn't like it.

The terrible direction they're taking was recently highlighted when Apple managed to stop OS X computers all over the world from opening new applications because of a dependency on one of their application servers. An Apple controlled server had some issues and that stopped users world wide from opening new applications on their own personal computers!

To me this is completely unacceptable and while I switched away from OS X years ago, it still pissed me off. In the wake of this debacle, "Sneak Berlin" wrote the article titled Your Computer Isn't Yours that I think is a great read and recap of what happened and why it's terrible. Also describes what's coming in OS X in the Sierra Leone version.

I'm a pretty technical person with a decades long history of using Unix like operating systems so even in OS X most of my time was spent in a terminal. I prefer to do most things on the command line. I even read my email in the terminal. So other than a web browser, I didn't really need any of the features that OS X offered.

The biggest advantage to an Apple laptop is that they control every aspect of the device. From the hardware to the overall operating system. This allows them to provide a very smooth experience and mostly free of issues. I get the appeal of this.

On the other hand there is a part of me that completely missed the ability to tweak every last details and tinker with the internals of my workstation. This definitely scratches an itch that I've always had when it comes to computers and it never died out, even if it was dulled a bit while using OS X.

Since switching back I've had a lot of fun (and shed a few tears) tinkering, breaking, fixing, altering, and customizing things to my hearts content. It was initially time consuming but I've now got myself a workstation completely tailored to how I want to work. I can't imagine ever going back to a workstation where I don't control everything. Every keyboard shortcut, every tray icon, every virtual desktop organization, every... well everything.

How I work?

So I'll give a high level view of how I work, what software and tools I use, how I organize my desktops and apps, etc. All of my public configurations can be found in my dotfiles repository.

Desktops

I use the i3 tiling window manager with i3blocks as the desktop environment on my computer. I love using tiling wm's because it makes things to simple and keeps virtually everything visible on screen.

Generally I'll have 5 active virtual desktops and each has their own purpose. Here is the list of each desktop number and it's purpose.

  1. Coding. I use this desktop to run a few terminals. Generally one larger terminal that runs tmux that I have sessions for each of the major projects I am currently working on. Next to that I'll have 2 stacked terminals that I'll use to do various tasks while I'm coding. Some examples may be test a code change, run a debug web server, or scanning a document from a different project or place on the system.
  2. Web browsing. Ill run Firefox here, full screen, and only use this for browsing. Occasionally I'll run LibreOffice along side here for situations when I need to update spreadsheets or documents based on data from a web portal. I usually keep this desktop's windows in a tabbed layout.
  3. Communications. On this desktop I'll have a few terminals. One running the neomutt mail client (more on that below), another running irssi IRC client in a remote tmux session, and another just for random tasks when in that desktop.
  4. Team Chat. Yes, this is another "communications" type desktop but I only use this desktop for team communication services. Here I keep our MatterMost and client Slack sessions. This is a desktop I try to avoid as much as possible but I do need to spend more time than I'd like here.
  5. Writing. This is just a big ass terminal where I do most of my writing. I try to have nothing else on this desktop to avoid distractions.

Terminal

I run the suckless terminal (called st) for all terminal work on my system. The terminal itself is bare bones by default, which I love, and there is a whole set of patches from the community available to add to the term.

You customize st by rebuilding it with your own custom configurations. If you add a new patch, you have to rebuild and reinstall the terminal. It sounds crazy but the process takes seconds. You can see my custom version of st here.

For my main development terminal I'll run a tmux session to manage various projects. Think of tmux as a "virtual" terminal manager. It allows me to configure custom workspaces all within a single terminal. Basically I keep a dedicated workspace in tmux for every project I'm currently actively working on. This makes it super easy - 3 keystrokes - to switch from one project to another.

Email

Like most of my daily or typical work, I handle my email in a terminal. I know most people will think I'm crazy but honestly it's the best way to deal with email. Using the keyboard to navigate and manage email is so much faster than a GUI interface.

For email I use the best mail client (MUA) ever created: mutt. Technically I use a fork called neomutt which is a community maintained fork and has more active development than the original mutt. Neomutt is kept up-to-date with the original mutt development as well so there's no missing out on core mutt features or fixes.

I like to keep a copy of all my email on my local system. This is handy for searching for or handling emails offline. I love to run through my email backlog offline and queue everything up to send once I'm connected again.

To download my email I use an older version of offlineimap. The version I use is so old it requires Python 2. While newer offlineimap versions support modern Python there are changes in how it works and honestly I've just been too lazy to switch it up, debug any issues, etc. The version I'm using works and works well.

I have a cronjob that runs every 30 minutes to download my email. The script that sync's my mailboxes has a flag check and if set, the script will not download any new email. I usually set this flag during working hours and make it a point to only check my email every couple of hours. I don't like the distraction of constantly updating my inbox.

To send email I use msmtp which is a sendmail like utility and can send email directly from the command line. Mutt is configured to use this when sending email.

Both offlineimap and msmtp support multiple accounts so it's just a single config file for each and I have all my email accounts managed and in use.

Oh, and I only send plain text email. As I've said before, HTML emails are annoyng.

Coding / Editing / Writing

I spend the majority of my day writing. Code, email, docs, policies, blog posts, discussions, etc. All of these I will write using my text editor.

For writing I use the vim editor. No surprise here and I'm not alone. There are millions of people use vim daily. I've used vim (or vi) for more than 2 decades now. It's widely viewed as the best text editor in existence and I agree. Fight me.

I have a handful of plugins and config tweaks that make it easier to get tasks done. I even have a simple Python script that will setup a new environment with my vim setup and vimrc. All of this is available in my dotfiles repo (linked above).

One plugin that I think should be mentioned specifically is goyo. It turns a vim session into a distraction free environment. I even have it setup to only focus on the current paragraph. This is great for just writing articles, documentation, etc. I'm using it right now to write this blog post.

Documents

Since the vast majority of the documents I work in are text files I don't have a lot of software for other document types. However, there are a few that deserve notable mention.

For PDF documents I will generally use mupdf to read them. This is one of the best utilities I use. It's small, fast, easy to use, and does one thing - and just one thing - really well; display PDF's. It can load even large PDF's in less than a second and I can use my keyboard to browse, zoom, exit, etc.

When I need to actually do some editing to a PDF, there is a piece of software that is a rarity for me in the Linux/FOSS world. That is, I actually paid for this software. It's called Master PDF Editor 5 and it is worth every penny. I've never used Acrobat but I'm told it's on par with it. For advanced PDF manipulation, this is a must if you're using Linux.

For office type documents like spreadsheets or advanced word processing I will always use LibreOffice, which is a free and open source MS Office alternative and is completely (I believe) compatible.

Music

Several years ago I made a big mistake. Well, sort of. I sync'd my music library from iTunes to Google Music (now YouTube Music). This meant I had all my music in "the cloud" and could easily add to playlists on the go, etc. Like always, that convenience came at a price. Now I'm basically locked in.

As a result I don't listen to music much on my computer. I have all my files copied over but I haven't been able to figure out how to transfer playlists to map to my files. It will be virtually impossible to export my playlists from YouTube Music locally because half my playlists are files that are generally not accessible on cloud providers. I'd have no way of mapping them back to my local files.

I'm also way too lazy to spend the days it would take to manually put together my playlists again.

That said, when I rarely listen to music on my computer I will use the mpd daemon and the ncmpcpp controller. Honestly this is a pretty complex interface and other than the basics, I haven't taken the time to learn it. Mostly because I rarely use it.

Usually when I want music, I just throw on my Bose QC35's and play directly from my phone. I have a Pixel 5 as a cell phone in case you're curious.

Misc

For videos I'll use the amazing mpv with the occasional fall back to vlc, though it's usually not needed as mpv meets 99% of my video needs. It's fast, light, and controlled via the keyboard. Perfect!

Image viewing is left to the sxiv utility. Like mpv and mupdf, it's goal is to do one thing and do it well. It's totally keyboard controlled but it's key selection is sort of annoying. I'd like it to use the common vim navigation mapping. Maybe it's configurable. I haven't taken the time to look into it.

If I want to quickly view a CSV or Excel file from the terminal, there is an awesome utility for that: sc-im. This little thing is very handy for viewing data files without the overhead of LibreOffice.

Lastly, most of my file management is done with the basic shell commands (ls, mv, cp, rm, etc.) Sometimes though I'd like to quickly browse a structure or make use of key combo shortcuts I've setup to do certain tasks for me (ie, get a Dropbox share link for a file). For these times I rely on vifm, which is a fantastic terminal based file manager. Other than straight shell commands, I don't think there is a faster file manager experience than vifm. If you're familiar with vim then this will feel completely comfortable for you.

Linux vs *BSD

I won't get into this holy war but I do prefer FreeBSD over Linux. The entire experience is just better. FreeBSD (and all *BSD's really) have a very fluid and complete feeling. This because they are complete operating systems. Meaning kernel and default userland are all created and maintained by their respective communities.

Linux on the other hand is a kernel. The distribution decides the userland, system structure, packaging format, etc. The lack of uniformity is very annoying. I also really really dislike Linux packaging decisions that are often made. Again, I won't get into that here.

The reason I chose Linux instead of FreeBSD for my workstation really boils down to three things.

  1. Focus. FreeBSD's focus is to be a rock solid server environment. Linux's focus is to be a well rounded system for any use case. As such, Linux has a lot more support for newer hardware, etc.
  2. Bluetooth support. While FreeBSD does have BT support it's really not prioritized and I don't think it's code base has been touched in years. I really love my BT keyboard and mouse for traveling, which I do a lot of, so this is important to me.
  3. Wifi speeds. Again, FreeBSD's goal is server stability and since you usually wouldn't run a server over wifi, the speeds the wifi drivers get are not up to par with Linux. Some people report speeds maxing out around 20mbps. Yes, we're spoiled today and that just seems like a silly limitation to have on a daily driver workstation.

Well?

When I think about the shift from OS X back to Linux I often question what took me so long to switch back. I'd been annoyed with Apple and OS X for some time. I think it was just laziness.

It does take some work up front to tweak your system how you want it and yes, you will run into issues that will burn hours troubleshooting and figuring out. But once you've got it all dialed in, it's like a custom tailored suit. It just fits perfectly, feels good to use, and you'll really enjoy what you get out of it.

Is it for everyone? Well, yes. There are very friendly desktop environments that will feel very much like OS X or Windows. GNOME or KDE are the first that come to mind. As you get more comfortable you can tweak here and there but to start it doesn't have to be a totally custom job that you have to show off on r/unixporn.

You can boot from a USB stick and click around without damaging your actual system. You can also dual boot your computer. Even your Mac's can run Linux.

The bottom line is, if you're curious, just give it a shot. What have you got to lose? A couple of hours maybe? You'll get to learn a few new things and maybe find yourself hooked on a new adventure. Not a bad trade.