38b140905f
Hop-State: A_06FNDQKBYQT60ENR92VY6KG Hop-Proposal: R_06FNDQJ64YSD232PJ7AT47R Hop-Task: T_06FNDK6YRGJ4TEATJEC6EQR Hop-Attempt: AT_06FNDK6YRMRZ1VHNB189B48
72 lines
2.8 KiB
Markdown
72 lines
2.8 KiB
Markdown
# Resonant
|
|
|
|
Your library, wherever you listen.
|
|
|
|
Resonant is a desktop-first music player for personal, self-hosted collections. It connects directly to Navidrome and other OpenSubsonic-compatible servers while keeping the listening experience calm, immediate, and separate from server administration.
|
|
|
|
## What works in v0.1
|
|
|
|
- A responsive library home with albums, tracks, favorites, search, and queue management
|
|
- Functional playback controls with seek, volume, previous, and next actions
|
|
- An offline demo library with locally synthesized audio, so the app is useful immediately after cloning
|
|
- OpenSubsonic token authentication, connection testing, album loading, random-track loading, artwork, and streaming URLs
|
|
- A Tauri 2 desktop shell for macOS, Windows, and Linux development
|
|
- Keyboard-visible controls, reduced-motion support, semantic labels, and a WCAG 2.2 AA target
|
|
|
|
The server password is held only in memory. Resonant remembers the server address and username locally, but secure credential persistence is intentionally deferred until the desktop keychain integration is added.
|
|
|
|
## Run it
|
|
|
|
Requirements: Node.js 22+, Rust 1.85+, and the platform prerequisites for Tauri 2.
|
|
|
|
```sh
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
To run the desktop shell:
|
|
|
|
```sh
|
|
npm run tauri dev
|
|
```
|
|
|
|
To validate the full project:
|
|
|
|
```sh
|
|
npm run check
|
|
```
|
|
|
|
## Connect a server
|
|
|
|
Open the server control in the lower-left corner, then enter the URL and credentials for a Navidrome or OpenSubsonic server. Browser development requires the server to allow the development origin. The Tauri networking layer will replace browser fetch before packaged distribution so remote libraries do not depend on browser CORS policy.
|
|
|
|
## Architecture
|
|
|
|
```text
|
|
Resonant desktop client
|
|
├── React product interface
|
|
├── Playback and queue state
|
|
├── OpenSubsonic client
|
|
│ ├── salted token authentication
|
|
│ ├── library and artwork requests
|
|
│ └── authenticated stream URLs
|
|
└── Tauri shell
|
|
|
|
Navidrome or another OpenSubsonic server
|
|
├── scans and indexes music
|
|
├── owns metadata and artwork
|
|
└── streams or transcodes audio
|
|
```
|
|
|
|
The protocol boundary is deliberate. Resonant owns the product experience without forking the media engine, and the server can be replaced as long as it speaks OpenSubsonic.
|
|
|
|
## Next milestones
|
|
|
|
1. Move remote requests into Tauri's HTTP plugin and store credentials in the OS keychain.
|
|
2. Add album and artist detail routes with deterministic library pagination.
|
|
3. Persist the queue, favorites, and playback position, then synchronize favorites back to the server.
|
|
4. Add native media keys, system now-playing metadata, ReplayGain, and gapless transition support.
|
|
5. Bundle an optional managed Navidrome sidecar for the “choose a folder” setup path.
|
|
|
|
Product direction and accessibility principles live in [`PRODUCT.md`](./PRODUCT.md).
|