Keep your mouse moving and avoid timing-out of your screen with this handy, completely free mouse jiggler. Note: this isn’t to be used to keep your mouse cursor moving to trick an activity tracker. So don’t do that!

Mouse Jiggler .mouse-jiggler-wrapper { background: linear-gradient(135deg, #ebf4ff 0%, #e0e7ff 100%); padding: 40px 20px; font-family: -apple-system, BlinkMacSystemFont, ‘Segoe UI’, Roboto, sans-serif; } .jiggler-card { background: white; border-radius: 16px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15); padding: 32px; max-width: 480px; margin: 0 auto; width: 100%; } .jiggler-header { text-align: center; margin-bottom: 32px; } .jiggler-header h2 { font-size: 28px; font-weight: bold; color: #1f2937; margin: 0 0 8px 0; } .jiggler-header p { color: #6b7280; font-size: 14px; margin: 0; } .status-card { background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%); border-radius: 12px; padding: 24px; margin-bottom: 24px; color: white; } .status-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .status-label { font-size: 12px; opacity: 0.9; } .status-badge { padding: 6px 12px; border-radius: 20px; font-size: 11px; font-weight: 600; } .status-badge.active { background: #4ade80; color: #166534; } .status-badge.inactive { background: #d1d5db; color: #374151; } .move-count { text-align: center; } .move-count-number { font-size: 48px; font-weight: bold; margin-bottom: 8px; } .move-count-label { font-size: 12px; opacity: 0.9; } .runtime { margin-top: 16px; text-align: center; font-size: 12px; opacity: 0.9; } .controls { margin-bottom: 24px; } .control-group { margin-bottom: 20px; } .control-label { display: block; font-size: 13px; font-weight: 500; color: #374151; margin-bottom: 8px; } .slider { width: 100%; height: 8px; background: #e5e7eb; border-radius: 4px; outline: none; -webkit-appearance: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; background: #6366f1; border-radius: 50%; cursor: pointer; } .slider::-moz-range-thumb { width: 20px; height: 20px; background: #6366f1; border-radius: 50%; cursor: pointer; border: none; } .slider:disabled { opacity: 0.5; cursor: not-allowed; } .slider-values { display: flex; justify-content: space-between; font-size: 11px; color: #6b7280; margin-top: 4px; } .slider-values .current { color: #6366f1; font-weight: 600; } .select { width: 100%; padding: 10px 16px; border: 1px solid #d1d5db; border-radius: 8px; font-size: 14px; background: white; cursor: pointer; } .select:disabled { opacity: 0.5; background: #f3f4f6; cursor: not-allowed; } .select:focus { outline: none; border-color: #6366f1; box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); } .main-button { width: 100%; padding: 16px; border: none; border-radius: 12px; font-size: 16px; font-weight: 600; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; transition: all 0.2s; } .main-button:hover { transform: scale(1.02); } .main-button:active { transform: scale(0.98); } .main-button.start { background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%); } .main-button.start:hover { background: linear-gradient(135deg, #2563eb 0%, #4f46e5 100%); } .main-button.stop { background: #ef4444; } .main-button.stop:hover { background: #dc2626; } .note { margin-top: 24px; padding: 16px; background: #eff6ff; border-radius: 8px; } .note p { font-size: 11px; color: #374151; text-align: center; line-height: 1.5; margin: 0; } .note strong { font-weight: 600; } .icon { width: 20px; height: 20px; }

Mouse Jiggler

Keep your screen awake automatically

Status Inactive
0
Mouse movements
Interval (seconds)
5s 30s 120s
Movement Pattern Circular Square Zigzag Minimal

Note: This simulates mouse activity in the browser. For system-level prevention, consider adjusting your power settings or using a dedicated system utility.

(function() { var isActive = false; var moveCount = 0; var interval = 30; var pattern = ‘circular’; var intervalId = null; var patternIndex = 0; var patterns = { circular: function(index) { var angle = (index * Math.PI) / 18; return { x: Math.cos(angle) * 5, y: Math.sin(angle) * 5 }; }, square: function(index) { var positions = [ { x: 5, y: 0 }, { x: 5, y: 5 }, { x: 0, y: 5 }, { x: -5, y: 5 }, { x: -5, y: 0 }, { x: -5, y: -5 }, { x: 0, y: -5 }, { x: 5, y: -5 } ]; return positions[index % positions.length]; }, zigzag: function(index) { var isEven = index % 2 === 0; return { x: isEven ? 5 : -5, y: isEven ? 3 : -3 }; }, minimal: function(index) { var isEven = index % 2 === 0; return { x: isEven ? 1 : -1, y: 0 }; } }; var elements = { toggleButton: document.getElementById(‘toggleButton’), buttonText: document.getElementById(‘buttonText’), statusBadge: document.getElementById(‘statusBadge’), moveCount: document.getElementById(‘moveCount’), runtime: document.getElementById(‘runtime’), runtimeValue: document.getElementById(‘runtimeValue’), intervalSlider: document.getElementById(‘intervalSlider’), intervalValue: document.getElementById(‘intervalValue’), patternSelect: document.getElementById(‘patternSelect’) }; function formatTime(seconds) { var hrs = Math.floor(seconds / 3600); var mins = Math.floor((seconds % 3600) / 60); var secs = seconds % 60; return hrs.toString().padStart(2, ‘0’) + ‘:’ + mins.toString().padStart(2, ‘0’) + ‘:’ + secs.toString().padStart(2, ‘0’); } function updateUI() { elements.moveCount.textContent = moveCount; elements.runtimeValue.textContent = formatTime(moveCount * interval); if (isActive) { elements.statusBadge.textContent = ‘Active’; elements.statusBadge.className = ‘status-badge active’; elements.buttonText.textContent = ‘Stop Jiggling’; elements.toggleButton.className = ‘main-button stop’; elements.toggleButton.innerHTML = ‘Stop Jiggling‘; elements.runtime.style.display = ‘block’; elements.intervalSlider.disabled = true; elements.patternSelect.disabled = true; } else { elements.statusBadge.textContent = ‘Inactive’; elements.statusBadge.className = ‘status-badge inactive’; elements.toggleButton.className = ‘main-button start’; elements.toggleButton.innerHTML = ‘Start Jiggling‘; elements.runtime.style.display = ‘none’; elements.intervalSlider.disabled = false; elements.patternSelect.disabled = false; } } function startJiggling() { intervalId = setInterval(function() { var movement = patterns[pattern](patternIndex); var event = new MouseEvent(‘mousemove’, { bubbles: true, cancelable: true, clientX: window.innerWidth / 2 + movement.x, clientY: window.innerHeight / 2 + movement.y }); document.dispatchEvent(event); patternIndex++; moveCount++; updateUI(); }, interval * 1000); } function stopJiggling() { if (intervalId) { clearInterval(intervalId); intervalId = null; } } elements.toggleButton.addEventListener(‘click’, function() { isActive = !isActive; if (isActive) { moveCount = 0; patternIndex = 0; startJiggling(); } else { stopJiggling(); } updateUI(); }); elements.intervalSlider.addEventListener(‘input’, function(e) { interval = parseInt(e.target.value); elements.intervalValue.textContent = interval + ‘s’; }); elements.patternSelect.addEventListener(‘change’, function(e) { pattern = e.target.value; patternIndex = 0; }); updateUI(); })();

Note: No, your mouse cursor won’t visually move on screen!

Here’s what’s actually happening:

The app is dispatching mousemove events to the browser, which registers as activity and should help prevent the screen from going to sleep. However, these events don’t actually move your physical cursor – you won’t see it jumping around.

What it does:

  • Simulates mouse activity at the browser level
  • May prevent browser-based idle detection
  • Keeps the browser tab “active”

What it doesn’t do:

Work when the tab is in the background

Move your actual cursor visually

Prevent system-level sleep (Windows/Mac power settings)

Leave a comment

Trending