Your personal AI radio.
Context-aware · library-native · locally hosted.
Quick Start · API Relay · Screenshots · Architecture · Docs
|
Recommended API relay — OpenAI-compatible endpoint maintained by the author. |
Electron desktop · browser PWA · 420×760 player · dark / light themes
Works with Claude · Codex · OpenAI-compatible APIs · Navidrome · NetEase · QQ Music · macOS Calendar · ICS · OpenWeather · UPnP / DLNA
Not a playlist app. Not a chatbot.
A local AI DJ that pulls real tracks from your libraries, reads your day, and speaks between songs.
| Library-native Navidrome · NetEase · QQ |
Context-aware Calendar · weather · taste corpus |
Locally hosted Loopback API · disk-cached TTS |
Standby → On-air → Chat → Settings → Brain
Streaming apps optimize for engagement. Playlists demand curation. Aurio is a third path — a radio host that runs on your machine, knows your day, and picks from your libraries.
| Algorithmic streaming | Aurio | |
|---|---|---|
| Music source | Platform catalog | Your NAS + NetEase + QQ |
| Personality | None | Editable taste corpus + DJ persona |
| Context | Opaque | Calendar · weather · time-of-day |
| Voice | None | System / Tencent / Fish TTS |
| Privacy | Cloud-first | Local server · loopback API by default |
| Principle | What it means |
|---|---|
| Local-first | Brain, queue, TTS cache, and settings live on your machine — cloud is optional |
| Context-native | Every segment assembles persona, taste, weather, calendar, and play history before the AI speaks |
| Library-grounded | Tracks resolve against real libraries, not hallucinated titles |
Aurio doesn't wait for you to press play. Scheduled beats keep the show alive:
| Time | Beat | What happens |
|---|---|---|
| 07:00 | plan |
Day plan segment — sets the arc for what's ahead |
| 09:00 | morning |
Morning open — weather, calendar, first picks |
| 10:00–23:00 | mood |
Hourly mood check — append new segments to the queue |
| Anytime | open |
Radio engine refills when the queue runs low |
| On demand | chat |
"Play something jazzy" — enqueue, steer mood, or talk-only |
Intelligence
| Capability | Detail | |
|---|---|---|
| 🧠 | AI brain | Claude / Codex CLI, or any OpenAI-compatible API |
| 📅 | Context engine | Weather, macOS Calendar, ICS feeds in every segment |
| 💬 | Chat to steer | "Play some Jay Chou" — enqueue, mood shift, or talk-only |
| ⏰ | Scheduled show | 07:00 plan · 09:00 morning · hourly mood 10–23 |
Music & broadcast
| Capability | Detail | |
|---|---|---|
| 🎵 | Multi-source music | Navidrome · NetEase (QR) · QQ — search, queue, lyrics |
| 🎙️ | Voice | macOS say · Windows SAPI · Tencent · Fish — disk-cached |
| 📻 | Radio engine | Auto-refills queue via WebSocket when tracks run low |
| 🔊 | UPnP cast | DLNA speakers on your LAN |
Platform
| Capability | Detail | |
|---|---|---|
| 🛡️ | Secure default | Control API loopback-only; media proxies LAN-ready for casting |
| 🖥️ | Cross-platform | Electron desktop + browser PWA from one server |
Don't want to wrangle CLI logins? Use the author-maintained relay:
AI_PROVIDER=api
AI_API_KIND=openai
AI_API_BASE_URL=https://token.baogutang.top/v1 # use the exact base URL on the portal
AI_API_MODEL=your-model-id
AI_API_KEY=your-key-from-portalOr configure in-app: Settings → Brain · AI → API Key.
CLI mode (Claude / Codex) still works with zero API key — the relay is optional.
UI notes
- Dot-matrix clock standby with live service strip (NetEase · Navidrome · QQ)
- Spectrum + synced lyrics; drag-and-drop Up Next queue
- Glass-morphism sheets with Framer Motion spring physics
- Monospace Nerd Font UI · accent
#ff6a3d/#5ad19a· dark / light themes
Requires Node.js 20+ · macOS, Windows, or Linux
Prefer packaged builds? Grab the latest macOS, Windows, or Linux installer from Releases.
| Step | Command |
|---|---|
| 1 | git clone https://github.com/baogutang/aurio.git && cd aurio && npm install |
| 2 | cp .env.example .env — every key is optional |
| 3 | npm run server → open http://localhost:8080 |
| 4 | npm start — Electron desktop (optional) |
First launch opens an onboarding wizard (AI → music → voice). Reconfigure anytime in Settings.
npm run dist:mac # macOS .dmg + .zip
npm run dist:win # Windows NSIS + portable
cd web && npm run dev # frontend HMRTrigger → context.js → brain/ → music/ → tts/ → WebSocket → React player
Segment pipeline (sequence)
sequenceDiagram
participant T as Trigger
participant C as Context
participant B as Brain
participant M as Music
participant V as TTS
participant P as Player
T->>C: assemble(trigger)
C->>B: think(prompt)
B-->>C: {say, play[], intent, ...}
C->>M: resolveQueue(play[])
M-->>C: tracks with URLs
C->>V: cachedSynthesis(say)
V-->>P: WebSocket broadcast
Each beat returns { say, play[], reason, segue, intent, placement, mood }.
→ docs/architecture.md
Tech stack
| Layer | Stack |
|---|---|
| Desktop | Electron 33 |
| Frontend | React 18 · Vite · Tailwind · Framer Motion |
| Server | Node.js 20 · Express · WebSocket |
| Brain | Claude / Codex CLI · OpenAI-compatible API |
| Music | Navidrome (Subsonic) · NetEase API · QQ Music |
| Voice | macOS say · Tencent Cloud · Fish Audio |
| Cast | UPnP / DLNA via native SSDP discovery |
Copy .env.example → .env. In-app changes persist to data/settings.json.
| Variable | Purpose |
|---|---|
PORT |
Server port (default 8080) |
AURIO_ALLOW_LAN |
Open control API to LAN (default false) |
AI_PROVIDER |
claude · codex · cli · api |
AI_API_* |
Hosted model / relay |
NAVIDROME_* |
NAS music library |
NETEASE_COOKIE |
Auto-filled after QR login |
VOICE_PROVIDER |
system · tencent · fish |
| Goal | Action |
|---|---|
| Hands-free listening | Let cron beats run (morning open, hourly mood) |
| Start the show | Tap Play — radio engine refills the queue |
| Request a vibe | Chat: "Play some Jay Chou" · "Change the mood" |
| Switch source | Tap Source — combined / NetEase / Navidrome / QQ |
| Cast | Settings → Cast → DLNA device |
| Tune taste | Edit user/taste.md, routines.md, mood-rules.md |
curl -X POST http://localhost:8080/api/chat \
-H 'Content-Type: application/json' \
-d '{"text": "something mellow"}'| Topic | Link |
|---|---|
| Architecture | docs/architecture.md |
| Frontend spec | docs/FRONTEND_SPEC.md |
| Security model | SECURITY.md |
| Changelog | CHANGELOG.md |
| Contributing | CONTRIBUTING.md |
| Social preview | PNG · SVG source |
Regenerate README media (server must be running):
node scripts/capture-readme-assets.mjsnpm run server # backend only
npm test # vitest (19 tests)
cd web && npm run buildDo I need an API key?
No. Default brain uses your local Claude or Codex CLI. API mode — including the author relay — is optional.
Brain shows unavailable
Verify claude --version or codex --version in terminal. For API mode, check Base URL + key under Settings → Brain · AI.
Without Navidrome?
Yes. NetEase and QQ search work out of the box. NetEase playback needs QR login in Settings.
Browser only?
Yes — npm run server serves the PWA at http://localhost:8080.
MIT © 2026 Aurio contributors







