A self-hosted web soundboard app. Upload audio clips, organize them into boards, assign hotkeys, and share via private, unlisted, or public links.
- Multi-user accounts (email + password)
- Create multiple soundboards with categories
- Drag-and-drop clip upload with waveform previews
- Per-clip volume, loop, and keyboard hotkeys
- Global stop, search, and drag-to-reorder
- Three visibility modes: private, unlisted, public
- Public explore gallery
- Hybrid local-first caching (IndexedDB) with offline upload queue
- Docker deployment with SQLite + on-disk audio storage
cp .env.example .env
# Edit .env and set AUTH_SECRET (openssl rand -base64 32)
docker compose up --buildOpen http://localhost:3000.
Requires Node.js 20+.
cp .env.example .env.local
npm install
npm run db:migrate
npm run dev| Variable | Description | Default |
|---|---|---|
AUTH_SECRET |
Auth.js session secret | required |
NEXTAUTH_URL |
Public app URL | http://localhost:3000 |
DATABASE_URL |
SQLite path | file:./data/app.db |
UPLOAD_DIR |
Audio file storage | ./data/uploads |
MAX_UPLOAD_BYTES |
Max clip size | 10485760 (10 MB) |
-
Run the app via Docker or
npm run build && npm starton port 3000. -
Install URL Rewrite and ARR.
-
Create a site and add a reverse proxy rule:
- Pattern:
(.*) - Rewrite URL:
http://localhost:3000/{R:1}
- Pattern:
-
In
web.config, increase upload limits:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="20971520" />
</requestFiltering>
</security>
</system.webServer>- Set
NEXTAUTH_URLto your public HTTPS URL.
See PLAN.md for the full implementation plan and architecture.
MIT