Documentation

← Back to App

Handy Control Panel

Complete reference for every panel, control, and preset.

⚙️ Connection & Settings

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.

  • Click the gear icon in the top-right header to change your key at any time.
  • Use the eye icon inside the input to toggle key visibility.
  • The status indicator (green/red dot) shows live connection state. Click it to manually disconnect or reconnect.
  • When disconnected, all commands to the device are blocked.

ℹ️ Device Info

An expandable panel showing live hardware details:

  • Model — Device hardware model name.
  • Firmware — Current firmware version.
  • Current Mode — Active operating mode (HAMP, HDSP, etc.).
  • API Latency — Round-trip time for the last API call.

🎚️ HAMP Mode

HAMP (Handy Alternating Motion Protocol) is the primary motion mode. It provides continuous back-and-forth movement at a controllable speed.

Controls

  • Start / Stop — Starts or stops HAMP motion.
  • Speed Slider (0–100%) — Controls the velocity of motion. Subject to the Master Max Speed limit.
  • HAMP State — Displays "Idle", "Running", or real-time Surprise preset phase info.

Master Max 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.


📐 Master Stroke Range

Sets the physical boundaries for the device's slide travel. All presets and random stroke logic operate within these limits.

  • Minimum (0–100%) — Lower bound of the stroke. Default: 0%.
  • Maximum (0–100%) — Upper bound of the stroke. Default: 50%.

On page load, these values are pushed to the device. The panel starts collapsed by default.


🎛️ Quick Presets

One-tap preset patterns that switch the device to HAMP mode and start motion. Tapping the active preset again acts as a stop toggle.

Header Controls

  • Random Length — Toggles random stroke range. When enabled, the stroke boundaries randomize within the Master Stroke Range every 2–4 seconds. The slider text updates to show the randomized values (e.g. 0% (🎲 12%)).
  • Focus Mode — Expands presets into a full-screen grid. Tiles auto-size to fit without scrolling. The Random Length and Exit buttons are available in the floating header.

Simulation Presets

🤚 Handjob Simulation
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.
👄 Blowjob Simulation
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.
🍈 Titjob Simulation
Stroke Range Dynamic (Full range focus)
Speed 15–30%
Behaviour Smooth, long, slow steady strokes with occasional tighter "squeeze" phases in the middle.
🏔️ Edging Simulation
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.

Dynamic Pattern Presets

💓 Pulse Pattern
Speed Range 10% → 90% → 10% (ramp)
Step Size ±15% per tick
Tick Interval 800ms
Behaviour Smoothly ramps speed up, then back down, repeating
🌊 Wave Pattern
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
😈 Tease Pattern
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
📈 Escalate Pattern
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
❤️ Heartbeat Pattern
Sequence 70 → 20 → 85 → 5 → 5 → 5 (repeating)
Tick Interval 500ms
Behaviour Mimics a two-beat heartbeat pulse with distinct "lub-dub" rhythm
🎭 Surprise Pattern
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.
🔧 Custom Surprise Configurable

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
STOP Emergency

Immediately halts all motion, clears all running preset intervals and timers, disables Random Stroke, and resets stroke range to Master values.


🎬 Sequence Timeline

Chain multiple presets into an automated playlist. Each segment runs for a configurable duration before advancing to the next.

  • Palette — Drag or click preset chips to add segments to the timeline.
  • Segments — Resize by dragging edge handles, reorder by drag-and-drop, or remove with the ✕ button.
  • Default Duration — New segments use this value (default: 20s, range: 2–120s).
  • Play / Stop — Starts or halts sequential playback. A progress bar animates through each active segment.
  • Repeat — When enabled, the timeline loops from the beginning after the last segment completes.
  • Save / Clear — Persists or wipes the timeline from browser local storage.

🏗️ Architecture

The app is a lightweight client-side PWA backed by a stateless Node.js/Express proxy.

  • Frontend — Vanilla HTML/CSS/JS with glassmorphism UI. All preset logic, timers, and random calculations run in the browser.
  • Backend — Express server acts as a blind proxy. It receives the Connection Key as an HTTP header from the browser and forwards it to the Handy Cloud API. No state is stored server-side. Security headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy) are applied to all responses.
  • Hosting — Served on myhandy.click (dedicated domain) and also at vidscan.jasonchoy.com/handy (legacy path). Caddy handles HTTPS/TLS certificates automatically via Let's Encrypt.
  • Storage — Connection Key and timeline data are stored in localStorage.
  • Multi-user — Each user manages their own key. The server scales linearly since it holds no per-user state.

Handy Control Panel — Documentation