Writing
Long-form posts, updated over time. Subscribe via the Atom feed.
- New Year, New Me Jan 2026 · 888 words I redesigned my personal site from scratch. Here's what changed and the design principles behind the decisions.
- Dotfiles Jan 2026 · 106 words I published my dotfiles, which will be a good incentive for me to use them more enthusiastically, and it should also help me set up new dev machines in the future.
- We Have New York at Home Dec 2025 · 1221 words I spent a month living and working in New York recently, and I want to take some of the habits I learned from New York home to Seattle.
- Racing towards Bethlehem Nov 2025 · 1043 words We haven't removed the bottlenecks in software engineering, but LLM-assisted tools are reshaping the work surrounding them. Code review, reading comprehension, and shared understanding still cost what they cost, but the difference is that reaching those bottlenecks is getting faster, the necks themselves are getting wider, and all of that changes how I want to work.
- Spinning Plates Nov 2025 · 2158 words LLMs have made me more productive than ever and somehow worse at the parts of programming that I actually liked. I’m trying to work out what to keep, what to change, and what it means when the work doesn’t feel like it’s mine anymore.
- Show them something good Oct 2024 · 1172 words Insights on standing out as an engineer seeking work, inspired by a Nashville musician, my boss's blog, and personal career experiences.
- Moving On: Reflections on My Journey at BRINC May 2024 · 2154 words After a year at BRINC, where I stood up the web app team and built the first version of LiveOps, I'm moving on to a new role at PostHog. I reflect on the things I learned, the things I liked and didn't like, and what I'm looking forward to in my new role.
- Getting the blog back together Apr 2024 · 705 words My triumphant return to blogging, some notes on bringing this site back to life, and setting the stage for what's coming next.
- Announcing circle: a Haskell client for Circle's REST API Nov 2022 · 588 words Announcing my first Haskell package: circle! This package implements a Haskell client for Circle's REST API. It supports all V1 endpoints to let users create and manage accounts, wallets, and users; and send fiat and cryptocurrency between them. Hopefully this makes building a Haskell application that uses Circle's REST API much easier!
- Improving the experience of JSON in Haskell with autodocodec and bifunctors Nov 2022 · 2595 words Libraries and techniques for improving the developer experience of working with JSON in Haskell.
- Data validation in Haskell with newtypes, smart constructors, and aeson Oct 2022 · 2054 words I'm working on a library that is wrapping an HTTP API, and I'm heavily leveraging aeson for working with the JSON returned and sent to that API. This post describes how I implemented field validation on the type level using Haskell newtypes and hand-rolled ToJSON and FromJSON instances.
- Reflections on my career in 2020 Jan 2021 · 2393 words 2020 felt like a particularly long year for a variety of reasons, and one of the reasons it felt long for me was because I changed companies twice after 5 years at Qualtrics! After starting the year there, I did a stint at 47 Degrees before joining Mercury at the start of December. Since this was the first time in my career that I'd actually changed companies, I wanted to write down some of my reflections on what I learned (both good and bad) throughout the process.
- I drove into the sunrise today and it felt like hope Dec 2020 · 846 words Today I drove 12 hours from Seattle WA to Ogden, UT. This was a first for me. While I was no stranger to road trips, I'd never driven 12 hours straight before, and even though I had all day to do it, I was nervous that I wouldn't pull it off.
- Implementing Dark Mode for my Website Dec 2020 · 693 words Now that both Windows and Mac have native dark modes for their respective operating systems, I figured I was overdue for enabling a dark mode on my personal website. Specifically, I wanted a site that inherited the dark mode settings from the user's operating system so that they didn't have to toggle in on the my website itself. Also, I wanted a solution that used pure CSS so that I didn't have to add any additional javascript to my site and modify any DOM elements at runtime. In this post, I cover how to configure dark mode based on your browser's OS, and how I went about picking CSS for dark mode that made sense for my page.
- Building a Fantasy Football Draft Assistance Algorithm: Part Two Nov 2020 · 3105 words Constructing a Fantasy Football draft assistance algorithm using Gaussian Kernel Density Estimation (Gaussian KDE) Part Two: Building the User Interface. Given my cross-sectional dataset from a variety of different fantasy football prediction sources, I implemented a DAsHA, a tool into which I could feed (a) the current draft position and (b) players already picked, and return as much data as possible for me to pick the best player that round.
- Building a Fantasy Football Draft Assistance Algorithm: Part One Nov 2020 · 3005 words Constructing a Fantasy Football draft assistance algorithm using Gaussian Kernel Density Estimation (Gaussian KDE) Part One: Collecting, Cleaning, and Preparing the Data. In order to beat my friends outperform the recommendations provided my fantasy football platform, I needed to create an cross-sectional dataset of projected player performance across a variety of different sources.
- Getting Started in Open-Source Oct 2020 · 1165 words As a software engineer at 47 Degrees, I'm ostensibly a member of the open-source community, since 47 Degrees spends a lot of time and resources on maintaining a few hundred libraries in Scala, Haskell, Kotlin, and Swift. However, unlike other folks at the company who were involved in open-source before they joined, I was never involved in a significant open-source project before joining.
- My Note-Taking Process Sep 2020 · 730 words The other day I was asked about my approach towards packaging up my knowledge into a format that's worth sharing: 'My question to you is at what point do you package up what you have learnt to share with others? I’m a software dev and forming a habit of writing what I have done seems like it might distract me out of flow if i’m to take notes to share later when i’m working, consequently, I think i’m a little exhausted after coding to write something decent. That’s the little quagmire I find myself in at the moment, I wish to share, just don’t have the method. Any tips?' It was a great question, I figured it deserved an involved response, and when I finished writing my thoughts I'd written almost 500 words.
- ValidatedNel in the Wild Aug 2020 · 68 words I'm keeping my streak alive and I wrote another blog post for 47 Degrees, this time a technical deep dive into a PR I made where I rewrote the error reporting in an sbt plugin to use error accumulation. There's a bunch of code examples that I cite from the blog post that guide the content.
- 47 Days at 47 Degrees Aug 2020 · 59 words I recently wrote a blog post for my new company about my initial impressions working there for the first month and a half. I ramble about several topics, including asynchronous working patterns, impostor syndrome, and the importance of seeking out work that's outside of my comfort zone.
- macOS Catalina 10.15.4: Development Setup for my new Mac Jun 2020 · 1078 words I bought a new personal laptop recently and I'm starting a new job soon, which means that I'm going to have a few new Mac laptops to set up in the near future. So, I figured it would be prudent to write my new Mac setup steps before I get the new computers and publish these steps somewhere so that I can easily get up and running with my new machine. My configurations isn't too crazy, but it is custom, and I think I have enough 3rd-party development and productivity tools installed that it's worth a blog post to cover all of the bases. On a final note, I'm primarily a backend/distributed-systems/data engineer, so my needs mostly revolve around Scala, Java, Go, Node, Python, and Haskell. YMMV!
- Setting up a Functional Scala REPL with Ammonite May 2020 · 913 words One of my favorite tools in the Scala ecosystem is Li Haoyi's Ammonite, which is a tool that enable first-class scripting support in Scala. You can use Ammonite to run Scala code in the REPL, as scripts, or even as a system-level shell as a replacement to something like Bash. It's a great tool and one I use daily when writing Scala. My favorite thing to use it for is for advanced REPL support -- Scala is my favorite language and Ammonite lets me whip up little Scala scripts and run them in the command line as I used to do with Python or Node.
- Installing Jekyll and its Toolchain on macOS Catalina Mar 2020 · 1044 words This post is for people like me: folks who want to install Jekyll on Mac OS Catalina, have run into dumb errors along the way, and just want one place where all the steps are laid out in an easy-to-follow way.