When there’s nothing left to tweak, you have to tweak your Emacs theme!
That said, when is there ever nothing to tweak? 🃏 Of course, there are days where we’re not motivated to tweak anything, and those days are prime candiates for exploring the deep, deep well that is themeing your tools. I love looking at new themes, playing with them, seeing what makes them different than another one and settling down to learn a new one. But it’s also one of those things than can easily cause overload.
This post was inspired by the idea of theme overload, in point of fact. The Doom Emacs project is blessed with some really high quality themes in it’s theme pack and I have explored them all. Purple is a particular favorite. But I’ve also discovered that a lot of the time themes are designed for a particular use case. A theme that works great on a sunny day working at the kitchen table, is less helpful when hacking late night on something in a dark room.
With Emacs, there even more variables to consider because we have this wonderful opportunity to use our editor either in a full-color system window OR a shell. Such flexibility remains one of my favorite parts of editors like Emacs and Vim. But it also means that a theme that looks great in a system window might look like trash (or just be unsuable) in a terminal, or vice versa.
Enter the moe theme! Looking beautiful in a system window, the theme was designed with only 256 colors in mind, so it makes the jump beautifully to a terminal shell as well. I know I could just switch themes, but it’s one less thing to do when you fire up Emacs in a terminal, and I love that. I highly recommend taking moe themes for a ride. I usually use the dark variant, but light is solid as well.
For a few years now, I’ve had a cobbled together weather station using Ecowitt
sensors that one can readily buy on Amazon, and the fantastic open source tool
WeeWx. I really don’t think I can sign the praises of WeeWx loudly enough.
The components of the setup:
Ecowitt GW3000 “gateway”
Ecowitt XXXX temperature sensor
Ecowitt rain guage
FreeBSD jail (or any unix-like 24-7 server, an RPi would be fine here)
Ecowitt is better know in the agricultural community for making very expensive,
very high performing sensors for farms. But thankfully they’ve dipped their toes
in the commercial waters and provided a highly cost-effective way to build a
home weather station cluster, without dropping hundreds of dollars on a Davis
instrument (and then being locked into their ecosystem).
See, the real beauty of Ecowitt is that all the sensor communicate with the
gateway over a 900Mhz channel which the GW listens for, parses and then
transmits to a given IP address on the local network. The recipient of the
gateway’s communication is supposed to be a super janky phone app. But we can do
one better and send it all to WeeWx!
WeeWx handles a lot of different sensors. So you could probably replace
everything I just said above with plugging in a $300 Davis weather station and
use that with WeeWx. But your mileage will vary depending on model numbers and
firmware and honestly, nobody got time for that. Instead, we’ll use the Ecowitt
plugin in WeeWx to intercept the gateway’s messages, store them in a sqlite
database and let WeeWx generate a really nice HTML page for our weather station
(demo of mine here: https://wx.unbl.ink).
Of course, now all that fine weather data is parsed and stuffed ina SQL data
store, so you can also re-process it to a heavier weight DB engine, like
postgres and go nuts. At least, that’s what I’ve done. Having raw, time-based
data from sensors on your own property gives you a chance to run historical
calculations of specific events, and it also allows me to pull local data into
other projects, so my run tracker doesn’t get data from the airport 90 miles
from my house, but can use super local weather data.
There’s an argument to be made for ease of use in software. The epiphany with
Apple software in the early part of the 21st century was that most users had
tasks they wanted done. They did not want to use a computer to do them, per se.
But if a computer could do them, that was okay.
The problem with this perspective is that it assumes a certain amount of
laziness—or perhaps lack of discrimination‒on the part of the user. There are
some excellent times to be lazy, but choice of tools is not one of them. Ask any
accomplished carpenter if the Home Depot plane and the Lee Nielson plane is the
same tool. They are not. But let us explore this analogy a bit more. It’s
actually damned appropriate.
If a computer and the software running on it are tools, then, like a carpenter,
an experienced computer user should be discriminating in their tools. This
perspective took me a long time to arrive at. I enjoy learning about my tools.
And yet, I have watched a number of highly productive software developers not
give a second thought to their tools. Perhaps it’s more fair to say they do not
give a thought to how their tools work.
This lack of curiosity in the things that enable their work means they will
always suffer when their tool breaks. At some fundamental level they do not know
how they are doing what they’re doing. Any furniture maker knows at a basic
level how a table planer works. Do you understand your linter works? How about
the request and response cycle in your browser? The algorithm that kicks out
the most appropriate answer on StackOverflow? I hope you’ve answered yes to at
least one of those. But what about how a compiler works? A JIT scripting
language compiler? These are all the tools of our trade.
In the case of software there’s an even worse fate. What happens when your tool
doesn’t even allow you to be curious about it? Closed source software, or even
just limited access to the source means you are working with a black box. You
couldn’t learn how it worked even if you wanted to. I can think of a worse fate
for someone who does something professionally.
All this is a round about way to explain why I am drawn to Emacs and tools like
it. Popular open source tools that have survived, at this point literally, for
generations of builders. There will always be a new and shiny thing. But I have
made an intentional effort to lean into the open source tools that have served
the curious among us for a long time now.
I encourage you to find some part of the software stack that allows you to do
work and lean into it. Learn why it exists, how it is built, the people who
built it, and maybe even how you can help build it in the future.
I recently embarked on a plan to learn to draw. I’ve done this a few times, in a
few different ways. This time feels different. The lessons I’ve begun start with
some very basic ideas, no home run or get rich quick schemes here. Rather, I
have a daily exercise of drawing basic shapes, holding the pencil, and just
getting experience trying to see what I want on the paper before I touch the
This has been a revelation to me, not least of which because I like these sorts
of small habit methods for kickstarting new skills. But the other part that has
been interesting is seeing how things change when I start creating things. I
often consider learning something new to come with consumption. I read a book,
watch a video or get instruction from someone else. In this new pattern,
learning comes from experimentation, comes from creation.
There’s something to this, and I think it’s related to other discussions about
closed versus open mindsets. A consumption mindset intrinsically comes from a
belief that what will help you be your best self comes from outside of you.
But experimentation and creation comes from a belief that the help you need is
already inside of you, you just need room to play with an idea.
This creation can come from writing, drawing, painting, software development,
sculpture, music composition, active conversations with others, and a myriad
other places. But the important part is that you give yourself room to
experiment with what’s in your own head. So often we fall into the trap of
looking for something outside us to kick us into a new mindset, but often
nurturing the creative spirit can have a much greater effect.
One last observation, most of the disciplines I rattled off above fall into the
realm of art at some level. There’s truth there too. The thing that sets us free
as humans and helps us to be our best self is often the exploration of the edges
where mundane day-to-day life interacts with what we humans call art.
Create more art. Explore your mind. Explore your world. Watch your creativity
and ability to learn blossom. Then, perhaps most importantly, spend some time
helping someone else discover the magic of creation.
I have moved to reading and responding to all my email in Emacs. I honestly
didn’t think I would ever be able to make this jump because of silly things like
signatures, HTML email and my address book. But the reality of how I actually
use email on a day to day basis is a big part of why this was possible.
As it happens, most of my email work is replying to other people. As an engineer
on a product team I start very few email threads, and even fewer with people
outside the organization. Thus, the lack of the company standard HTML signature
in my outgoing emails is rarely a problem. On the once or twice a month
occurrence of needing to send an external-facing email, I can pop open Gmail in
a browser and take care of it.
But for quickly replying to folks, parsing tasks into my daypage (more on this
later) and saving content to read later, Notmuch has been a dream.
So the cat’s out of the bag. As in my last post about email in Emacs, I use
Notmuch along with mbsync for getting email and msmtp to send email. I also host
my own email server on a Digital Ocean VPS running mailinabox 1. This makes
the configuration with mbsync and msmtp pretty painless.
The other important discovery I made is muchsync 2. This allows me to run
the mbsync task for looking for new email on a server in the house that’s always
on. Then each other device I want to read and respond to email just runs a
`muchsync` task that hits up that server and syncs the state of the notmuch tag
The result is delightful. I can clear out my inbox on one machine and find it
all cleared up on all the others. Combine that with the ability to quickly
respond to email within Emacs, copy links to specific messages and capture them
to Org Mode, and archive things I don’t care about, the whole thing is really effective.
One aspect of this is that I have my email setup to default to showing the
plaintext version, with a tab-able HTML view powered by eww. This works
surprisingly well. As usual, my configuration is in my dotfiles, specifically
my `+mail.el` 3 configuration in Doom Emacs.
Check it out and I hope you can get a handle on your email.
I don’t make a habit of watch the Olympics. But I remember a moment back in 2018
when I happened to turn on coverage just as they were televising a gold-winning
snowboard cross run by Red Gerard1. He blew out all the other riders in his group
to take the gold. Silver was significantly behind him. What stood out to me
watching him ride, however, was how keyed in he was to the whole thing.
I don’t know how much snowboarders are allowed to practice the cross course
before the event, but given that he was on the hill with 9 other riders who
didn’t look nearly as keyed in meant there was likely more to what was going on
than simple familiarity with a series of cuts, jumps and bombs.
What Gerard was, of course, was in flow. I am not sure if you’ve ever
experienced flow, but beyond snowboarder cross, the state of mind is also
illustrated in Zhuang Zhou’s philosophical writing from 4th century BCE China.
In his seminal work, Zhuang discusses a butcher who, having so mastered his
craft, he is not cutting into an animal, but rather his motion guides the blade
of the knife through the various cuts he needs to make to perfectly separate the
Life, it seems to me, is the pursuit of flow. In flow, everything goes from one
to the next without deliberate thought of how to achieve a specific end. There
is no value judgment on the task achieved. Flow is not about good or bad, it is
about the accomplishment of a given task. There is different work to be done to
assess value, but once value has been assessed and it’s time to work, we all
seek flow, that place where don’t need to know we’re our best selves, but where
we simply are our best selves and are doing what we set out to do with as little
thought as possible.
I try to keep notifications in my life to a bare minimum. I get tips from
friends or co-workers about making sure notifications on my phone are disabled
while I sleep. I disable them all the time. The one thing I allow are text
messages to vibrate my Garmin watch, and I’m on the fence as to whether this is
There are people who’s professions wont allow this. I get that. But I also know
that most people build narratives about getting a late night text about the
health of a loved one to justify always getting pinged when Facebook needs your
attention, or a new email comes in. These are largely untrue, or at least
building a process into your life for events that may never happen.
Instead I’ve made distractions I encounter my own fault. I can’t blame Facebook
for pinging me in the middle of focused work. I took control of what I could and
my responsibility now is to check for messages when I need to. I check slack
quite often, after each chunk of work, emails a few times a day, and social
Have you ever thought about the value of all the different notifications in your
life? If it not, it may be worthwile to audit all the things that vie for your
time. It is your time after all, and with ownership comes responsibility.
When people say “I can’t do that” most of the time, they’re actually saying “I
can’t see myself doing that.” When I started running, a lot of people said they
didn’t know how I could run so far, or that they could never do that.
When I started, I didn’t imagine I’d run marathons. I just started with 1 or 2
mile runs. Those 2-mile runs were hard, and sometimes they still are.
Yet being out on the road gets you up on that hill where you have a better view of
your future self. One day I saw myself going farther, and then I went farther.
What do you see yourself doing? What steps can you take to get a better vantage
point of where you could be? Little steps is all it takes.
When running, you will sometimes come to a path that, for whatever reason, is
difficult to read. While the incline may go up, your eye and, subsequently
your mind, says it’s going down. Such visual tricks are called trompe
l’oeils, literally “trick of the eye” in French.
Personally, these tricks often have the effect of letting me run harder
uphill than I otherwise would, revealing the incredible amount of mental
power that goes into distance running. If my mind does not believe I’m going
uphill, I run faster, even if I am in fact going uphill. Most people would
consider this a cool trick to get you to run faster. Unless you didn’t want
to run faster.
In a race, such tricks would be welcome. I am going all-out, pushing myself
to the limit to achieve a personal record, or, in rare cases, to actually win
the race outright. But in training, such exertions are often unwelcome.
Outside of races, pushing yourself as hard as you can go is generally frowned
upon. There is no use destroying your capacity to run tomorrow with a hard
training run today. Training theory says you should lay down a base of solid,
slower running, and save faster, max-heartrate runs for the occasional
This, it occurs to me, is a perfect analogy for how we use our ability to
reason, and to conversely to simply react. Danny Kahneman would have called
this fast thinking and slow thinking. You would expect that in most cases,
having a “gut feeling” about something would be great. But in practice, such
impulsive decision making often gets us into trouble. Our slow thinking –
our ability to reason – ought to be a our base, slow training thinking. This
sort of thinking prepares us for moments where we need our fast thinking, or
our reactionary thought.
This has sweeping implications for all sorts of personal interactions. I’m
quite interested in how this plays into Nate Walker’s ideas of “moral
imagination” and radical empathy. You see, most of us are actually not every
good at empathyzing. Sympathy comes naturally to a great many people. We can
imagine the pain, or anger someone is feeling when we are in the presence of
it. But empathy asks us not just to feel someone’s emotional state, but to
The problem, as I see it, is that, like with running, there are trompe
l’oeils all around us. Places where we think we understand why someone is
acting the way they are.
“She’s just pissed because I forgot to call last night.”
“He’s still frustrated because he didn’t have time to get coffee this morning”
On the face of it, those very well might be true. Or they might not. When do
we know we’re running hard up hill? In most places in life, this is
completely unimportant to quickly address someone’s emotional state. Far more
important is to be patient, and understanding without necessarily assuming
that we can know right now what’s bothering someone, or why they’re doing
what they’re doing.
“She struggles with abandonment issues since her father left when she was 8,
and while you didn’t call, what upset her most was feeling alone.”
“He was up really late last night stressing about work that was supposed to
be done. Not getting cofffee made things worse, but were hardly what cause
his foul mood.”
In both of these cases, there are underlying mental states. It requires
imagination and trust in our fellow humans to truly empathize in these
circumstances. While the road appeared to go down hill, and we were all into
bombing down it, the reality is that we burned ourselves out on a training
run that tricked us into going up hill. We would have been better served to
hold our judgment for a little longer, and asked more questions, and listened
more closely. Rarely do we need to exercise empathy quickly, and applying
Walker’s “moral imagination” can get us a lot closer to understanding a lot
more people, and making all our lives a lot easier.
I discovered Nethack for the first time this weekend. Well, I knew it existed
for a while, but I had always sort of poked around at it, generally unimpressed.
But on Friday there was a lobste.rs post about a speedrun of nethack that
totally captured my attention. The runners used the inventory at the start of a
randomly generated map to determine which seed was used by the RNG to build the
dungeon. From there, they had a general sense of what would work. This resulted
in an ascension, as victories are called, of sub 8 minutes. The previous best on
the most popular nethack server, nethack.alt.org, was more than 90 minutes.
All that to say that reading about their speedrun made me realized how much more
there was in nethack. Much more. And now I’m hooked. I also joined the IRC
channel for NAO and with IRCCloud I get notifications when I’m done with a game
with my final score. It’s actually kind of delightful. Now I need to stop
wasting time with it :)