Sign inSign up

chantrail/stripchat-recorder

By chantrail

•Updated about 3 hours ago

StripchatRecorder. Supports post-processing, split proxies, Stripchat mirror and notifications.

Image
Integration & delivery
Web servers
Content management system
2

7.9K

chantrail/stripchat-recorder repository overview

⁠StripchatRecorder

简体中文⁠ | English⁠

A self-hosted Stripchat live stream recorder with a web-based management UI. Supports automatic recording, post-processing pipelines, and multi-channel notifications.

License: GPL-3.0 Docker Image


⁠Features

  • Monitor multiple streamers and auto-record when they go live
  • Automatic file rotation: set Recording File Duration (seconds) in Settings to 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.
  • Web UI for managing streamers, recordings, and post-processing
  • Streamer Finder: discover streamers via camgirlfinder.net⁠, supporting:
    • Face search: upload an image, auto-detect a face, and find similar streamers
    • Name search: search by username keyword
    • One-click add to recording list directly from result cards
    • Launch a similar-face search from any streamer card
  • HLS Relay: proxy a streamer's live stream to any player without recording — open /stream/{modelname} to start automatically; supports multiple simultaneous clients
  • Supports split network proxies: configure Stripchat API proxy and CDN chunk proxy separately
  • Supports configurable Stripchat mirror site (replaces stripchat.com in requests with your mirror domain)
  • Mouflon HLS decryption: manage pkey → pdkey key pairs for decrypting Stripchat's encrypted HLS segment filenames; supports automatic key sync from a configured URL
  • Configurable post-processing pipeline with pluggable modules:
    • contact_sheet — generates a tiled preview image with timestamps
    • filter_short — deletes recordings below a minimum duration
    • notify_discord — sends recording info and cover image to a Discord Webhook
    • notify_telegram — sends recording info, cover image, and video via MTProto (supports files >2 GB, HTTP/SOCKS5 proxy)
  • Disk space monitoring on the recordings page, with a warning highlight when less than 5 GB remains
  • Dual runtime: Tauri desktop app or headless server accessible via browser
  • Real-time UI updates via Server-Sent Events with multi-client sync
  • Dark/light mode following system theme
  • Custom UI language support, see Custom Locale Guide⁠

⁠Quick Start (Docker)

services:
  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.

⁠Key Settings

The following options are available in the Web UI under Settings:

SettingDescription
Output directoryPath where recordings are saved
Max concurrentMaximum number of simultaneous recordings; 0 means unlimited
Poll intervalHow often to check if a streamer is live (seconds), range 10–300
Preferred recording resolutionTarget 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 formatFormat for auto-merging segments after recording: mp4 (default), mkv, ts
Auto-recordWhether 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
⁠Network Proxies and Mirror

In the settings page under "Network", you can configure:

Stripchat mirror project: https://github.com/ChanTrail/StripchatMirror⁠

  1. API Proxy: used for Stripchat API access; if a mirror is also set, mirror requests go through this proxy.
  2. CDN Proxy: used for downloading live stream chunks; can be configured independently from the API proxy.
  3. Stripchat Mirror: replaces stripchat.com in requests with your mirror domain.
⁠Mouflon HLS Decryption Keys

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.

⁠HLS Relay

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

⁠Post-processing Modules

Modules are standalone executables implementing a simple protocol. They receive input via environment variables and communicate with the host via stdout.

⁠Built-in Modules
ModuleDescription
contact_sheetExtracts frames at a configurable interval and tiles them into a preview image
filter_shortDeletes recordings shorter than a configurable minimum duration
notify_discordSends recording info and cover image to a Discord Webhook
notify_telegramSends 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.


⁠Building from Source

Prerequisites: Rust, Node.js (LTS), ffmpeg

⁠First-launch Setup

When running the binary directly, if no run mode has been configured in config/settings.json, an interactive TUI will guide you through setup:

  1. Select UI language (Chinese / English)
  2. Select run mode (Desktop / Server)
  3. If Server mode, enter the listen port (default 3030)

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
⁠Build Docker image
docker build -t chantrail/stripchat-recorder .

⁠Tech Stack

  • Frontend: Vue 3, TypeScript, Vite, Tailwind CSS, Reka UI
  • Backend / Desktop: Rust, Tauri 2
  • Post-processing modules: Rust (standalone binaries)
  • Container: Debian, ffmpeg

⁠License

This project is licensed under the GNU General Public License v3.0⁠.


⁠Disclaimer

This project is intended for technical research and learning only. Users are responsible for deployment, operations, and compliance risks.

Tag summary

Content type

Image

Digest

sha256:07ad4f1b2…

Size

323.1 MB

Last updated

about 1 month ago

docker pull chantrail/stripchat-recorder