ReDrive — Driver's Manual

what the controls actually do, and how the rider feels it

01 The basics

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.

The STOP button

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.

Room codes & the rider link

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.

02 Room & privacy

Sharing your room

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.

Public vs. Private

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.

Waiting rooms — when the rider sets up first

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.

Room lifetime

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.

03 Controls tab

Signal Pattern

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.

Hold

flat constant signal. what you set is what they get, no variation. the baseline for everything else.

Sine

smooth wave. intensity rises and falls rhythmically. the gentlest oscillation — good for sustained sessions or as a base layer.

Ramp ↑

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.

Ramp ↓

opposite — starts at full intensity and fades out, then resets. peaks and withdraws. good for that "trailing off" sensation.

Pulse

sharp on/off rhythm. more percussive than Sine — each hit is distinct. Hz sets how fast the pulses come.

Burst

clusters of pulses with gaps. groups of sensation separated by quiet moments. feels more complex than Pulse alone.

Random

unpredictable rhythm. the rider can't settle into anticipating the next hit. good for keeping them on edge — literally.

Edge

builds to a peak, holds, then drops. the classic edging shape. depth controls how far it drops on the release.

Intensity V0

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.

Speed / Hz V0

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.

Depth

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.

04 Beta — electrode position

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 modes

Sweep

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).

Hold

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.

Spiral

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.

Touch

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.

Sweep parameters

ParameterWhat 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.

Alpha oscillation L0

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.

05 Intensity ramp

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.

ParameterWhat 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.

06 Poppers

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.

ModeDurationIntended 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.

07 Touch tab

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.

AxisWhat 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.

Base Power slider

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.

Gesture loop

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.

Anatomy picker

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.

Uploading a custom anatomy image

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.

Rider avatars in the picker

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.

08 Script tab — funscript player

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.

Standard channels

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.

4-Channel mode (E1–E4) 4-Phase

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.

Loading scripts

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 withRoutes to
.e1.  /  _e1  /  -e1E1 electrode
.e2.  /  _e2  /  -e2E2 electrode
.e3.  /  _e3  /  -e3E3 electrode
.e4.  /  _e4  /  -e4E4 electrode
volume, volVolume channel
beta, position, surgeBeta channel
alpha, twist, vibrAlpha channel
anything elseIntensity channel

Playback

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.

Video sync

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.

Signal offset

e-stim has latency that video doesn't. the offset row below the video player lets you shift the signal timing:

DirectionWhat 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.

09 Sources — input locks

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.

Priority when multiple sources are active

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.

10 Presets

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.

11 Quick reference

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.