StripchatRecorder. Supports post-processing, split proxies, Stripchat mirror and notifications.
7.9K
A self-hosted Stripchat live stream recorder with a web-based management UI. Supports automatic recording, post-processing pipelines, and multi-channel notifications.
1800 for 30-minute files, or 0 (default) for unlimited recording. The value auto-saves and applies to active recordings based on downloaded media duration. Completed files merge in the background while recording continues. Cuts preserve whole HLS chunks, so files can exceed the limit by one chunk; lowering the limit rotates an already-over-limit file when the next chunk arrives./stream/{modelname} to start automatically; supports multiple simultaneous clientsstripchat.com in requests with your mirror domain)pkey → pdkey key pairs for decrypting Stripchat's encrypted HLS segment filenames; supports automatic key sync from a configured URLservices:
stripchat-recorder:
image: chantrail/stripchat-recorder:latest
container_name: stripchat-recorder
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
# - LANGUAGE=en-US # Set interface language: zh-CN (default) or en-US
# - PORT=3030 # Set server port (default: 3030)
ports:
- "${PORT:-3030}:${PORT:-3030}"
volumes:
- ./data/logs:/app/stripchat-recorder/logs
- ./data/recordings:/app/stripchat-recorder/recordings
- ./data/modules:/app/stripchat-recorder/modules
- ./data/config:/app/stripchat-recorder/config
docker compose up -d
Then open http://localhost:3030 in your browser.
The Docker image runs in Server mode by default (port 3030). Configuration is written to the mounted config/settings.json.
The following options are available in the Web UI under Settings:
| Setting | Description |
|---|---|
| Output directory | Path where recordings are saved |
| Max concurrent | Maximum number of simultaneous recordings; 0 means unlimited |
| Poll interval | How often to check if a streamer is live (seconds), range 10–300 |
| Preferred recording resolution | Target stream resolution and fallback direction (prefer lower or prefer higher); if no stream exists in that direction, the nearest stream in the other direction is used instead of failing; defaults to original/highest |
| Merge format | Format for auto-merging segments after recording: mp4 (default), mkv, ts |
| Auto-record | Whether newly added streamers have auto-record enabled by default |
| Max post-process tmp dir (GB) | Size limit for temporary files created by post-processing modules; oldest files are deleted when exceeded; 0 means unlimited, default 50 GB |
In the settings page under "Network", you can configure:
Stripchat mirror project: https://github.com/ChanTrail/StripchatMirror
stripchat.com in requests with your mirror domain.Stripchat encrypts HLS segment filenames (the Mouflon system). If recordings fail to download segments, add the corresponding pkey → pdkey key pairs in Settings under "Mouflon Decryption Keys". Keys can be obtained from community channels.
You can also configure a "Sync URL" and optional "Sync Token" to automatically pull the latest keys from a specified URL.
In Server mode, you can stream any streamer's live broadcast directly to a player without adding them to the recording list:
http://localhost:3030/stream/{modelname}
The relay starts automatically on first access and supports multiple simultaneous clients on the same stream. The "Relay" page in the Web UI shows all active sessions with their state, connection count, and uptime.
docker run -d \
--name stripchat-recorder \
--restart unless-stopped \
-e TZ=Asia/Shanghai \
-e LANGUAGE=en-US \
-e PORT=3030 \
-p 3030:3030 \
-v ./data/logs:/app/stripchat-recorder/logs \
-v ./data/recordings:/app/stripchat-recorder/recordings \
-v ./data/modules:/app/stripchat-recorder/modules \
-v ./data/config:/app/stripchat-recorder/config \
chantrail/stripchat-recorder:latest
Modules are standalone executables implementing a simple protocol. They receive input via environment variables and communicate with the host via stdout.
| Module | Description |
|---|---|
contact_sheet | Extracts frames at a configurable interval and tiles them into a preview image |
filter_short | Deletes recordings shorter than a configurable minimum duration |
notify_discord | Sends recording info and cover image to a Discord Webhook |
notify_telegram | Sends recording info, cover image, and video to Telegram via MTProto (supports files >2 GB, HTTP/SOCKS5 proxy) |
Custom modules placed in the modules volume directory are discovered automatically and will not be overwritten when the container restarts. See the Module Development Guide for details.
Prerequisites: Rust, Node.js (LTS), ffmpeg
When running the binary directly, if no run mode has been configured in config/settings.json, an interactive TUI will guide you through setup:
The choices are saved to config/settings.json and the TUI will not appear again on subsequent launches.
# Install frontend dependencies
npm install
# Build frontend + Tauri binary
npm run build
npx tauri build --no-bundle
# Build post-processing modules
for dir in modules/*/; do
[ -f "$dir/Cargo.toml" ] && cargo build --manifest-path "$dir/Cargo.toml" --release --bins
done
docker build -t chantrail/stripchat-recorder .
This project is licensed under the GNU General Public License v3.0.
This project is intended for technical research and learning only. Users are responsible for deployment, operations, and compliance risks.
Content type
Image
Digest
sha256:07ad4f1b2…
Size
323.1 MB
Last updated
about 1 month ago
docker pull chantrail/stripchat-recorder