2019 - A Year of Lowered Expectations

Another year around the sun. Another year of this blog being sorely neglected. Whoops. I liked the approach that I took last year, where I listed some of my accomplishments for the year and some low expectations for what I want to do for the next year. I’m going to see if I actually checked off any of the boxes I set out for myself from 2017. Things I Had Hoped to Achieve in 2018 Ship a MVP of my side project Em nope. [Read More]

Dotfiles and The Life-Changing Magic of Tidying Up

I’m excited to announce that I’m now the proud (and broke) owner of a brand new 15” Macbook Pro (2017). I know, I know. I should have waited until Fall 2018 for Apple to announce a refresh. My rationale for getting the new laptop is mostly that I had been waiting for a refresh at WWDC. If none came, I was going to get one anyway since I’ve been holding off for a long time. [Read More]

New Year, Old Me

I’m not a New Year’s Resolution person, mostly because I don’t think they work. I’m not opposed to the idea, I just think that they take a wrongheaded approach (for me). Picking up a new habit is a lot of hard work, and I think trying to kick off a new year with the idea that it’s going to be a complete “fresh start” I think puts people in the wrong mindset for setting a habit. [Read More]

Okta OpenID JWT Validation

At work I’ve been implementing JWT encoding/decoding/validation for an auth service written in Ruby to handle both Okta OpenID Connect. The workflow is fairly straight forward. Once you log in via the Okta web portal, Okta will pass back an ID Token, which is a Base64 encoded JWT. Once decoded using Ruby’s Base64 urlsafe_decode64 method, the contents look something like this (taken from here): # Header: { "alg": "RS256", "kid": "mLi1UdXCkm90Klq9ZJy5p6rAZx5_X2GQee2E_Lj3eUs" } # Payload: { "sub": "00a1b33cde4fH5ij60k7", "email": "myuser@mycompany. [Read More]

Migrating From SquareSpace to Hugo

The migration is complete… almost. Some of my previous blog posts are probably still improperly formatted and some of my lighting portfolio didn’t seem to make the cut at all. SquareSpace’s formatting doesn’t make it conducive to migrating your blog to anything other than Wordpress, to put it lightly. You can export your entire site into XML, which is… ugh. I decided to decide the mild headache it was to migrate from SquareSpace to Hugo hosted on GitHub Pages just in case I decided I wanted to retrace my steps in doing this again. [Read More]


Who I Am Hi! My name is Cat Cai. I’m a software engineer who currently bumbles around a lot in Kubernetes and Go for a great company called Fair (seriously, we’re great and we’re hiring). I’ve also been known to sometimes do Ruby, Python (poorly), and JavaScript (mostly for React Native). In the not-so-distant past I was a tech and games freelance journalist for the likes of VG247 and Tom’s Hardware. [Read More]


I’ve been seen out in the wild doing a talk here and there. Deploy Your Next Application to Google Kubernetes Engine (Google Next ‘19) This talk was done in conjunction with the wonderful GKE PM William Denniss. My coworker Marshall Brekka and I discussed Fair’s experiences with Kubernetes. A Tale of Two Clusters: Handling Interservice Routing Between Two K8 Clusters (K8 Los Angeles Meetup) My coworker Marshall Brekka and I talked about the cross-cluster controller we wrote to handle routing between our two Kubernetes cluster. [Read More]