Why I use a Linux workstation
07 Jan 2021
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.
Update: As of 2023-08-20 I finally switched to Alpine Linux. Still the same laptop.
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.
- 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.
- 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.
- 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.
- 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.
- 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'm now using isync to download my email. It was a fairly easy conversion
but the config format is a bit more verbose. I really regret not making this
change sooner because offlineimap used to take 3-4 minutes to sync all my
mailboxes and isync takes roughly 20 seconds.
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 isync 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.
- 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.
- 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.
- 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][up].
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.
[up]: https://reddit.com/r/unixporn "r/unixporn"