avi
b000544d15
perf(app): fluid navigation + genre search
...
Directory search now merges name and tag(genre) hits so genre queries
find tagged stations. Tabs jump instantly (adjacent glide, swipe kept);
startup pre-builds disk-backed singletons off main thread; equalizer
animation runs only on the playing indicator; row placement animations;
missing list key. Debug-only StrictMode guard for main-thread I/O.
Release signed with debug key for direct installs.
2026-09-10 06:48:55 -05:00
avi
5ff5318db4
feat(nostr): decentralized layer Phase A — identity, relays, zaps, NWC wallet
...
Additive Wavlake-inspired layer; zero existing features touched.
Crypto/protocol (pure-Kotlin core, fr.acinq secp256k1-kmp 0.17.3):
- Bech32 + NIP-19 (npub/nsec/nprofile/nevent/naddr)
- NIP-01 events: canonical serialization, BIP-340 schnorr sign/verify
- NIP-04 ECDH AES-CBC (raw x-coord via pubKeyTweakMul)
- Wavlake music NIP kinds 30440-30443 (Track/Album/Artist/Playlist)
- 4 conformance unit tests vs official spec vectors (all pass)
NostrService: multi-relay OkHttp websocket client, publish/subscribe/
query/getProfile/publishProfile/publishReaction/publishTrack/publishRaw,
best-effort failure posture (relays down = silent, app unaffected).
Identity: NostrKeys — AndroidKeyStore-encrypted private key at rest,
npub-only display. Verified on-device: create → npub chip → survives
force-stop + relaunch.
Payments (PaymentService abstraction, NWC provider):
- NIP-47 Nostr Wallet Connect over the pairing relay, pairing string
keystore-encrypted, 15s timeout, never hangs playback
- LUD-06/LUD-16 lightning-address invoice resolution
- NIP-57 zaps: ephemeral-key zap request → callback nostr= → pay
- payment history records (no secrets)
UI (design-system tokens, progressive disclosure):
- ⚡ bolt on mini-player → TipSheet (21/100/500/1000/custom, recent
addresses)
- Appearance → ⚡ Decentralized sheet: identity create/import, NWC
connect, advanced relays/profile
2026-09-08 11:49:09 -05:00