Skip to content

Commit c28b045

Browse files
author
Kenth Fagerlund
committed
chore(release): bump version to v0.5.0
1 parent 3d9071c commit c28b045

8 files changed

Lines changed: 58 additions & 15 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ halpradio/
4040
├── pkg/
4141
├── app/app.go # CLI flags (-backend, -theme, -version), config loading, tea.Program setup
4242
├── player/player.go # Player interface, Manager struct, multi-backend exec, native Oto audio, ICY stream listener
43+
├── party/ # P2P mesh synchronized radio rooms, Argon2id/AES-256-GCM E2EE & protocol engine
4344
├── plugin/ # Wazero Wasm sandbox, capability permissions, host API, registry client
4445
├── radio/ # Store (bundled/local/favorites), Station struct, RadioBrowser HTTP client
4546
├── theme/theme.go # Theme struct & color palettes (tokyonight, catppuccin, synthwave, nord, gruvbox, dracula)

Formula/halpradio.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@
44
class Halpradio < Formula
55
desc "LazyVim-inspired Terminal Internet Radio Streamer"
66
homepage "https://github.com/halpworld/halpradio"
7-
version "0.4.0"
7+
version "0.5.0"
88
license "GPL-3.0-or-later"
99

1010
on_macos do
1111
if Hardware::CPU.arm?
12-
url "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_darwin_arm64.tar.gz"
12+
url "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_darwin_arm64.tar.gz"
1313
else
14-
url "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_darwin_amd64.tar.gz"
14+
url "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_darwin_amd64.tar.gz"
1515
end
1616
end
1717

1818
on_linux do
1919
if Hardware::CPU.arm? && Hardware::CPU.is_64_bit?
20-
url "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_linux_arm64.tar.gz"
20+
url "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_linux_arm64.tar.gz"
2121
else
22-
url "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_linux_amd64.tar.gz"
22+
url "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_linux_amd64.tar.gz"
2323
end
2424
end
2525

README.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ docker run --rm -it --device /dev/snd halpworld/halpradio:latest
7878
| **Linux MPRIS v2 & Media Keys** |**Native D-Bus + `playerctl`** | ❌ None | ❌ None | ❌ None | ⚠️ Basic MPRIS |
7979
| **Song Change Desktop Notifications** |**Native macOS/Linux/Win + Dedupe** | ❌ None | ❌ None | ❌ None | ❌ None |
8080
| **CLI & Hotkey Remote (`halpradio remote`)** |**macOS Shortcuts, Raycast, tmux** | ❌ None | ❌ None | ❌ None | ⚠️ Socket |
81+
| **Terminal Party Line (`Ctrl+p`)** |**P2P Mesh Sync, E2EE Rooms & Reactions** | ❌ None | ❌ None | ❌ None | ❌ None |
8182
| **Acoustic Fingerprinting (`I`)** |**Chromaprint / AcoustID + Ad Strip** | ❌ None | ❌ None | ❌ None | ❌ None |
8283
| **Pomodoro & Sleep Timers (`z`)** |**Intervals, Station Switch & OS Notify** | ❌ None | ❌ None | ❌ None | ⚠️ Basic sleep |
8384
| **Beat-Reactive Animated Visualizers** |**5 Animal DJs + EQ Spectrum** | ❌ None | ❌ None | ❌ None | ⚠️ Basic VU |
@@ -321,6 +322,42 @@ Internet radio ICY streams often emit dirty titles like:
321322

322323
---
323324

325+
## 🎉 Terminal Party Line: P2P Mesh Synchronized Radio Rooms & Reactions
326+
327+
Share the groove with teammates, study groups, or friends with zero central audio relaying! `halpradio` features an end-to-end encrypted (E2EE) P2P mesh party system powered by WebRTC data channels:
328+
329+
### 👥 In-TUI Party Manager (`Ctrl+p`)
330+
- **Quick Create & Join**: Press `Ctrl+p` anywhere in the app to host a new room with a memorable 6-character room code (e.g. `#8X2K9P`) or join an existing session.
331+
- **Argon2id & AES-256-GCM Encryption**: Every party room derives high-entropy session keys with Argon2id and encrypts all peer-to-peer control traffic using AES-256-GCM with CSPRNG nonces.
332+
- **Zero Central Audio Relaying**: Audio streams directly from the source radio broadcast on each client while synchronization commands and metadata travel peer-to-peer over WebRTC data channels.
333+
- **DJ Pass Governance**: Host can choose **Host Only** (only the room creator can change stations) or **Open Democracy** (any participant can tune stations).
334+
- **Sub-Second Playback Sync**: Late-joining listeners automatically tune to the room's current broadcast with sub-second clock sync.
335+
- **Deterministic Host Election**: If the room host disconnects, peers deterministically elect a successor host without interrupting playback.
336+
337+
### 🎈 Live ASCII Reactions & Mini-Chat
338+
- While in an active party room, press `1` - `5` anytime to float live reactions across connected listeners' terminals:
339+
- `1`: 🔥 Fire
340+
- `2`: ❤️ Heart
341+
- `3`: ☕ Coffee
342+
- `4`: 🚀 Rocket
343+
- `5`: 👀 Eyes
344+
- Floating reactions rise and decay gracefully over 3.5 seconds in the party bar without disturbing your TUI view.
345+
346+
### ⌨️ CLI Party Commands
347+
Control and join party rooms directly from your shell or tmux sessions:
348+
```bash
349+
halpradio party create "team-focus" # Create room and launch TUI
350+
halpradio party create --dj-pass=open # Create room with democratic DJ control
351+
halpradio party create --headless # Host room headlessly in server / tmux
352+
halpradio party join 8X2K9P # Join room #8X2K9P with interactive TUI
353+
halpradio party status # Inspect current room, listener count, and host
354+
halpradio party react 1 # Send 🔥 reaction to current room
355+
halpradio party chat "Loving this track!" # Send mini-chat ping to room
356+
halpradio party leave # Disconnect from current room
357+
```
358+
359+
---
360+
324361
## ⌨️ Navigation & Keybindings (Vim & Media Style)
325362

326363
Press `?` or `F1` anywhere in **halpradio** to open the floating **WhichKey Overlay**.
@@ -338,7 +375,9 @@ Press `?` or `F1` anywhere in **halpradio** to open the floating **WhichKey Over
338375
| | `0` / `F` | Jump directly to Analog Frequency Tuner (experimental) |
339376
| | `g` / `G` | Jump to top / bottom of list |
340377
| | `Ctrl+u` / `Ctrl+d` | Half page up / down |
341-
| **Discovery & Sharing** | `I` | **Identify playing track** via acoustic stream fingerprinting (Chromaprint / AcoustID) |
378+
| **Discovery & Sharing** | `Ctrl+p` | Open **Party Room Manager** (P2P mesh synchronized listening & room setup) |
379+
| | `1` - `5` | Send live floating ASCII reaction (🔥 ❤️ ☕ 🚀 👀) when in Party Room |
380+
| | `I` | **Identify playing track** via acoustic stream fingerprinting (Chromaprint / AcoustID) |
342381
| | `y` | Yank / copy track metadata (`Artist - Title`) or identified song to system clipboard |
343382
| | `o` | Open streaming search in default web browser (Spotify, YT Music, Apple, DDG, Google) |
344383
| | `s` | Star / bookmark track to `~/.config/halpradio/saved_tracks.txt` (on History tab) |

SECURITY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ We actively provide security patches and updates for the following versions of *
66

77
| Version | Supported |
88
| ------- | ------------------ |
9+
| 0.5.x | :white_check_mark: |
910
| 0.4.x | :white_check_mark: |
1011
| 0.3.x | :white_check_mark: |
1112
| 0.2.x | :white_check_mark: |

docs/ARCHITECTURE.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,22 @@ halpradio/
5555
├── app/ # CLI flag parsing, configuration loading & app bootstrap
5656
├── player/ # Multi-backend audio playback engine & ICY stream reader
5757
│ └── fingerprint/ # Acoustic stream recognition, Chromaprint / AcoustID client, LRU cache
58+
├── party/ # P2P mesh synchronized radio rooms, Argon2id/AES-256-GCM E2EE & protocol engine
5859
├── plugin/ # Wazero Wasm sandboxing engine, capability permissions, host API, registry client
5960
├── radio/ # Station catalog store, YAML parser, RadioBrowser client & metadata sanitizer
6061
├── theme/ # Theme definitions & color palette registry
6162
├── timer/ # Pomodoro focus engine, sleep timer with volume fade, and OS event dispatcher
6263
├── ui/ # Main Bubble Tea Model, Update, View, and Keymap logic
63-
│ └── components/ # Modular UI sub-views (Header, StationList, PlayerBar, Visualizer, Modals)
64+
│ └── components/ # Modular UI sub-views (Header, StationList, PlayerBar, Visualizer, Modals, PartyBar)
6465
└── util/ # OS configuration directory resolution & clipboard utilities
6566
```
6667

6768
### Module Breakdown:
6869

6970
| Package | Key Types / Files | Responsibilities |
7071
|---|---|---|
71-
| [`pkg/app`](../pkg/app/app.go) | `Run()`, `RunPluginCLI()` | Parses CLI flags (`--backend`, `--theme`, `--version`, `--fingerprint`, `--auto-identify`), handles CLI subcommands (`remote`, `plugin`), sets up store, instantiates `player.Manager`, initializes `tea.Program`. |
72+
| [`pkg/app`](../pkg/app/app.go) | `Run()`, `RunPluginCLI()` | Parses CLI flags (`--backend`, `--theme`, `--version`, `--fingerprint`, `--auto-identify`), handles CLI subcommands (`remote`, `plugin`, `party`), sets up store, instantiates `player.Manager`, initializes `tea.Program`. |
73+
| [`pkg/party`](../pkg/party/sync.go) | `Session`, `MeshNode`, `Packet`, `Crypto` | P2P mesh synchronized radio rooms, WebRTC data channels, Argon2id key derivation & AES-256-GCM encryption, sub-second playback sync, host election, ASCII reaction bus. |
7274
| [`pkg/player`](../pkg/player/player.go) | `Player`, `Manager`, `TrackInfo` | Detects audio CLI backends (`mpv`, `vlc`, `ffplay`, etc.) or falls back to native Go audio. Runs ICY metadata streaming goroutine. |
7375
| [`pkg/player/fingerprint`](../pkg/player/fingerprint/client.go) | `Client`, `Result`, `LRUCache` | Captures 5s audio buffers, computes Chromaprint subfingerprints, queries AcoustID & MusicBrainz APIs with LRU caching. |
7476
| [`pkg/plugin`](../pkg/plugin/manager.go) | `Manager`, `Sandbox`, `Manifest`, `RegistryClient` | Executes sandboxed WebAssembly plugins via Wazero with capability checks (`network`, `storage`, `events`). Fetches and verifies official registry packages. |

docs/PACKAGING.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ For Arch Linux users, the binary package can be built using the following `PKGBU
2626
```bash
2727
# Maintainer: halpworld <https://github.com/halpworld>
2828
pkgname=halpradio-bin
29-
pkgver=0.4.0
29+
pkgver=0.5.0
3030
pkgrel=1
3131
pkgdesc="LazyVim-inspired Terminal Internet Radio Streamer"
3232
arch=('x86_64' 'aarch64')
@@ -88,17 +88,17 @@ For Windows users using [Scoop](https://scoop.sh):
8888

8989
```json
9090
{
91-
"version": "0.4.0",
91+
"version": "0.5.0",
9292
"description": "LazyVim-inspired Terminal Internet Radio Streamer",
9393
"homepage": "https://github.com/halpworld/halpradio",
9494
"license": "GPL-3.0-or-later",
9595
"architecture": {
9696
"64bit": {
97-
"url": "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_windows_amd64.zip",
97+
"url": "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_windows_amd64.zip",
9898
"bin": "halpradio.exe"
9999
},
100100
"arm64": {
101-
"url": "https://github.com/halpworld/halpradio/releases/download/v0.4.0/halpradio_0.4.0_windows_arm64.zip",
101+
"url": "https://github.com/halpworld/halpradio/releases/download/v0.5.0/halpradio_0.5.0_windows_arm64.zip",
102102
"bin": "halpradio.exe"
103103
}
104104
}
@@ -114,7 +114,7 @@ For Windows users using [Scoop](https://scoop.sh):
114114
115115
buildGoModule rec {
116116
pname = "halpradio";
117-
version = "0.4.0";
117+
version = "0.5.0";
118118
119119
src = fetchFromGitHub {
120120
owner = "halpworld";

install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ if [ -z "${VERSION}" ]; then
3333
echo "🔍 Fetching latest halpradio release..."
3434
VERSION=$(curl -s "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
3535
if [ -z "${VERSION}" ]; then
36-
VERSION="v0.4.0"
36+
VERSION="v0.5.0"
3737
fi
3838
fi
3939

pkg/app/app.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/halpworld/halpradio/pkg/util"
2323
)
2424

25-
var Version = "0.4.0"
25+
var Version = "0.5.0"
2626

2727
type AppInstance struct {
2828
Program *tea.Program

0 commit comments

Comments
 (0)