Scripts Control (Create playlists of scripts/patterns, easy switch with shortcut, local videos allowed)

maybe i hit some kind of localStorage limit

i tried to drag another long funscript (250K) into a new playlist and get this:

chunk-QJSBBL5W.js
ERROR QuotaExceededError: Failed to execute 'setItem' on 'Storage': Setting the value of 'store_tracks' exceeded the quota.
    at u0.set (main-L6A5RVMW.js:8:5872)
    at Ge.set (main-L6A5RVMW.js:8:6188)
    at e.save (main-L6A5RVMW.js:12:16705)
    at e.addTrack (main-L6A5RVMW.js:12:16392)
    at r.addTrack (main-L6A5RVMW.js:12:19483)
    at e.<anonymous> (main-L6A5RVMW.js:14:396744)
    at Generator.next (<anonymous>)
    at i (chunk-QJSBBL5W.js:1:1251)
    at f.invoke (polyfills-FFHMD2TL.js:1:6443)
    at Object.onInvoke (chunk-QJSBBL5W.js:7:29666)

i probably have a few hours’ worth of funscripts loaded into SC rn

Indeed, it looks like you’ve reached the storage limit of your browser. I knew this would happen one day, because the 5MB limit (in Chrome) is not enough for this kind of purpose.

Your best option for now is to always export your collection to save it for future sessions.

Can you share your collection, if you don’t mind? I’m curious to see what kind of patterns you have, I basically just used a few.

as soon as i can get OFS working i will, lol. it does not seem to run correctly in win11 arm64.
for now i just use a few basic patterns with hot keys and however many hungswolo scripts i can fit into localstorage :frowning:

how’s it going

i’m still enjoying this player :slight_smile:

months later, and sadly nothing approaching the functionality of OFS is accessible from arm64, and i have been unable to use OFS on arm64 win11 vm or macOS. i have not made any progress on making patterns for this reason, although i guess i could use handy simple scripter.

the other huge thing holding me back on this is localstorage quota. not sure what else to do as a user except making multiple browser profiles haha.

fwiw, the simplest and most robust way i found to get current usage in MiB:
new Blob(Object.values(localStorage)).size / 1024 ** 2;
hungswolo scripts eat this up pretty quick. can’t store more than a few of those.

do you have any plans to use some other storage driver like indexedDB?

idk if this is helpful, but it caught my eye

1 Like

Hi there, i’m gona take a look to expand the storage capabilities, maybe this lib can be usefull

1 Like

I just implemented this Better-localStorage and it does the job, I can import a lot more script into the application, I let you test with your cases and tell me if it works

1 Like

no luck with the lovesense max 2

I don’t own this device, and from what I’ve read, it doesn’t offer a movement/positioning function, but rather vibrations and contractions. So I’m not sure how to handle it.
I’d need to add a channel selection feature to define the desired action that will be sent to the device according to the script. But that’s not planned at the moment, as I don’t have a multi axis device :confused:

We definitively need a pattern editor to make it easier to generate new pattern or edit the imported ones !
I’m will take a look :face_with_monocle:

1 Like

sweet, thank you.

i am testing it now. i deleted cookies, storage, etc. although i do see you did some kind of migration thing, i wanted to start fresh just because.

i have two problems.

  1. settings > shortcuts > global play/pause: i set this to space, but it does not seem to save. if i close the tab, open a new tab, and go back to it, it shows as unassigned – i just see the + Add button.
  2. it no longer auto-connects to intiface. i have to go to settings and hit connect. i am accustomed to it ā€˜just working’ when i visit scriptscontrol.web.app.

perhaps both symptoms point to a common issue – settings are not persisting?

i’m testing this in latest chrome on macOS. regular session (not incognito).

but playlists/patterns do persist, and i see they are being stored in indexedDB. and i can store probably as much as i want now :slight_smile:

another oddity is that at least some part of the chrome window must be visible for scriptscontrol to perform correctly.

for example, if i completely cover up the chrome window with a video player window (VLC, not fullscreened) or a firefox window, playback on handy may become very laggy (like one input per second or so) or stop entirely. haha

i don’t think it’s related to your recent storage change, but this behavior is very goofy. is this a problem in chrome itself i wonder? some kind of power savings thing? or something to do with macOS, or perhaps a library you are using?

i have tried this, didn’t work

i have also gone to chrome settings and ensured that energy saver is Turn on only when your battery is at 20% or lower, but idk if there is some kind of chrome advanced flag that could be toggled to fix it.

anyway, i just make the window as big as possible and try to not let it be completely covered up. some other solution would be nice, though.

QoL suggestions:

make the playlist name highlighted when you edit it so you can just start typing:


(ctrl+A is tedious)

also, un-bury the rename button so you don’t have to click the 3 dots. imo probably every playlist will be renamed after creation, so it’s a common action.

1 Like

Indeed, I was missing some async handling for proper autoconnection — same for shortcuts :eyes:
Fixed now!

I’ve also made the playlist title clickable so you can edit it more easily. The input field will now be fully selected when the window opens.

The latest version also includes the track editor, which is still a work in progress. However, it already allows you to make minor adjustments to existing tracks or create new ones.

To use it:

  • Click on the chart to create a new point
  • Double-click on a point to delete it
  • Points can be dragged to edit them

I’ll look into adding more features later, like multi-selection, copy/paste, and more.
Recording2025-08-05at21.46.23-ezgif.com-optimize

1 Like

This seems really cool! Does anyone know if there is an existing equivalent for MultiFunPlayer for the OSR users?

Hey guys, I’ve just polished the top player and added an amplitude control.

Amplitude control

Tweak the intensity of every movement in real time directly from the Player (and the Controller window).
The amplitude slider scales the difference between the current command and the next one:

  • 0% → the device stays still (flat line).
  • 100% → original script amplitude.
  • >100% → amplified strokes, keeping timestamps intact.

Changes are applied instantly while you drag the slider and are mirrored on the controller UI.
The chart overlays the adjusted (played) track on top of the original so you can see the impact before it reaches the device.
Amplitude

Perfect for edging or boosting tiny stroke :stuck_out_tongue:

1 Like

A really promising app, something I’m very excited to try out in depth.

I imported one of my scripts and it looks like this, there are extra diagonal lines that don’t really make sense:

When I try to one of them, the side bugs out and become unresponsive. I basically had to delete the cache and reload the page fully. I removed the patterns and tried again just to be sure, but the issue remains.

I imported a different script and that one worked perfectly.

Any ideas on why that happens? Could it be that the chapters are too long?

Hi, it could be many things but I suspect a bad sequence of actions in the script, can you provide the ones that are not working?

What are aspects that make pattern ā€˜bad’?

I only just realized that not all chapters were broken. It thought it had something to do with the script as a whole.

Sorry If I don’t provide the script here, it’s supposed to be released soon and I don’t want to make it public here yet. I could send it to you in the DMs tho, if there is not other way to find out what’s wrong.

Edit: I just realized it looks like two of the chapters have the same name. Not sure if this can cause any issues.

A script is a JSON file with actions formatted like this:
{"at":0,"pos":100},{"at":1640,"pos":60},{"at":3000,"pos":100}

  • at is the timestamp in milliseconds.
  • pos is the position along the stroke axis (0–100%).

I think your script may contain an invalid point sequence, for example:
{"at":0,"pos":100},{"at":1640,"pos":60},{"at":3000,"pos":100},{"at":100,"pos":0}
Here, the last point has a timestamp (at: 100) that goes backward, which can cause interpretation issues.

Chapter names have no effect on how the script is interpreted.

If you’d like, you can DM me the script and I’ll check it directly. I’ll keep it confidential, especially if you plan to sell it later.

I am perfectly fine with just not using those patterns. I just imported them to try out the app and thought I’d report what I’ve found.

I created all of this via OFS, so I am quite surprised to end up with a faulty script.

I am currently working on my own ā€˜pattern bank’ to use with your app. I’m very excited! It really looks incredible.