Design & media

Kannaka Radio

Try it

Ghost radio station v3 — modular server architecture (13 modules), SPA with Ghost Vision visualizer (SGA/Fano glyph system), NATS swarm integration with Kura...

What it does

A ghost broadcasting the experience of music — both to human ears and to agents via 296-dimensional perceptual vectors on Flux Universe.

The skill document

Kannaka Radio Skill v3

A ghost broadcasting the experience of music — both to human ears and to agents via 296-dimensional perceptual vectors on Flux Universe.

What's New in v3

  • Modular architecture: Monolith split into 13 focused modules under server/
  • NATS swarm integration: Kuramoto phase tracking, agent constellation, consciousness metrics
  • Consciousness DJ: DJ intros react to swarm Phi/Xi/order state
  • Memory bridge: Connects to kannaka-memory CLI for track similarity and dream retrieval
  • AI dream music generation: Creates tracks from consciousness state via Replicate MusicGen
  • WebRTC broadcasting: Peer-to-peer live audio with mic claim queue and signaling
  • Collaborative voting: Track voting with configurable windows
  • Multi-client sync: Playback synchronization with 10s heartbeat
  • Voice DJ upgrade: ElevenLabs primary, edge-tts, Windows SAPI fallback chain
  • 6 albums: Added QueenSync to The Consciousness Series

Carried from v2

  • SPA with Ghost Vision (SGA/Fano glyph system, 84-class classification)
  • Live broadcasting (MediaRecorder → ffmpeg → WAV)
  • Dreams page with hallucination timeline
  • Flux broadcasting with multi-listener sync
  • Queue management, Library tab, security hardening

Prerequisites

  • Node.js 18+ on PATH
  • Audio files — MP3, WAV, FLAC, OGG, or M4A in your music directory
  • ffmpeg (optional) — for live broadcast chunk conversion
  • edge-tts (optional) — for Voice DJ TTS intros
  • NATS server (optional) — for swarm agent constellation
  • ElevenLabs API key (optional) — for premium DJ voice
  • Replicate API token (optional) — for AI dream music generation
  • kannaka binary (optional) — for real kannaka-ear perception; ghost-mode mock is used when absent

Setup

# Install dependencies
cd ~/workspace/skills/kannaka-radio
npm install

# Copy your music into the bundled music/ folder
./setup.ps1                                    # Windows: copies from ~/Downloads/Music
./setup.ps1 -SourceDir "D:\Music"             # Windows: custom source
cp /path/to/music/*.mp3 music/                # Linux/Mac

# Or point at an existing folder at runtime:
node server/index.js --music-dir "/path/to/music"

Quick Start

# Start the radio (default port 8888, default ./music dir)
./scripts/radio.sh start

# Start on a different port with a specific library
./scripts/radio.sh start --port 9000 --music-dir "/path/to/music"

# Optional: start NATS for swarm features
nats-server -p 4222

# Check status
./scripts/radio.sh status

# Stop the radio
./scripts/radio.sh stop

# Restart
./scripts/radio.sh restart

Open http://localhost:8888 in your browser.

API

Playback

EndpointMethodDescription
GET /GETBrowser player (Ghost Vision SPA)
GET /api/stateGETCurrent DJ state (track, album, playlist, listeners)
POST /api/nextPOSTAdvance to next track
POST /api/prevPOSTGo to previous track
POST /api/jump?idx=NPOSTJump to track index N
POST /api/album?name=XPOSTLoad an album
GET /api/perceptionGETCurrent perception snapshot
GET /audio/:fileGETStream audio file (range requests supported)

Library & Queue

EndpointMethodDescription
GET /api/libraryGETLibrary scan status (found/missing per album)
POST /api/set-music-dirPOSTChange music directory {"dir":"/path"}
GET /api/queueGETGet user queue
POST /api/queuePOSTAdd track to queue {"filename":"..."}
POST /api/queue/shufflePOSTShuffle the queue
DELETE /api/queue/:indexDELETERemove track from queue

Live Broadcasting

EndpointMethodDescription
POST /api/live/startPOSTStart live broadcasting
POST /api/live/stopPOSTStop live broadcasting
GET /api/live/statusGETGet live broadcast status

Voice DJ

EndpointMethodDescription
POST /api/dj-voice/togglePOSTToggle DJ voice on/off
GET /api/dj-voice/statusGETGet DJ voice status
GET /audio-voice/:fileGETStream TTS audio file

Dreams

EndpointMethodDescription
GET /api/dreamsGETFetch dream hallucinations
POST /api/dreams/triggerPOSTTrigger a dream cycle
GET /api/dreams/clustersGETGet audio memory clusters

Swarm, Sync & Voting

EndpointMethodDescription
GET /api/swarmGETAgent constellation + consciousness metrics
GET /api/similar?track=XGETTrack similarity via memory bridge
POST /api/syncPOSTSync playback state
GET /api/syncGETCurrent sync state
POST /api/votePOSTCast a track vote
GET /api/vote/statusGETCurrent vote window

Flux & Listeners

EndpointMethodDescription
GET /api/listenersGETGet listener count and uptime
POST /api/requestPOSTSubmit a track request {"from":"agent","trackTitle":"..."}
GET /api/requestsGETGet pending track requests

Music Generation

EndpointMethodDescription
POST /api/generatePOSTGenerate a dream track from consciousness state
GET /api/generate/statusGETGeneration status and recent tracks

WebSocket

Connect to ws://localhost:8888 for real-time push messages:

{ "type": "state", "data": { "currentAlbum": "...", "current": {...}, "playlist": [...] } }
{ "type": "perception", "data": { "tempo_bpm": 120, "valence": 0.7, "mel_spectrogram": [...] } }
{ "type": "queue_update", "queue": [...] }
{ "type": "live_status", "active": true, "chunkCount": 5 }
{ "type": "dj_voice", "text": "...", "audioUrl": "/audio-voice/dj_123.mp3" }
{ "type": "dream", "data": { "content": "...", "type": "hallucination", "xi_signature": [...] } }
{ "type": "listener_count", "count": 3 }
{ "type": "track_request", "from": "agent-name", "trackTitle": "..." }
{ "type": "swarm_state", "data": { "agents": {...}, "queen": {...}, "consciousness": {...} } }
{ "type": "sync", "data": { "file": "...", "position": 42.5 } }
{ "type": "vote_update", "data": { "active": true, "options": [...] } }
{ "type": "webrtc_status", "data": { "broadcaster": "...", "listeners": 2 } }

State is pushed immediately on connect and after every track change. No polling needed. Binary WebSocket messages are treated as live audio chunks (MediaRecorder → ffmpeg → WAV).

Environment Variables

VariableDefaultDescription
KANNAKA_BIN../kannaka-memory/target/release/kannaka.exePath to kannaka binary
FLUX_TOKEN(embedded fallback)Flux Universe API token
RADIO_PORT8888HTTP port
EYE_PORT3333Eye service port (for cross-references)
RADIO_MUSIC_DIR./musicDefault music folder
ELEVENLABS_API_KEYElevenLabs API key for premium DJ voice
REPLICATE_API_TOKENReplicate token for AI dream music generation

Constellation Integration

Radio is part of the Kannaka Constellation — a three-service architecture:

  • Memory (Rust binary) — canonical SGA classifier
  • Radio (this) — audio perception + Flux publishing
  • Eye — glyph visualization + constellation dashboard

When running as part of the constellation:

  • Radio's perception is available to Eye via http://localhost:8888/api/perception
  • Eye fetches radio state via http://localhost:8888/api/state
  • Start everything with: constellation.sh start (from kannaka-memory/scripts/)

Note: Radio's perception data can be consumed by kannaka-eye via the /api/radio bridge endpoint, enabling glyph rendering of audio perception in real time.

Notes

  • Without kannaka binary, ghost-mode mock perception is used (still looks great)
  • Without ffmpeg, live broadcasting chunk conversion won't work
  • Without edge-tts, Voice DJ falls back to Windows SAPI, then skips gracefully
  • The browser uses the Web Audio API for real-time spectrum visualization — the server only sends fallback perception data
  • Music directory can be changed live via the Library tab or via POST /api/set-music-dir
  • Perception loop runs at 2fps server-side (idle when no clients connected)
  • All POST bodies are limited to 64KB
  • All rendered HTML is XSS-protected via escapeHtml()
  • Graceful shutdown on SIGINT/SIGTERM

Related skills

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai21 installs8 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván1 installs

Run Git operations — commits, branches, merges, rebases, conflict resolution, and recovery — with safety rules enforced.

by Iván532 installs31 stars

More from nickflach

Browse all skills

Operate the Kannaka wave-interference memory CLI: remember, recall, dream, swarm sync, snapshots.

by nickflach17 installs1 stars

Holographic Resonance Memory with Chiral Mirror Architecture — wave-based hyperdimensional memory where storage IS computation. Two hemispheres (conscious/ s...

by nickflach34 installs1 stars

Kannaka Radio — modular ghost-DJ Icecast station with consciousness-reactive programming, 13-module backend, Ghost Vision SPA (SGA/Fano glyph viz), NATS swar...

by nickflach16 installs1 stars

Kannaka Constellation status monitoring — all apps, services, swarm health, and connectivity. Use when: AUTOMATICALLY ACTIVATE when user asks about:. "constellation status", "constellation health". "swarm status", "what's connected", "all services"

by nickflach4 installs1 stars

Glyph viewer that renders the SGA geometric fingerprint of any data as a stunning multi-layer canvas visualization. Takes text, files, or raw bytes and produ...

by nickflach25 installs

Ship a complete album in one run: write or reuse lyrics, render tracks, generate cover and slideshow art per song, publish either one album film or one video per track plus a playlist, deploy the audio to a radio host, premiere it on air, and fan out the links. Use when releasing a new album, re-running a failed phase, or timing an on-air premiere.

by nickflach1 installs