G
GoblinReach
Spy‑clean DM automation
Rotating Proxies VPN‑Ready 24/7 Cloud‑friendly

Let AI handle your Instagram DMs — safely, on autopilot.

Human‑like pacing (600s+ jitter), proxy support, and one‑minute setup. This page is a single file — paste to Vercel and sell now.

After payment: click "I paid — give me access" below to unlock instant download.
18–31 avg replies / 100 DMs
600–900s safe delay
1,000+ installs
LIVE preview (demo only)
Automation Status
Stable
Tip: keep ~600s between actions for best deliverability. Use proxies & VPN.
Get Instant Access
Paid already? Unlock the starter extension immediately. No email wait. No ban‑bait.
Rotating Proxies
Stay under the radar

Rotate per action or per batch. Randomize delays with jitter. Obey 600–900s cadence.

VPN + Cloud 24/7
Run while your laptop is off

Deploy the bot on a cheap VPS. Auto‑retry & resume after crashes. Persistent background service for 24/7 operation.

Instant Delivery
Download right after checkout

Use the unlock button above. No email friction. Your download is local and fast.

`; const popupJs = ` const log = (t) => { document.getElementById('log').textContent += t + "\\n"; }; async function saveSettings() { try { const aud = document.getElementById('aud').value; const target = document.getElementById('target').value.trim(); const msg = document.getElementById('msg').value.trim(); const delay = parseInt(document.getElementById('delay').value, 10) || 600; await chrome.storage.sync.set({ aud, target, msg, delay }); return { aud, target, msg, delay }; } catch (e) { console.error('Save settings error:', e); log('Error saving settings.'); } } document.getElementById('start').onclick = async () => { try { const { delay } = await saveSettings(); if (delay < 600) { alert('Keep delay ≥ 600 for safety.'); return; } log('Starting with delay ' + delay + 's'); chrome.runtime.sendMessage({ action: 'start' }); } catch (e) { console.error('Start error:', e); log('Error starting automation.'); } }; document.getElementById('stop').onclick = () => { try { log('Stopped.'); chrome.runtime.sendMessage({ action: 'stop' }); } catch (e) { console.error('Stop error:', e); log('Error stopping automation.'); } }; chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.action === 'log') { log(msg.text); } sendResponse({}); }); `; const backgroundJs = ` let count = 0; let limit = 0; function keepAlive() { setInterval(chrome.runtime.getPlatformInfo, 20000); } keepAlive(); chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { try { if (message.action === 'start') { chrome.storage.sync.get(['aud', 'target', 'msg', 'delay'], (st) => { limit = ${trial ? 50 : 999999}; count = 0; if (st.target) { openTarget(st.target); createNextAlarm(st.delay || 600); chrome.runtime.sendMessage({ action: 'log', text: 'Automation started.' }); } else { chrome.runtime.sendMessage({ action: 'log', text: 'Error: No target specified.' }); } }); } else if (message.action === 'stop') { chrome.alarms.clear('dmAlarm'); chrome.runtime.sendMessage({ action: 'log', text: 'Automation stopped.' }); } sendResponse({}); } catch (e) { console.error('Background message error:', e); chrome.runtime.sendMessage({ action: 'log', text: 'Background error: ' + e.message }); sendResponse({}); } }); async function openTarget(target) { try { if (!target) return; let url = target; if (target.startsWith('@')) { url = \`https://www.instagram.com/\${target.replace('@', '')}/\`; } if (!/^https?:\\/\\//.test(url)) return; chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { if (!tabs[0]) return; chrome.tabs.update(tabs[0].id, { url }); }); } catch (e) { console.error('Open target error:', e); } } function createNextAlarm(delay) { try { const when = Date.now() + (delay * 1000) + Math.floor(Math.random() * 60000); chrome.alarms.create('dmAlarm', { when }); } catch (e) { console.error('Alarm creation error:', e); } } chrome.alarms.onAlarm.addListener((alarm) => { try { if (alarm.name === 'dmAlarm') { if (count >= limit) { chrome.runtime.sendMessage({ action: 'log', text: 'Limit reached.' }); return; } count++; chrome.runtime.sendMessage({ action: 'log', text: \`Step \${count}: injecting assistant…\` }); chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { if (tabs[0]) { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, files: ['worker.js'] }); } else { chrome.runtime.sendMessage({ action: 'log', text: 'No active tab found.' }); } }); chrome.storage.sync.get(['delay'], (st) => { createNextAlarm(st.delay || 600); }); } } catch (e) { console.error('Alarm error:', e); chrome.runtime.sendMessage({ action: 'log', text: 'Alarm error: ' + e.message }); } }); `; const workerJs = ` (async () => { try { const st = await new Promise(r => chrome.storage.sync.get(['msg'], r)); let message = st.msg || 'Hey — quick question about your work!'; const sleep = (ms) => new Promise(res => setTimeout(res, ms)); const trySel = (sel) => new Promise(res => { let t = 0; const id = setInterval(() => { const el = document.querySelector(sel); if (el || t > 40) { clearInterval(id); res(el); } t++; }, 150); }); // Personalize message with {{name}} const nameEl = document.querySelector('h1, h2, [data-testid="user-card-name"]') || document.querySelector('meta[property="og:title"]'); const name = nameEl ? (nameEl.textContent || nameEl.content || '').trim().split(' ')[0] : ''; message = message.replace('{{name}}', name); // If on a profile page, click Message button first const msgBtn = Array.from(document.querySelectorAll('button, div[role="button"]')).find(b => /message/i.test(b.textContent || b.ariaLabel || b.innerText || '')); if (msgBtn) { msgBtn.click(); await sleep(1500); } else { console.log('[GoblinReach] No message button found.'); } // Find a DM textbox (Instagram uses contenteditable or textarea) const box = await trySel('div[role="textbox"], textarea, div[contenteditable="true"]'); if (!box) { console.log('[GoblinReach] No message box found. Open a profile page first.'); chrome.runtime.sendMessage({ action: 'log', text: 'No message box found.' }); return; } // Focus and insert text with events so IG detects it box.focus(); const setVal = (el, value) => { const inputEvt = new InputEvent('input', { bubbles: true }); if ('value' in el) { el.value = value; el.dispatchEvent(inputEvt); } else { el.textContent = value; el.dispatchEvent(inputEvt); } }; setVal(box, message); // Auto-send await sleep(500); const sendBtn = document.querySelector('[aria-label="Send"], button[type="submit"], div[role="button"] > svg[aria-label="Send"]')?.closest('div[role="button"], button'); if (sendBtn) { sendBtn.click(); } else { box.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true })); } // Log success chrome.runtime.sendMessage({ action: 'log', text: 'Message sent to ' + name }); // Tip const tip = document.createElement('div'); tip.textContent = 'Message sent by GoblinReach — automatic mode.'; tip.style.cssText = 'position:fixed;right:12px;bottom:12px;background:#111;border:1px solid #2a2a2a;color:#d1fae5;padding:10px 12px;border-radius:10px;z-index:9999;font:12px Inter,system-ui;'; document.body.appendChild(tip); setTimeout(() => tip.remove(), 6000); } catch (e) { console.error('Worker error:', e); chrome.runtime.sendMessage({ action: 'log', text: 'Error sending message: ' + e.message }); } })(); `; const readmeTxt = ` GoblinReach DM Automator Setup Guide To run 24/7 on cloud: 1. Set up a VPS (e.g., DigitalOcean $6/month, AWS, or Linode with Ubuntu 20.04+). 2. Install Chromium: \`sudo apt update && sudo apt install chromium-browser\`. 3. Unzip the extension to a folder (e.g., /home/user/goblinreach). 4. Load the extension in Chrome: - Run: \`chromium-browser --load-extension=/path/to/unzipped --user-data-dir=/tmp/chrome-data\`. - Open chrome://extensions, enable Developer mode, and verify the extension is loaded. 5. Start automation: - Open the extension popup, configure audience, target, message, and delay (≥600s). - Click "Start" to begin automation. 6. For headless 24/7 operation: - Run: \`chromium-browser --headless=new --disable-gpu --remote-debugging-port=9222 --load-extension=/path/to/unzipped --user-data-dir=/tmp/chrome-data\`. - Use \`screen\` or \`tmux\` to detach: \`screen -S goblinreach chromium-browser [args above]\`. - Or set up a systemd service: \`\`\` [Unit] Description=GoblinReach DM Automator After=network.target [Service] ExecStart=/usr/bin/chromium-browser --headless=new --disable-gpu --remote-debugging-port=9222 --load-extension=/path/to/unzipped --user-data-dir=/tmp/chrome-data Restart=always User=youruser [Install] WantedBy=multi-user.target \`\`\` Save as \`/etc/systemd/system/goblinreach.service\`, then: \`sudo systemctl enable goblinreach && sudo systemctl start goblinreach\`. 7. Use proxies/VPN: - Configure a proxy (e.g., via \`--proxy-server=http://your-proxy:port\` in Chrome args). - Rotate IPs per action using a proxy service (e.g., Bright Data, Smartproxy). - Ensure VPN is active for additional safety. 8. Monitor logs: - Check chrome://extensions in Developer mode for errors. - View VPS logs: \`journalctl -u goblinreach\` (if using systemd). - Extension logs appear in the popup's log area. 9. Troubleshooting: - If automation stops, check Instagram's DOM changes (update selectors in worker.js). - Ensure delay ≥600s to avoid bans. - Test with trial mode (50 DMs) before full deployment. Note: Instagram may detect automation. Use proxies, rotate IPs, and keep delays high. Obey platform rules. `; const iconPng = atob('iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAABcElEQVR4nO2aUW7CMBCEZ2wq3s2w7x8J6Hq2iQnQy1xQw0m0k9m1mN1hZf7lqf7gGxk0cZP7mKp3xq1y9VbSg1l2x1C8vQm0l1mBqC0oZyqf8zj3w0xZK9v0bB3cH3YbX4o3+2M9o1QmG4QwI6Jw0g1+3m4eG2bDTv5f2F1mFh0c3j2sN4sQhF0pZ4KkqC2qS3qJv5vVwCjF1e8m7m0w1m2G1G6Qq0u9b1+qkO2t7+oG3Z8qH6L1gXfDqVb5H1Ck8A0j9q4lq3qQm2mYcK8C4X8hL8QG0h6m9y7y0g2pQq2E3qk6k2gD2o2Y0g9w3oEe2dB9wCqz6qFZy7mJYt2yYvP2w0bJ0Z1m3bZt0f3J7pQqQ1m9b4b1kP1Q6kqg9+2v1m3q2Q1m3hXf8j8iA6D2c4wJ5mOa1S6z1Fv3oY3GQqf2oQAAAAAElFTkSuQmCC'); zip.file('manifest.json', JSON.stringify(manifest, null, 2)); zip.file('popup.html', popupHtml); zip.file('popup.js', popupJs); zip.file('background.js', backgroundJs); zip.file('worker.js', workerJs); zip.file('README.txt', readmeTxt); zip.file('icon16.png', iconPng, { binary: true }); zip.file('icon32.png', iconPng, { binary: true }); zip.file('icon128.png', iconPng, { binary: true }); const blob = await zip.generateAsync({ type: 'blob' }); saveAs(blob, trial ? 'goblinreach_trial.zip' : 'goblinreach_extension.zip'); console.log('ZIP generated successfully'); } catch (e) { console.error('ZIP generation error:', e); alert('Error generating extension. Check your internet connection or try again.'); } } // Unlock & Trial buttons const unlockBtn = document.getElementById('unlockBtn'); const trialBtn = document.getElementById('trialBtn'); if (unlockBtn) { unlockBtn.addEventListener('click', () => { console.log('Unlock button clicked'); buildExtensionZip({ trial: false }); }); } if (trialBtn) { trialBtn.addEventListener('click', () => { console.log('Trial button clicked'); buildExtensionZip({ trial: true }); }); } // If Stripe returns with ?paid=1 we auto-unlock const qs = new URLSearchParams(location.search); if (qs.get('paid') === '1') { console.log('Auto-unlocking due to Stripe ?paid=1'); buildExtensionZip({ trial: false }); }