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:
parent
1b7c6febbb
commit
bc6396a570
20 changed files with 1068 additions and 73 deletions
63
PRODUCT.md
Normal file
63
PRODUCT.md
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue