Framework-agnostic client-side router (uses page.js, plays well with React)