might be nice to put this in npm since it's not directly related and could be used elsewhere / free up some maintenance in here