100k skins: Reflections on the Winamp Skin Museum’s upload flow
A technical breakdown of the Winamp Skin Museum’s over-engineered upload flow, and how it helped create a positive feedback loop
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fbc13baf2-e89c-4a99-a4b6-08f53e12e901%2FScreenshot_2024-10-20_at_9.29.34_PM.png&w=3840&q=75)
Reactive GraphQL Architecture
A vision for using GraphQL on the client for local-first apps, apps using e2e encryption, and other apps with heavy client state
Why use the Relay Connection Spec?
My response to a Reddit user’s question about the value of the Relay Connection Spec
“KillsParentOnException” a lesson in API naming
An internal Meta decorator name which taught me something important about API naming
From opera to tech
Reflections on my journey from a classical music background to a career in big tech
Videos: I used to sing with a men’s chorus
Youtube videos of a choral group I used to sing with
My GraphQL Conf 2024 talk: Semantic Nullability
Youtube video of the talk I gave at GraphQL Conf 2024 covering advanced client error handling and its implications for potentially fundamentally solving the problem of pervasive nullability in GraphQL
A video of my wife and I singing Mozart’s Requiem
A video from earlier this year of my wife Chelsea Hollow and myself singing the soprano and bass solos in Mozart’s Requiem
I was on the Changelog podcast again
I caught up with Jerod and Adam about nostalgia, music, file sharing, Napster and the weird stuff I found in corrupt Winamp skins
How the React model tames N by N code complexity
Explaining how exactly the UI = f(state) model tames code complexity
Hal fixing a light bulb (what software development always feels like to me)
This clip from Malcolm in the Middle perfectly encapsulates the experience of trying to get anything done with software
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fb5bbe09d-75bf-42ed-b13c-1e9ef7f2f5c5%2FScreenshot_2024-08-01_at_8.52.55_PM.png&w=3840&q=75)
Itsy Bitsy Data Structures
Sharing this repository which teaches data structures through charmingly commented JavaScript implementations
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fec74f66b-df48-4fa8-b4ca-7bdbca242aeb%2FScreenshot_2024-08-01_at_8.37.15_PM.png&w=3840&q=75)
Bob Nystrom explains the Pratt Parser algorithm
Sharing Bob Nystrom’s excellent blog post explaining the Pratt Parser algorithm which offers a very clean way to model operator precedence
Windows93.net
One of the most fascinating pieces of software art/trolling/humor I’ve ever seen
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F8ebbaaec-9fc5-4db4-b001-2bfdb5e96061%2FScreenshot_2024-07-24_at_5.51.50_PM.png&w=3840&q=75)
Using Notion as my CMS with Next.js
Why I chose to use Notion as the backing CMS for the Notes portion of this site, and the technical details of how it’s implemented
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F727fb2ac-8f96-4964-8790-c88490cb5417%2FScreenshot_2024-07-24_at_11.53.31_AM.png&w=3840&q=75)
The Winamp Skin Museum has a secret debug mode
Shhhh. Don't tell anyone, but the Winamp Skin Museum has a secret debug mode.
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F6b7a6af9-118a-464c-9963-25a715a435bd%2FScreenshot_2024-07-24_at_11.17.44_AM.png&w=3840&q=75)
The Winamp Skin Museum is powered by an sqlite3 database
The Winamp Skin Museum is powered by an sqlite3 database containing 1.2gb of metadata about 86,000 Winamp skins and exposed as a public GraphQL endpoint
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F3eff4cda-73c0-4f9f-a6f6-0b747a8e9e18%2FUntitled.png&w=3840&q=75)
Winamp Skin Mosaics
Generating photo mosaics from Winamp Skins
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fde10cdc9-395a-4ae6-a34d-c8635a711783%2FUntitled.png&w=3840&q=75)
The bizarre secrets I found investigating corrupt Winamp skins
I started looking through corrupt Winamp skins and it lead me down some very strange rabbit holes
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fe94461bd-1f9c-4ef4-bbda-23acc32ef0df%2FEsErCPFVoAACjOn.jpeg&w=3840&q=75)
How I indirectly helped remove stray characters from across the web
I wrote a simple lint rule which detected hundreds of user facing bugs at Meta and inspired my colleague to ship a similar validation to every major JS parser
Next.js’s unstable_cache() demystified
I found some interesting information about Next.js’ elusive unstable_cache API
“Alexa, add half & half”
The funniest Alexa interaction I’ve ever had
Book: Crafting Interpreters
A glowing review of the book I most recommend to people interested in learning about compilers
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F7b8b516f-bbe5-4437-bfa5-08c769bcfa1f%2FUntitled.png&w=3840&q=75)
A nice way to render Markdown in React apps
A pattern for rendering Markdown in React apps directly from an AST without any serialized HTML
Avoid “straw that broke the camels back” lint rules
A class of lint rules that I think are best to avoid
The Challenges with Client Controlled Nullability
Explaining some of the non-obvious problems with the Client Controlled Nullability GraphQL spec RFC
Avoid name-spacing GraphQL mutation fields
Explaining why nesting your mutations inside GraphQL types is problematic
How Relay Enables Optimal Data Fetching
Sharing a blog post I wrote about what makes Relay so special
On software becoming a prestige job
Reflecting on how the reasons people pursue software engineering has evolved
On grinding
Thoughts on the tradeoff of not grinding
Elf Storage
Probably the funniest vandalism I’ve ever seen
Seeing Beyond Edge Cases
How my thinking about edge cases has evolved as I’ve grown as a software engineer
Beyond PEP 8 by Raymond Hettinger
An amazing talk articulating how code style can make you miss the forest for the tree
Diagnostics are the UX of a compiler
Sharing an insightful observation about the role diagnostics play in compiler design
Software at Scale
On scaling software to large numbers of developers, not just large amounts of data
Life, a fatal STD
A humorous quip by my high school sociology teacher
On persuasive technical writing and clarity of thought
How technical writing forces clearer thinking
Becoming a local subject matter expert
Expertise is a self fulfilling prophecy
Type systems as a mental tool
Type systems lead to clearer thinking and thus better code
Eager vs Lazy Learning
An observation about the way I learn
Web Audio regression in Safari iOS 17 Beta
Documenting a regression, I observed in iOS’ implementation of the web audio API
On ephemeral UI, fragile app state, and anxiety
Ephemeral UI make us nervous because we’ve learned that there’s a high likelihood lose our state by accident
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F2d5211c8-c670-4e1e-a4e3-03db6a74bef1%2FUntitled.png&w=3840&q=75)
Some statistics are just a function of term definitions
A class of statistics to look out for when evaluating statistical claims
A Winamp Skin Detective Story
Tracking down the cause of some mysteriously corrupted Winamp skins
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Ffa0ff4b2-ba0e-41f8-af03-a14453041eb7%2FScreenshot_2023-08-04_at_8.03.39_PM.png&w=3840&q=75)
“Cool S” as a Unicode standard
There was once a proposal to codify the ”cool s” as a unicode character
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fda7fd8fa-25c9-409b-b632-117aa72b5b46%2FIMG_2649.png&w=3840&q=75)
An old engineer’s tale
My dad‘s reframing of a sexist idiom
JSFuck: Express any JavaScript program with just six characters
Express any JavaScript code with just these six characters
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fed0e3d1d-5237-4a26-878c-779848db4828%2FScreenshot_2024-07-21_at_4.49.54_PM.png&w=3840&q=75)
Why UrlMe.me failed
Reflections on why my side project meme generator never caught on
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fc5c9bd2b-2342-479d-85a1-66aeb432a2c7%2Fit_failed.jpg&w=3840&q=75)
Extracting a beloved Pokémon from a corrupted save game
Sharing a YouTube video of an awesome ROM hacking rescue mission
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fdec8ce93-35be-430f-abab-6253d0e64cb1%2FUntitled.png&w=3840&q=75)
Chord notation is a domain-specific language
Reflecting on parallels between chord notation and software language design
Sentimental Versioning
Sharing a great post about software projects with unique versioning schemes
Disassembling Winamp with Ghidra to find the Maki interpreter
Sharing my n00b attempt at disassembling the Winamp binary
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F699a3d15-bbbe-41c0-b824-5219276d04d3%2FScreenshot_2023-06-01_at_11.05.42_PM.png&w=3840&q=75)
My favorite API: Vim Mode
An observation that Vim mode is a type of API
A GraphQL Maturity Model
I believe the benefits of GraphQL are fundamentally under-realized. Most organizations fail to capture much of the value it can provide.
How to build a typeahead
Sharing the canonical post on how to properly build a typeahead. It’s much more complicated than it first appears
Compiling to AST
A pattern for tracking location information when compiling to a high level language
Lint or Keep Quiet
Code review feedback that could be encoded as a lint rule, should be
My friends and I meet Thomas Hampson
My one interaction with the famous baritone Thomas Hampson
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fe23ff22b-6489-47f9-814a-3958d5d0188d%2FAE2A7558-5162-4541-B5FE-98D0CBA0B0FC.jpeg&w=3840&q=75)
Tom Waits on small print
A great Tom Waits quip on the nature of “small print”
Tom Lehrer on Mozart
Tom Lehrer quote on comparing your successes to those of others
A verbose version of The Night Before Christmas
Sharing a humorous rewrite of a classic poem that would often get pulled out around Christmas time during my childhood
Admiral Grace Hopper Explains the Nanosecond
Great way to conceptualize very small increments of time
Creating project-specific ESLint rules in a Yarn workspace
How to create custom project-specific lint rules for a repository that is using Yarn Workspaces where ESLint is run from the workspace root
Wireless Xbox controllers work with Macs
TIL Xbox controllers “just work” with Macs, and you have a lovely nostalgic evening playing Mario 64 in an emulator
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F4a0343d1-b6c4-4733-85fd-22d15971b963%2FUntitled.png&w=3840&q=75)
Super Tiny Type Checker
A minimal JS implementation of a type checker great for hands on learners
Jones Forth
A prodigiously commented implementation of the Forth programming language in x86 assembly. So clearly communicated even I could mostly follow it
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Ff2db3d14-cb68-4624-964f-fabcd3df5cdb%2FScreenshot_2024-07-21_at_4.52.11_PM.png&w=3840&q=75)
BBC micro:bit
A beautiful, inexpensive single board computer for teaching kids to program
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2F8b00b2bd-d8f6-45ff-b8db-7c9e33f0ad9a%2Fmaakecode_microbit_03.png&w=3840&q=75)
Sudoku Set Equivalence Theory: The Phistomefel Ring
An incredible property that all sudoku puzzles have which can be proven with set theory
Why there was never a Winamp 4
Did you ever wonder why they skipped straight from Winamp 3 to Winamp 5?
Laravel’s obsessive comment style
An insane detail that points to the obsessive approach Taylor Otwell took with Laravel
![](/_next/image/?url=%2Fnotion-mirror%2F84ebb48c-616a-4f51-ae9a-991a4e0a7e9b%2Fc2bcf002-2b8b-47b2-8f0c-6d726fa216c1%2Fundefined_-_Imgur.png&w=3840&q=75)
Falsehoods programmers believe about music genres
Did you know that the ID3 metadata tagging system hard coded the entire set of music genres? Some of the ones that got included are hilarious.
Build your own LEGO fidget cube
A simple but captivating fidget toy you can build out of LEGO