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.
63 lines
3.9 KiB
Markdown
63 lines
3.9 KiB
Markdown
# 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.
|