A local desktop video player with device synchronization for funscript playback. Built with Electron. Windows and Linux.
- Full-featured player with custom controls, keyboard shortcuts, and drag-and-drop
- Seek bar thumbnail preview (live frame capture on hover)
- Subtitle support (.srt, .vtt) with automatic SRT to WebVTT conversion
- Screenshot capture, picture-in-picture, aspect ratio cycling
- A-B loop points for repeat sections
- Replay button when video ends
- Script gap auto-skip with configurable countdown or skip button
- Browse and organize your video collection from one or more source folders
- Grid / list / folder-tree view toggle with thumbnail cards and live hover preview
- Drag-to-reorder sources, per-source enable/disable, overlap detection, hot-plug drive detection
- Funscript auto-pairing by filename with auto/manual badges; subtitle auto-detection
- Fuzzy search with exact-title precedence, path + collection + category matching, diacritic folding
- Sort by name, duration, average speed, max speed (matched tab only)
- Playlists, categories, and collections with pin-folder-as-collection support
- Multi-select for bulk playlist/category assignment
- Script variant detection — auto-detects multiple funscript versions per video
- Web Remote — control FunSync from your phone on the same WiFi. Library, playback, device sync. Installable as a PWA from the phone's home screen.
- VR content server — Quest standalone support via HereSphere / DeoVR. Your library appears in the headset; PC-connected devices sync automatically.
- PCVR companion bridge — DeoVR / HereSphere on PC (SteamVR, Virtual Desktop) driven via their timestamp APIs; all devices follow.
- Session status card docks bottom-right when an external source is driving playback, with a 50-entry history viewer and a VR ↔ Web Remote last-wins mutex.
- Search and download community funscripts from within the app
- Login with 2FA support (authenticator app), persistent session
- Thumbnails and metadata in search results
- One-click download — scripts auto-renamed, auto-associated, and paired with the current video
- Auto-match on video load — if no script is found locally, silently searches EroScripts and notifies
- Heatmap overlay on the seek bar (speed-colored)
- Gap indicators on the seek bar showing idle sections
- Manual funscript association with fuzzy-ranked suggestions
- Script variations — switch between multiple script versions during playback (V key)
- Multi-axis funscript support (TCode convention, 10 axes)
- Custom routing — assign different scripts to different devices per video, stable across Intiface restarts (index-first matching with name auto-heal)
- Speed stats (average/max) displayed on library cards
- PCHIP interpolation (shape-preserving, no overshoot) for smoother device motion
- Makima interpolation (less aggressive, good for oscillatory patterns)
- Configurable speed limit to prevent impossible device moves
- Per-setting persistence — configure once, applies to all playback
- The Handy — HSSP cloud sync with automatic script upload, drift detection, 10-second cloud health check (catches BT-mode switches)
- Buttplug.io — Connect to 700+ devices via Intiface Central (strokers, vibrators, rotators, e-stim)
- TCode serial (OSR2 / SR6) — USB serial with per-axis enable + min/max controls for all 10 axes (experimental)
- Autoblow Ultra / VacuGlide 2 — Cloud API (experimental)
- Auto-connect on startup — Handy and Buttplug.io connect automatically if previously configured
- Per-device offset controls + unified Sync tab showing total effective offset (VR + device stacking)
- Device simulator overlay showing real-time stroke position
- Works without any device connected — pure video playback is fully functional
- OFS-style action graph with centered playhead and speed-colored lines
- Numpad placement (0-9 maps to position 0-100), frame-by-frame stepping, snap-to-frame toggle
- Selection, copy/paste, undo/redo (per-script history persistence)
- Multi-script selector for multi-axis / custom-routing editing
- Modifier tools: half/double speed, remap range, offset time, remove pauses, reverse
- Pattern generator: sine, sawtooth, square, triangle, escalating, random
- Gap detection and fill with configurable patterns
- Audio waveform display and beat detection for music-synced scripting
- Metadata editor (title, creator, tags, performers)
- Bookmarks with named markers on the graph
- Live device preview on numpad placement (when sync engine is idle)
- Autosave toggle (off by default, shows save timestamp when enabled)
- TCode convention detection (10 standard axes)
- Companion file detection by filename suffix
- Axis-to-device feature mapping
- Searchable dropdowns for axis assignment with fuzzy matching
- Settings, playlists, and categories stored locally (no cloud, no account)
- Export/import backups as .funsync-backup zip files
- Automatic updates — notified when a new version is available; you control download AND install (no silent install on app quit)
- All user data preserved across updates
- Download the latest installer from the Releases page
- Windows:
FunSync Player Setup X.Y.Z.exe - Linux:
FunSync-Player-X.Y.Z.AppImage
- Windows:
- Run the installer / AppImage
- Windows: no admin required, installs per-user
- Linux:
chmod +xthe AppImage, then run
- The app launches automatically
Updates are checked on startup. When a new version is available, a toast appears — click Download, then Restart Now when ready.
| Key | Action |
|---|---|
| Space / K | Play / Pause / Replay |
| Left / Right | Seek 5s |
| J / L | Seek 10s |
| Up / Down | Volume |
| M | Mute |
| F / F11 | Fullscreen |
| O | Open file |
| H | Device panel |
| S | Screenshot |
| I | Info overlay |
| A / B | Loop points |
| Escape | Clear loop / close panels |
| R | Cycle aspect ratio |
| E | Toggle script editor |
| D | Toggle device simulator |
| V / Shift+V | Cycle script variants |
| G / Shift+G | Skip to next/previous action |
- Windows 10/11 (x64) or Linux (AppImage — Ubuntu 22+, Fedora 38+, SteamOS)
- Intiface Central for Buttplug.io device support (optional)
npm install
cd backend && python -m venv .venv && .venv/Scripts/pip install -r requirements.txt && cd ..
npm run buildRequires Node.js 18+, Python 3.11+, and ffmpeg/ffprobe binaries in the ffmpeg/ directory (or ffmpeg-linux/ for Linux).
See the repository license file.