SatsAmp/PRODUCT.md
avi 1c9d07251a feat(nostr): Amber external-signer login, pubkey import, ephemeral zap fallback
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.
2026-09-10 02:17:48 -05:00

63 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Product
<!-- impeccable:product-schema 1 -->
## Platform
android
## Users
A single primary audience: a personal listener on their own Android phone (minSdk 26). Two jobs, co-equal:
1. **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.
2. **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 remains `com.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
1. Tune in within seconds — the station list and playback are the front door.
2. Capture is one gesture — saving a song mid-play must never feel like a workflow.
3. The file is the promise — a saved song must carry correct metadata, or the feature has failed.
4. Own the look through tokens — every surface draws from the accent/mode token system, never hardcoded colors.
5. 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.