Developed by Ex0 Studios
A shared cloud soundboard desktop app for Windows. Users share a library of sounds in real time - uploading a new sound instantly shows it to everyone else via WebSocket. Sounds can be played to a virtual audio cable (for Discord or someone game) using global keyboard shortcuts.

To participate in our open beta and access the shared remote audio database, you do not need to host the backend locally. You just need to configure your client application to connect to our live production endpoint.
When setting up or selecting the host address within the application settings, change localhost to our official active bridge:
๐ Beta Server URL: https://earthling-coliseum-blurb-ngrok-free.dev
โ ๏ธ Important: Ensure you include the fullhttps://prefix so the desktop app can establish a secure handshake with the database and WebSockets.
cloudsoundboard/
โโโ server/ # Python FastAPI backend
โ โโโ app/
โ โ โโโ api/v1/
โ โ โ โโโ endpoints/
โ โ โ โโโ auth.py # POST /register, /login
โ โ โ โ โโโ sounds.py # CRUD + file serving
โ โ โ โ โโโ websocket.py # WS /ws/connect
โ โ โ โโโ deps.py # FastAPI dependencies (auth)
โ โ โ โโโ router.py # Router aggregation
โ โ โโโ core/
โ โ โ โโโ config.py # Pydantic Settings (.env)
โ โ โ โโโ exceptions.py # Domain exceptions
โ โ โ โโโ logging.py # structlog setup
โ โ โ โโโ security.py # JWT + bcrypt
โ โ โโโ db/
โ โ โโโ database.py # SQLAlchemy async engine
โ โ โโโ models/
โ โ โ โโโ user.py # ORM user model
โ โ โ โโโ sound.py # ORM sound model
โ โ โโโ schemas/
โ โ โ โโโ user.py # Pydantic I/O schemas
โ โ โโโ sound.py # + WS message types
โ โ โโโ services/
โ โ โ โโโ user_service.py # User business logic
โ โ โ โโโ sound_service.py # Sound business logic + WS broadcast
โ โ โ โโโ file_storage.py # Storage abstraction (Local/S3)
โ โ โโโ websocket_manager.py # WS connection pool + broadcast
โ โ โโโ main.py # FastAPI app + lifecycle
โ โโโ tests/
โ โ โโโ test_api.py # Integration tests
โ โโโ requirements.txt
โ โโโ pytest.ini
โ โโโ .env.example
โ
โโโ client/ # Electron + React/TypeScript
โโโ src/
โ โโโ main/ # Electron main process (Node.js)
โ โ โโโ main.ts # App lifecycle, IPC, tray
โ โ โโโ preload.ts # Safe IPC bridge (contextBridge)
โ โ โโโ audioPlayer.ts # Audio playback โ renderer
โ โ โโโ hotkeyManager.ts # globalShortcut management
โ โ โโโ storeManager.ts # electron-store (persistent settings)
โ โ โโโ logger.ts # Main process logging
โ โโโ renderer/ # React UI (browser context)
โ โโโ App.tsx # Root component
โ โโโ styles.css # Complete dark-mode design
โ โโโ types/index.ts # TypeScript types
โ โโโ services/
โ โโโ api.ts # Axios API client
โ โ โโโ websocket.ts # WS client (auto-reconnect)
โ โโโ audioService.ts # Web Audio API + device routing
โ โโโ stores/
โ โ โโโ appStore.ts # Zustand global state
โ โโโ components/
โ โโโ layout/
โ โ โโโ LoginPage.tsx
โ โโโ MainLayout.tsx
โ โโโ TitleBar.tsx / TopBar.tsx
โ โโโ soundboard/
โ โ โโโ SoundGrid.tsx # Responsive tile grid
โ โ โโโ SoundTile.tsx # Sound tile + hotkey
โ โ โโโ UploadDialog.tsx # Upload with Drag & Drop
โ โ โโโ AudioBridge.tsx # IPC bridge for audio
โ โโโ settings/
โ โโโ SettingsPanel.tsx # Audio devices, server, stats
โโโ index.html
โโโ vite.config.ts
โโโ tsconfig.json / tsconfig.main.json
โโโ package.json
| Column | Type | Description |
|---|---|---|
id |
UUID | Primary Key |
username |
VARCHAR(64) | Unique, indexed |
email |
VARCHAR(255) | Unique, indexed |
hashed_password |
VARCHAR(255) | bcrypt hash |
is_active |
BOOLEAN | Active account |
is_admin |
BOOLEAN | Admin permissions |
created_at |
TIMESTAMPTZ | Registration time |
| Column | Type | Description |
|---|---|---|
id |
UUID | Primary key |
name |
VARCHAR(128) | Sound name, indexed |
description |
TEXT | Optional description |
tags |
VARCHAR(512) | Comma separated tags |
filename |
VARCHAR(256) | Unique file name on disk |
original_filename |
VARCHAR(256) | Original name |
file_size |
INTEGER | Size in bytes |
mime_type |
VARCHAR(64) | MIME file type |
duration_seconds |
FLOAT | Duration in seconds |
file_url |
VARCHAR(512) | Relative download URL |
author_id |
UUID FK | Link to users.id |
play_count |
INTEGER | Number of plays |
created_at |
TIMESTAMPTZ | Upload time, indexed |
cd server
# Install dependencies
python -m venv venv
venv\Scripts\activate # Windows
pip install -r requirements.txt
# Configure
copy .env.example .env
# Edit .env โ especially SECRET_KEY
# Run (SQLite, development)
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# Tests
pytest tests/ -v
Server runs at http://localhost:8000, API documentation at http://localhost:8000/docs.
cd client
npm install
# Development (runs Vite + Electron)
npm run dev
# Production build
npm run dist
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/auth/register |
User registration |
| POST | /api/v1/auth/login |
Login, returns JWT |
| GET | /api/v1/sounds/ |
List of sounds (paginated, full-text search) |
| POST | /api/v1/sounds/upload |
Upload sound (multipart/form-data) |
| GET | /api/v1/sounds/{id} |
Sound details |
| PATCH | /api/v1/sounds/{id} |
Edit metadata |
| DELETE | /api/v1/sounds/{id} |
Delete sound |
| POST | /api/v1/sounds/{id}/play |
Increment play count |
| GET | /api/v1/sounds/files/{filename} |
Download/stream file |
| WS | /api/v1/ws/connect?token=<JWT> |
WebSocket connection |
{ "event": "sound_added", "data": { ...SoundPublic }, "timestamp": "..." }
{ "event": "sound_deleted", "data": { "id": "uuid" }, "timestamp": "..." }
{ "event": "sound_updated", "data": { ...SoundPublic }, "timestamp": "..." }
{ "event": "ping", "data": {}, "timestamp": "..." }
{ "event": "connected", "data": { "user_id": "..." }, "timestamp": "..." }
- Database: Change
DATABASE_URLto PostgreSQL in.env - SECRET_KEY: Generate:
openssl rand -hex 32 - HTTPS: Deploy behind nginx or Caddy with TLS certificate
- S3: Set
USE_S3=trueand AWS credentials โ then implementS3StorageBackendinfile_storage.py - ALLOWED_ORIGINS: Adjust for production domain
- Install VB-Audio Virtual Cable (free): https://vb-audio.com/Cable/
- In CloudSoundboard settings โ Audio output โ select CABLE Input (VB-Audio Virtual Cable)
- In Discord โ Voice & Video โ Input Devices โ CABLE Output (VB-Audio Virtual Cable)
- Sounds played in CloudSoundboard will be transmitted as your microphone to Discord.
- On each tile, click โฎ โ "Assign shortcut"
- Press any key combination (e.g.
F1,Ctrl+Shift+1,Alt+F5) - The shortcut works globally โ even when the application is minimized or in the game
- Shortcuts are saved between application restarts
| Layer | Technology |
|---|---|
| Backend | Python 3.12, FastAPI, SQLAlchemy 2.0 async, aiosqlite/asyncpg |
| Auth | JWT (python-jose), bcrypt (passlib) |
| Real-time | WebSockets (FastAPI native) |
| Logging | structlog (JSON in production) |
| Desktop | Electron 31, Node.js |
| UI | React 18, TypeScript, Zustand, Framer Motion |
| Audio | Web Audio API, HTMLAudioElement.setSinkId() |
| Hotkeys | Electron globalShortcut |
| Build | Vite 5, electron-builder |
Get the official compiled builds or join our dev team:
๐ฆ Download Latest Installer (.exe)
๐ Join the Official Ex0 Studios Discord Server
This project is maintained as an open beta under the MIT License by Ex0 Studios. See the project files for full licensing terms.