VE
verify
Build, launch, and drive HomeGlow locally to verify client/server changes end-to-end.
Install
mkdir -p .claude/skills/verify-jherforth && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16685" && unzip -o skill.zip -d .claude/skills/verify-jherforth && rm skill.zipInstalls to .claude/skills/verify-jherforth
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Build, launch, and drive HomeGlow locally to verify client/server changes end-to-end.85 charsno explicit “when” trigger
About this skill
Verifying HomeGlow changes
Launch (demo mode gives instant sample data)
# API server — demo mode auto-seeds chores + calendar for each new device
cd server && PORT=5001 DEMO_MODE=true node index.js &
# Client dev server (client/ expects the API at localhost:5001 in dev mode)
cd client && npx vite --port 3012 --strictPort &
Gotchas:
- Ports 3001/3005 are often already taken by the user's own dev servers on this machine — pick an unused port, never kill existing node processes.
- Each browser profile is a fresh "device" (
homeglow_device_namein localStorage). Demo seeding only happens for first-run devices: if you interceptGET /api/devices/*/settingsand injectwidgetSettingsinto an empty response, the app thinks it's configured and never seeds.
Drive (Playwright + system Edge, no browser download)
npm i playwright-core in the scratchpad, then
chromium.launch({ channel: 'msedge', headless: true }).
Useful handles:
- Widgets:
.widget-wrapper; refresh ring:button[aria-label="Refresh widget now"]. - Shrink widget refresh intervals by rewriting
GET /api/devices/*/settingsresponses (only whenwidgetSettingsalready exists — see gotcha above). - Simulate tab hide/show:
Object.defineProperty(document,'visibilityState',...)plus dispatchingvisibilitychange. - Screensaver: seed localStorage
screensaverSettings({enabled,mode:'photos'|'tabs',timeout(minutes, fractions ok),slideshowInterval}) before load; exit by clicking the overlay. - Track data churn with
page.on('request')filtered tolocalhost:5001.
Worth driving
- Widget auto-refresh cadence and the countdown ring (in-place, no remount: tag DOM nodes with a marker property and confirm they survive a refresh).
- Hidden page / photos-mode screensaver must stop all widget fetches; on resume an overdue widget fetches exactly once (catch-up).
- Client unit tests:
cd client && npm test(vitest). Server:cd server && npm test.