Help & Documentation
AGetting Started
Introduction#
The Edgy is an edging control application for The Handy. It provides an inverted arousal potentiometer - the higher you turn it (closer to orgasm), the more the device reduces stimulation, keeping you on the edge.
The app has two main modes. Game Mode runs live sessions with your device, driven either by a behavior - a reactive movement personality that responds to your arousal in real time - or by a funscript video, where the device follows a script synced to the video. Editor Mode is where you create and customize your own behaviors with visual curve editing.
Getting Started#
The Edgy works with The Handy (WiFi), 750+ Bluetooth toys via Intiface Central, and T-Code devices (OSR2, SR6) via serial. Pick your connection mode in the connection panel.
The Handy - Enter your connection key (found on your Handy account at handyfeeling.com). The app communicates directly with the device through the official Handy API over WiFi.
Firmware v4 or later is required. Visit handyfeeling.com/update to update your device if needed.
Intiface - Install Intiface Central (intiface.com/central), start the server, pair your device via Bluetooth, then enter the WebSocket URL (default: ws://localhost:12345) in The Edgy's connection panel. Supports 750+ devices.
T-Code - Serial devices (OSR2, SR6) connect via USB. Select the COM port and baud rate (default: 115200) in the T-Code tab. Alternatively, you can bridge through Intiface Central.
Note: Bluetooth devices may experience latency with fast commands (vibrato, tremolo). For best responsiveness, WiFi (Handy) or serial (T-Code) connections are recommended.
No device? The app works in simulator mode - all behaviors run locally so you can explore the interface and editor without hardware.
Creator's pick
The Edgy was originally built for The Handy, and it remains the device I use. The WiFi connection gives the best responsiveness for edging sessions.
For the sleeve, I use the TrueGrip Gen 2. The texture make a real difference in how you feel the strokes.
That said, edging is deeply personal - everyone responds differently, so experiment to find what works best for you.
Disclosure: Some links above are affiliate links. I may earn a commission at no extra cost to you. It funds The Edgy and never affects what I recommend.
Devices & Channels#
Connecting several devices
You can connect several devices at once and run them together: The Handy over WiFi, Bluetooth toys through Intiface, and a T-Code device over serial. Each connection gets its own section in the connection modal and its own chip in the header.
A single Intiface connection drives every toy paired with it. Each toy, and each of its actuators, appears as a separate entry you can configure and route.
Settings are per device, not per connection: stroke range and invert direction for linear actuators, intensity range for vibrators, and a sync offset to align a device that lags behind. Each device has its own card.
Every connected device shows as its own chip in the header, listing the channels it plays (e.g. "Vibrate V0") and, for battery-reporting toys, a live charge indicator. Click a chip to jump to its settings.
Channels & axes
A behavior or funscript is made of channels: stroke, vibration, and OSR axes (surge, sway, twist, roll, pitch). A channel is a logical stream of motion, independent of any specific device.
The Edgy follows the community multi-axis convention (the same axis codes used by multi-axis players like MultiFunPlayer). Each channel maps to a standard axis code:
| Channel | Axis | Type |
|---|---|---|
| Stroke | L0 | Motion (position) |
| Surge | L1 | Motion (position) |
| Sway | L2 | Motion (position) |
| Twist | R0 | Motion (position) |
| Roll | R1 | Motion (position) |
| Pitch | R2 | Motion (position) |
| Vibrate | V0 | Intensity (magnitude) |
| Pump | V1 | Intensity (magnitude) |
| Suck | A1 | Intensity (magnitude) |
These axis codes also drive funscript auto-detection: clip.funscript loads as stroke, clip.twist.funscript or clip.R0.funscript loads as twist, clip.vibrate.funscript or clip.V0.funscript loads as vibration, and so on. Extra vibrators can be numbered (Vibe1, Vibe2...).
Binding channels to devices
Open the connection modal and switch to the Binding tab (a dedicated Binding shortcut also sits in the header, next to the device chips). This is where you decide which physical actuator plays each channel.
The binding panel maps channels to the physical actuators of your connected devices. On connection, channels auto-match by type and axis code (stroke to a linear actuator, vibration to a vibrator). You can reassign, disable, or remove any binding.
The panel offers the standard channels by name even when the current behavior does not use them, plus an "add a channel" button - handy when you have several vibrators. A channel with no source simply stays idle, it never blocks the others.
A vibrator with no dedicated channel can still react to the action: its intensity is derived automatically from the current stroke speed, so a vibe and a stroker stay in sync without any setup.
Each bound channel has a fallback derivation you can pick per channel: Auto (smart default), Speed (intensity follows stroke velocity), Envelope (follows stroke amplitude), or Position (mirror or inverse of the stroke position). The fallback kicks in only when the active source does not feed that channel - a violet dot marks a channel currently running on its fallback.
Bindings are tied to logical channels, not to the source. Switching between a behavior and a funscript during a session keeps your bindings intact - whatever is playing feeds the bound channel.
BLive Session
Arousal Knob#
The central knob controls your arousal level from 0% (rest) to 100% (limit). Drag it clockwise to increase, counter-clockwise to decrease. You can also use arrow keys (Β±5) or Ctrl+mouse wheel.
The key concept: as arousal increases, the device automatically reduces speed, amplitude, and increases hold pauses. This creates the edging dynamic - you report your arousal, and the device responds inversely.
Try dragging the knob - watch the zone and color change
The knob displays 6 zones with distinct colors: Rest (0-15%, full stimulation), Rising (15-35%), Excited (35-55%), Very Excited (55-75%), Edge (75-90%, emergency braking), and Limit (90-100%).
Behaviors#
Behaviors are movement personalities that define how the device responds to your arousal level. Each has unique characteristics - some tease, some dominate, some are unpredictable.
A behavior is defined by two layers: base curves that control the continuous motion (velocity, stroke zone, amplitude, hold pause), and variations - temporary movement patterns that occasionally interrupt the base motion to add variety and surprise.
The app includes 7 built-in behaviors, plus any custom behaviors you create in the Editor.
Session Controls & Orgasm#
Start a session with the Start button or Space bar. Once running, use Pause/Resume (Space) and Stop (Escape). The behavior runs continuously, reading your arousal level in real-time.
Press the Orgasm button (or O key) to trigger orgasm mode. The device switches to a dedicated orgasm pattern for a set duration. Duration can be Fixed (exact time) or Range (random between min/max).
Funscript Video Mode#
The Edgy can play videos synchronized with .funscript files - the standard format for scripted interactive content. The device follows the script in sync with the video, and your arousal level dynamically modulates the intensity in real-time. This turns any scripted video into an edging session.
Loading Files
Click the video area or drag-and-drop a video file to load it. Funscripts are not picked up automatically - you add them explicitly, either by dragging them onto the player or with the "Load .funscript" button. You can load several at once (one per axis); the file name decides which channel each one drives (see Devices & Channels). The seek bar shows the script waveform so you can see upcoming intensity.
Behavior vs Funscript
Two playback modes are available: Behavior mode uses your selected behavior pattern (ignoring the funscript), while Funscript mode follows the script. Toggle between them with the Behavior/Funscript buttons below the video. You can switch freely during a session - clicking a behavior automatically switches to Behavior mode.
Channel routing (multi-device)
If you connect several devices or a multi-axis device, each logical channel (stroke, vibration, rotation...) routes to an actuator in the Binding tab, or in the Funscript Settings window for scripts. Key point: a given channel has a single routing, shared between Behavior and Funscript modes. If you assign vibration to a device, the vibration channel is sent there whether the source is a behavior or a funscript - you configure your hardware once. A channel with no device stays unassigned (None) and is previewed on the emulator.
Arousal Response Remapping
Arousal Response Remapping (ARR) is the core of funscript edging. It modulates the script based on your arousal level. Open the Funscript Settings (gear icon) to configure the Neutral ARR slider.
At the neutral point, the script plays exactly as written. Below neutral, the effect is amplified - the device exaggerates the script. Above neutral, it is progressively dampened, reaching its minimum at 100% arousal. How it dampens depends on the channel type: position channels (stroke, surge, twist...) compress their movement toward the average position, so the device moves less and less; vibration channels (vibrate, pump, suck) fade their intensity toward zero, so the device goes quiet. Set the neutral point higher (e.g. 60-70%) to get more edging range before dampening kicks in.
Orgasm Programs
Orgasm programs define what the device does when you trigger orgasm during funscript playback. Open the Funscript Settings to select a program. Four presets are included: Fast & Intense, Progressive, Slow & Deep (default), and Edging Release.
When you press the Orgasm button (or O key), the selected program temporarily overrides the funscript. The device follows the orgasm curves instead of the script. The program runs through its duration, then continues with the base curve values - the video keeps playing throughout. You can cancel the orgasm at any time. Create custom orgasm programs in the Editor (Orgasm Funscript tab).
To create or customize orgasm programs, switch to Editor Mode and select the "Orgasm Funscript" tab in the sidebar. It uses the same multi-channel editor as behaviors (the arousal knob is replaced by an orgasm progress + duration range): each program has its own curves per channel - plus optional cross-channel variations. Programs created there appear in the Funscript Settings selector.
Fullscreen Controls
In fullscreen video mode, touch and mouse gestures let you control the session without leaving the immersive view:
- Single tap - show or hide the control overlay
- Double tap - play or pause the video
- Swipe up/down - adjust arousal level (mobile)
- Back button - exit fullscreen (mobile)
- Mouse wheel - adjust arousal level (desktop)
Tips: Use Cinema mode for a focused viewing experience with all controls accessible. In fullscreen, behavior shortcuts and variations are overlaid on the video (desktop). Favorite your most-used behaviors to access them quickly during playback.
CEditor
Editor Overview#
The Editor Mode lets you create and customize behaviors using visual curves. Each base parameter (motion / stroke zone, amplitude, velocity, hold) is defined as a curve that maps arousal level to a value.
The editor has 3 columns: a behavior browser on the left, the curve editor in the center, and a real-time emulator on the right. The Edging tab defines normal behavior, the Orgasm tab defines orgasm-specific overrides.
A behavior drives more than stroke: a channel selector at the top of the curve column focuses one channel at a time (stroke, vibration, or an OSR axis), so the base curves you edit belong to the selected channel. Add or remove channels there. The variations below are shared across all channels.
The emulator on the right has a mono / multi-axis toggle: mono shows a Handy-style stroker (stroke axis only), multi shows a 3D OSR view driven by every channel of the behavior. It is a pure editor preview, no device or binding needed.
Understanding Curves#
Every behavior parameter is controlled by a curve. The X axis is arousal (0-100%), the Y axis is the parameter value. Click to add points, drag to move them, double-click to remove.
Velocity curve: controls stroke speed. Typically decreases as arousal rises (slower near the edge).
Drag points to reshape the curve - click to add, double-click to remove
Stroke Zone: two curves (min/max) define the physical movement range. The device moves between these boundaries.
Stroke zone min/max curves
Amplitude curve: what portion of the stroke zone is used per stroke. At 100% the full zone is used, at 50% only half.
Hold curve: pause duration (ms) between strokes. Typically increases at higher arousal to slow things down.
Range mode adds a second curve - the engine picks a random value between the two curves for each stroke, adding natural variation.
Stroke Zone#
The stroke zone defines the physical boundaries of movement. Stroke Min sets the bottom limit, Stroke Max sets the top limit. The visualization shows the active range.
Amplitude determines how much of the zone is actually used per stroke. A narrow amplitude within a wide zone creates subtle movements.
Adjust the sliders to see how stroke zone and amplitude interact
Device simulator
Variations#
Variations are temporary movement patterns that layer on top of the base curves. At each engine cycle, a weighted random draw decides whether a variation fires or the base motion continues. When a variation is selected, its shape takes over the device for one or more loops, then hands back to the base curves. This creates moments of surprise and personality within a behavior's steady rhythm.
Base curves alone produce a smooth, predictable motion - pleasant, but eventually monotonous. Variations break that predictability. A sudden slow full stroke, a quick vibrato, a lingering hover at the top - these are what make a behavior feel alive. They are entirely optional: a behavior with zero variations still works perfectly using its base curves alone. But adding even one or two variations transforms the experience from "mechanical" to "expressive".
Shape
The shape is the heart of a variation. It defines the exact movement pattern the device will follow. The X axis is time in milliseconds, the Y axis is position from 0% (bottom) to 100% (top). You draw the shape as a curve with control points - the device will interpolate smoothly between them.
A simple full stroke is just three points: 0% at 0ms, 100% at 500ms, 0% at 1000ms. A sinuous wave might be: 10% β 70% β 30% β 90% β 10% over 1200ms. You can create anything: quick jabs, slow plateaus, complex multi-point patterns. The shape can be as simple or intricate as you want.
Probability
Each variation has a probability curve that controls how often it triggers at each arousal level. The curve maps arousal (0-100%) to a trigger chance (0-100%). At any given arousal level, the engine reads each variation's probability, then makes a weighted random draw.
If a variation reads 30% at the current arousal, it fires roughly 30% of the time. If you have two variations at 25% and 15%, there's a 40% combined chance that one fires, and a 60% chance the base motion plays instead. When the total across all variations exceeds 100%, a variation always plays - the base motion never gets a turn. Use this intentionally: leaving room for base motion (keeping totals around 60-80%) often sounds better than variations playing non-stop. You can also force the opposite on purpose - set a single variation to 100% across the whole arousal range so it always plays, then give it Curve and Zone dependencies: it runs continuously while still following the base curves, so the edging logic (slowing down and shrinking as arousal rises) is preserved.
Stroke Zone
Stroke Zone controls where the shape positions land on the device. In "Absolute" mode, shape values map directly to 0-100% of the full device range - the variation ignores the current stroke zone entirely. In "ΓZone" mode, the shape is compressed into the stroke zone defined by the base curves at the current arousal level. As the zone narrows at high arousal, the variation narrows too. A multiplier lets you scale the effect: Γ0.5 compresses more, Γ2.0 expands beyond the zone.
Speed
Speed controls how fast the shape plays. In "Shape timing" mode, the X axis of the shape is used as-is: a 1000ms shape always takes 1 second regardless of arousal. In "ΓSpeed" mode, the shape duration is scaled by the base velocity curve. When velocity is low (high arousal), the shape slows down. When velocity is high, it speeds up. This keeps the variation feeling cohesive with the base rhythm. The multiplier adjusts the scaling factor.
Think of it as stretching or compressing the shape in time. In "ΓSpeed" mode at high arousal, a 1-second shape might take 3 seconds to play. At low arousal, the same shape might play in half a second. The shape itself stays the same, only the playback speed changes.
Amplitude
Amplitude controls how much of the stroke zone the variation actually uses. In "Full range" mode, the shape uses the entire available width. In "ΓAmplitude" mode, the width is scaled by the base amplitude curve. At high arousal where amplitude is typically low, the variation becomes a micro-movement. This is especially effective for subtle gestures near the edge. The multiplier adjusts the effect.
Loops
Loops control how many times the shape repeats before the engine moves on. You set a min and max - the engine picks a random number in that range each time the variation fires. Loops 1-1 means the shape plays once. Loops 3-5 means 3 to 5 repetitions. More loops means the variation dominates longer before returning to base motion.
Drift
Drift adds organic randomness to repeated loops. When enabled, the center position of each loop shifts randomly within the available zone. Instead of the shape repeating from the exact same starting point, each repetition starts from a slightly different position - creating a more natural, less mechanical feel. Drift is automatically disabled when loops = 1 (nothing to vary between) or when amplitude fills the entire zone (no room to shift the center).
Cross-channel variations
A variation is shared across every channel of the behavior, not stroke-only. The card shows a composite preview: all channel shapes superimposed, the active channel (the one selected by the tabs) in front, the others dimmed in the background. Channel chips let you switch the focused channel in one click. A channel with no shape shows a "+ Add Shape" overlay that creates and opens its shape; a channel with a shape shows an edit pencil. You edit every channel from the same variation card, without leaving it.
Zone and Amplitude dependencies are set per channel. They describe how a shape relates to that channel's own base curves, so each linear channel keeps its own spatial relationship. Speed, Hold, Loops, and Drift stay common to the whole variation - they carry the shared tempo that keeps the channels coordinated. Switch the channel tab to view or edit another channel's Zone and Amplitude.
A variation can run without stroke - useful for a roll-only or vibration-only accent. Every channel has a "Remove" action; on the stroke channel it freezes the stroke (it holds position instead of following its shape). The timeline then comes from the secondary channels, and the stroke shape is kept so you can restore it. On a single-axis device a stroke-frozen variation simply stays still, which is expected.
Preview
You can preview each variation directly in the editor. The thumbnail and parameter readouts next to each variation show the calculated values at the current arousal level. Note: when a base curve uses Range mode, the preview displays a static value from the primary curve - during actual playback, the engine picks a random value between the two curves on each cycle. For a live test, click the Play button on a variation card - this forces the variation to play on loop in the emulator, bypassing probability and using the full runtime including range randomization. You can see exactly what the variation feels like at the current arousal, then stop to return to normal behavior.
Collection & Linking
Variations are stored in a shared collection, independent from behaviors. When you add a variation to a behavior, you choose between two modes:
- Link - Link - the variation is shared. If you edit it in one behavior, the changes appear everywhere it is used. A chain icon and a count badge show how many behaviors reference it. This is ideal for signature patterns you want consistent across multiple behaviors.
- Copy - Copy - the variation is duplicated as an independent copy. Edits only affect the current behavior. Use this when you want to customize a variation without impacting others.
You can unlink a shared variation at any time by clicking the unlink button on the variation card. This creates a private copy for the current behavior while leaving the original intact for other behaviors. This action is irreversible.
You can also create standalone variations in the collection that are not attached to any behavior. These are useful for building a library of reusable patterns - for example, orgasm variations you want to pick from when configuring different behaviors.
Built-in presets and their variations are read-only. When you edit one, The Edgy automatically works on a private copy and leaves the original intact, so you can never break a built-in by accident. To make global edits that propagate everywhere, duplicate the preset (or create your own variation) first: only your own linked variations update across every behavior that uses them.
Orgasm Configuration#
When orgasm is triggered, the device switches from arousal-based curves to orgasm-specific curves. The X axis becomes orgasm progress (0% start to 100% end) instead of arousal.
Orgasm curves override each parameter independently. If not defined, the behavior falls back to using arousal-based curves with a fixed arousal level.
Orgasm gestures work like regular gestures but use orgasm progress for their probability curves instead of arousal level.
Orgasm duration can be Fixed (exact time) or Range (random between min and max). The progress bar shows remaining time.
Creating a Behavior#
1. Open the Editor and click "New behavior" in the browser sidebar.
2. Set a name, icon, and description in the Meta tab.
3. Draw the base curves for the stroke channel: motion / stroke zone (min/max), amplitude, velocity, and hold. These define how the behavior responds to arousal. Add extra channels (vibration, OSR axes) from the channel selector and give each its own curves.
4. Add variations in the Variations section: define shapes, set probabilities, configure dependencies and loops. A variation is cross-channel - shape each channel from its card, or freeze the stroke for a channel-only accent.
5. Optionally configure orgasm curves in the Orgasm tab for custom orgasm behavior.
6. Test in the emulator - use manual or sweep arousal mode to preview all arousal levels.
Example: Gentle#
Let's walk through a real behavior to see how curves and gestures work together. Gentle is built around soft, flowing movements that become increasingly subtle as arousal rises.
Base Curves
Velocity starts moderate (35%) and drops steadily to almost nothing (4%) at the edge - strokes get slower and slower. Amplitude is 100% at rest (full range) but shrinks to just 5% at the limit - near orgasm, the device barely moves. The stroke zone narrows gradually: from nearly the full range (5-95%) at rest, to a tight band (45-55%) at the edge. Hold pauses are zero until 50% arousal, then climb steeply - 100ms at 75%, 400ms at 90%, 800ms at the limit. The result: gentle, unhurried movements that become micro-caresses at high arousal.
Gestures
Gentle has 3 gestures, each with a different role:
1. Warming Caress
Warming Caress - A slow, full stroke (bottom β top β bottom over 1200ms). High probability at rest (35%), fading to 5% at the edge. Uses Curve dependencies for velocity and hold, Zone for stroke: it adapts naturally to the current base motion. Repeats 1-2 times. This is the "signature move" at low arousal.
2. Flowing Wave
Flowing Wave - A sinuous wave pattern (10% β 70% β 30% β 90% β 10% over 1200ms). Moderate probability (18% at rest, 8% at edge). Same Curve/Zone dependencies. Plays once. Adds fluidity and unpredictability.
3. Lingering
Lingering - Stays high (80% β 95% β 85% β 100% over 1000ms). Rare at rest (5%) but common near the edge (22%). Repeats 1-3 times. This creates the "hovering at the top" feeling that's characteristic of gentle teasing near orgasm.
Orgasm Configuration
During orgasm (35-55 seconds, random), the Gentle uses dedicated curves: velocity starts at 40% and eases to 15%, amplitude goes from 70% to 30%, no hold pauses. Two orgasm gestures - "Afterglow Caress" (gentle full strokes, increasingly likely) and "Soft Tremor" (delicate vibrato in a narrow band, appearing late in the orgasm).
Notice how all the pieces reinforce the personality: the curves create a smooth, decelerating base, the gestures add character at specific arousal ranges, and the orgasm config provides a distinct finish. This layered approach is what makes each behavior feel unique.
DReference
Keyboard Shortcuts#
| Key | Action |
|---|---|
| Space | Space: play/pause |
| Escape | Esc: stop |
| β / β | Up/Down: arousal +-5 |
| β / β | Left/Right: arousal +-25 |
| Ctrl+Wheel | Ctrl+wheel: arousal |
| O | O: orgasm |
| 1-9 | 1-9: switch favorite behavior (keyboard or numpad) |
| 0 | 0: switch to funscript mode |
About The Edgy#
I'm Glavious, a freelance developer trying to make my way in an increasingly tough world. I build things I care about, and The Edgy is one of them.
I've always been a fan of edging. The sync-based approach with interactive devices is great, but I felt it lacked real-time control - the ability to tell your device exactly where you are, and have it respond inversely. That's what The Edgy is built for. I hope everyone finds something they enjoy in using it.
The Edgy is and will remain completely free. No accounts, no subscriptions, no data collection. Everything runs in your browser.
Supporting the project
The Edgy is sustained through affiliate links with The Handy, plus tips and an optional pack of ready-made behaviors on Ko-fi. If you enjoy the app, either one helps keep it free and actively developed.
Disclosure: Some links above are affiliate links. I may earn a commission at no extra cost to you. It funds The Edgy and never affects what I recommend.