Reading List

The most recent articles from a list of feeds I subscribe to.

Making podcasts from Project Gutenberg e-books

I recently watched Pixar's SOUL and I loved its depiction of being in the zone:

In the Zone

This is a beautiful, astrally-projected depiction of Mihaly Csikszentmihalyi's flow concept. For the unfamiliar, here's how Csikszentmihalyi describes flow, or the optimal experience:

It is what the sailor holding a tight course feels when the wind whips through her hair, when the boat lunges through the waves like a colt -- sails, hull, wind, and sea humming a harmony that vibrates in the sailor's veins. It is what a painter feels when the colors on the canvas begin to set up a magnetic tension with each other, and a new thing, a living form, takes shape in front of the astonished creator.

That sounds pretty good, right? Csikszentmihalyi contends that flow is how we humans can achieve happiness. And it's not something that's given; it's something we have to cultivate and grow and work towards. I cannot recommend his book enough.

Even better was SOUL's depiction of the non-flow state - the lost souls:

lost souls

Definitely been there. Usually its whenever I hear, "Can you see my screen?" These poor creatures wander the astral plane, lost and unhappy and unsure why.

Luckily, the movie tells us it's never too late, and I believe them.

So, how do we achieve flow?

It's the deliberate combination of skill meeting challenge. More from Csikszentmihalyi:

The best moments usually occur when a person's body or mind is stretched to its limits in a voluntary effort accomplish something difficult and worthwhile.

This post documents a legitimate flow experience I had last week that began with an observation about my podcast addiction.

All My Best Friends are Podcasts

Yes, that's a Less Than Jake reference. You're welcome, 8th-Grade Charlie.

And, if you're at all like 28th-Grade Charlie, then you're also helplessly addicted to podcasts.

I listen all the time -- while I'm washing dishes, folding laundry, performing my daily Amazon cardboard box cutting ritual, even taking showers. Carly doesn't understand it, and I certainly can't explain it.

Am I that afraid of silence? My own thoughts? Am I so lonely for friendship that I even found this evisceration quietly comforting?

I know too much about ancient Rome to be able to answer these questions.

So, if I'm just going to accept my Overcast overlords, can I turn the tides on this one-directional relationship?

Yes. We can. Enter: the spark of an idea.

Create a podcast from the audio of YouTube videos

If I can't control what my favorite podcast hosts are talking about in any given episode, can I instead choose exactly what I want to listen to? What if there were a virtually unlimited source of content to consume? Surely, I could then be more deliberate in my listening habits.

YouTube is our answer. I've been collecting computer science talks and lectures in playlists that I always mean to "watch later" and never do. Fact is, I don't want to watch a YouTube video. I rarely ever sit down and "watch YouTube" (other than The 8-Bit Guy cleaning old VIC-20s). It's not part of my routine. I'm usually moving around too much.

YouTube also makes it really hard to consume something "on the go." You need to pay for their PiP or minimized mode, I think.

Then I found this post by Benjamin Congdon: a simple way to create an audio podcast feed from a YouTube playlist using a Raspberry Pi home server. His tutorial leverages an open source project called PodSync, which itself leverages ffmpeg and, everyone's favorite controversy, youtube-dl, behind the scenes to download audio from YouTube and generate a podcast RSS feed. This, this, is exactly what I was looking for!

Nothing to add here, other than bravo, Benjamin. I was able to follow his tutorial pretty much straight through.

Wait, I do have something to add. Benjamin suggests using rsync to upload your mp3s and xml RSS feed to s3 or the like. I did this initially, but I didn't like the idea of having to mark these files as public on s3 in case of some huge accidental traffic surge.

So I came up with another idea:

  • Create a public repo on GitHub and enable GitHub Pages (mine is here)
  • Init the repo in your /data directory on the Raspberry Pi (this is the directory with the generated .xml RSS feed and mp3 audio files)
  • Change your Podsync config's hostname to your GitHub Pages site:
hostname = "https://rockswhat.github.io/listener"`
  • Change your cron command to push to your repo (instead of rsync to s3):
*/15 * * * * cd /home/pi/podsync/data && git add . && git commit -m "update feed" && git push origin main

Voila! My own podcast feed of YouTube videos, publicly available on the Internet. You can add my feed to Overcast (or your favorite podcast player) with its XML URL:

https://rockswhat.github.io/listener/listen_laterz.xml

C'mon, you really achieved flow from that?

No, not really, but almost. Tutorials, good ones, at least, are guided paths toward some goal, with micro-feedback and mini-frustrations along the way. And these things are well-suited to flow. They can lead you to flow.

In my case, this tutorial got my gears turning. Which now gets us into to the creative computing side of this article.

I think it's important to remind ourselves to have fun with our computers. To use them to make art, make music, create weird stuff, just because we can. There's so much on our computers and phones now thanks to the Internet that can warp our minds and render us into Lost Souls. We often forget the simple joys of computers of the past, back when they were bicycles for the mind, and used adorable floppy disks or CD-ROM drives for games and encyclopedias. I know there's so much "more" that we can do with computers, but we need to remember that they are here to work for us, and not the other way around.

As soon as I saw Overcast fill up with audio from my Listen Laterz YouTube playlist, I knew I needed to keep going, to see what else I could render from clay into podcast feeds.

Creating a podcast audiobook from Project Gutenberg e-books

Where else can we find a giant repository of open content on the Internet that also happens to be inconvenient to consume?

Hello, Project Gutenberg!

Project Gutenberg is just about the coolest --- and one of the most important -- things on the internet. The fact that it was started on the ARPANET in 1971 blows my mind. That is some creative, forward-thinking from its founder Michael S. Hart.

My idea here is simple: pick a public domain book, chop it up into chapters, convert the chapters to audio, and then generate an xml RSS feed.

I picked Mary Shelley's Frankenstein, because, why not? I already read it a few years ago during my October "Spooky Reads" habit, but I figured it's the perfect candidate for re-animation.

If you've clicked the link to the text on Project Gutenberg, you'll see it's a plaintext nightmare. I'm not ashamed to admit here that I manually just chopped it up into separate text files, rather than writing a script to somehow do this for me. Whatever, ok?

First let's make some files.

cd pieces
touch intro.txt
touch letter-{1..4}.txt
touch chapter-{1..24}.txt
touch license.txt

And then we copy-pasta.

Now that I've got my chapters (aka future podcast episodes) all set, we're ready to convert them to audio. What's the easiest way I can do that?

My "in-the-zone" brain suggests using the terminal's say command. I've used this command a few years ago in one of my earliest creative computing projects: a live musical performance from a telepresence robot).

Surely, I can write a neat little script to loop through my text files and say them into an mp3. Some Googling for advice, and I've soon got this Bash script going:

for i in *.txt;
do
    echo "processing $i...";
    name=$(echo "$i" | cut -f 1 -d '.')
    say -v Vicki -f $i -o aiff/$name.aiff
    lame -m m aiff/$name.aiff mp3/$name.mp3
    rm aiff/$name.aiff
done

And it works! Checkpoint reached! The mp3 files are now sitting happily in their respective /mp3 folder. I experience a fleeting moment of joy, and then immediately plunge into the next challenge: generating an XML feed.

My hack-y brain suggests another copy-pasta. Let's take the feed generated by the Podsync library in the section above, replace pieces of it with Bash variables, and then loop through my text files to jam in the values I want.

More googling ensures, including learning a bit more about heredocs, and I've eventually got this script:

#!/bin/bash

# edit these to your liking
PODCAST_TITLE="Castellan - Frankenstein"
PODCAST_AUTHOR="Castellan"
CATEGORY="Technology"
GENERATOR="Castellan"
LINK="https://whatrocks.github.io/castellan/"
IMG="https://whatrocks.github.io/castellan/showart.jpg"

# automatic
CURRENT_DATE=$(date -R)

# order
EPS=(
  intro
  letter-1
  letter-2
  letter-3
  letter-4
  chapter-1
  chapter-2
  chapter-4
  chapter-3
  chapter-5
  chapter-6
  chapter-7
  chapter-8
  chapter-9
  chapter-10
  chapter-11
  chapter-12
  chapter-13
  chapter-14
  chapter-15
  chapter-16
  chapter-17
  chapter-18
  chapter-19
  chapter-20
  chapter-21
  chapter-22
  chapter-23
  chapter-24
  license
)

read -d '' feed << EOF
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
  <channel>
    <title>$PODCAST_TITLE</title>
    <link>$LINK</link>
    <description>$PODCAST_TITLE ($CURRENT_DATE)</description>
    <category>$CATEGORY</category>
    <generator>$GENERATOR</generator>
    <language>en-us</language>
    <lastBuildDate>$CURRENT_DATE</lastBuildDate>
    <pubDate>$CURRENT_DATE</pubDate>
    <itunes:author>$PODCAST_AUTHOR</itunes:author>
    <itunes:subtitle>$PODCAST_TITLE</itunes:subtitle>
    <itunes:summary><![CDATA[$PODCAST_TITLE ($CURRENT_DATE)]]></itunes:summary>
    <itunes:image href="$IMG"/>
    <itunes:explicit>no</itunes:explicit>
    <itunes:category text="$CATEGORY"></itunes:category>
EOF

echo $feed

COUNT=1
for episode in ${EPS[@]}; do
  echo "processing $episode..."
  MP3_FILE="book/pieces/mp3/$episode.mp3"
  MP3_SIZE="$(wc -c <"$MP3_FILE")"
  UUID=$(uuidgen)
  NEXT_DATE=$(date -R)
  DURATION="$(ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal $MP3_FILE)"
  read -d '' next << EOF
  <item>
      <guid>$UUID</guid>
      <title>$episode</title>
      <link>$LINK$MP3_FILE</link>
      <description>$PODCAST_TITLE: $episode</description>
      <pubDate>$NEXT_DATE</pubDate>
      <enclosure url="$LINK$MP3_FILE" length="$MP3_SIZE" type="audio/mpeg"></enclosure>
      <itunes:author>$PODCAST_AUTHOR</itunes:author>
      <itunes:subtitle>$episode</itunes:subtitle>
      <itunes:summary>Audio generated from the text of this chapter</itunes:summary>
      <itunes:image href="$IMG"></itunes:image>
      <itunes:duration>$DURATION</itunes:duration>
      <itunes:explicit>no</itunes:explicit>
      <itunes:order>$COUNT</itunes:order>
    </item>
EOF
  feed="${feed}${next}"
  COUNT=$((COUNT+1))
  sleep 5
done


END="</channel></rss>"

echo $feed$END | tee podcast.xml

Lots of minor bugs and typos later, and I've got my RSS feed! Is this script hideous? Sure, but it works! I'm having fun and that's all that matters right now. Speaking of fun, I also had to create cover-art, obviously:

Cover Art

Finally, using the same GitHub Pages approach, I upload my stuff and import my Franken-pod into Overcast, like so:

Listen

I decide to call the project Castellan because it has the word "cast" in it and it means keeper of a castle or something, and that feels pretty Frankenstein-y to me.

Finally, I give it a listen...

And it's a horrible monster. Here, I dare you to listen:

We've gotta do something about this, cause this thing doesn't sound human at all.

Machine learning to the rescue?

For a brief moment, I escape my zen-like programming mindset, and I go to the orange website and encounter a post about a new text-to-speech deep learning project, and it's damn good. Unfortunately, it's not open source.

Surely, there's a good open source text-to-speech project out there. Some more googling, and there is! I find the tts project from Mozilla, which deliciously provides a few Google Colab notebooks (aka Jupyter Notebook / Jupyter Lab) with pretrained models ready to go!

This is great news. Instead of the say command, I'm going to pump my chapters into this trained model and it's going to be awesome.

Except the models clip out after three sentences or so. I do some spelunking, and the model is meant to go sentence by sentence, rather than huge swaths of text at once.

But that's no problem for me.

I'll just split on the . period character, generate the audio once sentence at a time, and then concat them all together at the end.

Here's a link to my Colab notebook that you can try yourself. The only things I changed in this notebook are the bottom four or so cells.

Here's how I make my machine learning powered audiobook podcast:

  • Mount my Google Drive, where I've dropped the text files (and I'll store the generated mp3s):

    from google.colab import drive
    drive.mount('/content/gdrive', force_remount=True)
    
  • Install the pydub library to handle audio files

    !pip install pydub
    
  • Read my text files of the chapters from Google Drive into an array of tuples for processing

    import os
    path = '/content/gdrive/My Drive/Castellan/'
    chapter_path = f'{path}pieces'
    chapters = []
    for file in os.listdir(chapter_path):
    if file[-4:] == ".txt":
      with open(f'{path}pieces/{file}', 'r') as chapter:
        chapter_text = chapter.read()
        name = file[:-4]
        chapters.append((name,chapter_text))
    
  • Loop through the array, split each chapter into sentences, skip weird textual issues like newlines and other nonsense, run each sentence through the tts model, concat/reduce that sentence with a accumulating wav file of the entire chapter, and then save the accumulated wav file to an mp3 in Google Drive. Phew! That's a mouthful:

import scipy.io.wavfile
import uuid
from pydub import AudioSegment,s

silence = AudioSegment.silent(duration=500)
for chapter in chapters:
  
  print(f'processing chapter {chapter[0]}...')
  chapter_audio = silence
  for sentence in chapter[1].split('.'):
    
    # skip these
    if sentence == '”\n' or sentence == '\n' or sentence == '\n\n':
      continue

    sentence = sentence.strip('')

    # more skips
    if len(sentence) == 0 or sentence == '':
      continue

    # generate wav
    align, spec, stop_tokens, wav = tts(model, sentence, TTS_CONFIG, ap)

    # save wav file
    wav_unique = str(uuid.uuid4())
    wav_name = f'{wav_unique}.wav'
    wav_path = f'{path}wav/{wav_name}'
    scipy.io.wavfile.write(wav_path, TTS_CONFIG.audio['sample_rate'], wav)

    # read wav file
    sound = AudioSegment.from_file(wav_path, format="wav") 

    # combine it
    chapter_audio += sound
    chapter_audio += silence

  # save mp3 file
  file_handle = chapter_audio.export(f"{path}mp3/{chapter[0]}.mp3", format="mp3")
  print(f'done with {chapter[0]}!')

As you might have guessed, the above cell is the end result of much experimentation. Jupyter Notebooks make this iterative development insanely easy, and I only was able to pull things together like this after I'd figured out each individual piece. Jupyter Notebooks are like REPLs + documentation in one.

Once I had this all set up, I hit run all cells and went to sleep. When I woke up, I discovered that about half of my chapters had successfully processed! The only reason it didn't chug through all of them was the Google can randomly preempt your machine at any time, or they have a 12 hour timeout for CPUs. This felt a bit like it must have felt when you feed all your punchcards into the IBM mainframe, and there was some bug halfway through your stack.

No worries, I just removed the already processed chapters from my text files, and re-ran it. I can deal with this annoyance, because this is a toy project. And it's free. And my laptop fan is silent, almost like it's a brand new M1 Macbook, because I'm running this on Google machines.

Want to hear the result?

Dang!! That's so much better. Sure, it's still a little weird. But it's actually listen-able now. Thank you, machine learning!

I moved these files from Google Drive onto my local, and then I re-ran my XML generator script, changing the title to "Frankenstein Jr" and referencing the new better mp3s, and then pushed to Github Pages.

Here's a link to the podcast feed that you can add to your own player.

Sure, there's still problems. I've encountered these occasional weird sections where the tts voice just completely glitches out, perhaps due to the weird encoding of Project Gutenberg files (could be a \t character or something). I know that much of machine learning is about "cleaning up your data," so I could probably spend more time doing that, but Frankenstein-ly, I've already flowed onto my next idea.

Parse a screenplay and create voices for each character

Wouldn't it be amazing if you could recognize the characters and give them each a unique voice? That's gonna be hard with novels, but you know what's much easier: screenplays! They've got the characters broken out into discrete, named sections, like this:

        PRINCESS
    I love you.

        SMUGGLER
    I know.

The smuggler is lowered into the machine. HISSES and SQUEALS. Everyone, including THE BIG BOSS, turns away.

I just made this scene up ^, okay?

I could parse a screenplay, then pass each character's lines into a model with a specific voice.

Oh! I know there's sentiment analysis models. What if I first feed the sentences into a sentiment analysis model, and then feed that sentiment into the text-to-speech model.

Now, we're talking...

You can see where this is going. My brain is reeling with possibilities and new directions and new ideas.

This is creative computing. This is why I love programming and its ability to get you into the flow state.

I haven't tackled the screenplay parsing bit yet, but maybe I will. I'm just grateful that I was able to have fun with this project. This is how I want to live my life, being creative, having fun. This is how Csikszentmihalyi describes a life with flow:

Such individuals lead vigorous lives, are open to a variety of experiences, keep on learning until the day they die, and have strong ties and commitments to other people and to the environment in which they live. They enjoy whatever they do, even if tedious or difficult; they are hardly ever bored, and they can take in stride anything that comes their way.

I couldn't have put it better myself, obviously. John Cassidy of Klutz Press, my favorite publisher, does a great job rephrasing this sentiment, though:

Create wonderful things, be good, and have fun.

P.S. Don't you know about LibriVox, dude?

Yeah, so there's already a project called LibriVox that creates audiobooks from public domain texts using real human being voice volunteers. They even provide RSS feeds that you can use in your podcast player. Did I know about this before I went down this rabbit-hole. No! Would it have changed anything no! Maybe? It could have prevented me from exploring ML for this project, and that would have been a bummer.

My takeaway is that your ideas are probably not unique, but that doesn't mean you should explore them and find your own path forward. That's the path to creativity and fun.

Okay, enjoy the feeds!

School Supplies

Somedays I remember that I have a loop pedal.

loop pedal

Those are the best sorts of days.

Somedays that leads to a new song.

A loop pedal is a stack

A loop pedal is a magical device that lets you record in stacked layers. It's almost like editing something in Figma or Sketch, except each layer is the same "shape" as the first or root layer. And by shape here what I actually mean is length.

Like other guitar pedals, a loop pedal lives somewhere between your guitar (the input) and your amp (the output). It receives the input from your instrument and "does stuff" with it, before sending it onwards. For example, maybe you want to add some distortion or flange -- OR BOTH. Your guitar pedals are like the world's simplest data flow pipeline.

Guitar -> Distortion Pedal -> Flanger Pedal -> Chorus Pedal -> Amp

No cycles or braching in this DAG. I mean, maybe there could branching. Or cycles. I bet some guitarists do that, somehow. But that's beyond my pay grade.

Let's go back to our loop pedal and record something.

Imagine that I tap the loop pedal with my foot, play the following, and tap the pedal again.

X X X X X X X X

Each X here might represent one "measure" or "bar" in music theory land, but that's mostly unfamiliar territory for me, too, so instead we can say that we've played the X chord (I wish there was an X chord) 8 times of some fixed duration.

This is now our root layer for our stack.

By default, the pedal will keep "looping" this layer. You can double-tap it to "stop the loop" (maybe you'd do this when you reach a new section of your song, like the chorus).

Otherwise, now it's time to add some more layers. Tap the pedal again and you add the following layer:

X X X X X X X X
  y   y     y y

Maybe y is an awesome solo or something. Then you do it again.

X X X X X X X X
  y   y     y y
z z z z z z z z

Now, this pattern will keep repeating over and over, expanding to the right.

X X X X X X X X X X X X X X X X -->
  y   y     y y   y   y     y y -->
z z z z z z z z z z z z z z z z -->

What happens if you are recording a layer that extends longer than the root layer? Good question. The recording simple wraps around to the beginning of the root layer and you can keep going. However you will notice that you are already hearing what you recorded for this layer, so that can sound strange. Let's show an example.

I'm going to add a layer that just plays ascending notes up the guitar neck (a really crappy solo) and have this layer wrap around.

X X X X X X X X
  y   y     y y
z z z z z z z z
1 2 3 4 5 6 7 8

So far, so good. Why not keep going...

X X X X X X X X
  y   y     y y
z z z z z z z z
1 2 3 4 5 6 7 8
9 10

As you can see, my latest layer wrapped around to the beginning, such that when I played the 9, you would hear the 1 at the same time. This may or may not be what you want to do. I'm guessing.. no. Especially if you're playing some epic Type II guitar solo.

Thus, one of the more common use cases of the loop pedal is to lay down some repeatable groove that you can sing various verses or solo over. Instead of making the "unique" or "changable" a layer in your loop stack, you just keep that off to the side.

Reader beware that my loop pedal is relatively simple. There are other, better, more-intense loop pedals where you can have multiple different loop stacks going at the same time. For example, maybe you've got a loop going for the verses and another separate loop stack for the choruses in your song.

But I appreciate the simplicity of my pedal. The one thing I still haven't figured out is whether or not you can do the pop stack operation on it. The documentation suggests that you can erase the top layer of the stack, but I haven't figured it out yet. For now, I've been living in a push only world, flubs included, which you'll hear in the next section.

School Supplies

Hello, world, this is your premiere of SCHOOL SUPPLIES, the third single off my forthcoming EP: "Greetings From Buttzville, NJ":

The chords, for those interested (looking at you, The Grones) are:

Verse
G Bm Em C

Chorus
D G C

Outro(key change!)
A C#m F#m D

That's right! I pulled off my first key change. Thank you, Taylor Swift "Love Song" for the daily inspiration.

I'll leave the lyrics as an exercise for the reader.

Uncle Mike's Tips for Running a Zoom-Based Open Mic Night

Big thanks to Uncle Mike for organizing our second Zoom family open mic night. He runs a tight ship, mostly trying to prevent me from launching into a Bullet Train to Merlin's Grave medley like at Popestock.

To paraphrase his tips:

  • Each performer gets one song, of "normal song length" (so that means no Tubular Bells)
  • Announce the order in advance
  • Tune up your instrument when you're on deck or in the hole
  • Don't worry about messing up, start over if you need to, this is fun. Music is the best!
  • Change your zoom settings to "Original Sound"

This last one is key. Zoom does some "stuff" to make things sound "good" during boring work meetings that are boring. It's not optimized for fun singalongs that are fun. So, it's pretty much essential to follow these steps when you're singing and strumming over Zoom, unless you're trying to incorporate cosmic waves of hollow nothingness into your jam. Maybe you are?

Oh, you should check out Uncle Mike's music podcast, Tell You What! The Podcast. He interviews young musicians and bands on the run and it's fun and great and keeps you on your toes with new upcoming artists.

As Uncle Mike says, music is the best!

Unexpected, Useless, and Urgent

Or, What RSS Gets Right

Abraham Lincoln once said, "The medium is the message. And San Francisco summers are cold af."

Putting that aside, I've been thinking a lot (uh-oh) about why I like opening up my RSS reader app so much. And I'm not just talking about its looks, even though it's super cute (I'm using the free, open-source, and all-around neato NetNewsWire for my RSS needs).

No, I'm talkin' about them RSS feels.

Why does using opening my RSS inbox feel so much better than typing in gmail.com or tapping the iMessages icon or, heavens forbid, opening up Twitter?

With my sweet-sweet RSS, there's no anxiety. There's no guilt. In our time-tracking Screen Time home screen widget era, there's almost a baccanalian decadance to sifting through an RSS inbox, like watching honey drip from one of those wooden combs in a cereal commercial. Or -- back when we were allowed -- going to the library and reading the newspaper from those weird wooden dowels.

It should go without saying that this feeling does not extend to the other inboxen in my life. And I'd like to understand why -- and see if I can do anything about it.

A framework for messages

Butchering some data pipeline terms, let's define an inbox (e.g. email, social media, text messages, RSS, phone calls) as a sink for messages from various data providers, where these messages wait for human-in-the-loop processing (in this case, you).

O! Ye of little time! How are you meant to evaluate the "importance" of a given message? Let's explore that across two vectors: (1) prior awareness of the message's sender and (2) usefulessness of the message contents.

grid

The sweet-spot is that upper row: useful messages from both "people we know" and "people we don't know." Whereas if you're in the bottom row, you're gonna have a bad time: useless messages are never... useful.

Filtering on sender

The bottom right quadrant is easy to visualize: robo-calls about your non-existent car's expired warranty, social media ads, junk mailers in your meatspace mailbox.

You might think, perhaps, that we can use the "Expected Sender" vs "Unexpected Sender" filter to avoid this quadrant. In fact, this is what Apple allows you to do with the new Silence Unknown Callers feature in iOS 14 (which doesn't actually prevent the calls, but immediately sends unknown calls to the dead-letter queue that is your voicemailbox).

The problem with this blunt approach of dead-letter queueing the right column is that you're going to miss the serendipity of the upper right quadrant: calls from unexpected sources with useful information. Given my recent cancer diagnosis, I've had tons of important, useful calls from unknown numbers every single day, from doctors and the like -- calls that I want to triage quickly. Sending all calls from unknown numbers straight to voicemail would just be yet another inbox to maintain. Worse, I might miss something important in the upper right quadrant.

A lighter touch approach here is to auto-classify your messages into buckets based on sender. Gmail now does this with their "Primary", "Social", and "Promotion" tabs. Everything's still "in your inbox", but now you can usually just "Select all" on that Promotion tab and safely send those messages straight to the netherworld.

The bottom left quadrant is where your unique lifeforce is slowly chipped away, doomscrolling through your high school classmates' life updates or, gasp, political views. Don't get me wrong -- I really enjoy Instagram and it makes me happy to see people I know doing cool, cute stuff. But I know it can get real bad in this quadrant real quick. Unfollowing and/or muting is key here.

Filtering on content

Okay, so, if filtering on sender alone doesn't work, can we use the message contents to figure out if a given message is going to be useful?

We're now talking about pre-processing the messages in our queues.

In the days of future past, you might have employed a staffer to "sort through your office mailbox" to do this. How very Don Draper of you. But in today's era of secure password managers and 2FA, we ideally don't have that many other people in our digital inboxes. The inbox providers are aware of this, and they're starting to provide some tools to help here -- as long as you're okay with them "reading" your messages.

Gmail, for example, has gotten pretty darn good at spam detection. They're "reading your emails" and dropping the bad ones into your "spam folder" dead-letter queue. Maybe, once in a blue moon, they false-positive something that you have to go spelunking into that elephant graveyard to find. But I'm never annoyed by this, because when I see absolute garbage that they've blocked for me day-in and day-out, I'm hashtag grateful again.

This approach, however, isn't possible with all mediums. There's no way to pre-filter on content for an incoming phone-call, for example.

And the tradeoff in pre-filtering on content is, of course, privacy.

If you're down for your inbox provider to "scan" your messages, then they can potentially start to do some smart stuff, like "bubbling up" useful messages or getting rid of bottom row crud.

But, more likely than not, they're also reading them for another purpose.

The cost of free

Many of these inbox platforms are free (e.g. social media, Gmail), and someone's gotta pay to keep that spam algorithm ticking. And that someone is you.

Most ads are squarely in the bottom right quadrant. "Good" ads -- I'm talking about those Instagram candles you keep converting on -- are upper right quadrant. The platforms do their darndest to make sure their ads are as upper-right as possible, but they can't guarantee that. YouTube keeps asking me my age because it's genuinely confused as to why my viewing habits fluctuate between watching someone clean old Apple II and VIC-20 computers and the latest Super Mario 3 speed-runs.

And, c'mon, I'd rather just not ever see ads in the first place.

Okay, tough guy. Are you willing to pay for an ad-free inbox then?

Maybe? Ugh. Yes, there's a bunch of new players in the space who are emphasizing privacy and going ad-free. But am I going to willingly add yet another recurring subscription to my life? The Mandalorian is about to come back, and I'm already bracing for the impending Disney+ subscription.

I'll come back to this, because our analysis is still missing two important features.

A framework for inboxen

So, far we've only explored the features of an individual message -- not the nature of an inbox itself.

Regardless of an individual message's usefuless or your prior awareness of its sender, an inbox has two other important features that contribute to our mental well-being: (1) typical message volume and (2) expected urgency of triage.

inbox

The message volume thing is straightforward. Some platforms have a never-ending feed of messages that you can "enjoy," others not so much.

At the same time, each inbox medium connotes a inherent sense of urgency. The medium is the madness, if you will. No matter what the message says or who sends it, there's a differentiated inbox-level "urgency punch" to your lizard brain whenever any single message (spam or not) comes flying in.

Let's be more specific with some typical inboxes in our lives:

inbox overlay

Phone calls are just about as "urgent" as it gets. Prior to iOS 14, phone calls used to interrupt whatever you were doing, taking up your iPhone's entire screen real estate. Doesn't get more urgent-y than that! Luckily, calls are relatively sparse compared to text messages, which you still need to respond to, but you can "put them on ice" for days at a time with a high-degree of cultural acceptance.

Social media messages are legion in terms of volume. And, while they're not especially urgent from an innate message-level perspective, the platforms do their darndest to "notify" you of "engagement opportunities" to keep you locked-in, so these inboxes fall in the semi-urgent category in my book.

Onto RSS -- my beautiful, dark, twisted RSS. There's truly zero urgency here and relatively few messages (writing blog posts is time-consuming!). Moreover, returning to our message evaluation framework, an RSS inbox only contains messages from known senders, since you've explicitly had to add their RSS feeds to your feed-roll. And, since you've likely done that because you expect to value the contents of their messages, you're likely living in the upper left quadrant in RSS-land, enjoying that drizzled honey and those weird-newspaper rolls.

Email is the real challenge-tunity here.

Stuck in the Middle With You

Email is caught in the middle of all these features, both message-level and inbox-level. Anyone can email you at any time with any message, so there's a ton of it, and any message may be useful and/or urgent. That's mostly a good thing, and probably our RFC-writing forerunners wanted it that way.

Thus, we check our email, prodigiously, every single day. All day long. While we're pooping, while we're Zooming, while we're doing any old thing.

Perhaps this is a lens on why newsletters are making a comeback. Email readers are a "captive audience," because we cannot avoid triaging our email inboxes. As long as publishers keep their newsletters top-row-level useful, we'll keep Substacking them. Certainly, the chances of me reading an email newsletter are greater than they would be if I had to visit individual blogs. However, I think my ideal for premium content would be paid RSS feeds, rather than email newsletters, because I want to keep my email inbox clean as possible to aid in my triaging. In fact, this is what many podcasts are now doing (since podcasts are just noisy RSS feeds).

OK, enough about content-monetization (have I mentioned I have a free newsletter below?). How can we make our email inbox feel better? Is it possible to make email feel as good as RSS?

First, we should establish principles-slash-goals for each quadrant in our Conjoined Box of Message Success:

message actions

How might we think about upholding these principles in our email inboxes?

  • Upper-left: We never want to miss useful emails from people we know. None of our remediation tactics for the bottom row should impact our ability to "avoid missing" these. Got it?

  • Upper-right: This quadrant is kind of a nice-to-have for email. We aren't necessarily "looking" for new emails on a daily basis, but we also don't want to miss that awesome job-opportunity email. We need some way of pre-processing the contents or other features of the email (sender email address, subject line, etc) to bubble these up somehow.

  • Bottom-right: Spam filtering takes the prize here, but that's just table-stakes now. I think that the pre-categorization work of Gmail into Promotions and Social is really helpful, as is the ability to easily unsubscribe from ad-like emails. But the in-line ads of Gmail increase visual thrash, so it's a bit all over the place.

  • Bottom-left: This is less-relevant for email, since we've culturally moved these communications over to Facebook and the like.

Hmm, after reviewing message characteristics, email actually seems semi-okay. Most people can easily tell whether an email is going to be useful or not, provided that they take a second to glance it. The problem, then, is volume. Are we going to ensure that we glance at the most useful emails within their respective windows of urgency?

The medium is the madness

Maybe we need a faster way to just chug through emails. Power gmail users can't live without their keyboard shortcuts, for example. Or maybe we need better filtering-out of spam-like emails from our favorite clothing providers. Or maybe we need a way to remind us to triage a high-likelihood, potentially-useful email later.

Add up enough of these, and we're building a better imbox. I mean inbox. I do like the idea that companies like Superhuman and Basecamp are innovating in email to try to block and tackle against the useless and steer us towards the useful. I personally haven't made the jump yet. I'm slightly stuck in my Gmail ways now, and I do think that, with a bit more fiddly-work, I can set up my Gmail to reproduce a lot of the most impactful features of Superhuman or hey.com.

I've certainly missed some features in this analysis. But I'm trying to apply these frameworks not just to email, but to all forms on inboxes in my life that require my human-in-the-loop intervention. Something's gotta give, or this is just going to become our full-time job. Cue Slack-message sound.

Email me if you have any other ideas for inbox sanity! Just kidding - send a Tweet, for the love of all things electronic.

The Peep-Hole

Two weeks ago I woke up at 5 AM on the dot and had this entire creepy dream in my head. I went to the bathroom and scribbled it down while sitting on the toilet before I could forget it.

It being October and all, I thought I'd share this scary story...

yeasayer

Image source: the awesome Yeasayer music video for their song Ambling Alp

The Peep-Hole

There was peace in the village of Ghir, thanks to the Peep-Hole.

It had been this way for as long as anyone could remember.

"It's better than a thousand kings," said one shop-keeper.

"We're blessed to have the wisdom of our elders at our finger-tips," said another.

Any dispute, conflict, or argument could be brought to the Peep-Hole in the village center. No case or trial would be needed. The Peep-Hole had already seen and heard everything. A voice from the Peep-Hole would utter the Truth, and the matter resolved.

Ori had prepared his whole life to become a Watcher. To be one of the Watchers of the Peep-Hole was Ghir's greatest honor. Only the purest-of-heart and strongest-of-mind were chosen, and only once ever six years.

When Ori was six years old, his mother Cera was Chosen. It was the best day of Ori's life. The honor bestowed upon him was immense. He pledged that day to become a Watcher himself. He would join the Peep-Hole as the youngest Watcher ever, as soon as he came of age.

Everyone in town believed in Ori and thought he would be Chosen.

On the morning of the ritual, Ori woke up and asked the Peep-Hole in his hut for the weather.

"CLEAR AND CALM. LOW TO MID 70'S," replied the Peep-Hole.

Every hut in Ghir had access to the Peep-Hole. Its tubes stretched and tunneled from the village center into their homes. Any question, private or not, could be asked and would be answered by the Peep-Hole.

"Peep-Hole, what does it take to be Chosen as Watcher?" asked Ori.

"ONE MUST BE PURE-OF-HEART, STRONG-OF-MIND, AND BE OF-AGE TO BE CHOSEN."

Ori had heard these words thousands of times before.

"Peep-Hole, will I be Chosen as Watcher today?"

But the Peep-Hole was silent. Fear crept into Ori's heart. He tasted a cold sour in his teeth. Perhaps the ritual has already begun, he worried. Ori put on his finest clothes and raced to the village center.

The entire village of Ghir had already assembled. Ori was late, and the villagers glared at him. Ori took his place in the circle around the Peep-Hole.

The Peep-Hole gurgled and pulsed like liquid mercury. Its tubes flexed like the pulled off limbs of daddy-long-longs. Ori had seen the ritual twice before. He knew that the Peep-Hole would agigate and then announce a name.

"SREN"

The village gasped. Ori felt to the dirt.

A forlorn, meek boy stepped forward. Sren was a farmer's son. He was quiet and unassuming, and, like Ori, had just turned eighteen.

The village watched silently as Sren walked into the rippling quicksilver and disappeared. Before he was gone, he screamed.

Everyone screamed when they entered the Peep-Hole. No one knew why.

The villagers dispersed, but Ori remained. Fig, a younger girl of thirteen, came over to him.

"It's okay, Ori. There's always next ritual."

Ori glanced at her. He heard no kindness in her words. He only saw her as a potential rival.

When he returned home that night, Ori tried using the Peep-Hole again. But it refused to answer him.

Am I being exiled, he wondered. Being cut off from the Peep-Hole was an unimaginable exile. Worse than death.

And Ori wanted to die.

He wandered the village late that night, watching and listening to his fellow villages consult with the Peep-Hole from their fire-lit huts. He went to the town center and spat at the Peep-Hole. His spit fizzled on the liquid metal and evaporated. Ori sat down. He watched the Peep-Hole, watched it shimmer and and pulse. He wondered then, for the first time, where the Peep-Hole had come from. He fell asleep.

His sleep was dreamless, but Ori woke with a new clarity. Last night was the first night ever that he slept somewhere else, other than his hut. Somewhere far from his hut's Peep-Hole tube.

Ori felt powerful and confident.

Later that morning, he called the villagers back to the town center.

"Give it up, Ori," they grumbled.

"You weren't Chosen," they called.

But then they saw what he had done.

Pyres of wood had been stacked around the heptagonal Peep-Hole.

"People of Ghir," said Ori. "For too long we have been under a spell. Today I break that spell. People over Peep-hole!"

All the while, the Peep-Hole was gurgling uncontrollably behind him.

Ori lit a match and threw it into the pyre. Flames encircled the Peep-Hole. The quicksilver melted and slid to the ground, revealing a skeletal structure within.

Screams erupted from the crowd. Everyone vomited. Ori turned his head from the crowd to the Peep-Hole and collapsed again to the dirt, throwing up everywhere.

Inside the Peep-Hole were the Watchers. Or what was left of them. A pale, sickly blob pulsed and writhed from within the geodesic cage. Arms and legs and heads stuck out in all directions from the creature.

Ori couldn't stand the sight -- or smell -- of it burning, so he doused the fires. As the temperature cooled, the mercury reformed around the structure.

"Go," said Ori to the Peep-Hole. "Go and never return. We will lead ourselves."

The Peep-Hole thrummed loudly. It began to move, slowly, snapping off its tube arms one by one. The Peep-Hole slid out of the village center, towards the mountains. Ori watched it disappear into the forests.

The people of Ghir cheered Ori, naming him Hero.

For a while, all was well in the village. But then the disputes resumed. Ori wanted the villagers to settle things themselves, rationally, but he saw that they could not. He tried making rules for them to follow, but the people always found ways to re-interpret his words.

The Hero set up a trial system. The people came before him to argue their case, and Ori did his best to settle their disputes.

But soon the people became clever. They spun their words. Truths became indistinguishable from lies. Lies, truths. It was harder and harder for the Hero to resolve the matters of the village.

More than once as he stood in the town center, Ori caught a glimmer of silver in the corner of his eye, far away on the mountain-tops.

It became too much for the Hero. That day, the people came to the town center and didn't find Ori.

"He's abandoned us, too."

For many days, the villagers retreated to their huts and waited.

Then, one morning, the tubes in their huts were lit. They walked to the town-center.

The Peep-Hole had returned.

Ori was never seen again.

Notes on My Colon Cancer

The giant robot looks like a WED Treadwell, my favorite robot of all the Star Wars droids. I admit, I was worried that it would look organic, like a Sentinel from The Matrix, with wriggling Dr. Octopus arms and pinchy pincers that pinch. But I'm calmed by the robot's EVE-like exterior.

The room is sterile. A dozen masked, gloved attendants in blue buzz. I imagine I'm an astronaut about to step into the rocketship capsule.

Except I won't be going anywhere on this particular journey, unless something goes very, very wrong. In fact, I've already been asked repeatedly by various staffers to describe what I'm expecting to happen in this room over the next few hours:

"I'm here to remove my sigmoid colon via robotic surgery because of the cancerous tumor inside."

I'm 34 years old. It's October 12th, 2020. Five weeks ago I was diagnosed with colon cancer.

Stool, bloody stool

I've always been a standing wiper. Not sure entirely why. I must have once, accidentally, touched a load of poo during a seated wipe. That sort of thing can change a person.

This charming anecdote does factor into our story, because it means I've always had a pretty good sense for my poo. Consistency, quality, and color, both in the bowl and on the TP. Did you know, there's even a seven-stage scientific classification system for your poo, called the Bristol stool scale?!

Bristol stool scale

I first noticed blood two or three years ago. On a monthly or so cadence, I'd wipe and notice a reddish tinge. Not bright red, more like muddy-red. Poopy-red. Initially, I thought little of it. Just a minor curiousity. It certainly didn't happen every time. Still, I decided to check off the Blood in stool box on the forms at my annual physical with my primary care doctor that year.

A brief aside on the phrase "your primary care doctor." Like in Forgetting Sarah Marshall, the last doctor I really thought of as "my doctor" was my pediatrician. Since "becoming an adult", I've lived in three cities in two countries, which means that I've generally had no idea who my primary care doctor is or was, only that I'd need to find one to give me a referral to get this wart on my foot removed.

Firetruck

Anyway, this season's Dr. Who told me not to worry about the blood. "It's probably hemorrhoids."

WTF is a hemorrhoid? I wondered to myself as I said to him, "Sounds good." Googled it after, and I learned that it's a vein that pokes out a little in your butt and doesn't really want to be poking out a little, so it bleeds. Seems like a thing that can happen, so I more or less returned to regularly scheduled programming and just dealt with the occasional poopy-red wipe. This doc also said I probably don't need to come for a physical for a few years, that annual physicals are a myth, dry land in a water world.

Fast-forward to 2020. Everything sucks. And the bloody wipes are making a resurgence. Because, of course, they are. About four months ago I noticed that my first poop of the day (I usually go 2x) would have this purple-red streak embedded in it, like a racing stripe from hell. And it would happen almost without fail every single morning. That just didn't seem right, no matter what Doctors of Physicals Past told me. And then one morning I felt like I had actual blood dripping from my butt.

Now I consider myself to be a mostly healthy person. I eat fairly well (even though I enjoy the occasional sourdough loaf and hazy IPA), I run and bike and hike regularly, I ran an IRONMAN in 2016 and a few ultramarathons since. I also don't like being sick (who does?). But, like with most things in my life, I want to be "good" at health. An ideal dental appointment for me would go something like this, "Wow, Charlie, these are the straightest, whitest teeth we've ever seen. We'd like you to come in and be the model for our Instagram ads and also be our 3D teeth model for dentures. Congratulations. Here's two free toothbrushes. You also never need to floss again."

Anything that deviates from that ideal makes me squirm and I do think I can fix anything. For what it's worth I still believe that, if I ever encounter a blue flower on a mountain-top, I'm only a few months of mystical training away from becoming Batman. I already have the cape (it's actually a Harry Potter robe, but, hey, I'm scrappy).

At the same time, I counterweight this with a mild touch of hypochondria. I'll see the poison oak in the mistletoe, so to speak. In this case it was a gift. I googled again for stool, bloody stool and the dreaded colon cancer came back. Last time, I averted my eyes from these search results. But the bloody racing stripes weren't going away. I needed to get myself checked out.

Then I remembered an email from work: I was eligible for a OneMedical membership. I knew there was hype about OneMedical, certainly I've seen the billboards, but I still wasn't exactly sure what they were all about. It had been a few years since my last physical, as you know, so I was primary-care-less, with a bloody problem on my hands. I downloaded the OneMedical app, uploaded a photo of my insurance card, beep-boop, and I've got an appointment with a new doc in a few days in one of their nearby clinics. Already, I loved the experience - I could text my questions any time (see foot wart above). I'd describe OneMedical as a network of clinics with an app for scheduling appointments and texting with a doc. Sure, ZocDoc kinda does the scheduling thing, but Zocdoc feels like you're sifting through the classifieds. Gimme some non-user-generated-ratings-based curation, please.

So, I met with the doc, liked him a lot, discussed my bloody poops, and sheepishly asked if he'd be my new primary care. He agreed, and he also referred me to UCSF for a colonoscopy. Sure, I'm young, and it's probably hemorrhoids, we agreed, but it's the only way to be sure.

After some jiggling about with the referral documentation, we finally get the colonoscopy scheduled for a few weeks later on Sept 9th.

Then, on August 28th, Chadwick Boseman died of complications from colon cancer.

I wasn't freaked out. Okay, yes, I was very freaked out.

Colonoscopies are not bad

What's a colonoscopy? It's a surgical procedure where the doctor goes all the way up your butt to see what's going on in there. You are completely knocked out, so you feel nothing. The only thing you need to do is what we in the business like to call "bowel prep."

Allow me to describe bowel prep: the day before the procedure, you will poop your ever-living guts out for a few hours until you are clean-as-a-whistle, stem to stern. They'll give you a prescription for a gigantic jug of clear laxatives that you'll drink every 15 minutes or so for a few hours. In today's toilet-paper hoarding economy, I'd make sure that you are stocked up, because this gets messy.

Other then the laxatives, you're allowed to drink clear liquids - which is confusing because you can enjoy such clear liquids as black coffee, Gatorade, broth, even green jello.

But that's it. Easy. I watched Stranger Things season 3 again during my bowel prep day. Might not have been the best choice, as I intermittently had to pause Netflix to contribute my own liquified form of the Mind-Flayer, but it got the job done, and I cried my way thru Dustin and Suzie's hymn to childhood, again, as expected.

Okay, next, I woke up on September 9th. My appointment is around 2 PM. Normal day, right?

sf

Nope.

I decide to walk over to the UCSF Parnassus building in the creepy Mars firelight, imagining I'm the last man on Earth (and hoping I don't step on my reading glasses). Carly makes a plan to pick me up in a few hours in our car.

As expected, the procedure was painless. My only bit of further colonoscopy advice here is to ALWAYS bring a book with you, to every single medical appointment you have, because there's always going to be some sort of delay or waiting room.

An hour or so later, I woke up feeling the feels of that post-anesthesia giddiness. Except no one else was happy. Carly was in the room, a surprise to me. And my doctor looked quite serious.

In addition to two small polyps (which she removed), my colonoscopy surgeon found a tumor in my sigmoid colon. At this point, I don't know a sigmoid colon from a semi-colon, but I knew it wasn't good news. Go 2020!

Despite the odds (my youth, my health), I now had cancer. Well, I probably had it for awhile, but we just found out I had it.

My doc said I'd need to meet with UCSF's colorectal surgery team, and I'd also need to get CT scans ("cat scans") to see if the cancer had spread anywhere else in my body.

And so began one of the worst weeks of our lives.

A brief family history

Let's talk about the odds for a moment.

odds

We've already discussed my vigorous, proto-Batman level of health. And how I'm a fresh-faced, occasionally-bearded, 34 year old with the heart of a child and the strength of a chimpanzee (no, that's a humanzee).

Speaking of unfortunate genetics, it turns out that I have some family history of colon cancer.

Here's the scoop: my pops (that's cool talk for Dad) has had benign (non-cancerous) polyps in his previous colonoscopies. What's a poylp? It's a little growth thingy in your colon that may evolve into a tumor. Just like how a Charmander becomes a Charmeleon, polyps can grow bigger and more serious with more destructive power. Polyps are usually just snipped out during your colonoscopy and sent off for pathology (aka to see if they have cancer in them). Most do not. This is the case with my dad's polyp experience. Even though none of his have been cancerous, he still needs to go in for colonoscopies more regularly than those who don't have polyps.

My own tumor began as a lowly polyp, perhaps some ten years ago. We don't know exactly. But if I'd had a colonoscopy ten years ago, or five years ago, they might have seen it and snipped it out and you wouldn't be reading this.

If you go further up the Harrington tree, you'll learn that my dad's aunt (my father's mother's sister) died of colon cancer in her early 60s. And his other aunt (same side, same family) died of colon cancer in her 80s. Two factoids that I had no idea about until I asked my parents for their help filling out one of the many UCSF cancer history surveys. Also, on my mom's side, my grandfather's mother (my great-grandmother, who I never met) probably had colon cancer.

So, colon cancer is bouncing around in my family tree. But neither of my parents have it, and none of my grandparents had it, which I suppose is good. That said, I learned that my grandparents did have other sorts of cancers.

Getting confusing, right? I cannot stress this enough: Learn your family's medical history and write it down in a note on your phone. You'll be asked for this info 10,000 times before every single appointment. But, more importantly, your family history can be a signal to you and your docs whether are "higher-risk" for certain conditions.

I just didn't know about any of this. I knew there were some heart attacks in there, but not really about any of the cancer stuff. Ideally, each person would be given some sort of family history report when they're born or when they turn 18 or when they get their first Nintendo.

But that's just it. You don't get health info automatically. There's no one, other than you, to own your medical health story. You must become your own health advocate. Spoiler alert, but this is the number one lesson I learned during this entire cancer experience. Health literacy is just as important as financial literary or literacy literacy.

There are tools to help, and I'm still digging into them now. I'm much more excited now by the Apple Health stuff on iOS. I'm hoping it can become some sort of private, secure repository for my health data that I carry with me. For example, how many of you, dear readers, know your blood type? There's all sorts of little info-nuggets that you can track down NOW to pay-it-forward for FUTURE you. Cause, ain't nobody else gonna. It's like a scavenger hunt. Okay, enough proselytizing, dude.

Stage-wise limbo

Back to our story, we've just learned that I have a cancerous tumor up my butt and we've also filled out a few frightening family history reports. This is where UCSF kicks it into high gear (and, my goodness, do I love UCSF? Yes, yes I do. They are absolutely, amazingly wonderful, competent, and life-changing!).

I'm now starting to get booked for all sorts of appointments, starting with the ones previously mentioned: (1) CT scans of my abdomen and chest and (2) then the consult with the colorectal surgeon.

Because, as I later learned from my colorectal surgeon (who is the best!), when colon cancer spreads, it usually does the evolution thing from cancerous polyp (Stage 1) into tumor (Stage 2). After that, it can break through the wall of the colon into the nearby lymph nodes (Stage 3). Finally, it becomes (Stage 4) if it spreads to other organs, the first often being the liver and the lungs. At least, this is how I understand the various stages. I'm sure I'm missing some technical details and nuance. When reading about Chadwick Boseman, you'll learn that he was initially diagnosed with Stage 3 colon cancer in 2016, which eventually became Stage 4. In sum, you want your stage to be as low as possible.

At this point, pre-CT scan, Carly and I have no idea what stage I'm at. Well, we do know that I'm somewhere from 2 - 4. These appointments are going to help us understand where I'm at. Specifically, the CT scans will tell us if I'm Stage 4 or not.

Carly and I are in a daze for most of the next week. And so are our parents and our siblings. I honestly can't remember how many friends we told at this point, I know a few, but not that many. I didn't know what to say or feel.

Much like the South Park lament "The Simpsons did it!", there's usually an xkcd for whatever you're feeling or thinking:

emotions

As a wannabe stoic, I allow my negative visualization to run rampant. I'm thinking of the possibility that I've got only a few years (months?) left to live.

My CT scans are scheduled for Thursday afternoon and the meeting with the surgeon is Friday morning. Between then and now, we have the horrible Internet to do horrible searches and we have the two-page summary printout of my colonoscopy, replete with some terrifying photos of the tumor. The tumor looks like a cross between a tadpole and an eyeball (two things that I'd normally love). I don't like looking at this picture, at all, but the two-page summary somehow keeps traveling around our house, and no matter where I look, I see the pink tadpole eye staring back at me, and I wonder, "Are you my death sentence?"

The sound of silence

On Thursday, Carly and I walk over to the UCSF CT scanning place. It's slightly less hostile to human life outside today, so that's nice. After checking in with the front desk, I quickly pass through the first waiting room into the second waiting room. There's always a second waiting room.

It's here I realize that the sound of a major health issue is rapidly opening and shutting hospital doors. I scribble this pithy witicism into the back cover of my paperback copy of Flow and wait my turn with the CT machine. I'm given two bottles of "contrast" provided by reknowned-drink-maker General Electric to drink. These iodine cocktails will help the machine see my inside stuff. They taste like you're drinking printer ink. They're not that bad at all. Everyone else in here is at least fifty years old. I decide to do a five minute wall-sit to prove my vigor. Finally, I'm called back to the machine.

The CT machine looks like a coldsleep chamber crossed with a Weyland Corporation interdimensional portal. It's over in less than a minute.

Plan of attack

The scans are done and now it's up to the radiologist to read them. I'm sure some neat TensorFlow or PyTorch deep learning computer vision model could help here, but I don't have access to the dataset.

The next morning we drive over to the UCSF Center for Colorectal Surgery. It's in the beautiful ghost town of the greater Chase Center-Mission Bay area. I look up at the sun before heading in, thinking, "The next time I see you, ball of gas burning billions of miles away (quoth Pumbaa), we'll know the CT results and we'll know the plan."

When I see the sun again, we do.

The CT scans were clean. There's no sign that the cancer spread to other organs, ruling out Stage 4. This is the best news ever.

The second best news we hear is that the tumor is in a relatively excellent spot for surgery. After an impromptu rectal exam that morning (hello!) to make sure there was no cancer in the rectum, my surgeon gives us an overview of the situation and a plan of attack.

He's going to remove my entire sigmoid colon (which is about a foot long), and then simply reattach the rectum to the rest of the colon. And he's going to do this all via "robotic surgery" (using the WED Treadwell-like da Vinci Surgical System), so the scars will be teeny and the recovery much easier.

We'll only be able to tell if I'm Stage 2 or Stage 3 post-surgery. He's planning to remove the nearby lymph nodes and a pathology report will tell us if they're cancerous. If they're positive, it's Stage 3.

But, either way, we're getting this thing out of my butt, pronto.

Carly and I have a plan. We're planners. We needed this. A bit of our haze is lifted as we head into our next agenda item.

Gettin' hitched

We got married (eloped, both technically and social-distanced-ly) on Sept. 30th!

wedding

Look at those oblivious smiles. Wait -- we aren't oblivious, I have cancer. We just love eachother.

Originally slated for 2019, then after bouncing around in 2020, our cute elopement threaded a very small needle with a teeny ceremony and it was beautiful and wonderful and just what we hoped for.

Now, onto our first act as a married couple: my surgery on Monday, Oct 12th (and another round of bowel prep the day before).

Surgery ain't no joke

I don't have much to add about the surgery itself. I was there. But I don't remember anything. Thank goodness. I also haven't yet watched any YouTubes of how the da Vinci robot works. I didn't want to know before the surgery, and I'm not quite ready now to see it.

I did remember to bring a book, though:

book

And, then, after glimpsing my many-limbed robotic friend in the surgery room, it's lights out.

The next thing I know it's five hours later and I'm in a hospital bed and calling Carly to give her my room number. The nurses in the recovery area are amazing. I'm hooked up to an IV and they're monitoring my "ins" and my "outs" (my foods and my pees and poops). They do this every four hours, so you're not exactly going to get a perfect night's sleep here, but it's great to know that they're paying good attention to you.

The big goal for me for the next 24 hours is to walk around. Being the Big Hero 6 that I am, I try to walk at 9 PM on the day of my surgery (which concluded around 6 PM), and I stand up, but my heart starts racing, so I slowly plop back into bed. Then, at midnight, my nurse helps my try again, and I do it. I shuffle around the hallway like a zombie, wheeling along my IV stand. It's a huge win. I end up walking six more times that day, between many Breath of the Wild sessions and most of The Umbrella Academy Season 2.

Sure, my guts feel like someone took a blender to them, but I'm in great spirits, with incredible support from the UCSF team, Carly, and my mom.

Side note that IVs are interesting. They're like open ports into your body, allowing the medical team to either remove or add fluids. I didn't expect that they'd just keep these ports open during your hospital stay, but they do. I guess that makes sense.

port

Another secret weapon of mine that aided in my recovery: this cute avocado buddy that my sister and her boyfriend sent me:

avo

I'm squeezing this thing every time I'm jabbed with a needle (many, many times), using it as a pillow, and just loving it, cause it's so cute.

On Wednesday, after I've started farting and pooping again (great signs!), I'm sent home early.

The future

I'm home and moving slow and still feel a bunch of surgical pain in my tummy, but overall feel so happy about my progress. I have some cool scars, which I'm thinking about submitting to the @secret_buttholes Instagram:

scars

On Thursday, I get a call from my surgeon. The pathology is back early. There's no signs that the cancer spread past the colon walls. The lymph nodes don't show any signs of cancer in them. Which essentially means I had Stage 2 cancer. Per my doctors, there's no immediate need for chemotherapy.

We did it.

I still have some upcoming follow-up appointments, and meetings with cancer genetics to learn if I'm genetically predisposed to cancers. And I'm sure I'll be doing many more colonoscopies and other tests in the future. And I'm still recovering from the surgery, too.

But I (think) I'm cancer-free now. Now, there's no way to know that little microscopic cancer cells didn't manage to break through somehow, or that I don't have cancer in some other random part of my body, so it's kinda arbitrary to say something like "cancer-free." But we do know, for sure, that my colon cancer tumor was safely removed and that my doctors are extremely pleased with the results and the signs that it hasn't spread.

Hello, impostor's syndrome, my old friend

So, I guess that means I'm a cancer survivor.

Which is weird to say, because this whole thing happened very quickly. All I did was "bowel prep" for two days and then fall asleep and wake up with a painful stomach.

But I am a survivor.

In fact, I'm probably the luckiest cancer survivor ever, from my access to incredible people and resources at UCSF to the actual state of my tumor to my family and friends support network. I paid attention to my body (noticing the bloody poops) and got the support and encouragement needed to get checked.

UCSF has me signed up for a 5+ year relationship with their cancer survivors unit (I'll learn more in a few weeks when I have my first session). I'm excited about this, because I want to learn as much as I can about how to stay safe and healthy going forward. A few of my friends have told me that there's good research into fasting and Keto and their link with preventing colon cancers. I'm queuing up some Tim Ferriss episodes with Dom D'Agostino about this topic.

My wife and my family are depending on me to stay healthy, and I'm going to do everything I can to do so. I'm going to own my health and be my own health advocate.

Some thanks

It's now about a week and half out from my surgery. I'm doing better on the Bristol scale, but not quite back to normal yet.

walking

Monday was my surgery. Tuesday didn't capture my walks, because I didn't have my phone on me. But I'm moving around again, and eager to get back to regularly-scheduled life.

Thank you for reading this story. I hope it is informative and shocking and helps you think about your health and the health of those around you. For example, Molly - my sister - is definitely going to have to get a colonoscopy ASAP.

Thank you to:

  • My incredible, magical, beautiful wife Carly!
  • My parents and my mother-in-law and our siblings!
  • Our friends and family!
  • UCSF!
  • OneMedical!

Also, if I got anything wrong in this missive from a medical perspective, let me know and I can attept to correct the errata. This is meant to be my understanding of my situation, YMMV.

2021 Update! Read Part II of my cancer story: Notes on My Chemotherapy