Architecture
┌── On the recipient's Mac ──────────────────────────────────────┐
│ │
│ Mic → WebRTC VAD → faster-whisper (local) │
│ │ │
│ Camera (on-demand) ───┐ │ │
│ Screen/app sampler ───┤ │ │
│ HID idle detector ────┤ │ │
│ Hotkeys ⌘⇧Space,⌘⌃F,R,D├─────▶ Event Bus ─▶ Scheduler │
│ Cron (morning / 9pm / │ │ │
│ random check-ins /│ ┌─────────┴─────────┐ │
│ med reminders) ───┘ │ rules.decide: │ │
│ Conversation tracker ──────────▶ SKIP/LOG/ │ │
│ (passive capture) │ CHEAP_LLM/BIG_LLM │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌─────────────────────────▼──────────────┐ │
│ │ Gemini 2.5 pro/flash · structured JSON │ │
│ │ ↑ profile + permanent memories + │ │
│ │ semantic-relevant memories injected│ │
│ │ into every system prompt │ │
│ └─────────────────────────┬──────────────┘ │
│ │ │
│ ┌───────────────────────────────┼──────────┐ │
│ ▼ ▼ ▼ │
│ TTS (pyttsx3 / NSSpeech) JSON over USB SQLite │
│ → Mac speaker → ESP32 firmware + pgvec │
│ (OLED eyes + embeddings │
│ 2 flippers) │ │
└─────────────────────────────────────────────────────┼──────────┘
│
(every 60s async) │
▼
┌── Supabase (shared source of truth) ────────────┐
│ users.profile (JSONB) │
│ memories + vector(1536) + RPC match_memories() │
│ meals · observations · messages · activity │
│ Storage: photos bucket (food + reports) │
└──────────────────────────────────────────────────┘
│
┌──────────────┴──────────────┐
▼ ▼
Gifter web (Next.js) Emergency / daily-summary
· daily feed · FCM push (TODO post-hack)
· attention feed
· medical history
· meal log
Log in or sign up for Devpost to join the conversation.