All the usual web app yadda yadda that I don't want to write twice.