Skip to content

baogutang/aurio

Repository files navigation

简体中文

Aurio

Aurio

Your personal AI radio.

Context-aware · library-native · locally hosted.


Version License: MIT Node 20+ Electron React CI


Quick Start · API Relay · Screenshots · Architecture · Docs


Download Aurio for macOS Download Aurio for Windows Download Aurio for Linux


Recommended API relay — OpenAI-compatible endpoint maintained by the author.
Plug into Settings → Brain · AI → API Key, or use .env below.


token.baogutang.top


Aurio player — dark theme standby with dot-matrix clock on a cinematic gradient canvas

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


At a glance

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

See it in action

Aurio — light standby, dark standby, and on-air playback side by side

Aurio UI flow — standby, playback, chat, settings, brain

Aurio demo — standby, playback, chat, settings, AI brain

Standby → On-air → Chat → Settings → Brain


Why Aurio

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

Design principles

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

A day on the air

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

What you get

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

API relay

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-portal

Or configure in-app: Settings → Brain · AI → API Key.
CLI mode (Claude / Codex) still works with zero API key — the relay is optional.


Screenshots

Standby    On-air playback

Settings hub    Chat sheet    AI brain config

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

Quick start

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 HMR

Architecture

System architecture — Electron, PWA, Node server, brain, music, TTS

Show segment pipeline — trigger, context, brain, resolve, TTS, broadcast

Trigger → 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
Loading

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

Configuration

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

Usage

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"}'

examples/api.md


Documentation

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.mjs

Development

npm run server       # backend only
npm test             # vitest (19 tests)
cd web && npm run build

FAQ

Do 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.


License

MIT © 2026 Aurio contributors


Built by baogutang

AI relay → token.baogutang.top


Star History Chart

About

Your personal AI radio — a local-first DJ that reads calendar, weather & taste, picks from Navidrome/NetEase/QQ, and speaks between songs. Electron desktop + browser PWA for macOS & Windows.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors