Frontend rewritten in Vue

The admin UI moved from Svelte/SvelteKit to Vue 3, with a light/dark theme and a shared design system.

Changed

  • The frontend is rewritten in Vue 3 + TypeScript (vue-router, Pinia, Vite SPA). All pages keep their behaviour; the look follows a shared light/dark design system with Geist as the UI font and a theme switch in the account menu.
  • The access map runs on Vue Flow.
  • Hashed assets are served under /admin/assets/ and a missing one answers 404 instead of the SPA shell, so a stale tab reloads itself after an upgrade.
  • make lint now type-checks the frontend (vue-tsc) and checks formatting (prettier) alongside the Go linters.

Fixed

  • Expiring an API key sent the key id where headscale expects the prefix.