<divclass="source-card"><spanclass="status-dot"id="sourceDot"></span><div><strongid="sourceLabel">Checking source</strong><smallid="sourceSub">Connecting to Maps worker</small></div></div>
<p>Personal workspace<br><span>No outreach is sent</span></p>
<div><spanclass="eyebrow">PERSONAL DISCOVERY WORKSPACE</span><h1>Find the businesses worth a closer look.</h1><p>Search Google Maps, remove places already in your catalogue, then review the strongest opportunities in one calm workspace.</p></div>
<divclass="heading-badge"><spanclass="pulse"></span><spanid="backendLabel">Maps worker</span><small>private & local</small></div>
<divclass="notice-icon">!</div><div><strong>Finish the Maps worker setup</strong><pid="setupText">Start the bundled worker with Docker, then reload this page. The standard worker needs no API key.</p></div><ahref="#setup"class="text-link">Setup guide ↓</a>
<articleclass="stat-card"><divclass="stat-label"><spanclass="stat-icon green">✓</span><span>Approved</span></div><strongid="approved">0</strong><small>ready for your next step</small></article>
<divclass="panel-heading"><div><spanclass="eyebrow">01 · NEW SEARCH</span><h2>Start a discovery run</h2><p>Describe the businesses you want. These criteria apply only to this run.</p></div><spanclass="source-tag"><spanclass="status-dot"></span> Google Maps</span></div>
<formid="discoverForm"class="discovery-form">
<divclass="field wide"><labelfor="keywords">What should we find?<span>Keywords</span></label><inputid="keywords"name="keywords"placeholder="e.g. plumbing services"required></div>
<divclass="options wide"><labelclass="check locked"><inputtype="checkbox"id="include-email"name="include_email"checkeddisabled><spanclass="check-box"></span><span><strong>Collect public website emails</strong><small>Always on. The worker follows each public business website when available.</small></span></label><labelclass="check"><inputtype="checkbox"id="extra-reviews"name="extra_reviews"><spanclass="check-box"></span><span><strong>Collect extra reviews</strong><small>Useful for research, but increases run time.</small></span></label></div>
<divclass="form-footer wide"><buttonclass="primary-btn"id="discoverBtn"type="submit"><span>Run discovery</span><spanclass="btn-arrow">→</span></button><spanid="discoverMessage"class="form-message"role="status">Results are deduplicated before saving.</span></div>
<divid="activeRun"class="active-run empty-run"><divclass="run-orb">◷</div><div><strong>No active run</strong><p>Start a search to see progress here.</p></div></div>
<divclass="panel-heading explorer-heading"><div><spanclass="eyebrow">03 · CATALOGUE</span><h2>Prospect explorer</h2><p>Sort by opportunity score, inspect the evidence, and mark your next action.</p></div><divclass="explorer-actions"><divclass="search-box"><span>⌕</span><inputid="search"placeholder="Search catalogue"aria-label="Search catalogue"></div><selectid="status"aria-label="Filter by review status"><optionvalue="">All statuses</option><optionvalue="pending">Needs review</option><optionvalue="approved">Approved</option><optionvalue="rejected">Rejected</option><optionvalue="contacted">Contacted</option></select><buttonclass="quiet-btn"id="exportCsv"type="button">Export CSV</button><buttonclass="quiet-btn"id="refresh"type="button">Refresh</button></div></div>
<div><spanclass="eyebrow">SETUP</span><h2>One-time worker connection</h2><p>The bundled standard Maps worker runs locally and does not need a Google or scraper API key.</p></div><ol><li>Run <code>docker compose up -d --build</code>.</li><li>Keep <code>GMAPS_API_MODE=standard</code> in <code>.env</code>.</li><li>Start a discovery run. Open port <code>8081</code> only if you want to inspect the worker's native UI.</li></ol>
<sectionclass="panel schedule-panel"id="schedules"><divclass="panel-heading"><div><spanclass="eyebrow">AUTOMATION</span><h2>Scheduled discovery</h2><p>Repeat a search on a bounded interval and review the new results.</p></div></div><formid="scheduleForm"class="discovery-form"><divclass="field"><labelfor="schedule-category">Category</label><inputid="schedule-category"placeholder="e.g. plumbers"></div><divclass="field"><labelfor="schedule-keywords">Keywords</label><inputid="schedule-keywords"placeholder="e.g. plumbing services"></div><divclass="field"><labelfor="schedule-location">Location</label><inputid="schedule-location"value="South Africa"></div><divclass="field"><labelfor="schedule-interval">Repeat every</label><selectid="schedule-interval"><optionvalue="24">24 hours</option><optionvalue="48">48 hours</option><optionvalue="168">7 days</option></select></div><divclass="form-footer wide"><buttonclass="quiet-btn"type="submit">Save schedule</button><spanid="scheduleMessage"class="form-message"></span></div></form><divid="scheduleList"class="muted"></div></section>
<dialogid="messageDialog"class="message-dialog"><formmethod="dialog"id="messageForm"><divclass="dialog-head"><div><spanclass="eyebrow">AI ASSISTED DRAFT</span><h2id="messageTitle">Tailor a message</h2><p>Review the evidence, add your offer, then edit before sending.</p></div><buttonclass="icon-btn"value="cancel"aria-label="Close">×</button></div><labelfor="offerInput">What should we offer?</label><textareaid="offerInput"rows="4"placeholder="e.g. Move their hosting to Gold Plus for R119/month and rebuild the website free."></textarea><divid="messageStatus"class="form-message"></div><buttonclass="primary-btn"id="generateMessage"type="button">Generate subject and email →</button><labelfor="subjectOutput">Subject</label><inputid="subjectOutput"readonly><labelfor="bodyOutput">Email draft</label><textareaid="bodyOutput"rows="12"></textarea><divclass="dialog-actions"><buttonclass="quiet-btn"id="copyMessage"type="button">Copy draft</button><buttonclass="quiet-btn"value="cancel">Close</button></div></form></dialog>