UwU Player — watch, feel, remember: the whole script setup in one app [Updated v0.6.0: TCode support]

UwU Player is a local media player built for the way scripts are shared here: download a funscript, drop it next to its video, press play — your device follows along. Your files stay on your machine, and the same app runs on Windows and Android.

A scripted setup usually means a video player, a script player beside it, a connection bridge, a file browser and a script editor. UwU is all of it in one app — plus the parts the chain was missing: read a script before you play it, reshape any script at playback time without editing the file, and look back on every session afterwards.

New in v0.6.0: TCode device support (preview) — OSR2, SR6, FUNSR1 and other DIY builds connect natively over Bluetooth or USB serial, no bridge app. Plus an anchor jump that skips a script’s quiet gaps with one press, and a jog slider for the Handy. Details in the changelog below.

Quick facts

  • Windows 10+ / Android 8.0+ (iOS, Linux, macOS planned) — one app for the whole loop: library, playback, script engine, device connection
  • Funscripts are discovered, not configured: drop one next to the video and press play — full MultiFunscript multi-axis support, native Vorze CSV
  • Script visualizer: per-axis waveforms, intensity heat coloring, speed views, millisecond global offset
  • Script Post-Processing: invert, smoothing, speed limit, idle fill — live during playback, original file untouched
  • Four device paths: The Handy, Vorze direct Bluetooth, TCode DIY builds (preview), Intiface Central for everything else
  • Session Recap dashboard: activity heatmap, per-actuator charts, KPIs, device ranking

One app, not a setup

Library, player, script engine and device connection share one window (or one phone screen). Seeking, pausing and speed changes are followed natively — the same app runs all three, so there is no sidecar app to keep in sync.

The player half is a real media player: multi-format playback, stepless 0.25x–3.0x speed, smart resume, touch gestures on mobile, desktop shortcuts (Space, ←/→, F/Enter, Esc). New in this release, the anchor jump: the flag button (N) jumps to the script’s next action point, over the dead gaps, landing a beat ahead so the device eases in.

Scripts are discovered, not configured

A .funscript next to the video is the whole setup — picked up when you press play, no import step. Your videos and scripts stay plain files on disk.

  • MultiFunscript files load as-is, the file name picks the axis: video.twist.funscript → R0, video.surge.funscript → L1
  • Vorze’s native CSV scripts are read too — piston / cyclone / ufosa / ufotw in the name selects the device

A library, not a file browser

Multiple watched folders, incremental scans, and the result stays navigable: thumbnails, search, favorites, custom tags, watched/unwatched tracking with NEW badges, per-folder summaries — plus maintenance tools like batch duration backfill and thumbnail regeneration.

Read a script before you feel it

The visualizer draws every axis of a script as a waveform during playback — position lanes, speed views, and intensity heat coloring from calm blue to intense red, on by default.

  • Standard heatmap scale maps speed onto a fixed 0–600 UPS range, so “red everywhere” means the same in every script; Auto contrast normalizes to the current script for maximum detail
  • A script running early or late? Adjust mode shifts the whole thing by a global offset, to the millisecond — file untouched

Reshape any script to your taste — no file editing

Every script here was authored on someone else’s device, for someone else’s taste. When that shows, it’s four switches — each re-rendering the waveform live, and the device follows the processed timeline:

  • Invert — mirrors the whole script (100 − p) for a reversed axis
  • Smoothing — folds jitter inside dense passages into single clean strokes, timing untouched
  • Speed limit — re-times passages above your max speed to a pace the device can actually follow
  • Idle fill — bridges long dead gaps with a gentle synthetic stroke at your rhythm

The original file is never modified, and an Adjusted badge shows while the device follows your version instead of the author’s. Invert is free for everyone; the other three are Supporter perks — free to preview, acting on device output once you upgrade.

Devices, connected the native way

Device Connection Notes
The Handy Native protocol via the Handy cloud Paste the Connection Key from handyfeeling.com and play; playback drift compensated automatically; firmware 4+
Vorze (A10 Piston SA / Cyclone SA, UFO SA / UFO TW) Direct Bluetooth — no Intiface Warns you if Intiface Central is holding the device
TCode builds (OSR2, SR6, FUNSR1, …) Bluetooth or USB serial — new, preview No bridge app; model presets + Detect axes reads your build’s real axis table; one device at a time; Android: Bluetooth only
Everything else Intiface Central (Buttplug) Free and open source, broad compatibility

The device panel shows live status with adjustable output range and direction (0–100%) — the slider doubles as a stroke limiter. Every device gets a card in the Devices tab: adapter badge, motion test, script dry-run; the Handy’s adds a jog slider to drive the slide by hand.

A record of every session

Whenever a connected device moves, the recorder keeps the log — what played, which device, how intense. Each device card has a Rec switch: Rec ON writes that device into the session, Rec OFF keeps it out without unplugging.

  • The Recap dashboard opens on a 6-month activity heatmap (everyone) — click a day and the session list re-centers on it; Supporters add past-session browsing with merging, trend chart, KPIs and device ranking
  • Session detail turns the log into per-actuator motion and speed charts plus stats: active vs resting time, max & average speed, total travel distance

Feedback & downloads

Questions, bug reports, feature requests — the feedback form on the website or in the app (no login needed), or a comment below. Full usage guide: uwuplayer.com/docs.

Windows 10+ and Android 8.0+ today; iOS, Linux and macOS planned — the more people ask, the higher it climbs. Downloads, the full feature tour and the script guide: uwuplayer.com.

Changelog (last updated: 2026-10-25)

v0.6.0

New features:

  • Added TCode device support (preview): connect natively over Bluetooth or USB serial and choose the transport in the connection UI, with built-in device presets for SR6, FUNSR1 and OSR2. (Bluetooth only on Android)
  • Added “jump to next script anchor”: a new anchor button in the playback controls, or press N to jump straight to the script’s next anchor, making it easy to skip gaps in the script
  • The device test area now includes a stroke jog slider for the Handy, so you can drag its position directly

v0.5.1

New features:

  • Added Script Post-Processing: Invert, Smoothing / noise reduction, Speed limit and Idle fill can now be applied to the script live during playback, previewed in real time on the script visualizer, with an “Adjusted” indicator while active; Smoothing, Speed limit and Idle fill are Supporter perks — free to preview, taking effect on device output automatically after upgrading
  • The script visualizer’s intensity coloring is now on by default, with a new “Heatmap color scale” setting: standard (fixed 0–600 UPS mapping, comparable across scripts) or auto-contrast (normalized to the current script)
  • The speed view now supports coloring by intensity
  • Device connection adapter tabs now arrange as a 2×2 grid on narrow screens
  • Improved the Patreon login flow: unlinked accounts now get a register / email-login guide instead of a dead end
    Bug fixes:
  • Fixed Windows title-bar minimize/maximize/close buttons occasionally becoming unresponsive

v0.5.0

New features:

  • Added a dedicated “Devices” tab: device connection and control now live on their own main tab, with new device test runs; the floating button on the player screen still opens the same panel, which is drag-resizable on narrow screens
  • Device cards now show a connection-adapter badge
  • Position lanes in the script visualizer can now flip to a “Speed view” showing the speed curve
  • Added a speed unit preference (strokes/s or u/s), applied consistently in the script visualizer and session stats
  • Added desktop keyboard shortcuts: Space play/pause, Left/Right seek 10 seconds, F/Enter fullscreen, Esc exit
  • Handy now supports manual zeroing
  • Warns when Intiface Central holds a Vorze device on BLE direct, with device cards hinting at available native connections
  • Improved dark-theme error colors, status colors, narrow-screen layout, script-visualizer alignment details and wording
    Bug fixes:
  • Fully fixed Windows file/folder dialogs becoming unresponsive
  • Fixed the dashboard trend chart rendering incorrectly with only a few sessions

v0.4.1

New features:

  • The Review tab is now a session dashboard: session-level stats with the session list moved into a “Recent sessions” card
  • Added a session trend chart and a 6-month activity heatmap to the dashboard (supporter exclusive), with hover details and per-metric colors; heatmap taps re-center the recent sessions card
  • Added an actuator speed chart rendered as a step line
  • The script visualizer now opens with a single expanded axis and keeps the rest collapsed
  • Added library maintenance: batch-backfill missing video durations and generate or regenerate thumbnails
  • Media scanning now runs as a non-blocking, cancellable banner instead of a full-page progress screen; missing video durations are backfilled automatically during lazy thumbnail loading
  • Better wide-window layout: switch to a side navigation rail on wide windows (new navigation layout preference), and page content width now adapts to the window size
    Bug fixes:
  • Fixed Patreon action rows only being tappable across part of their area
  • Fixed the tier badge and account labels not reflecting the effective tier

v0.4.0

New features:

  • Script sync now supports the native Handy protocol
  • Added a global script offset setting
  • Added an intensity heat render mode to the script visualizer
  • Folder view can now sort by path or last played
  • The media library header now shows the media count
  • Added a “Check for Dev Updates” entry on the About page (supporters only)
  • Improved some in-app wording and translations
    Bug fixes:
  • Fixed cover thumbnail generation failing for audio files with embedded cover art
  • Fixed UI stutter during media thumbnail generation on Windows
  • Fixed playback progress not being saved in some cases

v0.3.2

New features:

  • Added script visualization (currently in preview; its structure may change in future updates)
  • Media cards now show watch state: unwatched items display a NEW badge; right-click or long-press a card to mark it watched or unwatched
  • The filter dialog adds a watched/unwatched filter and improved interactions
  • The flat view grid now supports adjustable card size
  • The folder list shows summary info per folder: media count, unwatched count, and last played time
2 Likes

MacOS please!

What Apple device do you have?

Android
tried it out last night!
im not sure if it was intifiace or the player probably intiface but it keep disconnecting after every 2 videos or so.
would like to see a marked as watched button for videos!
everything else was great :+1:

Thanks for trying it out! Glad to hear everything else was great.

I’ll try to reproduce the Intiface disconnecting issue locally to investigate what’s going on.

As for the “watched” button, your suggestion has been received and the watched/unwatched display and filtering feature is currently being worked on. It’s expected to be released this week!

1 Like

Update: v0.3.2 is out :tada:

Quick follow-up to share what’s new in the latest release. This round is mostly about keeping a large collection easy to track — plus a fun new way to look at your scripts.

Script visualization (preview) You can now watch the script itself, not just feel it. The action chart draws out each axis as playback runs, so you can see what’s coming. It’s currently in preview — the structure may change in future updates as it settles.

Watch state on media cards Cards now show where you left off: unwatched items get a NEW badge, so it’s easy to spot what you haven’t gotten to yet. Right-click (or long-press on Android) a card to mark it watched or unwatched.

Library niceties

  • The filter dialog gained a watched/unwatched filter, along with some interaction polish.
  • The flat view grid now has adjustable card size — make those thumbnails as big or as small as you like.
  • The folder list shows a summary per folder: media count, unwatched count, and when you last played something from it.

That’s it for this round. If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

1 Like

Update: v0.4.0 is out :tada:

This round is headlined by native Handy support, plus two additions to the script visualizer that make a script easier to read before and during playback.

The Handy, native protocol The Handy now connects through the Handy cloud: grab the Connection Key from handyfeeling.com, paste it into the “Handy cloud” tab in the device panel, and play. The session bar shows how the device is keeping up (following / sync / buffer), drift from the playback position is compensated automatically, and seek, pause, and speed changes are followed. The output range slider doubles as a stroke limiter, so you can keep the device working within a range you like. The cloud connection needs firmware 4 or later, and response speed depends on your network.

Intensity heat coloring The visualizer’s line can now be colored by intensity — blue for calm, red for intense. On position axes that reflects stroke speed; on vibration and rotation, command strength. Handy for spotting the rough stretches of a script before you’re in one. The setting is saved and can be toggled during playback.

Global offset If a script runs consistently early or late, the chart’s adjust mode now drags all lanes as one: line the waveform up with the red playback position line and the offset applies to the whole script, in milliseconds, with a reset button to zero it out. Zooming in gives you finer control.

Library niceties

  • Folder view can sort by path or last played.
  • The library header now shows the media count.
  • The About page gained a “Check for Dev Updates” entry (supporters only).

Under the hood: fixed cover thumbnails failing on audio files with embedded art, thumbnail-related UI stutter on Windows, and playback progress not being saved in some cases.

If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

Update: v0.4.1 is out :tada:

This round is about looking back: the Session History tab has grown into a full session dashboard, and the library gained some long-overdue upkeep tools.

The Recap dashboard The tab you knew as Session History is now Recap. It opens on a dashboard instead of a plain list, starting with a 6-month activity heatmap — visible to everyone — where the color depth is that day’s usage time. Click a day and the Recent Sessions card re-centers on it. Supporters additionally get the session trend chart (per-metric colors, hover details), KPI summaries like total sessions and longest session, and a device ranking.

Speed view in session detail Actuator cards in the session detail can now toggle their chart between the motion curve and a speed view drawn as a step line — how hard the device was actually working, at a glance.

Visualizer default view The script visualizer now opens with a single expanded axis and keeps the rest collapsed, so multi-axis scripts start readable.

Library niceties

  • New library maintenance tools: batch-backfill missing video durations, and generate or regenerate thumbnails.
  • Media scanning no longer takes over the screen — it runs as a cancellable progress banner while the library stays usable, and missing durations are backfilled automatically as thumbnails lazy-load.
  • Wide windows get a side navigation rail (new navigation layout preference), and page content adapts to the window width.

Under the hood: fixed Patreon action rows only being tappable across part of their area, and the tier badge / account labels not reflecting the effective tier.

If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

1 Like

Update: v0.5.0 is out :tada:

This round gives devices a home of their own: a dedicated Devices tab for connection, control, and testing — plus a speed view in the script visualizer, Handy zeroing, and desktop keyboard shortcuts.

The Devices tab Connection and control move out of the player’s floating panel into their own main tab. New here: device testing. Every device card has a quick test action for a short motion check, and script test playback drives the device with a script right from the tab — a dry run to check response and direction before the real thing. The floating button on the player screen still opens the same panel as before, which is now drag-resizable in height on narrow screens. Device cards also carry a connection-adapter badge, so a device connected over BLE direct, Intiface Central, or the Handy cloud is identifiable at a glance.

Speed view in the visualizer Position lanes can now flip from the position waveform to a speed view of the same axis — handy for seeing where a script pushes hard, not just where it goes. A new speed unit preference (strokes/s or u/s) is applied consistently in the visualizer and the session stats.

Handy zeroing The Handy’s card gains a reset action: it stops any running session and gently drives the slide back to the zero position at the top of the stroke window — for when a manual test or an interrupted script left it mid-travel.

Connection hints If Intiface Central is holding a Vorze device while you try a direct Bluetooth connection, the app now says so, and the device card hints at the native connections available.

Desktop keyboard shortcuts Space toggles playback, ←/→ seek 10 seconds, F/Enter toggle fullscreen, Esc exits.

Under the hood: the Windows file/folder dialogs becoming unresponsive are fully fixed, the dashboard trend chart no longer misrenders with only a few sessions, and dark-theme error/status colors, narrow-screen layout, and visualizer alignment details got polish.

If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

Update: v0.5.1 is out :tada:

This round is the one for everyone who collects scripts here: Script Post-Processing — reshape any script live during playback to fit your taste and your device, without editing the file.

Every script you download was authored on someone else’s setup, for someone else’s taste. When that shows up — a reversed axis, jittery passages, sections faster than your hardware can follow, long dead gaps — the options used to be living with it or reaching for a script editor. Now it’s four switches, each previewed on the waveform in real time, and the processed timeline is exactly what the device follows:

Invert mirrors the whole script (100 − p), so a script recorded on a reversed axis plays in the intended direction — no editor roundtrip.

Smoothing / noise reduction folds the tiny jitters inside dense passages into single clean strokes, without changing the timing.

Speed limit re-times the sections above your max speed, so even the most intense passages stay at a pace the device can actually follow.

Idle fill bridges long still sections with a gentle synthetic stroke at your set rhythm.

The original file is never touched, and while post-processing is active the Script card wears an Adjusted badge — you always know when your device is following your version instead of the author’s. Invert is free for everyone; the other three are Supporter perks: free to preview as long as you like, acting on device output once you upgrade, and any adjustments you keep re-apply on their own next time.

Heat coloring, now the default The visualizer’s color-by-intensity mode is on by default, and a new Heatmap color scale setting makes its readings honest across scripts: Standard (absolute speed) maps velocity onto a fixed 0–600 UPS scale — “red everywhere” means the same thing in every script, handy for judging a download before you commit to it — while Auto contrast (relative) normalizes to the current script for maximum contrast within it. The speed view supports the coloring too.


Smaller touches Connection-adapter tabs arrange as a 2×2 grid on narrow screens, and the Patreon login flow no longer dead-ends: unlinked accounts get a register / email-login guide.

Under the hood: fixed the Windows title-bar minimize/maximize/close buttons occasionally going unresponsive.

The app checks for updates on launch, or update manually from Settings. The Supporter trial code from the v0.5.0 post is still live (until Oct 18): 1 month of the Supporter perks, free — keep it for a friend who hasn’t seen the supporter side yet.

Claim the code — patreon.uwuplayer.com/redeem/36D8E

If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

Update: v0.6.0 is out :tada:

This round is the one for the DIY crowd: TCode devices — OSR2, SR6, FUNSR1 and the rest of the open-source family — connect natively now. No Intiface Central in between: the app speaks TCode itself, over Bluetooth or USB serial (preview).

TCode support Pick the TCode tab in the connection UI and choose the transport: Bluetooth — pair the device in the system Bluetooth settings first, then connect from the paired list — or USB cable (Windows), plug in and pick the port. Android supports Bluetooth only. A Device model selector carries presets for SR6, FUNSR1 and OSR2 with their stock axis layouts, and Detect axes asks your actual build for its real axis table, replacing the preset — for firmwares that don’t answer, the preset keeps the device usable anyway. One TCode device at a time for now, and the whole thing ships as a preview that will keep maturing over the next releases.

Jump to the next script anchor The playback controls gain a flag button (desktop also gets the N key) that jumps to the script’s next action point. Every script has them: the long dead gaps where nothing moves. Press it mid-gap and you land right where motion resumes; in dense passages, repeated presses step through the actions one by one, and the landing sits a beat before each action so the device eases into position. The jumped distance shows on screen as “+X.Xs”.

A jog slider for the Handy The Handy’s card gains a test action of its own: expanding it shows a jog slider that drives the slide straight to the position you drag to. The slider starts from the device’s current position, and like the other test controls it pauses while a script is driving the device.

If anything feels off or there’s something you’d like to see next, the feedback form on the website or in the app is the fastest way to reach me — or just leave a comment below.

Downloads for Windows and Android, as always, at uwuplayer.com.

Are there any plans to support FUNSR PRO?

Could you please tell me which axis FUNSR PRO supports? Based on your information, support for FUNSR PRO will be shipped in the next update. Right now, however, you can select any device model and connect to FUNSR PRO with a USB cable. After connecting, click “Detect axes”, the correct axis will be detected from the device’s response.

I apologize, but since I only have an Android device, I am unable to connect via USB cable to detect the axes.

No need to apologize—I completely understand. Since you only have an Android device, USB-based axis detection isn’t possible, and in our testing Bluetooth usually can’t detect a device’s axes either.

After looking into it, I found that FUNSR PRO appears to support L0, R1, and R2 (and also R0 if the twist module is installed). Could you please confirm whether this is correct? If you can confirm it, I can add support for this device in the next update.

I believe that is correct.
I think it’s a fantastic app, so I look forward to its continued development.

Thanks for confirming! I’ll add support for FUNSR PRO in the next update. Glad you like the app and thanks for the encouragement!