Replace inline SKILL.md instructions with executable shell scripts for each setup phase (environment check, deps, container, auth, groups, channels, mounts, service, verify). Scripts emit structured status blocks for reliable parsing. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
36 lines
1.7 KiB
HTML
36 lines
1.7 KiB
HTML
<!DOCTYPE html>
|
|
<html><head><title>NanoClaw - WhatsApp Auth</title>
|
|
<meta http-equiv="refresh" content="3">
|
|
<style>
|
|
body { font-family: -apple-system, sans-serif; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #f5f5f5; }
|
|
.card { background: white; border-radius: 16px; padding: 40px; box-shadow: 0 4px 24px rgba(0,0,0,0.1); text-align: center; max-width: 400px; }
|
|
h2 { margin: 0 0 8px; }
|
|
.timer { font-size: 18px; color: #666; margin: 12px 0; }
|
|
.timer.urgent { color: #e74c3c; font-weight: bold; }
|
|
.instructions { color: #666; font-size: 14px; margin-top: 16px; }
|
|
svg { width: 280px; height: 280px; }
|
|
</style></head><body>
|
|
<div class="card">
|
|
<h2>Scan with WhatsApp</h2>
|
|
<div class="timer" id="timer">Expires in <span id="countdown">60</span>s</div>
|
|
<div id="qr">{{QR_SVG}}</div>
|
|
<div class="instructions">Settings → Linked Devices → Link a Device</div>
|
|
</div>
|
|
<script>
|
|
// Persist start time across auto-refreshes
|
|
var startKey = 'nanoclaw_qr_start';
|
|
var start = localStorage.getItem(startKey);
|
|
if (!start) { start = Date.now().toString(); localStorage.setItem(startKey, start); }
|
|
var elapsed = Math.floor((Date.now() - parseInt(start)) / 1000);
|
|
var remaining = Math.max(0, 60 - elapsed);
|
|
var countdown = document.getElementById('countdown');
|
|
var timer = document.getElementById('timer');
|
|
countdown.textContent = remaining;
|
|
if (remaining <= 10) timer.classList.add('urgent');
|
|
if (remaining <= 0) {
|
|
timer.textContent = 'QR code expired — a new one will appear shortly';
|
|
timer.classList.add('urgent');
|
|
localStorage.removeItem(startKey);
|
|
}
|
|
</script></body></html>
|