Skip to content

Latest commit

ย 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽ™๏ธ CloudSoundboard (Beta v0.1.0)

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


๐ŸŒ Active Beta Live Server

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 full https:// prefix so the desktop app can establish a secure handshake with the database and WebSockets.


Architecture


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


Data Model

users

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

sounds

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

Quickstart (For Developers)

Backend Local Hosting

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.

Client Local Hosting

cd client

npm install

# Development (runs Vite + Electron)
npm run dev

# Production build
npm run dist

REST API overview

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

WebSocket messages (server โ†’ client)

{ "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": "..." }

Production configuration

  1. Database: Change DATABASE_URL to PostgreSQL in .env
  2. SECRET_KEY: Generate: openssl rand -hex 32
  3. HTTPS: Deploy behind nginx or Caddy with TLS certificate
  4. S3: Set USE_S3=true and AWS credentials โ€“ then implement S3StorageBackend in file_storage.py
  5. ALLOWED_ORIGINS: Adjust for production domain

Virtual Audio Cable (Discord)

  1. Install VB-Audio Virtual Cable (free): https://vb-audio.com/Cable/
  2. In CloudSoundboard settings โ†’ Audio output โ†’ select CABLE Input (VB-Audio Virtual Cable)
  3. In Discord โ†’ Voice & Video โ†’ Input Devices โ†’ CABLE Output (VB-Audio Virtual Cable)
  4. Sounds played in CloudSoundboard will be transmitted as your microphone to Discord.

Keyboard shortcuts

  • 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

Technology

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

๐Ÿ’ฌ Community & Downloads

Get the official compiled builds or join our dev team:

๐Ÿ“ฆ Download Latest Installer (.exe)

๐Ÿ‘‰ Join the Official Ex0 Studios Discord Server


License

This project is maintained as an open beta under the MIT License by Ex0 Studios. See the project files for full licensing terms.


About

A shared cloud soundboard desktop app for Windows with real-time WebSocket syncing.

Topics

Resources

Code of conduct

Security policy

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages