2026 Summer Stage 4 β Amber Signer Login, Relay Cleanup & Login Hardening
π Signer Login (Amber / NIP-46)
A new Signer tab in the Nostr login dialog supports cross-device pairing via NIP-46 (nostrconnect://). The NIP-46 flow is signer-agnostic, so it works with any remote NIP-46 signer β Amber, Primal, nsec.app, Keys.band, etc. A QR code is shown for easy mobile scanning.
π Unified Signer Plumbing
Amber and nostrconnect logins are now wired into the shared signer utilities (useLoginActions, useCurrentUser, and signerUtils.getUserSigner()). Every existing code path that already used the unified signer for nsec, extension, or bunker logins now also works for signer-based logins. Several spots that still called window.nostr directly were updated to use the shared signer, including list utilities, dashboard Nostr utilities, post writing, and NIP-42 auth.
π Relay Cleanup
Stale relays were removed from all relay lists and fallbacks across the dashboard, including relay.damus.io and wss://relay.nostr.net. Default search and publish relays now consistently use wss://nos.lol and wss://relay.primal.net. The shared NPool is cached at module level so bunker and nostrconnect logins reuse a single connection pool instead of opening fresh WebSocket connections on every signer call.
π οΈ Android & Older WebView Compatibility
Added an AbortSignal.any() polyfill for older Android WebViews that don't support it, which previously broke every nostrconnect login with AbortSignal.any is not a function. The Signer tab also reorders the login options to promote the reliable NIP-46 flow first, while the NIP-55 on-device flow is clearly marked experimental because Chrome's IntentDispatcher doesn't always return the redirect after Amber approval.
π My Rooms Reliability
Fixed the My Rooms page rendering an empty list even when the signed-in user owned rooms. It now fetches kind 30312 events directly from the relay's /api/events endpoint and parses room fields from tags, avoiding the broken /api/rooms-by-pubkey route. Diagnostics were also added for unexpected response shapes so relay compatibility issues are visible instead of silently failing.
π§ͺ Testing & Infrastructure
Added a gsd-browser end-to-end test script that exercises Amber, nsec, and extension login plus signing round-trips against a local dev server. A scripts/BROWSER_TESTING.md guide documents what each test covers, how the transports are mocked, and the gotchas discovered while building the suite. A reverse proxy server was also added for public Amber testing routes.
π§Ή Bug Fixes & Polish
- Fixed nostrconnect session race conditions and stale state when the login dialog is closed and reopened.
- Guarded all async login handlers against
setStatecalls on unmounted components. - Replaced the shared
loadingboolean with per-methodloadingMethodstate so a long Amber wait no longer disables the other login tabs. - Deduplicated relay list constants and moved search relays to a single
PUBLIC_SEARCH_RELAYSenv variable. - Added an accessible
aria-labelto the nostrconnect QR code. - Restored the production
startscript and addedstart:proxyfor the dev proxy server.
Special thanks to @Yeghro, @bitkarrot, and @devin-ai-integration[bot]