Complete reference for every panel, control, and preset.
On first load, a Settings modal prompts you to enter your device's Connection Key. This key is stored in your browser's local storage and is sent as a header with every API request. The server never stores it permanently.
An expandable panel showing live hardware details:
HAMP (Handy Alternating Motion Protocol) is the primary motion mode. It provides continuous back-and-forth movement at a controllable speed.
A universal speed cap applied to all manual speed changes and preset velocities. Default: 75%. Any speed value that exceeds this limit is automatically clamped down.
Sets the physical boundaries for the device's slide travel. All presets and random stroke logic operate within these limits.
On page load, these values are pushed to the device. The panel starts collapsed by default.
One-tap preset patterns that switch the device to HAMP mode and start motion. Tapping the active preset again acts as a stop toggle.
| Stroke Range | Dynamic (Full-range and mid-to-long focus) |
|---|---|
| Speed | 20–60% |
| Behaviour | Irregular speed with frequent noticeable pauses and sudden tight tip-focused twists to mimic a hand's grip changes. Uses longer strokes by default. |
| Stroke Range | Dynamic (Upper 40% focus) |
|---|---|
| Speed | 25–45% (Bobbing) |
| Behaviour | Shorter strokes focused on the top half, with intermittent deep-throat plunges and slow tip licks. |
| Stroke Range | Dynamic (Full range focus) |
|---|---|
| Speed | 15–30% |
| Behaviour | Smooth, long, slow steady strokes with occasional tighter "squeeze" phases in the middle. |
| Stroke Range | Master |
|---|---|
| Speed Range | 5% → 70% → 5% |
| Behaviour | Gradually ramps speed up over 10-30s (ease-in curve), holds at peak for a few seconds, then crashes to near-zero. Follows visual HUD countdowns. |
| Speed Range | 10% → 90% → 10% (ramp) |
|---|---|
| Step Size | ±15% per tick |
| Tick Interval | 800ms |
| Behaviour | Smoothly ramps speed up, then back down, repeating |
| Speed Range | ~10% – ~80% (sine curve) |
|---|---|
| Formula | 45 + 35 × sin(step × 0.3) |
| Tick Interval | 600ms |
| Behaviour | Smooth sinusoidal oscillation creating a flowing wave feel |
| Base Speed | 8–20% (random, 5 out of 6 ticks) |
|---|---|
| Burst Speed | 60–95% (random, every 6th tick) |
| Tick Interval | 1200ms |
| Behaviour | Maintains a slow teasing pace with unpredictable fast bursts |
| Speed Range | 5% → 100% → resets to 5% |
|---|---|
| Step Size | +5% per tick |
| Tick Interval | 700ms |
| Behaviour | Gradually builds intensity, then drops to minimum and repeats |
| Sequence | 70 → 20 → 85 → 5 → 5 → 5 (repeating) |
|---|---|
| Tick Interval | 500ms |
| Behaviour | Mimics a two-beat heartbeat pulse with distinct "lub-dub" rhythm |
| Slow Phase Speed | 8–15% (random) |
|---|---|
| Slow Phase Duration | 2–5 seconds (biased 80% toward longer) |
| Burst Phase Speed | 30–80% (random) |
| Burst Phase Duration | 1.5–4 seconds (biased 80% toward shorter) |
| Stroke Bias | 80% chance of long-stroke range during slow phase |
| Visual HUD | Shows phase name and live countdown in HAMP state |
| Behaviour | Alternates between drawn-out slow phases and sudden explosive bursts. When Random Length is enabled, the slow phase favours near-full stroke ranges (min within bottom 20%, max within top 20% of master bounds) 4 out of 5 times. |
A fully configurable version of the Surprise preset. A settings panel appears when this preset is selected, allowing you to tune every parameter.
| Slow Speed Min–Max | User-defined (default: 8–15%) |
|---|---|
| Slow Duration Min–Max | User-defined (default: 2–5s) |
| Favour Longer Slow (%) | Bias toward longer slow durations (default: 80%) |
| Long-Stroke Bias (%) | Chance of near-full stroke range during slow (default: 80%) |
| Burst Speed Min–Max | User-defined (default: 30–80%) |
| Burst Duration Min–Max | User-defined (default: 1.5–4s) |
| Favour Shorter Burst (%) | Bias toward shorter burst durations (default: 80%) |
| Visual HUD | Shows phase name and live countdown in HAMP state |
Immediately halts all motion, clears all running preset intervals and timers, disables Random Stroke, and resets stroke range to Master values.
Chain multiple presets into an automated playlist. Each segment runs for a configurable duration before advancing to the next.
The app is a lightweight client-side PWA backed by a stateless Node.js/Express proxy.
localStorage.
Handy Control Panel — Documentation