A client-side router for single-page apps