OAuth PKCE state is origin-scoped — initiating from 127.0.0.1
and receiving callback on coffee.apoena.dev breaks the flow.
From local dev, redirect to production login with handle pre-filled.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- client_id always points to production so PDS can fetch metadata
- redirect_uri is dynamic (window.location.origin) so dev login
redirects back to localhost instead of production
- Add localhost:5173/5174 to allowed redirect_uris in metadata
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Nginx sets application/json automatically for .json files via
MIME types; the explicit header caused a duplicate that broke
ATProto OAuth client metadata fetching.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add vite-env.d.ts for ImportMeta.env type
- Bump tsconfig target/lib to ES2022 for Array.at()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vue 3 + Vite PWA backed by ATProto PDS (coffee.apoena.dev).
Stores coffee spots as dev.apoena.coffeespot records with name,
geolocation, note, and status. Map via MapLibre + OpenFreeMap,
auth via ATProto OAuth, deploy via Docker + Nginx on Coolify.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>