FunSync Player — All-in-one video player with built-in editor, EroScripts search, and multi-device sync

:movie_camera: What is it?

FunSync Player is a free local desktop video player built for funscript playback. Everything in one
app — player, editor, library, device sync, and EroScripts integration.


v0.4.0 Update — VR, Web Remote, and Linux

New release is live. Existing installs: you’ll be prompted to update on next launch — click
Download, then Restart Now when you’re ready. The updater no longer installs silently on quit —
you control the timing.

:goggles: VR support (the big one)

Two modes, both plug into your existing FunSync setup:

  • Quest standalone — FunSync serves your full library to HereSphere on your headset.
    Thumbnails, funscripts, chapter markers, and filters all work. Pick a video in the headset → devices
    on the PC sync automatically. Bluetooth toys drive from the PC’s Buttplug.io stack, the Quest never
    touches Bluetooth.
  • PCVR companion — HereSphere running on PC (SteamVR, Virtual Desktop, etc.) — FunSync
    reads their timestamp API and routes to every connected device.

Set-up takes one URL copy-paste on the Quest side.

:iphone: Web Remote

Control FunSync from your phone on the same WiFi: http://<PC-IP>:5123/remote/. Browse your
library, pick a video, devices on the PC follow along. Works for Handy, Buttplug, TCode, Autoblow.
Installable as a PWA from the phone’s home screen for a native-feeling launcher. No app store, no
account.

Shares the desktop’s library, collections, playlists, categories, search, and folder browse.
View-only for groupings (create/edit on the desktop).

:dna: VR ↔ Web Remote mutex

Last-wins handover. If you’re driving from the phone and start a VR session, the phone bridge tears
down cleanly and the VR session takes over — toast tells you what just happened. Devices stay bound
to one source, no silent stepping on each other.

A small status card docks bottom-right whenever an external source is driving playback, showing
what’s connected, what’s playing, and which devices are live. 50-entry session history with a clear
button.

:open_file_folder: Library — folder-tree browse + source management

  • Folder mode alongside grid and list. Folder cards show thumbnail mosaics of their contents.
    Breadcrumb nav, collapse per source.
  • Pin folder as collection — right-click any folder to make it a selectable collection that
    auto-tracks new videos you drop in.
  • Source management — drag sources to reorder, per-source enable/disable toggle (keep offline
    drives in the list without scanning), overlap detection at add-time, rename/delete.
  • Search overhaul — type the exact filename, the matching video is now always first. Token
    matching, diacritic folding (café finds cafe), path + collection + category search, all shared
    between desktop and phone.

:penguin: Linux support

.AppImage build now ships alongside the Windows installer. Built and tested on Ubuntu; should work
on Fedora / SteamOS. Mark it executable, run, done.

:wrench: Device fixes

  • Handy WiFi/BT ghost fixed — the app now polls the handyfeeling cloud every 10s. When you
    switch the device to BT mode, the stale WiFi indicator clears within ~10 seconds instead of
    lingering forever. Big quality-of-life fix if you use the same device via both paths.
  • Buttplug per-device state cleanup on removal — no more inherited axis/mode settings when a new
    device takes a recycled Intiface index.
  • Custom routing — index-first matching — routes now survive Intiface restarts by tracking
    stable device indices + names; reassign themselves automatically if Intiface reshuffles.
  • TCode — full 10-axis UI (L0/L1/L2/R0/R1/R2/V0/V1/V2/A0) with per-axis enable + min/max range.
  • Offset / sync panel — the Handy offset on the Handy tab and Sync tab now stay in sync live.
    When VR is driving, each device row shows the total effective offset (device + VR pipeline added
    together) so you can see the stacking and don’t double-compensate.

:sparkles: Small stuff that matters

  • Auto-updater: you choose when to install. No silent install on quit.
  • Search “Sorted by relevance” pill on the library header while a query is active.
  • Unmatched tab: speed sort options correctly disabled (nothing to sort on).
  • Kebab menu auto-closes cleanly on scroll/tab/filter change (no ghost menus).
  • List-view subtitle + funscript badges + category dots now render correctly (previously threw
    silently in list view).
  • Rapid-seek (J/L spam) no longer leaves the Handy briefly silent after a flurry.
  • Playlists + categories: auto-detected funscripts like Foo (Part B).funscript now found when
    playing from those views, not just manually associated ones.
  • 1544 JS tests + 172 Python tests, matrix-built on Windows and Ubuntu.

Full changelog: Release v0.4.0 ·
DaveMakesWaves/funsync-player


v0.3.0 Update — Device Expansion + Custom Routing

New release is live. If you already have FunSync installed, you’ll be prompted to update on next
launch.

New device support (experimental):

  • E-stim devices (DG-LAB Coyote, MK-312BT, ET-312) via Buttplug.io — with safety cap and ramp-up
  • Rotation devices (Vorze A10 Cyclone) via Buttplug.io
  • TCode serial (OSR2 / SR6) — direct USB connection, multi-axis
  • Autoblow Ultra / VacuGlide 2 — cloud API sync

These are built to spec and tested in simulation but not verified on physical hardware yet. If you
own any of these devices, I’d love your feedback.

Custom Routing — multi-device script assignment:

  • Assign different funscript files to different devices per video
  • Set up in the Associate Funscript modal → Custom Routing tab
  • Saved per-video, persists across sessions
  • Works with any combination of Handy, Buttplug, TCode, Autoblow

Library improvements:

  • Filters, search, sort, and view mode now preserved when navigating back from player
  • No more full re-scan every time you return to library
  • Loading spinner during scan
  • External drive hot-plug detection — toast on disconnect/reconnect, auto-refresh
  • Fuzzy auto-matching catches near-identical filenames that exact matching missed

Other fixes:

  • Controls auto-hide properly after mouse stops moving
  • Devices stop immediately on back button (no delay)
  • Variant selector shows correct name when switching back to Default
  • Script variations naming modal — pick from suggestions or type custom name

Full changelog: Release 0.3.0 · DaveMakesWaves/funsync-player · GitHub

Release 0.3.0 · DaveMakesWaves/funsync-player · GitHub |


Post this as a reply to your existing thread, or edit the original post to add it at the top with a
horizontal rule separating it from the original content.

:construction: Early Release — This is a fresh v0.3.0 launch. It works well but there will be
bugs. If anything seems broken or behaves unexpectedly, drop a comment below or open an issue on
GitHub and I’ll patch it. Active
development.

:zap: Why another player?

FunSync is a single install — open it, point it at your video folder, and go.

What you get:

  • Video player with heatmap seek bar, thumbnail preview, subtitles, A-B loop
  • Library with thumbnail grid, search, playlists, categories, hover video preview
  • Built-in script editor edit and play without switching apps
  • The Handy + Buttplug.io with auto-connect on startup
  • Multi-axis support route vib scripts to Buttplug.io vibrate devices

:star2: EroScripts Integration

Search and download scripts without leaving the player. Log in once, search by video name, one click
to download. Scripts auto-rename to match your video and load immediately.

Load a video without a script? The app searches EroScripts automatically and notifies you if a match
exists.

:fast_forward: Gap Auto-Skip

Scripts with long idle sections? The app detects gaps and either shows a Netflix-style skip button
or auto-skips with a countdown. Configurable threshold from 5-60 seconds. Press G to skip manually
anytime.

:twisted_rightwards_arrows: Script Variants

Got multiple versions of a script (soft, intense, half-speed)? FunSync detects them automatically
from filenames. Switch mid-playback with the V key — heatmap updates instantly, device re-syncs.

:ocean: Script Smoothing

PCHIP interpolation for Buttplug.io devices — the same algorithm MultiFunPlayer uses. Smooths out
jerky direction changes without overshoot. Configurable in Settings alongside a speed limiter.

:control_knobs: Device Support

  • The Handy — HSSP cloud sync, auto-connect, drift detection, re-sync
  • Buttplug.io / Intiface Central — auto-connect on startup, auto-scan, multi-device
  • Multi-axis — dedicated .vib.funscript routed to Buttplug.io vibrate devices while Handy
    handles stroke
  • No device? No problem — it’s also just a solid video player on its own

:pencil2: Built-in Script Editor

OFS-style action graph built into the player. Numpad placement, beat detection, waveform display,
pattern generator, gap filler, modifiers (half/double speed, reverse, remap range). Edit a script
and immediately play it back with your device — no export/import cycle.

:warning: Heads up

  • Windows only for now Linux version is available but untested
  • Script editor and multi-axis are usable but still being refined
  • No code signing yet — you’ll get a SmartScreen warning on first install. Click “More info” → “Run
    anyway”
  • This is a passion project, not a company

:speech_balloon: Feedback welcome

What’s missing? What’s broken? What would make you switch from your current setup? I’m actively
developing this and want to build what the community actually needs.

Download |
GitHub

Buy Me a Coffee at ko-fi.com

21 Likes

Hope this works with the handy 2, been looking for a new player since handycontrole buggs out alot on stroke length with the handy 2.

1 Like

Yes, it works with Handy 2 via the same WiFi connection key.
If you hit any stroke range issues, let me know and I’ll investigate.

Ill check back a year from now. Ill bookmark it for now

1 Like

This looks really promising.
I only got 2 complaints.

The bigger problem for me is that it seems to only recognize videos in the main folder and not the subfolders. I have them organized by creator or fandom. I am not planning to throw them all in one unorganized folder.

The smaller problem is I separate them between “animated” and “real porn” so two main libraries.
So an option to add multiple libraries and then select an active one, or an option to toggle them on and off, would be nice.

I will definitely give this a try if you can add subfolder support.
But what you already have looks really good.

Good luck with your project! :+1:

2 Likes

Yeah, i agree with you about the subfolder issue, ill sort that and put it out with the next patch.

As for the 2 main libraries i think i have a solution for how that could work so ill add that to the feature list

Thanks for the feedback much appreciated :grin:

2 Likes


Based on what you said about separate views I’ve prototyped this, it still needs real testing but as a concept i think it works

1 Like

This looks fucking cool.
I gotta try this on linux.

1 Like

Thank you i really appreciate that!

Linux compatibility is on my to-do list, you can try it to see what works and what doesn’t, it may be more functional than you expect but ill need to split my disk and install a distro before I can do any comprehensive testing.

1 Like

What you added looks like what ScriptPlayer calls Playlist, right?

What I mean is that I have two source folders.

Real Porn

Animation

I meant a way to load either all videos from one source, such as Animation, or from another source.

UI-wise, my first thought was to have a menu open when you press the “Change Directory” button (top right), in which you have a list of folders with a boolean to decide which videos to show.

If you still can’t understand what I mean, I can open Paint and try to show you what I mean.

No idea if my suggestion is even compatible with your vision of the program, though.

If you want to continue this conversation, I think it’s better if you message me privately to not clutter this topic too much. Your call.

1 Like

Good idea, I’ve sent you a message

This looks cool! I’d like to request support for Vacuglide 2 so that funscripts can be uploaded to it.

Would be really cool if it could fetch media from Stash. Is that something that is out of scope for this app?

1 Like

fetching from the stash may be tricky, does this have an import/ export data option?

I can look into this, keep an eye out for updates but since i dont own the device testing would have to be down to the community so i would have to release it as an experimental feature

1 Like

What about VR? Wish HereSphere had something like this.

Good job, I’ve already found a bug with the interface. Is it better on GitHub or here?

Not really looked into it, I’d imagine it would involve some work but I’ll add it to the list

2 Likes

Here is fine, thanks :grin:

If you set the Unmatched filter and change directory, the interface will display Matched, but the Unmatched filter will still be applied.