what the controls actually do, and how the rider feels it
you're the driver. the rider opens their browser, lands on the join page, and their ReStim connects automatically. everything you change on your panel hits their device in real time — no lag worth worrying about.
big red thing at the top. zeroes intensity immediately, clears any active ramp, stops gesture loops. the rider still controls their own hardware volume — ReDrive's stop kills the pattern signal, but if they've got the ReStim dial cranked up they might still feel residual. remind them before you start: their dial is their absolute floor, your controls are relative to it.
the banner shows your room code and a "Rider Link" button. send that link to your rider. they open it, their browser bridges directly to their local ReStim — nothing to install. once they're connected you'll see their count tick up next to the room code.
0 riders in the banner means nobody is receiving your commands yet. commands still go to the server — they're just queued until someone connects. don't start a ramp before you see a rider show up.
the banner at the top of the driver page has everything you need. Code only copies just the room code — useful if you're telling someone verbally. Rider link copies the full join URL — paste it anywhere to invite someone. either way, the rider opens the link in their browser and the session starts automatically.
rooms start as Public — they appear in the live sessions list on the ReDrive home page. click the Public button in the banner to toggle it to Private. private rooms are hidden from the list but still work normally — anyone with the room code or rider link can still join. toggle it as many times as you like during a session.
the normal flow is driver creates a room, then shares the code. but riders can also initiate: they hit Open Waiting Room on the home page, which gives them a driver invite link to send you. you open that link in your browser and the session is created and connected on your behalf — the rider's page moves straight into the live session without them having to do anything else. waiting rooms expire after 30 minutes if no driver claims them.
rooms last up to 24 hours. if your browser tab goes to sleep or you lose the network, the server holds the room open for 1 hour before treating the driver as gone. riders can stay connected during this window and will reconnect automatically when you come back. once the grace period expires the room closes and riders are disconnected.
your driver key is part of the room URL (the ?key=… part). the room code alone gives rider-level access only — sharing the room code with a rider doesn't give them driver controls.
the pattern shapes how intensity is delivered over time. all patterns work within whatever intensity level you've set — it's the waveform, not the volume.
flat constant signal. what you set is what they get, no variation. the baseline for everything else.
smooth wave. intensity rises and falls rhythmically. the gentlest oscillation — good for sustained sessions or as a base layer.
builds from zero to full intensity over the period, then resets. feels like a tightening squeeze that releases. the Hz controls how fast that cycle repeats.
opposite — starts at full intensity and fades out, then resets. peaks and withdraws. good for that "trailing off" sensation.
sharp on/off rhythm. more percussive than Sine — each hit is distinct. Hz sets how fast the pulses come.
clusters of pulses with gaps. groups of sensation separated by quiet moments. feels more complex than Pulse alone.
unpredictable rhythm. the rider can't settle into anticipating the next hit. good for keeping them on edge — literally.
builds to a peak, holds, then drops. the classic edging shape. depth controls how far it drops on the release.
0–100% — the relative output level. this is relative to the rider's own hardware limit. if they have their ReStim volume dial set low, your 100% is still within their self-imposed ceiling. they own their absolute max. you own the shape and level within it.
start low. always. a rider new to your style needs time to calibrate their hardware limit to what you're sending. 20–30% is a reasonable introduction and you can build from there.
how fast the selected pattern cycles. 0.05 Hz is an extremely slow wave — nearly imperceptible drift. 8 Hz is rapid, almost buzzy. for most patterns, 0.5–2 Hz is the sweet spot where the rider can feel each wave individually.
how far the pattern swings between its peak and trough. at 100%, a Sine wave goes from zero to full intensity. at 50%, it only swings from half-intensity to full — still oscillating, but the rider never drops below 50%. at 0%, depth collapses and it behaves like Hold regardless of what pattern you've chosen.
depth is the difference between "the signal breathes" and "the signal just varies slightly". keep it high for pronounced waves; pull it down when you want the pattern to be subtle texture on top of a constant base.
beta controls which electrodes are active and in what balance. the ReStim uses a triphase setup — three poles: L+ (left), Neutral (centre), R+ (right). beta position moves the focal point across this arc.
from the rider's perspective this is the physical location of sensation. sweeping beta is the difference between a fixed point and something that moves across the body. it's a huge part of how varied a session feels.
beta oscillates between two positions automatically at a set Hz. the rider feels the sensation travel back and forth. you control the speed, where it's centred, how wide it swings, and whether it spends more time on one side (skew).
beta stays wherever you set it with the slider. static position — useful when you want the rider locked in one spot or when you're transitioning between positions manually.
beta sweeps while alpha oscillates in a 90° offset — they wind together and tighten toward centre, then auto-reset. creates a converging spiral sensation. let it run and it cycles on its own.
beta is driven by the touch canvas. wherever your finger is on the Y axis, that's where the electrode is. full manual control via gesture.
| Parameter | What it does to the rider |
|---|---|
| Sweep Hz | how fast beta moves across the arc. slow Hz = a lazy drift. fast Hz = rapid oscillation they'll feel as a kind of vibration between points. |
| Centre | where the sweep is centred. pull it toward L+ or R+ to bias the sensation to one side. Neutral keeps it balanced. |
| Width | how wide the arc is. 100% swings the full range from L+ to R+. narrow it down to keep sensation tightly focused around the centre point. |
| Skew | time imbalance. skew toward L+ means the sweep lingers on the left side before swinging right. useful for asymmetric bodies or when you want emphasis on one electrode. |
a secondary axis (L0) that oscillates independently of beta. when enabled, it adds a layered shimmer or counterpoint to whatever beta is doing — think of it as a secondary sweep running underneath the main sensation. toggle it on/off with the α button. the rider will notice the quality of sensation shift — it goes from a cleaner signal to something more complex and textured.
instead of snapping intensity to a new value, a ramp takes it there slowly over a set duration. the rider experiences a smooth, sustained build — or a long controlled descent — rather than a sudden change.
| Parameter | What it does |
|---|---|
| Target % | the intensity level you're ramping toward. doesn't have to be 100% — you can ramp to 40% from 0 if you just want a gentle creep upward. |
| Duration | how long the ramp takes to complete. short durations feel like a sharp surge; long durations are almost imperceptible moment-to-moment but the rider gradually notices they're somewhere different. |
| Start | fires the ramp from wherever intensity currently is toward the target. the rider page shows a progress bar so they can see it coming. |
moving the intensity slider manually during an active ramp cancels the ramp. the stop button also cancels it. once the ramp completes, intensity holds at the target.
long slow ramps — like 3–5 minutes to 60% — are good for warming up a rider without them consciously registering each step. they just gradually notice they're somewhere much more intense than when they started.
the Poppers button sends a full-screen overlay to the rider's browser — a timed cue for them to inhale. the signal keeps running as normal; this is purely a visual direction. you set the mode before hitting the button.
| Mode | Duration | Intended use |
|---|---|---|
| Normal | 10 seconds | standard hit. quick, routine. |
| Deep Huff | 20 seconds | longer, more sustained inhale. |
| Double Hit | 35 seconds | extended — covers two sequential hits. the rider holds the overlay for longer. |
the signal doesn't stop automatically during a poppers cue. if you want the combination of overlay + a peak in signal, you time that manually — fire the poppers and push intensity at the same moment. the overlay counts down on their screen, but their device keeps doing whatever you're telling it to do.
the touch panel is a 9:16 canvas with an anatomy overlay. dragging your finger on it sends live beta and intensity simultaneously — both axes from one gesture.
| Axis | What it maps to |
|---|---|
| Y (vertical) | electrode position. top of canvas = L+, centre = Neutral, bottom = R+. drag up and down to sweep between electrodes. the path always passes through Neutral — no jumping straight from one pole to the other. |
| X (horizontal) | intensity above the base power floor. the further right you drag from centre, the more intensity you're adding on top of whatever the base power slider is set to. left of centre maps back toward the base. |
the intensity floor while using touch. at 0% the rider gets nothing until you drag right. at 50% they're already at half intensity the moment you touch the canvas, and X only adds up to 25% on top. set it to where the session baseline should be before you start drawing.
draw any path on the canvas, then lift your finger. ReDrive records the exact trajectory — position, timing, intensity — and starts looping it automatically. the rider feels your gesture play out on repeat until you change something.
switching to a different beta mode (Sweep, Hold, Spiral) pauses the gesture but keeps it in memory. switching back to Touch mode — or hitting Resume — picks it up exactly where it was. good for when you want to hold the loop but briefly layer in a sweep or change modes without losing your recorded gesture.
complex gestures loop better than simple ones. a straight drag loops in a way that's immediately obvious; a slow curve with pauses creates something that feels less mechanical and more alive.
below the canvas is a row of thumbnail images — the anatomy picker. clicking one changes what's shown behind the touch canvas. thumbnails labelled with a ★ badge are custom images (rider avatars or images you've uploaded). thumbnails labelled with a 👤 badge are from a connected rider who set their own photo.
the last two items are always the built-in canvas drawings (Default and Simple) — outlines drawn directly, no image needed. these are always available even if no images are uploaded.
click the + button at the right end of the picker row. pick any PNG, JPG, or WEBP image. it uploads immediately and appears in the picker with a ★ badge. custom images are stored per-room — they persist for the room's lifetime and are visible to you only (riders can't see what you're using as your overlay). a room can hold up to 10 custom images.
to make a properly proportioned overlay (9:16, 400×1000 px) from a photo, use the Anatomy Overlay Maker tool — it lets you align and crop a photo to the right dimensions before you upload it here.
when a rider sets a photo from their join page, it's sent to the server and immediately appears in your anatomy picker with a ★ and 👤 badge. clicking it loads their photo as the canvas overlay — useful for a more personalised sense of who you're working with. if a rider is the only one with an avatar, it's auto-selected when they connect.
funscripts are pre-scripted timelines of position values, typically made to match a video. ReDrive can play them across multiple independent axes simultaneously — three standard channels plus four direct electrode channels for 4-phase setups.
Intensity V0 — the script drives the electrical output level. 0–100% mapped directly to signal strength. use for scripts that were originally made to drive a toy's motor speed — they translate well to e-stim intensity.
Beta L1 — the script drives electrode position. a funscript that goes 0→100→0 will sweep L+ → R+ → L+. ideal for scripts made specifically for triphase setups, or anything labelled "position" or "surge".
Alpha L0 — drives the secondary oscillation axis. layered on top of whatever beta is doing. scripts labelled "alpha", "twist", or "vibr" auto-route here.
you don't have to use all three. loading only a Beta script gives you a pure position-scripted session with no intensity automation. the channels that aren't loaded stay wherever Controls or Touch left them.
enable the 4-Phase toggle in the Controls tab to unlock four direct electrode weight channels. instead of the engine computing electrode balance from beta position, the scripts drive each electrode's output directly — 0–100% per channel.
E1 (cock) · E2 (balls) · E3 (perineum) · E4 (anal) — each maps to one electrode pair in a 4-channel setup. a Volume channel scales the overall output level.
use Load Set (or drop all four files at once onto the panel) to auto-route a matched set. ReDrive reads the filename and routes by suffix: .e1.funscript → E1, .e2.funscript → E2, and so on. the engine bypasses its normal blend math and sends your script values directly for as long as fresh data is arriving.
hit Load on the channel you want and pick a .funscript file, or drag one (or several at once) onto the script panel. ReDrive reads the filename and routes automatically:
| Filename contains / ends with | Routes to |
|---|---|
| .e1. / _e1 / -e1 | E1 electrode |
| .e2. / _e2 / -e2 | E2 electrode |
| .e3. / _e3 / -e3 | E3 electrode |
| .e4. / _e4 / -e4 | E4 electrode |
| volume, vol | Volume channel |
| beta, position, surge | Beta channel |
| alpha, twist, vibr | Alpha channel |
| anything else | Intensity channel |
Play starts all loaded channels from the current seek position. the seek bar shows the combined duration across all loaded scripts. the centre value button between the time display and Loop shows a pulsing ● PLAYING when active, amber ● PAUSED when paused.
Loop checkbox replays from the beginning when the end is reached. Eject removes a single channel without stopping others — you can swap scripts mid-session.
paste a URL or load a local video file. once loaded, the video drives the timeline instead of the internal clock — the script position follows video.currentTime exactly, including when you scrub or skip. the signal stays locked to whatever frame the rider is watching.
e-stim has latency that video doesn't. the offset row below the video player lets you shift the signal timing:
| Direction | What it does |
|---|---|
| positive (+) | signal advances — plays ahead of the video. use when the signal feels like it's lagging behind the on-screen action. |
| negative (−) | signal is delayed — plays behind the video. use when the signal fires before the corresponding visual. |
fine steps are ±50 ms. coarse steps are ±500 ms. the centre button shows the current offset and resets to zero when clicked. range is ±5 seconds.
the Sources row sits just below the tab buttons, always visible. it controls which inputs are active. green = live, red+strikethrough = locked out.
| Controls | sliders, pattern buttons, ramp — everything in the Controls tab. lock it out when running a script and you don't want accidental slider movement to interfere. |
| Touch | the touch canvas and gesture loop. locking this stops gesture recording, stops any running gesture loop, and ignores the canvas entirely. |
| Script | the funscript player. locking this pauses output from loaded scripts without stopping playback internally — re-enable and it picks back up. useful for temporarily overriding a script with manual control. |
when more than one source is running, the priority order is Script → Controls → Touch. specifically: if a script has a channel loaded, Controls cannot send to that same axis. Touch takes effect the moment your finger is down — it overrides passively for its axes while active. all of this is automatic; you don't configure it.
for a clean scripted session: load your funscripts, click Controls and Touch to lock them out, then play. the rider gets exactly what the script says, nothing extra.
presets save and restore the full state of the Controls tab — pattern, intensity, Hz, depth, beta mode, sweep parameters, alpha, all of it — with one click.
the preset list is fetched from the server. new presets can be added to the PRESETS dict in engine.py — they appear automatically without redeploying. a Milking preset is included out of the box as a starting point for what a full preset looks like.
presets don't affect the Script tab or Sources state. they're purely Controls tab snapshots.
| You want to… | What to do |
|---|---|
| stop everything immediately | STOP button — zeroes intensity, kills ramp and gestures |
| warm a rider up slowly | Hold pattern, set a 3–5 min ramp to 40–60% |
| keep them guessing | Random pattern, Sweep beta, depth at 70–100% |
| focus sensation on one spot | Hold beta mode, position slider where you want it |
| create a traveling sensation | Sweep beta at 0.3–0.8 Hz, width at 80–100% |
| run a funscript cleanly | Script tab → load file → lock Controls & Touch sources → Play |
| sync signal to a video | Load video in Video Sync section, adjust signal offset if needed |
| record and loop a gesture | Touch tab → draw path → lift finger → gesture loops automatically |
| fire a poppers cue | select mode (Normal / Deep Huff / Double Hit) → Poppers button |
| give a rider a break mid-script | lock the Script source — signal stops, playback timer keeps running |
| resume a paused gesture | switch to Touch beta mode or hit Resume in the Touch tab |
| layer script + manual control | leave all sources active — script owns its loaded axes, Controls fills the rest |
| run a 4-channel funscript set | enable 4-Phase toggle → Script tab → Load Set (or drop all files) → Play |
| hide your session from the home page | click the Public button in the room banner → toggles to Private |
| use a rider's photo as the touch overlay | Touch tab → anatomy picker → click their ★ thumbnail |
| upload a custom anatomy image | Touch tab → anatomy picker → click the + button → pick image file |
the rider controls their absolute power limit at their hardware level, always. ReDrive shapes and directs the signal within whatever ceiling they've set. keep that in mind at the start of every session — agree on their limit before you push past 50%.
unpleasant dreams.