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

3.9 KiB
Raw Permalink Blame History

Product

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.