Skip to content

Repository files navigation

Sonata

🎵 Sonata

Lavalink-compatible audio server
pure TypeScript · no Java · no yt-dlp

LicenseVersionLast CommitCode SizeNodeDocs

FeaturesQuick StartConfigurationAPISourcesPerformance


Sonata is a drop-in replacement for Lavalink (Java) written entirely in TypeScript. It provides the same REST + WebSocket protocol that Discord bots expect, but with faster startup, lower memory, and native YouTube/SoundCloud/Spotify resolution — no Java runtime or yt-dlp required.


✨ Features

🎧 Audio PlaybackPCM → Opus encoding, DAVE/E2EE encryption, real-time mixing
🌐 12 Audio SourcesYouTube (InnerTube), Spotify, SoundCloud, Deezer, Apple Music, Bandcamp, Twitch, Vimeo, NicoNico, Mixcloud, Podcasts, HTTP, Local
🎛️ 13 DSP FiltersEQ (15-band), karaoke, timescale, tremolo, vibrato, rotation (8D), distortion, channel mix, low-pass, high-pass, reverb, limiter, volume
📦 Zero JavaPure Node.js — no JRE, no Maven, no yt-dlp
🔌 Plugin Systemnpm packages, local paths, auto-scan — all with full type support
🚀 Performance~200ms startup, ~15MB idle, ~30MB with 10 players
🔄 ProtocolLavalink v4 + v3 — works with any lavaclient
📊 ObservabilityPrometheus metrics, health check, HTML dashboard

🚀 Quick Start

📦 npm (global)

npm install -g @sonata-sdk/server
sonata # start with default config (./config.js)
sonata /etc/sonata/config.js # start with custom config

◻ npx (no install)

npx @sonata-sdk/server # run directly

🐳 Docker

docker build -t sonata .
docker run -p 2333:2333 -v ./config.js:/app/config.js sonata

🔧 From source

git clone https://github.com/sonata-sdk/sonata.git
cd sonata
npm install
npm run build
node dist/index.js

⚡ Dev mode (no build)

npx tsx src/index.ts # one-shot
npm run dev # watch mode (auto-restart)

🏗️ Bootstrap (clone + build)

sonata --build # clones repo, installs deps, compiles

💻 CLI

sonata [config-path]
Options:
-v, --version Show version
-h, --help Show this help
--build Clone repo, install deps, and build from GitHub

⚙️ Configuration

Copy config.example.jsconfig.js. Every option is documented inline.

SectionDescription
serverHost, port, password, CORS, SSL, dashboard path
loggingLevel, format (text/json), file transport, colors
sourcesToggle each source on/off, set API keys
lavalinkAPI version, session resume, plugin directory
voiceUDP mode, encryption fallback, keepalive
playerVolume, idle timeout, normalization, auto-leave
queueMax size, history, crossfade, shuffle, loop
cacheLRU or Redis, TTL, max entries
metricsPrometheus endpoint
rateLimitingWindow, max requests, per-user
securityHSTS, content-type enforcement, SQLi/XSS blocking
pluginsnpm packages, local paths, per-plugin config
clusteringMulti-node (coming soon)
resolvingSearch aliases, retry, fallbacks
dashboardTheme, refresh, player controls

📡 Audio Sources

SourceMethodPlaylistsAuth Required
YouTubeInnerTube API (5 clients)
SoundCloudPublic API
SpotifyWeb API + YouTube mirrorclientId + clientSecret
DeezerGateway API + CDNarl
Apple MusiciTunes Search API
BandcampHTML
TwitchHTML
VimeoHTML
NicoNicoAPI + HTML
MixcloudAPI + HTML
PodcastRSS/XML
🌐 HTTPDirect URL
📁 LocalFilesystem path

Deezer requires an arl cookie for high-quality streaming. Set sources.deezer.arl in config. SOCKS proxy is also supported via sources.deezer.proxy.


📖 API

Lavalink v4

MethodEndpoint
GET/v4/info
GET/v4/stats
GET / POST / DELETE/v4/sessions, /v4/sessions/{id}
GET/v4/sessions/{id}/players
GET / PATCH / DELETE/v4/sessions/{id}/players/{guildId}
POST/v4/sessions/{id}/players/{guildId}/voice
GET/v4/loadtracks?identifier=
GET / POST/v4/decodetrack?track=
POST/v4/decodetracks
POST / DELETE / PATCH/v4/sessions/{id}/players/{guildId}/queue
GET/v4/sessions/{id}/players/{guildId}/history
GET/v4/routeplanner/status
POST/v4/routeplanner/free/address, /v4/routeplanner/free/all

Legacy /v3/* endpoints are also available for backward compatibility.

Extra Endpoints

MethodEndpointDescription
GET/healthStatus, uptime, players, memory
GET/versionVersion, node, platform
GET/dashboardHTML admin dashboard
GET/metricsPrometheus metrics

Search Prefixes

InputResolves To
https://youtube.com/watch?v=...YouTube
https://open.spotify.com/track/...Spotify
https://soundcloud.com/user/trackSoundCloud
never gonna give you upAll sources (auto-detect)
ytmixes:VIDEO_IDYouTube Mix (recommendations)
ytplaylist:QUERYYouTube playlist search

🎛️ Audio Filters

FilterDescriptionRange
VolumeMultiplier with 16-bit clamp0% – 1000%
Equalizer15-band graphic EQ (±0.25 gain)40Hz – 16kHz
KaraokeCenter channel removal
TimescaleSpeed, pitch, rate0.5x – 2.0x
TremoloAmplitude modulation
VibratoPitch modulation
Rotation8D stereo pan0.05 – 0.5 Hz
DistortionSin/Cos/Tan waveshaping
Channel MixLeft/right mixing matrix
Low Pass1-pole low-pass filter
High Pass1-pole high-pass filter
ReverbComb-filter delay with decay0–100% mix
LimiterDynamic range compression0–1 threshold

Apply via PATCH /v4/sessions/{id}/players/{guildId} with { filters: { ... } }.

Example usage:

{
"filters": {
"reverb": { "delay": 0.05, "decay": 0.4, "mix": 0.3 },
"highPass": { "smoothing": 0.1 },
"limiter": { "threshold": 0.95, "attack": 0.002, "release": 0.1 }
}
}

🧩 Plugin System

Sonata supports plugins via config.js:

plugins: {npm: ['@sonata-sdk/plugin-lyrics'],paths: ['./my-local-plugin.js'],configs: {'@sonata-sdk/plugin-lyrics': {geniusApiKey: '...'}}}

Create your own using the @sonata-sdk/plugin-sdk:

import{register}from'@sonata-sdk/plugin-sdk'exportdefaultregister({name: 'my-plugin',version: '1.0.0',install(ctx){ctx.onTrackStart((guildId,track)=>{ctx.log('info',`▶ ${track.info.title}`)})ctx.registerRoute('GET','/my-plugin/status',(req,res)=>{res.end(JSON.stringify({ok: true}))})},})

⚡ Performance

MetricSonataLavalink (Java)
RuntimeNode.js 20+JRE 17+
Package size~5 MB JS~100 MB JAR
RAM (idle)~15 MB~300 MB
RAM (10 players)~30 MB~500 MB
Startup time~200 ms~10 s
DependenciesnpmMaven
Docker image~150 MB~400 MB

🏗️ Architecture

src/
├── index.ts # Entry point
├── config/ # Config module loader
├── server/ # HTTP + WebSocket server / router / middleware
├── lavalink/ # REST API (v3+v4), WS protocol, session manager
├── player/ # Player state machine, queue, track encoder, audio streamer
├── discord/ # Voice connection (Opus + DAVE/MLS encryption)
├── audio/ # DSP mixer with 13 filters
├── resolving/ # 12 audio source resolvers
│ ├── youtube/ # InnerTube API (5 client profiles)
│ ├── soundcloud/ # SoundCloud public API
│ ├── spotify/ # Spotify Web API + YouTube mirror fallback
│ └── ... # 9 more sources
├── cache/ # LRU / Redis track cache
├── dashboard/ # HTML admin dashboard
├── metrics/ # Prometheus exporter
├── plugin/ # Plugin manager + loader
└── types/ # TypeScript type definitions

~8K lines across 48 files.


🛠️ Development

npm run typecheck # TypeScript type checking
npm test# Run tests (24 passing)
npm run build # Compile to dist/
npm run dev # Watch mode with auto-reload

📦 Related


Built with ❤️ in TypeScript · MIT License

About

High-performance Lavalink-compatible audio server for Discord bots. TypeScript. Native YouTube/SoundCloud/Spotify resolvers via InnerTube API. No yt-dlp.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages