LazySound is a terminal UI for SoundCloud: browse, search, manage playlists, and play tracks through an mpv‑backed daemon so playback survives TUI restarts.
- Browse My Tracks, Liked Tracks, My Playlists, Liked Playlists
- Search tracks and playlists
- Playlist drill‑down (view playlist tracks)
- Quick actions:
- Playlists: create, rename, delete (own), like/unlike
- Tracks: like/unlike, add to playlist, remove from playlist
- Playback via mpv through a background daemon (survives TUI restarts)
brew install mpv
On Windows, install mpv and ensure it is in your PATH.
Config is a single JSON file at:
~/.config/lazysound/config.json
Example:
{
"soundcloud": {
"client_id": "YOUR_ID",
"client_secret": "YOUR_SECRET",
"redirect_uri": "http://127.0.0.1:7878/callback",
"scope": "*"
},
"keymap": {
"play": ["p"],
"stop": ["s"]
},
"theme": {
"text": "252",
"muted": "240",
"accent": "#2b8cff",
"accent_dim": "#1b4d7a",
"border": "238",
"danger": "#ff4d4d",
"selection_text": "231",
"progress_fill": "#000000"
},
"daemon": {
"addr": "127.0.0.1:7777"
}
}Tokens are stored in the default token store (~/.soundcli/token.json).
Auth flow lives in lib/soundcloud/auth.go (AuthCodePKCE).
TUI:
go run cmd/lazysoundtui/main.go
Daemon (optional, keep playback after closing TUI):
go run cmd/lazysoundd/main.go
CLI control:
go run cmd/lazysoundctl/main.go status
go run cmd/lazysoundctl/main.go pause
go run cmd/lazysoundctl/main.go next
go install ./cmd/lazysoundtui
go install ./cmd/lazysoundd
go install ./cmd/lazysoundctl
Ensure ~/go/bin is in your PATH.
- root app module
lib/soundcloudlib/playerlib/uikit
┌───────────────────────────────────────────────────────────────────────┐
│ lazysoundtui │
│ cmd/lazysoundtui/main.go │
│ - load config │
│ - init client + token │
│ - fetch initial data │
│ - start TUI │
└───────────────────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────────┐
│ bootstrap │
│ internal/app/bootstrap.go │
│ - init client │
│ - fetch initial data in parallel │
└───────────────────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────────────────┐
│ UI │
│ internal/ui/model.go │
│ - navigation + list selection │
│ - search state │
│ - quick actions state │
│ - playback state │
│ - renders panes + info │
└───────────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ API Client │ │ UI Components │ │ Daemon │
│ lib/soundcloud/* │ │ lib/uikit/* │ │ internal/daemon/* │
│ - SoundCloud HTTP │ │ - tables/panes │ │ - queue + mpv IPC │
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
│
▼
┌───────────────────┐
│ Player │
│ lib/player/* │
│ - mpv process │
└───────────────────┘
cmd/lazysoundtui/: TUI entrypointcmd/lazysoundd/: playback daemon entrypointcmd/lazysoundctl/: CLI controller for playbackinternal/app/: config + bootstrapinternal/ui/: TUI state, rendering, and componentslib/soundcloud/: SoundCloud API client + modelslib/player/: mpv control/IPClib/uikit/: shared render helpers (component,style,layout,math)internal/daemon/: playback daemon + protocol
- Auth command (PKCE) wired to CLI
- Pagination for search/large lists
- Queue management and “play next”
- Metadata: artwork + waveform rendering