This is a giant list of projects I've worked on.
- Helmet is a module to help secure Express web applications. It was originally created by Adam Baldwin and I've been the primary maintainer since 2013. It had 27.7 million downloads in 2019.
- Express.js in Action is a book I wrote about Express and its ecosystem. It was published in April 2016—a lifetime ago—but despite some of it being a little outdated, I'm still proud of it.
- HumanizeDuration.js is a library that turns durations to strings. For example, it turns 361,000 milliseconds into "6 minutes, 1 second". Dozens of contributors have localized it into 41 different languages.
The rest of this page is a list that attempts to cover everything I've done. It's pretty boring but aims to be exhaustive.
I've written many guides, tutorials, and how-tos. Two of those got turned into books:
I recently started a job on Signal's Desktop team. It's early days so I don't have much more to share yet!
I've had two full-time jobs:
- Airtable is a tool to organize anything. I was on the Platform team where I worked on the API, Blocks, and much more. I learned a ton about programming, prioritization, product, and puppies.
- Braintree lets developers easily accept payments. I was on the Contextual Commerce (now called Extend) team where I did a lot of Clojure and Ruby. Before that, I spent a lot of time building Braintree's SDKs. My biggest project was Hosted Fields, a fancy way to accept credit cards on a webpage. We even got a patent for it, which I have mixed feelings about.
Before graduating college, I had a few other part-time jobs, mostly internships:
- Counsyl, now Myriad Women's Health, aimed to give everybody "access to vital information about their bodies to help them confidently make choices about their lives". They did this by doing complicated genetic tests and presenting them to patients in accessible ways. I wrote a lot of Django and Python code for them, and even programmed a small robot! One of the coolest parts of the internship was seeing all of the people in white lab coats, something I will likely never wear. Fun fact: they were my third internship in a row that had a nearly-boundless supply of string cheese.
- UniversityNow provided affordable, accredited online higher education. The first weeks of my internship were fixing bugs and implementing small features in Rails, but then I spent the rest of the summer working on their real-time chat feature. I learned Backbone.js and wrote a whole lot of Jasmine specs.
- Fetchnotes was a note-taking app that aims to be "your mind's best friend". Their homepage and web app got a redesign by a brilliant designer, and I coded them both up! I bumbled my way through Ember.js to make it work. Soon after, a TechCrunch story was written and it got tens of thousands of hits! And it worked! Scary stuff. The service is no longer around.
Open source stuff
I've published a number of modules and packages and libraries and tools and whatever. In alphabetical order, they are:
- America's DJ is a Twitter bot that tweets fake DJ names pulled from US military operations. You can find the source here.
- American police shooting countdown, my entry to JS1024 2020
- arraywrap.js wraps an element in an array if it isn't one already
- backbone-getnset adds custom getters and setters to Backbone.js models
- Bits Required implements "how many bits do we need to represent integer X?" in various languages
- Brainfuck interpreter, in Python
- Brainfuck syntax highlighting for Atom
- Brainfuck web app, a simple web app written in Brainfuck
- BREACH helper for Node helps to mitigate BREACH attacks by adding a random-length HTML comment helper
- BrowserIs asks questions about Node.js requests useragents. Made for Express
- Canvas to favicon sends a
<canvas>to the favicon
- ChicagoCTA is a Mastodon bot that tweets alerts from Chicago public transit
- Circles 1K is 639 bytes of trippy and was an entry to JS1k
- Close the popups was my entry to JS1k 2019
- coinflip.js randomly returns
- connect-appcache adds Appcache middleware to Connect/Express
- Content Security Policy sandbox is a little test app for playing around with Content Security Policy
- context.clear is a small library for clearing a HTML5 canvas
- cyborg.txt is a collection of robots.txt utilities for Node
- document.head shim for CommonJS
- Dragon Scales was my entry for JS1k 2014
- dw_red.vim is a red-heavy Vim colorscheme
- Euler Method calculator in C++
- EvanSpec is a souped-up
- Facebook autopoker Chrome extension (or the source)
- ffmpeg buddy helps you build ffmpeg commands
- Fireworks was my entry to JS1k 2016
- Flood is a game I didn't invent but did implement. A friend didn't like the version she was playing, so I made one that she liked
- Fudo is an adorable friend that was made from scratch in 36 hours at a hackathon. Art by Lulu Tang. Sound and code help from David Jackson
- get the latest Node version from Node
- Gopher Node lets you write Gopher servers with Node
- haha.sh is a simple shell script that generates hearty laughter
- Helmet for Crystal is a collection of security handlers for the Crystal programming language
- Helmet is a collection of security middlewares for Express
- Hide the Facebook news feed
- HumanizeDuration.js turns milliseconds into English durations, or many other languages
- image to table converts images to all-HTML
- Is GitHub Up? is a command-line tool that tels you if GitHub is online
- iscp is an interactive scp, because I always forget the syntax
- isExpress is a function for detecting Express applications
- ISO 3166 country list maps things like "DE" to "Germany" and vice-versa
- journ is a command-line journal
- Lil' pages is a collection of little web-based utilities
- luhncheck is a little website that runs a number through a Luhn validator
- mailtolink.js creates
- Meme.js is a canvas-based meme generator I worked on for now-defunct Buddy Meme
- minidots are a couple of dotfiles I use when SSHing or in VMs
- MouseTracker.js creates an object called
mouseand keeps its
- nimi mute is a dictionary for the Toki Pona mini-language
- Origin won 7th place in the 2013 js13kgames. I also wrote a little blog post about it
- Percentage.js is a simple function to convert numbers to percentages, like 0.12 to 12%
- Pie Time was my entry to JS1k 2015. I also wrote a post about it
- Pinboard to Standard Notes Importer moves Pinboard bookmarks into Standard Notes. See the source code
- Potions was my entry to JS1k 2017
- Pushbullet CLI is a command-line interface to Pushbullet. I'm no longer the maintainer
- pwgen is a little webpage for generating passwords
- QR It turns text into QR
- random-word is a CLI tool to pick a random word from a file
- rename is an interactive version of the
- ring-secure-headers adds security HTTP headers to Ring apps (for Clojure)
- RTS camera for Unity is a little utility for RTS games in Unity. Made it for a university course
- scrabbler is a small Scrabble cheater written in Python
- ScriptInclude adds
- setAttributes helps you call
.setAttributeon a DOM node more easily
- SnackWrap allows you to watch files and run a shell command every time a file changes. Not as focused as Grunt or Sprockets
setIntervalbut it starts immediately. It was made for a guide
- The TypeScript Grunt skeleton
- Tic Tac Toe in Lua
- Ticker is a lightweight wrapper around
- Time in Korea is a simple Android app that tells you the time in South Korea
- tiny "coming soon" page
- toki pona to hex converts the Toki Pona language to and from hex
- Truth table generator for CoffeeScript. Made to take the tedium out of a homework assignment
- Try EJS
- Try LiScript
- Two's complement utility for converting from two's complement numbers
- Two-factor authentication list
- untouched gets pristine copies of built-in objects (like Array or JSON) even if they've been modified
- User Agent Bag parses user agents per RFC7231
- VimL syntax highlighting for Atom
- What if the English language had syntax highlighting?
- when-file-exists calls a callback when a file is created
- wren-please is an assertion library for Wren
- wren-vector is a 3D vector library for Wren
- XML to text turns XML to plain text with Python
- Zap was my entry to JS1k 2018. It was an honorable mention—read my post about it
- ZoomContext lets you pan and zoom around an HTML5 canvas
Open source contributions
I've made a bunch of small pull requests to various open source projects. Most of them are tiny, but here are some slightly more notable ones:
Code stuff that isn't open source
There's some code stuff that isn't open source for whatever reason. Those things include:
- The ChiPy Mentorship Program had me as a mentor in the Fall 2017 cohort
- Single Color Image lets you generate a PNG that's just one color. It's a simple app with a simple API
- My StackOverflow profile
- Reddit's /r/dailyprogrammer challenge solutions
Pretty much all of the above is code-related, but I've done a few other things here and there when I can tear myself away. They are, in no order:
- America's DJ is a Twitter bot that tweets fake DJ names pulled from US military operations
- A very short poem called "Camera"
- A wallpaper from a NASA photo
- Evan Hahn's 100 dope beats of the day
- How many English words are alphabetical?
- "Is it worth cheating Caltrain?"
- Naps and their effectiveness
- Study guides from Michigan: semester 3, semester 4, semester 5, and semester 6
- Custom Steam icons for Zineth, Lode Runner 2
And that's it! That's pretty much everything I've done.