--- title: Ben Burwell's Projects --- # Ben's Projects A bunch of things I'm working on or have worked on, roughly and arbitrarily ordered by recency, significance, and interesting-ness. ## [aerc](https://aerc-mail.org) Recently, I've been contributing a bunch of features (including the maildir backend) and bug fixes to aerc, an email client that runs in your terminal. It's designed to be a more modern replacement for mutt. As part of my work, I've also contributed patches to a few of aerc's upstream dependencies including [go-maildir](https://github.com/emersion/go-maildir) and [go-message](https://github.com/emersion/go-message). While aerc is still in heavy development, I recommend taking a look, especially if you currently use mutt. It has a number of nice improvements, like a tabbed UI, built-in IMAP and SMTP support, the ability to view and compose emails without external programs like vim or less completely taking over your terminal, and even a built-in terminal emulator which can be helpful for email-driven software development. ## [HowToChooseAPassword.com](https://howtochooseapassword.com) A single-purpose site that explains in simple terms why strong passwords are important and provides some tips on how to generate and store them. I built this site to be linked to from login and registration screens in my own software, and would encourage other sites to link to it as well in order to establish canonical password advice. Hopefully we'll see some traction with things like [WebAuthn](https://webauthn.io/) which make it easier for people to protect their accounts without really trying and this site will become obsolete, but in the meantime it serves as a helpful resource. ## [PlateZero](https://platezero.com) One of my hobbies is cooking. Often, I just make things up on the spot and don't bother following a recipe, but for certain things I do like to use recipes which I've developed or adapted in order to achieve the best results. PlateZero is a new kind of recipe site designed to help serious cooks iterate upon and improve recipes, not simply store them statically. If you like to cook, give PlateZero a try! ## [similar.beer](https://similar.beer) A recent weekend hack with a few friends. We trained a ML model on beer reviews and built a web frontend to interact with it. Users can look up beers which they enjoy and use our model to find other beers they might enjoy either based on similarity or by tweaking specific attributes, e.g. "show me beers like [Founders Canadian Breakfast Stout](https://similar.beer/brewery/1199/47658), but much more malty." ## [Wireshark](https://www.wireshark.org) One of my all-time favorite tools. During college, my summer internship at [Lutron Electronics](http://www.lutron.com) was focused on packaging a custom internal build of Wireshark complete with new dissectors for Lutron's proprietary network protocols. While I spent a good chunk of time working on Wireshark, including writing a plugin to capture USB serial data in the pcap format, I only ended up being able to contribute a single build script fix upstream. Nonetheless, my name still appears in the [Wireshark authors file](https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob;f=AUTHORS) which I think is pretty neat. ## [ghsshauth](https://git.burwell.io/ghsshauth) Use GitHub as an SSH authentication mechanism! Just make a `~/.ssh/authorized_github_users` file with all of the GitHub usernames you want to grant SSH access to. A few things like this exist, but didn't do _quite_ what I had in mind. Since each user's [SSH keys are available through the API](https://developer.github.com/v3/users/keys/), it's pretty trivial to write a program suitable for use as the `AuthorizedKeysCommand` which looks up SSH keys to allow. Future enhancements might include caching keys with an expiry mechanism in case the GitHub API is unavailable, as well as enabling authenticated API access for higher rate limits. ## [`pass-audit`](https://git.burwell.io/pass-audit) I use zx2c4's [pass](https://www.passwordstore.org/) for managing my passwords. When Troy Hunt introduced the [Pwned Passwords API](https://haveibeenpwned.com/Passwords) as part of Have I Been Pwned, I wanted a way to check whether any of the passwords in my store had been affected by breaches. So, I wrote `pass-audit`, an extension for pass which can check any or all of your passwords against both the HIBP API (using [k-anonymity](https://en.wikipedia.org/wiki/K-anonymity)) as well as local wordlists like rockyou. ## [Phlux](https://git.burwell.io/phlux) Like [f.lux](https://justgetflux.com/), but for the Phillips Hue system (_ph_-lux, get it?). I have a bunch of Hue bulbs with adjustable color temperature at home, and I wanted them to change to warm light during the evening and cool light during the day. This little program runs on a box I have set up at home and automatically adjusts the colors at sunrise and sunset. There's definitely room for improvement, but this more or less does what I wanted it to. ## [`active911`](https://git.burwell.io/active911) npm package [Active911](https://www.active911.com) is a popular system for integrating fire and EMS paging with mobile apps enabling first responders to get richer data more quickly than traditional tone and voice paging systems. In order to build out custom dispatching software for [my college EMS organization](https://www.bergems.org), I wrote this package and [published it to npm](https://www.npmjs.com/package/active911). ## [1090](https://git.burwell.io/ten-ninety) A Java Swing application which shows live [ADS-B](https://en.wikipedia.org/wiki/Automatic_dependent_surveillance-broadcast) aircraft position and identification superimposed on a scalable map of airfields, VORs, approaches, departures, and jetways. The map can be scaled and panned using vim-like key bindings, and map layers can be toggled. I have an RTL-SDR tuned to 1090 MHz connected to a Raspberry Pi running [dump1090](https://github.com/antirez/dump1090) for decoding the RF packets to which the Java application connects over a TCP socket. ## [DOML (DOM language)](https://git.burwell.io/doml) This was just a random little hack investigating using HTML as code. By constructing DOM elements in a way that represents an abstract syntax tree, and then including a JavaScript file, it's possible to "run" your HTML while simultaneously using some interesting CSS to see what the program is doing. For example, check out [this implementation of the Euclidean algorithm](https://cdn.rawgit.com/benburwell/doml/master/prog/euclideanAlgorithm.html) for finding the GCD of two integers. Viewing the source, you'll see the program which is executed written as a bunch of `span` elements with different classes and data attributes, and if you open the console, you'll see the result printed. ## [Scotland Yard Solver](https://git.burwell.io/scotland-yard) A board game we got when I was younger is [Scotland Yard](https://en.wikipedia.org/wiki/Scotland_Yard_(board_game)) in which players must try to figure out the location on the board of Mr. X based upon the modes of transport they announce (makes more sense when you know the game). Anyway, I thought it might be interesting to write a program to narrow down the possible locations of Mr. X in order to make better decisions as a player. In practice, it seemed to be more fun to just play the game without the program, but it was an interesting problem to play with. ## [Solfege](https://git.burwell.io/solfege) I'm sure I'm not the only one who has gotten a song in my head and not been able to remember where it came from. While things like Shazam exist, they only really work if you can actually _play_ the song you're trying to identify. The situation I often encounter is having a short phrase in mind, which Shazam has no way to identify. My solution was to build a music search engine where songs are indexed by their [solfege syllables](https://en.wikipedia.org/wiki/Solf%C3%A8ge). * * * And more at !