App (setup/loop) abstraction