---
name: personal-radar
description: Morning scan skill that audits all available APIs, secrets, tokens, and capabilities, then checks emails and calendars across all connected accounts. Run on heartbeat/cron to produce a daily briefing. Use when asked to scan emails, check calendar, do morning briefing, or audit available tools and APIs.
---

# Personal Radar

Full-spectrum intelligence scan. Checks every service, reports status + billing, pulls emails + calendar.

## When to Run
- Morning cron / heartbeat
- "check my emails" / "what's on my calendar"
- "what access do we have" / "run radar"
- Before ANY agent claims "I don't have access" — run this first

## Execution

```bash
cd /root/.openclaw/workspace && source venv/bin/activate && python3 skills/personal-radar/scripts/radar.py
```

Parse the JSON output and format as the briefing below.

## Master Service Registry

### 🟢 Connected — Free / Unlimited

| Service | Auth | Location | Capabilities | Billing |
|---------|------|----------|-------------|---------|
| **Playwright** | None needed | `/usr/local/bin/playwright` v1.58.2 | Screenshots, full browser automation, stealth mode | **Free, unlimited** |
| **OpenClaw Browser** | Internal | headless chromium | Snapshot, screenshot, navigate, act, Chrome relay | **Free** (part of OpenClaw) |
| **ImageMagick** | None needed | `/usr/bin/convert` | Crop, resize, compress, format convert | **Free, unlimited** |
| **Microlink API** | None needed | `https://api.microlink.io/` | OG data, screenshots, metadata extraction | **Free tier** — 50 req/day, then throttled |
| **GitHub CLI** | OAuth token | `~/.config/gh/hosts.yml` | Repos, issues, PRs, CI, API queries | **Free** (public repos unlimited) |
| **Vercel CLI** | Auth token | `vercel` global | Deploy CE website | **Free tier** — hobby plan |
| **curl/wget** | None | System | HTTP requests | **Free** |
| **Node.js** | None | `/usr/bin/node` v22.22.0 | Scripts, servers | **Free** |
| **Python 3.12** | None | `/usr/bin/python3` | Scripts, automation | **Free** |

### 🟢 Connected — Paid / Metered

| Service | Auth | Location | Capabilities | Billing |
|---------|------|----------|-------------|---------|
| **Gemini AI** | API key | `GEMINI_API_KEY` env | 44 models incl. image gen (gemini-3.1-flash-image, imagen-4.0) | **Free tier generous** — 15 RPM flash, 2 RPM pro. Pay-as-you-go after |
| **Notion API** | API key | `/home/clawd/secrets/notion/api_key` | Query/create/update pages + databases | **Free** (API included in workspace plan) |
| **Figma API** | Personal token | `/home/clawd/secrets/figma/api_token` | Read files, export images, file data | **Free** (included in Figma plan) |
| **Anthropic (Claude)** | API key | OpenClaw internal | All agent conversations | **Paid** — per-token. Track via `session_status` |
| **Discord Bot** | Bot tokens | OpenClaw internal (8 agents) | Messages, channels, webhooks, reactions | **Free** |

### 🟢 Connected — Google Accounts

| Account | Token | Scopes | Calendars |
|---------|-------|--------|-----------|
| **kitt@curiousendeavor.com** | `google-auth/token.json` | gmail, calendar, docs, slides, drive, sheets | Kitt's calendar |
| **assafdagancos@gmail.com** | `google-auth/token-personal.json` | gmail.readonly, calendar.readonly | 9 calendars: Personal, CE, Spoken Method, Travel, Visitors, SHOOTS, Perso/Fun, Calendar, Assaf Personal |

### ❌ Not Connected / Broken

| Service | Issue | What's Needed |
|---------|-------|---------------|
| **Recraft** | 401 Unauthorized | API key `RECRAFT_API_KEY` in ~/.bashrc returns 401. Key may have expired or been revoked. Need new key from recraft.ai dashboard |
| **X/Twitter (xurl)** | 401 Unauthorized | No API keys configured. Run `xurl config` or set env vars. Need Twitter developer app credentials |
| **ScreenshotOne** | Quota exhausted | Don't use. Replaced by Playwright |

### ⚠️ Stale / Needs Verification

| Item | Issue |
|------|-------|
| Old Gemini key in MEMORY.md | `AIzaSyC2dTGU667C7l8mzaCjI5S18txWtf0aHPc` is DEAD. Working key: `AIzaSyDXqYZInk83iVV4mD29pSuHQKbgkiI1x9Q` |
| Old Notion key in some scripts | `scrape-add-boards.cjs` hardcodes different key than secrets file |
| `kitt-workspace-token.json` | Referenced in docs/reference.md but file doesn't exist |
| `screen -S mt` | Unknown purpose — check if still needed |

## Screenshot & Capture Methods (ranked by preference)

1. **Playwright CLI** — `playwright screenshot --browser chromium --viewport-size="1440,900" --full-page "URL" out.png`
2. **Playwright Python** — `from playwright.sync_api import sync_playwright` (+ stealth: `playwright-stealth`)
3. **OpenClaw browser tool** — `browser(action="screenshot")` — good for interactive pages
4. **Microlink API** — `https://api.microlink.io/?url=URL` — returns OG image + metadata (50/day free)
5. **OG scraping** — `skills/visual-capture/batch-og.py` — scrape og:image directly (unlimited)
6. **ImageMagick crop** — `convert full.png -crop 1400x900+0+0 hero.png` — post-processing

## Web Scraping Scripts

| Script | Target | Notes |
|--------|--------|-------|
| `scripts/scrape-behance.cjs` | Behance moodboards | Assaf's profile boards |
| `scripts/scrape-behance-board.cjs` | Single Behance board | Full project images |
| `scripts/scrape-add-boards.cjs` | Multiple boards → Notion | 10 boards configured |
| `scripts/scrape-creativeboom.js` | Creative Boom | Inspiration feed |
| `agents/julia/scripts/scrape-design-sites.js` | Creative Boom + It's Nice That | Julia's daily scan |
| `agents/thibault/skills/trend-scouting/scripts/capture-signal.sh` | Any URL | Hero screenshot + crop + compress |
| `scripts/taste-smart-capture.py` | Any URL | Smart: OG → largest image → screenshot |

## Taste Board Pipeline

| Script | Purpose |
|--------|---------|
| `scripts/import-mymind.py` | Import MyMind CSV |
| `scripts/mymind_smart_import.py` | Smart import with dedup + OG covers |
| `scripts/taste-screenshots.py` | Batch screenshots for entries |
| `scripts/taste-smart-capture.py` | Smart image extraction |
| `scripts/taste-microlink-covers.py` | Set covers via Microlink |
| `scripts/taste-notion-covers.py` | Set covers via Notion API |
| `scripts/taste-fix-all-covers.py` | Fix missing covers |
| `scripts/taste-full-sync.py` | Full sync |
| `scripts/taste-ingest.py` | Ingest new entries |
| `scripts/taste-api.js` | API server |

## Figma Integration

| Component | Location | Status |
|-----------|----------|--------|
| Remote plugin | `figma-plugin/code.js` | Commands via WebSocket relay |
| CC Plugin | `public/cc-fig-plugin-download/` | Claude-powered Figma chat |
| Relay server | `scripts/figma-relay-web.cjs` (port 3055) | `screen -r figma-relay` |
| Tunnel | Cloudflared | `screen -r figma-tunnel` (URL changes on restart) |

## Background Services

| Screen Session | Purpose | Check |
|---------------|---------|-------|
| `figma-tunnel` | Cloudflared tunnel | `screen -S figma-tunnel -X hardcopy /tmp/ft.txt && grep trycloudflare /tmp/ft.txt` |
| `figma-relay` | Relay server :3055 | `curl -s localhost:3055` |
| `webserver` | Static files :8800 | `curl -s localhost:8800` |
| `mt` | Unknown | Investigate |

## Output Format

Post briefing:
```
🔭 **Personal Radar** — [date, Lisbon time]

📧 **Email** (X unread across Y accounts)
[grouped by account, newest first, max 10 per account]

📅 **Today** — [day of week]
[events with Lisbon times, sorted chronologically]

📅 **Tomorrow Preview**
[first 3 events]

🔧 **Service Status**
[ALL services with status — ✅ ⚠️ ❌]
[Include billing/quota notes]

🛠️ **Background Services**
[screen sessions — running/stopped]
```

## Rules
- Subject + sender + snippet only for emails. No full bodies.
- Calendar times in Europe/Lisbon timezone.
- Show ALL services every time (not just broken ones).
- If token refresh fails, say so — don't silently skip.
- Flag emails from known contacts.
- After scan: update `docs/credentials-registry.md` if any status changed.
