# Reaper-Web A low-latency, fully containerized deployment of REAPER DAW, accessible directly through a modern web browser via KasmVNC. This repository builds a custom Ubuntu-based image that pipes PulseAudio through a Node.js WebSocket bridge, allowing you to produce music and record microphone audio remotely without needing a local DAW installation. ## Features - **Browser-Native Audio:** High-quality, low-latency audio playback and microphone recording streamed directly to your browser via WebSockets. - **Auto-Initialization:** The audio pipeline initializes seamlessly on the first click inside the container. - **Optimized Latency Stack:** Features reduced Node.js WebSocket overhead, `tsched=0` disabled in PulseAudio, and expanded JS playback buffers to prevent crackling. - **Persistent VST/Project Storage:** Plugins (`.vst3`, `.vst`, `.lv2`) and projects are mapped to external host directories for data safety. - **Baked-In Defaults:** Includes a pre-configured `reaper.ini` tailored for the web wrapper and Openbox settings that force REAPER into a maximized view by default. ## Architecture * **Base Image:** `lscr.io/linuxserver/baseimage-kasmvnc:ubuntunoble` * **Window Manager:** Openbox (configured for forced fullscreen application view). * **Audio Backend:** PulseAudio & PipeWire * **Streaming Protocol:** KasmVNC (WebRTC/WebSockets for video, LSIO Node.js bridge for audio). ## Prerequisites - Docker & Docker Compose - Ensure your Docker host has ALSA drivers loaded (`/dev/snd` must exist on the host). ## Deployment 1. **Clone the configuration:** Ensure this project lives in your docker-compose app path (e.g. `/srv/configs/docker_compose/reaper-web`). 2. **Configure Environment:** Create an `.env` file to define your paths and secure VNC password: ```bash nano .env ``` 3. **Build and Run:** ```bash docker compose up -d --build ``` 4. **Access the DAW:** Navigate to `http://:` (e.g., `http://10.0.0.190:3010`). *Note: Microphone access requires HTTPS. If you are routing this through Nginx Proxy Manager, ensure an SSL certificate is attached and Websocket Support is enabled.* ## Data Directories Map the following volumes in your `docker-compose.yaml` to persist your data: - `/config` - Persistent application state and Reaper configurations. (If empty, it automatically populates from the image's optimized defaults on first boot). - `/projects` - Your Reaper `.RPP` files and audio recordings. - `/vst` - Legacy VST2 plugins. - `/usr/lib/vst3` - VST3 plugins. - `/usr/lib/lv2` - LV2 plugins. ## Troubleshooting - **Audio is crackling:** This is usually due to network jitter or CPU overload. The internal playback buffers have been optimized to 150ms. If you are accessing this over a VPN or a high-latency WAN connection, you may need to increase the `duration > .15` threshold in `kclient.js` inside the `Dockerfile`. - **Microphone is not working:** The browser will strictly block microphone access unless the webpage is served over **HTTPS** or accessed via `localhost`. You must use a reverse proxy to handle the SSL termination. - **"Connection Refused" Audio Error:** If you see this in the logs, ensure the PulseAudio permissions fix (`PULSE_RUNTIME_PATH=/config/.pulse` in the `Dockerfile`) is active. This bypasses root-level Docker volume permission restrictions.