first pass at app boilerplate