NIP-55 get_public_key flow (nostrsigner: intent) with signer package stored for future requests; manual npub import fallback; sign-out. Rename user-facing Decentralized labels to Nostr. Fix Wavlake track zaps for external-signer logins via canSignLocally + ephemeral keys. Artist address resolution + zap buttons in Discover search.
3.9 KiB
Product
Platform
android
Users
A single primary audience: a personal listener on their own Android phone (minSdk 26). Two jobs, co-equal:
- Listener — open the app, tune in to a curated station fast (lofi, synthwave, EDM, phonk, classical, ambient, jazz, rock), and keep music playing in the background.
- Collector — hear a song on air and save it: the app records from the live stream and embeds the detected song metadata on track boundaries, producing a keepable file in the local library.
No accounts, no social layer, no second-user roles.
Product Purpose
SatsAmp is a personal internet radio player with a built-in "save this song" reflex. Success means: zero-friction playback of a curated station set, and a saved song from live radio feeling like one tap, with correct title/artist baked into the file.
Positioning
Most radio apps play streams but discard what's on them. SatsAmp treats the live stream as a source of keepable music: it watches ICY metadata, detects song boundaries, records the rolling buffer, and embeds real metadata into the saved file. Combined with a hand-picked station set and no account or setup, the differentiator is capture-from-the-air, not discovery or personalization.
Operating Context
- Single-user personal device use; headphone and speaker listening.
- Streams are live and can drop; playback is a foreground service with notification controls. Swiping the task away stops playback and clears the notification (closed means stopped); screen-off listening with the task alive keeps playing.
- Library is local (Room DB,
radamp.db); saved songs, playlists, and imported files live on-device. - Stations are built-in defaults plus user-added streams (direct URL or M3U playlist import).
Capabilities and Constraints
- Android app, Kotlin + Jetpack Compose (Material 3), compileSdk 35, minSdk 26, targetSdk 35.
- Live ICY stream metadata, song-boundary detection, rolling audio buffer, metadata embedding on saved files.
- Appearance system is shipped and binding:
UiPrefs+UiTokens— 4 accents (violet / blue / green / orange) × dark/light, each accent AA-contrast verified per fill; live theme switching via the appearance dialog; launcher label SatsAmp (applicationId remainscom.rada). - Network use is stream fetching only; no accounts, no analytics, no backend.
- Cleartext HTTP exists in the station list — playback must tolerate mixed http/https sources.
Brand Commitments
- The current visual identity is user-declared binding: the 4-accent × dark/light token system with AA-verified contrast must be preserved and followed by all future design work.
- Name: SatsAmp.
Evidence on Hand
- 11 built-in stations (cliamp.stream music channels in playlist order: Lofi → … → NCS Chill), all verified live 2026-09-09 (HTTP 200 + audio payload; probe results were ephemeral, not committed). Media Monarchy ships as a built-in stream in the Streams tab instead (talk, not music).
- Working recorder pipeline (
recording/: IcyStreamReader, SongBoundaryDetector, RollingAudioBuffer, MetadataEmbedder). - Design scratch work in
design/(glass theme CSS + demo). - Absences that must not be fabricated: no testimonials, no user base, no press, no pricing, no privacy policy text.
Product Principles
- Tune in within seconds — the station list and playback are the front door.
- Capture is one gesture — saving a song mid-play must never feel like a workflow.
- The file is the promise — a saved song must carry correct metadata, or the feature has failed.
- Own the look through tokens — every surface draws from the accent/mode token system, never hardcoded colors.
- Nothing to sign up for — zero accounts, zero setup, on-device everything.
Accessibility & Inclusion
AA contrast is the standing bar, already enforced per accent in the token system; touch targets and dynamic font sizes follow Material 3 defaults.