feat: directory search, favorites, motion system, home button, transport fix

- radio-browser.info directory search (debounced, ~58k stations) with
  codec/bitrate/country metadata and save-to-stations action
- station favorites (star) persisted in StationRepository; Starred
  section pinned in Stations; active-station row highlight
- motion system (Motion.kt): shared-axis nav transitions, hub hop,
  metadata rise, play/pause pop; LocalReduceMotion honors system
  'remove animations'
- AppHomeButton (launcher icon) top-left on every surface + SatsAmp
  wordmark on the hub; home pops the stack back to the player
- transport row: add missing Next button, conventional order
  stop · prev · play · next
- WaveGraphic center glow: wider, fainter, no perceptible disc edge
- StreamMetadata: strip unsubstituted {{template}} residue
- PRODUCT.md + DESIGN.md (impeccable design context); .gitignore for
  re-downloadable skill engine binaries
This commit is contained in:
avi 2026-09-08 00:37:33 -05:00
commit bc6396a570
20 changed files with 1068 additions and 73 deletions

63
PRODUCT.md Normal file
View file

@ -0,0 +1,63 @@
# 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.
- 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
- 43 built-in stations, all verified live 2026-09-07 (HTTP 200 + audio payload; probe results were ephemeral in /tmp, not committed).
- 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.