0.7.0
v0.7.0 — Editor v2, Per-Device Controls, Looping, and a Pile of Fixes
Auto-update from v0.6.x. All settings preserved.
The biggest release since launch — the editor finally has its own monitor, every device class got the same depth of controls, and a community-reported multi-axis bug is fixed. Plus loop, autoplay, and a stack of reliability work surfaced from your feedback.
✏️ Editor v2 — pop out, stack axes, OFS parity
Editor opens in a separate window for second-monitor users; main window collapses to just the video. Pop-out canvas is fully editable, every editor hotkey works, drag-streams collapse to one undo step.
- Stacked multi-axis lane view — toggle "show all axes at once." Inactive axes render as read-only previews above the main editing canvas, locked to the main timeline. Click any preview to swap which axis is active. Community ask from an SR6 owner.
- OFS-parity hotkey pack — numpad lands on 0/10/20/.../90 (not 0/11/22),
Eequalize,Endmove-to-playhead,Qalternating insert,Homerepeat-last-stroke,Shift+B/Ctrl+Bbookmark nav,[/]speed step,Ctrl+Alt+Left/Rightselect before/after playhead. Simplify dialog with live "will remove N of M" preview. Export Heatmap PNG. - Multi-band waveform (
Shift+W) — three stacked traces (low / mid / high) tinted per band. Voice fundamentals show in mid, slap transients in high. Pure DSP, no ML. - Voice-activity overlay (
V) — thin "VOICE" strip showing speech segments.
🎮 Device controls — parity across every device class
Community ask from a ScriptPlayer user. Range setting for every device, not just Handy.
- Per-device range for Buttplug devices (Lovense, Solace, Keon, Intiface-connected anything) — dual slider in the device row, applies to linear / vibrate / e-stim / rotate.
- Per-axis invert for TCode (OSR2/SR6) — checkbox per axis, fixes physically reversed mount orientation without rewriting the script.
- Range Extender — new "Stretch limited-range scripts" toggle in Playback settings. When a script's stroke positions stay in a narrow band (e.g. 30–70), stretches them to use the device's full range. Works for every device class (per-tick for Buttplug/TCode/Handy-HDSP, upload-time for Handy-HSSP and Autoblow).
- Integrated multi-axis funscripts now work — combined-format files (HereSphere
additional_axes, OFSraw, sibling-key, inline TCode) auto-detect and drive all axes. Previously only the piston (L0) fired. Reported by an OSR2 owner on the thread.
🔁 Looping & autoplay
- Loop video —
Shift+Lor⋮menu. Session-scoped (resets on new video). Status chip in the badge cluster when on. - Loop playlist — per-playlist toggle next to "Play All" in the playlist view. Each playlist remembers its own setting.
- Auto-play next video — new tickbox in Playback settings. When on, after a video ends the next one loads, syncs the funscript, and plays automatically (instead of pausing). Default off — opt in.
🎥 VR projections — spherical formats
VR Format panel now supports equirect-180 and fisheye-180 projections via WebGL, alongside the existing planar formats.
- Drag-to-pan, FOV slider (60°–120°), double-click recenter, Shift+Arrow keyboard pan.
- Per-video override; "Apply to all in folder" for fast bulk setup.
- Performance: zero-copy texture upload on hardware-decoded sources. 8K HEVC remains GPU-bound (no change — same ceiling as native playback).
⚡ Quality of life
- Playback speed control in the player overflow menu + a speed chip in the badge cluster.
</>keyboard shortcuts. - Up Next on Play All now correctly shows the next item (was showing "no more videos" on every item — bug fix).
- Cloud-upload gate extended to Autoblow (was Handy-only) — devices stop firing on advance until the new script is uploaded. No more device-silent windows on script change for Autoblow users.
- VR Format menu item in the player
⋮for VR videos. - Backup-restore no longer leaves an orphan backend racing the relaunched instance.
🐛 Notable fixes (from community reports)
- Buttplug auto-reconnect now actually retries (was single-shot — would silently stop after one attempt).
- TCode smoothing setting (PCHIP / Makima) now actually applies (was Handy-only despite the UI implying TCode worked).
- Variant axis-switch race — switching axes mid-playback could land on the wrong axis. Fixed via load-token guard.
- Web Remote phone-connect fired twice — Handy got two uploads per connect. Fixed with a 2s dedup window.
- VR Flatten on half-SBS/TB videos was double-letterboxing one eye. Fixed.
- Spherical VR projections were hiding the playback controls under the canvas. Fixed with a z-index trap removal.
- Buttplug status showed
Connection failed: [object Event]when Intiface wasn't running. Now shows a useful hint. - Web Remote modal rendered translation keys (
webRemote.titleetc.) instead of translated text — duplicate key in en.json. Fixed across all 8 locales + parity test hardened to catch this class of bug going forward.
⚠️ Heads up
- Windows Defender false-positive on the backend is much less likely in v0.7.0 — disabled UPX compression on the bundled Python backend, which was the dominant trigger. Backend exe is ~30MB larger as a result. If Defender still flags it, see the wiki troubleshooting page.
- Code signing still in progress — first install will show a SmartScreen warning. "More info" → "Run anyway."
- 8K HEVC on Pascal-and-older NVDEC is still hardware-bound. The new VR projection panel doesn't change that ceiling.
📊 Numbers
- 2423 tests pass across 104 test files (was ~1544 at v0.4.0)
- 8 languages: English, 中文, 日本語, 한국어, Deutsch, Español, Français, Русский — every key in lockstep, validated by parity tests every commit
- Windows installer + Linux AppImage, both auto-built by CI on tag push
🙏 Thanks
A huge thanks to everyone who's been on the thread reporting bugs, suggesting features, and testing the rough edges on hardware I don't own. Most of the device-side work in this release came directly from your reports — multi-axis, range, invert, autoplay, looping, all of it. Keep it coming.