Jordan Eldredge

Blog

Formal write-ups of projects and ideas. For quick thoughts, observations, and links see Notes.


no-unused-binary-expressions: From code review nit to ecosystem improvements

How implementing an ESLint rule led to changes in how people write JavaScript


Grats: A More Pleasant Way to Build TypeScript GraphQL Servers

Bringing Implementation-First GraphQL to TypeScript via a novel static analysis approach.


Implementation-First GraphQL

Defining a meaningful distinction within code-first GraphQL server libraries.


Interesting Bugs Caught by ESLint’s no-constant-binary-expression

I contributed a rule to ESLint that catches a surprisingly wide variety of logic bugs.


?? "" is a Code Smell

Defaulting to empty string is a lie we tell our type checker.


A VSCode Extension to Clarify Operator Precedence in JS

I wrote a VS Code extension which shows subscript parentheses in your JS code to help clarify operator precedence.


Implementing Python's Context Manager Pattern in JavaScript

Python Context Managers are a great way to model resources with setup and teardown. Here's how to implement that pattern in JavaScript.


Open .ani Animated Cursors Online

I made a simple website where you can instantly open and view any .ani file for free.


I gave a talk about compiling to WebAssembly in the browser

Video of my TSConf 2021 talk entitled "Faster, Safer: Compiling Untrusted Code to WebAssembly in the Browser".


This Software is Punk Rock

A reprint of an interview I did with the Italian design magazine Progetto Grafico about Winamp's significance in our digital culture.


Generating a 12 Hour Youtube Video With Python

Making a video that smoothly scrolls through 70k Winamp skins over the course of 12 hours.


Building the @WinampSkins Twitter Bot

How my Twitter bot @winampskins works under the hood, how it has evolved over time, and what I've learned from the project.


Using Machine Learning to Generate Winamp Skins

I used thousands of screenshots of Winamp skins and StyleGAN2 to train an ML model generate more Winamp skins.


Speeding Up Webamp's Music Visualizer with WebAssembly

Writing an in-browser compiler to compile untrusted user-supplied code to fast and secure Wasm at runtime.


Talk: Design as an Optimization Problem

Video of a talk I gave at Speakeasy JS about the engineering and design philosophy behind the Winamp Skin Museum.


Rendering Animated .ani Cursors in the Browser

Technical breakdown of how the NPM module ani-cursor converts .ani files into CSS animations in the browser.


Mainlining Nostalgia: Making the Winamp Skin Museum

Thoughts on what I think made the Winamp Skin Museum successful.


Implementing a Robust Web Audio API Balance Node

After more than four years, I'm finally happy with how Webamp implements balance.


I did a Q/A with the Reactiflux community

Read the transcript of a live Q/A I did about Webamp and Nuclide.


I did an interview for the Changelog Podcast

I talked about Winamp2-js on the Changelog Podcast.


Making the case for building something useless

Why I'm perfectly happy to have built something that nobody really uses.


I talked about Winamp2-js on the Zeal Interestings Podcast

I appeared on the Zeal Interestings Podcast to talk about Winamp2-js.


A Tour of Winamp2-js Features

Demo videos of Winamp2-js' more interesting features with notes on how they are implemented.


Crash Safari with the Web Audio API

Discovering, reproducing, and working around a bug that crashes Safari hard.


Markdown Today: Journal from any browser

A private, mobile-first web app that writes your journal directly to Dropbox.


Gzip hates your DRY code

How to remove code and still increase your library weight.


Functional JavaScript: Learn by refactoring

Learn the basics of functional programming by iteratively refactoring imperative code.


I was interviewed for a podcast

My work interviewed me as part of their "employee spotlight" series.


"Ah leave me not to pine" ukulele solo

Video and PDF tablature of a Gilbert and Sullivan aria arranged for ukulele.


Why linting errors should cause tests to fail

Making the case against allowing linting errors in master.


Podcasts I like

A summary of the podcasts to which I subscribe.


Listen Faster: How I found 30 extra hours in my week

I’ve added the equivalent of 30 hours to my week, all dedicated to reading and listening.


The game Snake in 90 lines of JavaScript

I wrote a minimal implementation of the game Snake in JavaScript.


Breaking into open source

A detailed guide for those who are struggling to find a way to contribute to open source.


Vim Awesome: Talk at the San Francisco Vim meetup

Video of a talk I gave introducing and explaining Vim Awesome.


You're underusing Underscore

Ten common mistakes people make when using Underscore, and a linting tool to detect them.


UrlMeme: Make memes anywhere you can type a URL

I made a meme generator where the URL is the user interface.


I gave a talk: Finding Creativity Through Constraints

In which I discuss how constraints have inspired my creative process as a musician and programmer.


I think my new paste bin should be immune to takedown notices

I recently released a new website called HashBin which avoids being able to see the content the pastes it helps create.


How Winamp2-js loads native skins in your browser

How we get from a binary Winamp skin file to seeing Winamp2-js take on the look of your favorite skin, all within the limitations of your browser.


Creating the Shepard Tone audio illusion with JavaScript

The Shepard Tone is an audio illusion that creates the impression of an endlessly rising or falling tone.


Drawing mandalas with JavaScript and canvas

Rewriting a PHP script from 2008 in JavaScript.


Surviving Hacker News traffic with the help of free CDNs

Free CDNs are a thing, and they can be put to use almost instantaneously during an unexpected traffic spike.


I'm glad I factored out jQuery

I refactored Winamp2-js to not depend on jQuery, and learned native JavaScript is not so bad.


Why I switched from Vundle to Plug

I've found Plug to be superior to Vundle in several regards.


Speed up Laravel tests with database transactions

How I used transactions to make my tests run eight times faster.


Globally install PHP command-line tools with Composer

How to install CLI tools wiht Composer.


Writing a custom Codeception module

How to write a custom Codeception module and distribute it as a Composer package.


Infinite javascript array using AJAX

A simple way to asynchronously load suggestions into an array in JavaScript.


Testing emails with Codeception

A Codeception helper to test emails sent by your application.


Acceptance testing with Codeception and Vagrant

How to get Codeception acceptance tests working in a Vagrant workflow.


Intro to Vim Talk

I gave a talk at the San Francisco Vim Enthusiasts user group.


The two characters that were destroying our CodeIgniter sessions

Documenting a bug in CodeIgniter that causes sessions to be irretrievable.


A trick to get consistent checkbox form values

A tehcnique to ensure that unchecked checkboxes submit a value of zero with PHP apps.


Laravel 4.1 handles ambiguous routes differently than 4.0

Documenting a change in Laravel 4.1 that affects how ambiguous routes are handled.


My Git alias for shipping a feature branch

A handy Git alias for merging a feature branch into master and pushing it to the server.


Setting up PHP completion in Vim

.vimrc settings for PHP completion in Vim


Better indent support for PHP in Vim

A .vimrc snippet for better indent support for PHP with HTML.


Issue tracking for your workflow

I've been using GitHub issues to track problems with my workflow.


WhatTheFuckShouldIBeForHalloween.com

Generate infinite sexy Halloween costume ideas.


Free Edition of Charles Gounod’s Le Crucifix

I typeset a Creative Commons edition of Charles Gounod's a cappella choral work 'Le Crucifix'.


Piano Four-Hands Arrangement (Wedding Gift)

As a wedding gift for Chelsea I arranged a piano four-hands version of the song her dad wrote to sing her to sleep.


Papageno's Glockenspiel-kulele [Ukulele Ringtone]

A ringtone for Chelsea based on Papageno's Glockenspiel music from Mozart's The Magic Flute.


Silly fach generator

I created a website that will generate silly fach names.


One way "curl pipe sh" install scripts can be dangerous [proof of concept]

One way in which 'curl pipe sh' install scripts can be dangerous.


Charlie Chaplin's Smile: Ukulele Solo

A solo ukulele arrangement of Charlie Chaplin's 'Smile'.


Walking Away [Ukulele]

An original song from the vaults. Recorded on my first ukulele into my first (MacBook) laptop.


Tom Waits' "Ol' 55" for Jared and Kathleen [Ukulele]

I recorded a simple version of Tom Waits' 'Ol' 55' for my friends Jared and Kathleen's wedding.


Chelsea's Text Tone [Ukulele]

A tiny ukulele track for Chelsea's iPhone text tone.


I Wish I Had The Time [Ukulele/Vocal Multitrack]

I wrote and recorded a song about not having time to write songs.


I Love You Truly [Ukulele Mp3]

I arranged and recorded 'I Love You Truly' on electric ukulele for Chelsea.


[Ukulele Solo] Never On Sunday

I arranged and recorded a solo ukulele version of the classic song 'Never on Sunday'.


Backyard Ukulele Session: Ukulele Videos with Chelsea

Chelsea and I recorded a few songs in our backyard with the help of Beau Lambert.


I Come To the Garden Alone (For George Morris)

I arranged and recorded the hymn 'In The Garden' on ukulele in memory of George Morris.


FachMe: Find your roles

I built a website to help opera singers discover role which might suite their voice.


"The Surprise Slide" Ukulele Micro Song

A micro song for Chelsea, written and recorded while she was in San Diego.


Electric ukulele ring-tone for Chelsea

While visiting my parent's cabin in the woods, I created a little ring-tone song with my Electric Ukulele for Chelsea.


Irving Berlin's "Blue Skies" on Eleuke electric ukulele

I arranged and recorded Irving Berlin's 'Blue Skies' on my new Eleuke electric ukulele.


Jazz Ukuele Video: What's New?

I arranged and recorded a jazz ukulele version of the classic song 'What's New?'


Jazz Ukulele "Love Is a Song" from Bambi

I arranged and recorded 'Love Is a Song' from Walt Disney's Bambi on my new ukulele.


Multitrack Video: "In My Room"

On New Years Day some friends and I recorded a multitrack video of The Beach Boys' song 'In My Room'.


Video: I Made a $4 Electric Ukulele

I got bored over winter break and make an electric ukulele out of stuff I found in my parent's basement.


Mary Had a Little Lamb - Parallel Fifths

My dad and I recorded a version of Mary Had a Little Lamb where I sang and played the same song a fifth above.


Original Song: "Driving"

I wrote a song for Chelsea after three years of dating.


Colors of The Wind (Alice n' The Irving Street Kidz)

My friends and I recorded a cover of 'Colors of The Wind' from the major motion picture _Pocahontas_.


Eight-Part Barbershop Tag In Parallel Fifths

Experimenting with recording every part in a barbershop tag a perfect fifth higher to create jazzy chords.


[Multitrack] "That's Why I Love You"

I recorded an a cappella version of 'That's Why I Love You' by The Flamingos.


[Multitrack] Gilbert + Lisa 30th Anniversary

I recorded a little audio drama for my parents 30th wedding anniversary featuring characters and musical excerpts from the hilarious musical Forever Plaid.


Happy Birthday/PhD Nathaniel: "That's Mathematics"

I got my family to record a math themed song for my brother's birthday and graduation.


[Original Song] "Parking Garage"

I recorded a short song in a parking garage.


[Original Song] "Our Love Will Last As Long"

I wrote and recorded a novelty love song for Chelsea.


"Lazy Afternoon" Barbershop Tag

I wrote and recorded a barbershop tag for Chelsea.


We're Going To Be Friends (White Stripes Cover)

I recorded a cover of 'We're Going To Be Friends' by the White Stripes with multiple voice parts and ukulele.


Alice 'n The Irving Street Kidz

My friends and I recorded a rendition of 'I Want to Hold Your Hand' by The Beatles.


Refresh Cannon Bot

Geoff's Boring Programming Stuff wrote a bot to beat my Refresh Cannon game.


Refresh Cannon

I turned my forum avatar image into an interactive projectile aiming game.


Refresh Hero Avatar Game

I turned my forum avatar image into an interactive rhythm streak game.


Original Barbershop Tag: You Beside My Side

I wrote a barbershop tag for my girlfriend Chelsea.


Endlessly rising Shepard Tone

I created the Shepard Tone audio illusion using Lilypond.


Barbershop Happy Birthday For Amanda

I multitracked 'Happy Birthday' for my friend Amanda Ortmayer's birthday.


Further Backwards ABCs Foolishness

I sing the alphabet song with the melody backwards, the words backwards while showing solfegge hand signs and conducting.


Backwards ABCs One Step Nerdier

I recorded myself singing the ABCs backwards while playing the ukulele.


The ABCs Backwards

I learned to sing the alphabet song backwards and recorded it in Golden Gate Park.


Doo-Wop Multitrack: "Earth Angel" (for Chelsea)

I recorded a doo-wop arrangement of 'Earth Angel' for my girlfriend Chelsea.


Barbershop Multitracks with Zane

I recorded two barbershop tags with my friend Zane Fiala.


Shrewd Simon Short

I recorded myself reading a tongue twister story about Shrewd Simon Short.


How I DDOSed myself with an avatar

An inventive trick with dynamically generated avatar images, or: How I learned the hard way just how motivated people are by leader boards.


Play the card game "War" in my avatar

I programed a dynamic avatar that plays the card game war.


Php only serving one page at a time [fix!]

I uncovered the reason why my php server was only serving one page at a time.


Your Debut Album (Automated)

I wrote a PHP script that automates a hilarious method for generating Your Debut Album.


PHP: Avatar Hack

A php script that generates an image for use as an avatar.


New Song: Ballad of the man who can't sing

I wrote and recorded an original song about not being able to write.


Drawing mandalas with PHP for my Papa

I wrote a PHP script that generates mandalas based on the size and number of points you give it.


Get alerts when the emails you send are opened

I wrote a script that sends you an email when the image you embed in your emails is opened.


Multi-track Jazz Standard: Everything I have is yours

I record a multi-track of the jazz standard Everything I Have is Yours, with strange harmonies.


Video: Barbershop tag taught with hand signs

I recorded a video multitrack of a barbershop tag, showing all four parts in sol-feg hand signs.


Video: Overtone singing

I experiment with overtone singing.


Barbershop Multitrack Tag: Overtone experiment / robot quartet

I recorded a barbershop tag in a robot voice to experiment with overtones.


Barbershop multi-track: Happy Anniversary Chelsea

I recorded a barbershop tag for Chelsea on our year and a half anniversary.


Alvin sings Schumann's Widmung

I tricked my professor into thinking I found a recording of the Chipmunks singing Schumann's Widmung.


Barbershop multi-track: Cry

I recorded a multi-track of the barbershop tag 'Cry'


Barbershop multi-track: I Love To Sing 'Em (Best tag so far!)

I recorded a multi-track of the barbershop tag 'I Love To Sing 'Em'


Found: "still, the fire hasn't burnt out yet for us Baby, just keep holding on to me Alfonso"

I found a letter in which the writer tries to assure the recipient that the fire hasn't burnt out yet for them.


Found: Envelope of old photos and slides

I found an envelope of old photos and slides in a PG&E bill return envelope.


Barbershop multi-track: Original cell phone ring tone tag

I wrote and recorded a multi-track of a barbershop tag for my cell phone ring tone.


Barbershop multi-track: Who'll Take My Place When I'm Gone

I recorded a multi-track of the barbershop tag 'Who'll Take My Place When I'm Gone'


Found: Three smutty paper airplanes

Three paper airplanes I found in San Francisco with writing on them which is decidedly not safe for work.


Found: "Update on Money Unpaid to Me and Evil Needed to be Stopped"

A chaotic note I found taped to a newspaper vending box.


Barbershop multi-track: Lord, You Made the Night Too Long

I recorded a multi-track of the barbershop tag 'Lord, You Made the Night Too Long'


Found: Socrates Myspace Page

A drawing I found depicting what Socrates' Myspace page would look like.


My first barbershop multi-track: Love Letters

I recorded a multi-track of the barbershop tag 'Love Letters Straight From the Heart'


Found: Henry system of music transcription

A strange document I found on the ground which refers to an unknown music transcription system.


SFSU Chamber Singers sing for ACDA

A video of my choir singing at St. Boniface Church in Anaheim, California.


My brother's minuet

I recorded myself playing a minuet my brother wrote for a music course.


Youtube also caught my choir

Sharing a youtube video of the choir in which I sing.


PGP Desktop was causing OS X to run slowly

Sharing an issue I found where PGP Desktop was causing my computer to run slowly.


Only the first and last letters of a word need be in the right place

A made a script that scrambles the inner letters of words but, surprisingly, leaves them still readable.


Fixed the two major problems with the MAME cabinet

Update on my MAME cabinet project.


Mac OS X keychain fix

How to fix a corrupt keychain file on Mac OS X