I make projects
My philosophy around personal projects tries to walk the intersection of fun, useless, and interesting. For all of these, I've put far more work into them than people who have used them, and I'm really proud of that.
Imagine if someone took an unflattering picture of you every time your played a chess move. That's the GifChess Club! A finalist at the 2015 Static Showdown and I published the base component for the state and the view separately.
My 2016 Static Showdown entry, One at a Time, is a play on those "Word at a time" stories except you can throw in emojis or animated webcam gifs of yourself too. Coded in 48 hours, and then I took a 12 hour nap.
So yeah, .club domains were on sale for $2.88 a year, and who doesn't want to be part of a club? So I made the repeatone.club for people who want to show that they listen to the same song on repeat. Pulling data from last.fm with a webtask acting as the API, it tries to make the output pretty by blurring the album artwork and pulling high contrast colors from it for the text.
Host your own static Instagram site with USI! Why? Well, reasons. Built to be a fully universal (aka isomorphic) JS app with React and Webpack. I think it's pretty neat. If all you want is your Instagram data and pictures, check out the backing library instagram-download.
Ever wondered how long it's been since the Cubs won the World Series? Or were even in the World Series? Well it's been awhile, but in case you want to be reminded of this second after second while staring at a ticking clock symbolizing over 100 years of futility, you're in luck.
I write a lot in Day One, and some of that I wanted to share on the Internet. metalsmith-dayone is what I use to do that, and you can use it too! Be on the lookout for the blog of cute things my daughter says and does.
I used to be a private Strava person, but then I realized I loved trying to get on segment leaderboards so I wanted to make them all public. So I built a bulk editing plugin because I wanted other people to be able to do the same (and I don't like clicking a mouse over and over).
My siblings and I are not all in the same place but we still wanted to do Secret Santa so I setup Twilio Secret Santa! For probably less than $2 (unless you have hundreds of siblings) you can use it too!
Emojis are important. We all know that. Emoji Fortunes really drives that point home. Featured on time.com and washingtonpost.com (on a listicle of weekly Internet gems right after pictues of babies with drawn on eyebrows, so yeah, I've made it).
If you thought I would only have one emoji related project, then you'd be wrong. The less popular (although I think much cooler) sister of Emoji Fortunes is Emoji Haikus! Also it's built on the same two modules which basically single-handedly validates the tiny modules philosophy.
Geohashing, introduced by xkcd #26, is a spontaneous adventure generator based on the stock market and md5 and graticules (oh my!). I've been fascinated by it since it was announced in 2008, but it took until 2015 for me to write a geohashing CLI and React Native iOS appto find the day's coordinates. This is exactly as cool as it sounds. Both projects are backed by the same set of modules.
Tell someone they are Awesome! Hackily served at all paths of the domain by using a GitHub Pages custom 404 page, but if there's one thing I've learned, it's that it's OK to abuse HTTP for single page novelty sites.
One time I spent a few weeks figuring out Asterisk and ordering parts so I could make a socket.io signaling server ring my R2-D2 telephone. It remains one of my proudest achievements that I never use.
I love coffee. Also an old place I lived had terrible Internet in the kitchen. This confluence led to adapting an existing coffee ratio calculator for my needs, which were custom presets for my wife and I, and an appcache file so it worked offline.
My sappy wedding website has probably my favorite scrolling animation that I've ever done (plus it was one of the best days of my life so I'm proud of it).
I write modules
As I said above, I love open source. I've created and contribute to a bunch of other modules outside of ones for the projects above. I try to publish everything to npm with good docs and put the source on GitHub. In fact, I've only ever had one private GitHub repo, and that was the website I used to ask my wife to marry me.
This is an over-engineered attempt (hey, at least it has tests) at taking photos bulk exported from our family phones and cameras, and organizing them. It works, but I probably wouldn't use it if I were you.
There are a lot of different Ragnar races, and one day I got semi-obsessed with sorting them based on criteria like elevation gain and total mileage. There wasn't an easy way to do that on their website, so I built ragnar-data so I could fetch, format, filter, sort, and cache all that data.
Run this as part of your continuous deployment workflow when using Surge to teardown merged branches. Works great if you deploy to feature branches, but don't want your Surge account littered with the ghosts of features past.
Single page apps (or native web apps as I like to call them now), don't lend themselves to crawlers very well since the markup is generated clientside. spa-crawler is built on rndr.me to crawl any site for internal links. The result is a list of all urls and content in the whole site. I've used this to archive old single page apps into a set of html files that could be hosted without any sort of server-side routing.
Download your Instagram JSON data and media to a directory structure convenient for self hosting.
Perf matters and JS bytes over the wire is a big part of that. js-size works as a CLI and JS module to take a JS file and output the minified gzipped size. Useful when combined with curl and wzrd.in: curl -s https://wzrd.in/standalone/local-links | js-size.
node-gamepad is a great module for using various gamepads within node. I had some 3rd party SNES and N64 controllers laying around but the library didn't support them at the time. I wrote hid-mapper as a CLI tool to take any controller and map the siginals sent from each button/joystick to a JSON config file that can be consumed by node-gamepad. Please use this to take a a USB gamepad and fly a drone with it.
less is my preferred CSS preprocessor so I wrote lessitizer and less-import-inserter. Together they handle taking a less file containing a list of imports (like Bootstrap) and inserting new imports to do things like override variables and mixins, and then packaging that along with your app's less into a css file or string.
I love GitHub Pages, but there can be a few annoyances around my normal workflow of developing a site in a master branch, compiling static files to a directory and then pushing that directory to a gh-pages branch. git-directory-deploy is really just a wrapper for the original shell script that fit my criteria, and adapted to be npm installable to fit my usual workflow.
moonboots is a tool I've contributed to for streamlining a set of conventions for the server-side of building native web apps. moonboots-static and moonboots-express are two plugins I wrote for moonboots to wrap those conventions in my usual workflow of a simple dev server and then writing a directory of static files. This all uses browserify under the hood, but I've really been enjoying webpack lately, so moonboots isn't my primary tool for this anymore.
Url shorteners are so 2008. simple-realurl will make your urls longer (provided that they were previously shortened)!