Self-hosted music streaming with peer-to-peer sharing
Features • Screenshots • Quick Start • Architecture • FAQ • API Reference • Contributing
SoundTime is a self-hosted music streaming platform built with Rust and SvelteKit. Upload your music library, organize it into playlists, and share tracks across instances using peer-to-peer networking powered by iroh (by n0.computer).
Unlike centralized platforms, SoundTime gives you full control over your music. Run it on your own server, connect with other SoundTime instances through encrypted P2P channels, and enjoy a modern, responsive listening experience.
Screenshots coming soon — see Quick Start to try it yourself!
| Layer | Technology |
|---|---|
| Backend | Rust, Axum 0.8, Sea-ORM 1.1, PostgreSQL 16 |
| Frontend | SvelteKit 2, Svelte 5, Tailwind CSS, shadcn-svelte |
| Auth | Argon2id, JWT (jsonwebtoken), tower-governor |
| Audio | Lofty (metadata), Symphonia (decode/waveform) |
| P2P | iroh 0.96 (QUIC), iroh-blobs 0.96 (content-addressed storage) |
| Visualization | D3.js 7 (network graph) |
| Storage | Local filesystem or AWS S3-compatible |
| Deployment | Docker Compose, Nginx reverse proxy |
The fastest way to get SoundTime running on any machine (Linux, macOS, Windows WSL):
curl -fsSL https://raw.githubusercontent.com/CICCADA-CORP/SoundTime/main/install.sh | bash
or with wget:
wget -qO- https://raw.githubusercontent.com/CICCADA-CORP/SoundTime/main/install.sh | bash
This will automatically:
~/soundtime.env with random secretsCustom install path? Set
SOUNDTIME_INSTALL_DIRbefore running:SOUNDTIME_INSTALL_DIR=/opt/soundtime curl -fsSL https://raw.githubusercontent.com/CICCADA-CORP/SoundTime/main/install.sh | bash
If you prefer to set things up manually:
git clone https://github.com/CICCADA-CORP/SoundTime.git
cd SoundTime
# Configure environment
cp .env.example .env
# Edit .env — at minimum, change JWT_SECRET to a random string
# Launch all services
docker compose up
Once started:
The first user to register automatically becomes the admin. Open the frontend and create your account to begin the setup wizard.
See the Development Guide for a complete setup walkthrough.
Prerequisites: Rust 1.93+, Node.js 20+, PostgreSQL 16
# Start PostgreSQL
docker compose up postgres -d
# Configure environment
cp .env.example .env
# Backend (terminal 1)
cd backend
cargo run
# Frontend (terminal 2)
cd frontend
npm install
npm run dev
See the Deployment Guide for production setup with SSL, custom domain, S3 storage, and P2P configuration.
SoundTime follows a modular monorepo architecture with a Rust backend organized into 5 specialized crates:
soundtime/
├── backend/
│ └── crates/
│ ├── soundtime-server # Axum HTTP server, routes, auth, middleware
│ ├── soundtime-db # Sea-ORM entities & database connection pool
│ ├── soundtime-migration # 22 database migrations (PostgreSQL)
│ ├── soundtime-audio # Audio metadata, storage, waveform generation
│ └── soundtime-p2p # P2P networking via iroh (discovery, health, search)
├── frontend/
│ └── src/
│ ├── lib/
│ │ ├── components/ # 11 UI components (AudioPlayer, NetworkGraph…)
│ │ ├── stores/ # Svelte 5 rune stores (auth, player, queue)
│ │ └── i18n/ # 5 language packs
│ └── routes/ # 16 SvelteKit pages
├── docker/ # Dockerfiles + Nginx config
├── docs/ # Documentation
└── docker-compose.yml # Full-stack orchestration
┌─────────────┐ ┌──────────────────────────────────────────────┐
│ Browser │────▶│ Nginx (reverse proxy) │
└─────────────┘ └────────┬──────────────────────┬──────────────┘
│ │
┌────────▼────────┐ ┌────────▼────────┐
│ Frontend │ │ Backend │
│ SvelteKit 2 │ │ Axum 0.8 │
│ Port 3000 │ │ Port 8080 │
└─────────────────┘ └────────┬─────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────────▼──┐ ┌───────▼──┐ ┌───────▼──────┐
│ PostgreSQL │ │ Audio │ │ P2P Node │
│ 16 │ │ Storage │ │ iroh/QUIC │
└───────────┘ └──────────┘ └──────┬───────┘
│
┌────────▼────────┐
│ n0.computer │
│ Relay Servers │
└─────────────────┘
For a deep dive, see the Architecture Guide.
| Guide | Description |
|---|---|
| Architecture | System design, crate responsibilities, data flow |
| API Reference | Complete REST API documentation (60+ endpoints) |
| Deployment | Production setup, SSL, S3, environment variables |
| Development | Local dev setup, testing, project structure |
| P2P Networking | iroh protocol, relay servers, content addressing |
We welcome contributions of all kinds! Whether you're fixing a typo, adding a feature, or improving documentation — every contribution matters.
P2P_ENABLED=true environment variable, SoundTime works as a standalone self-hosted music server with no external connections.
cd ~/soundtime # or your install directory
git pull
docker compose pull
docker compose up -d
Database migrations run automatically on startup.
If you discover a security vulnerability, please report it responsibly. See SECURITY.md for details.
SoundTime is licensed under the GNU Affero General Public License v3.0.
This means you can use, modify, and distribute SoundTime freely, but if you run a modified version as a network service, you must make the source code available to its users.
SoundTime is a self-hosted music streaming tool designed for managing and streaming your own personal music library. The peer-to-peer features are intended for sharing legally owned or royalty-free content between instances you operate or trust.
The developers of SoundTime do not endorse, encourage, or condone the use of this software for sharing, distributing, or hosting copyrighted material without proper authorization from the rights holders.
Each SoundTime instance is independently operated. The responsibility for the content hosted, shared, or made available through a given node lies entirely with the operator of that node — not with the authors, contributors, or maintainers of the SoundTime software.
By using SoundTime, you acknowledge that:
If you are a rights holder and believe your content is being shared through a SoundTime instance, please contact the operator of that specific instance directly.
Made with ❤️ by CICCADA