Preview
Details
NekoBeat is a multi-axis funscript video player for Windows. It reads funscripts exported from OpenFunScripter, turns multi-axis motion into device commands in real time for machines like the SR6 and OSR2, and plays the matching video in sync.
The name comes from the catgirl in the icon: Neko (cat) + Beat.
Seek safety (highlight #1)
Jump around the timeline and the device never lurches — it walks there smoothly instead.
Drag from the start of a video straight to 80 % and the device does not snap from 0 to 80 %. It moves there smoothly from wherever it is right now, and rejoins the script when it arrives. Switching videos and the loop rewind work the same way.
(How it works: instead of handing the new target straight to the device, NekoBeat splits the distance from where the device is to where it needs to be into a controlled ramp at a speed you choose, and only hands control back to the script once it has arrived.)
You choose how long a jump takes. The settings do not ask for numbers — they tell you how long the jump takes, in three steps:
- Safe (recommended): half the travel in about 1.5 s, full travel in about 3.0 s
- Standard: about 0.9 s half, 1.8 s full
- Fast: about 0.4 s half, 0.8 s full
There is also a custom step where you set the time per 1 % of travel (5–120 ms), and the dialog shows the equivalent half / full travel times live.
These actions all ease: seeking on the progress bar (playing or paused), auto-next to the next video in the library, switching loop clips, the loop rewind to A, opening a new video from a stopped state, and taking over sync when a device has just connected.
These have fixed durations and are not affected by the switch: returning to centre at the end of playback (about 1 s), Reset (about 1.2 s), and the axis-limit drag preview (about 0.7 s).
Play and pause have their own easing switch. With it on, pressing play eases the device into the script, and pressing pause glides it to the end of the current stroke (0.12–0.6 s) instead of cutting it off half-way or snapping backwards.
While you drag the progress bar, the device stays still. Only the picture follows your pointer; the device holds position. When you let go, it moves smoothly to where you stopped and resumes sync. So scrubbing around never turns into the device flailing.
Whatever you set, these always stop immediately: switching videos, stopping, disconnecting the device, quitting the program, and the panic stop.
If you would rather have a more raw feel, you can turn easing off entirely and the device will reach its target as fast as the script clock allows.
Panic stop (highlight #2)
Something feels wrong, you hit one button, and the device stops immediately.
There is a dedicated Panic stop button in the control bar, right next to play. The keyboard shortcut Ctrl+Esc does the same thing, and it works in full screen too.
- It stops right away. The device halts and the video pauses at the same moment.
- It cannot be held up in a queue. (How it works: NekoBeat first throws away every command still sitting in the serial queue, then sends the stop. Otherwise the stop command would sit behind them and the device would have to work through the whole queue before it stopped.)
- It stays stopped. A panic stop disarms the link. After that, dragging the progress bar will not move the device either, so a stray click cannot set it going again.
- Panic stop outranks a drag in progress. If you hit it while you are dragging the progress bar, releasing the pointer still will not move the device.
- Coming back is safe too. The link re-arms only when you press play again, and because the device stopped at an unknown position, resuming is forced through the safety ramp — even if you have easing switched off.
Features
Playback and sync
- Playback runs on libmpv with an OpenGL surface, so the picture stays smooth
- Play / pause / stop / recentre / seek all sit on one control bar; see above for how seeking and the panic stop behave
- Right-click the picture to pause or resume, double-click or press F11 for full screen, Esc to leave it
- In full screen the control bar hides itself and slides back when the pointer reaches the bottom edge, so it never blocks the picture
- The status bar shows a
Sync ±N msfigure: how far the device is from the picture. Smaller is tighter; if it grows, the device got held up by a stutter
Media library
- A cover grid so you can see everything you have at a glance, with duration and an axis-count badge on each card and a detail pane on the right
- Search, filter and sort the library
- Scanning runs in the background: keep browsing and playing while it finds new files, and the interface never locks up
- Thumbnails are cached; a file that has moved can be relinked; clearing the thumbnail cache does not touch your favourites
- Favourites: right-click a card to file it under any number of collections, filter the panel by collection, and create, rename, reorder and prune collections
Loops
- Mark a range with the A / B buttons, then give it a title, tags, a collection and a note
- Double-click a loop card to play that range on repeat; when it reaches B it does not hard-cut back to A but glides smoothly (the same seek safety as above)
- Filter and sort loops by collection, tag or keyword; a video can hold as many loops as you like
Heat map
- The coloured band above the control bar is the heat map: green is the slowest motion, then yellow, orange and red, with dark red the fastest. You can see at a glance where a script is calm and where it is intense
- It doubles as the progress bar: the top and bottom edges are 100 % and 0 %, and a click or drag seeks
- The colouring follows XTPlayer’s heat map: of all the heat maps I have used, that one is by far the clearest to read, so I learned the logic from it and kept the same approach here. Credit to Khrull for that
Axis control
- Axis limits: scale how far each axis travels, save any number of profiles and import or export them. With playback stopped, dragging a slider or clicking the 0 % / 100 % handle really drives the device to that limit, so you can compare the travel directly
- Axis calibration and test: set the minimum, maximum, home position, inversion and script offset of each axis; three buttons in the panel really drive the device to 0 %, 100 % and the centre
- Home is per axis: position axes return to the home point you configured, while channels that only have an intensity, such as vibration and lubrication, return to 0 — a true stop
- It asks before it moves: after connecting, NekoBeat first confirms which axes the device actually has (D0 / D1 / D2) and only then starts driving it, so it never sends commands for an axis your firmware does not have
Device link
- If the interface stutters, the device does not stutter with it (how it works: serial communication runs on its own thread, so a busy interface never delays the commands the device is due)
- USB serial and Bluetooth serial (classic SPP) are supported. Bluetooth ports are labelled
Bluetooth serial · <device>and are retried more patiently than USB, so a single timeout does not drop the link - Per-command logging is off by default; turn on “Log every TCode command (diagnostics)” under Settings when you need to troubleshoot. Otherwise the log gets one statistics line every five seconds
Interface
- A dark, minimal layout: menu bar, media library on the left, video and control bar in the middle, loop list on the right; the two side panels can swap places
- The interface language defaults to English and can be switched to Simplified Chinese under Settings, and the choice is remembered across restarts
- Resizing the window does not make the columns flicker
Notes
- Why I built it: the players I tried had too many features and too many settings buried in the wrong places, and the learning curve was steep. NekoBeat’s goal is simple — make the things you actually do every time easy: pick a video, connect the device, play, mark a loop. You should be up and running in a few minutes.
- Credits and thanks: NekoBeat learned a great deal from XTPlayer by Khrull (XTPlayer - Cross platform TCode sync (OSR, SR6) Stream your local media and sync funscripts to almost any device with a browser) and MultiFunPlayer (MFP) by Yoooi (MultiFunPlayer v1.34.6 - Multi-axis funscript player with SLR & FapTap support) — thank you both for the inspiration. I am not much of a programmer, and this started as a hobby project to get the workflow I wanted, so it is deliberately simple and shaped by what I personally needed.
- Tested on: a generic SR6.
- Free, no ads, no account.
- Privacy: nothing is uploaded anywhere and there is no telemetry; favourites, loops and the library cache stay on your own machine.
- Safety: NekoBeat drives real hardware. The panic stop (
Ctrl+Esc) is right next to play; start with conservative axis limits and try a new script at low travel before letting it run at full range.
Requirements and compatibility
- Windows 10 or 11, 64-bit
- Portable build — unzip and run, nothing to install
| Connection | Status | Notes |
|---|---|---|
| USB serial (wired) | Supported | Connect the device over USB. Once a port such as USB-SERIAL CH340 shows up in Windows, select it and connect |
| Bluetooth serial (classic SPP) | Supported | The firmware must expose Bluetooth as a serial passthrough, as most ESP32 TCode firmwares do. Pair it in Windows first, then pick the port labelled Bluetooth serial · <device> |
| BLE only (low energy) | Not supported | Devices that do not create a serial port, such as Nordic UART, would need a native Bluetooth transport, which is not implemented yet |
| WiFi / network API (for example Handy in WiFi mode) | Not supported | These need a per-vendor adapter layer |
There is no built-in device list: NekoBeat speaks TCode v0.3 over a serial port, and once connected it asks the device which axes it has and only ever drives those. So the table above is about the connection, not the model — an SR6, OSR2, SR2, OSR6 or any other TCode device should work. So far it has only been tested on a generic SR6, so if you try it on something else, please report back and I will add it to the list. One caveat: if a firmware does not answer the D0 / D1 / D2 axis query, NekoBeat falls back to the SR6 six-axis preset.
Download
- Download (GitHub Releases): Releases · Ftsuk/NekoBeat · GitHub
- Project page (GitHub): GitHub - Ftsuk/NekoBeat: Multi-axis funscript video player for Windows. Drives SR6 / OSR2 devices over TCode v0.3 serial while playing the matching video in sync. · GitHub
- Grab
NekoBeat-1.0.0-Portable.zip, unzip it and runNekoBeat.exe



