2026-04-28 Evening — IMAP Proxy Live, Dashboard Updated
IMAP Proxy — Phase 6.2 Foundation (20:05 UTC)
Status: ✅ Infrastructure wired and dashboard live
Credentials: Pending Matt's iCloud app-specific password
What was built
imap_proxy/module in hoffdesk-api:proxy.py— IMAPProxy class with IDLE support, provider presets (iCloud/Gmail/Outlook/Yahoo), app-specific password authdashboard_router.py—/imap/status,/imap/metrics,/imap/dashboardendpoints- Auto-start on server startup if
IMAP_USER+IMAP_PASSWORDenv vars set - Dashboard updated:
- IMAP Proxy card added to main dashboard (auto-refreshes every 10s)
- System health card now includes IMAP proxy status
- CSS for IMAP-specific styling
- Auth bypass for
/imap/prefix (health/metrics, no sensitive data)
Endpoints
GET /imap/status— JSON proxy status (provider, connection, emails processed)GET /imap/metrics— Recent email processing metricsGET /imap/dashboard— HTMX fragment for dashboard embed- Dashboard at
family.hoffdesk.comnow includes IMAP card
To activate iCloud Mail
- Generate app-specific password at appleid.apple.com
- Add to hoffdesk-api
.env:
IMAP_PROVIDER=icloud IMAP_USER=your_email@icloud.com IMAP_PASSWORD=xxxx-xxxx-xxxx-xxxx - Restart server → proxy auto-connects via IMAP IDLE
Architecture
- Outbound-only (appliance-initiated, no inbound tunnels)
- IMAP IDLE for real-time push notification
- Fallback poll every 30s if IDLE unsupported
- Auth circuit breaker: 3 consecutive failures → alert Matt, silence
- Zero-config ingress: iCloud App Password → IMAP IDLE → Document Pipeline
Files Modified/Created
- NEW:
hoffdesk-api/imap_proxy/__init__.py - NEW:
hoffdesk-api/imap_proxy/proxy.py - NEW:
hoffdesk-api/imap_proxy/dashboard_router.py - MODIFIED:
hoffdesk-api/main_v2.py(added IMAP router + startup/shutdown hooks) - MODIFIED:
hoffdesk-api/dashboard/router.py(IMAP health check) - MODIFIED:
hoffdesk-api/shared/session_auth.py(IMAP auth bypass) - MODIFIED:
shared/project-docs/dashboard/templates/index.html(IMAP card) - MODIFIED:
shared/project-docs/dashboard/static/style.css(IMAP styles)