v2 had three shortcuts (Relay / Latest / Respond). v3 collapsed them into a single smart shortcut that branches based on whether there's unread inbox. Plus a sneaky cross-agent fix where alcohol logs were going to the wrong table. Everything still runs on Mina's Mac for ~$0.20/day.
All Mina's stuff lives on his Mac. He doesn't.
Cockpit · mina-pt · insta-agent · LeedAB · n8n · Second Brain. All useful, all anchored to a screen. Every walk, every chore, every commute = blind spot. Insights vanish. Captures don't happen. Decisions wait for desk time.
Aria sits in his pocket. He talks. She reads his vault, asks his other agents, captures his thoughts, briefs him in the morning, can pause to ask him a follow-up question, controls his music. The desk is optional, not central.
A FastAPI service on the Mac, a Telegram bot, ONE iOS Shortcut on watch + phone, three launchd timers, persistent vault memory. ~2,300 lines of Python. Built across two weekends.
Phone is I/O. Mac is brain. Cloud is the model. Vault is memory. Other agents are spokes.
┌── apple watch (haptic + tap surface) │ jbl flex 3 │ ┌── second brain vault (read + soft-write) │ │ │ _inbox/aria-captures/YYYY-MM-DD.md │ │ │ Mina/aria-learnings.md (persistent memory) │ │ │ ▼ ▼ ▼ ┌────────────────────────┐ ┌──────────────────────────────┐ │ iPhone │ │ Mac (always-on, caffeinate) │ │ │ │ │ │ • iOS Shortcuts │ ───────►│ FastAPI · port 8770 │ │ (Relay/Latest/ │ POST │ ├─ /tell /push /reply │ │ Respond) │ │ ├─ /mission /stop │ │ • Telegram bot DM │ ◄───────│ └─ /latest /status /health │ │ (watch buzz on │ │ │ │ push) │ │ Mission worker (asyncio) │ │ │ │ • picks up pending │ └────────────────────────┘ │ • runs Claude w/ 12 tools │ │ • pauses on ask_mina │ │ │ │ launchd timers │ │ • 08:00 morning brief │ │ • 22:00 daily cleanup │ └────────────┬─────────────────┘ │ ┌──────────────┬──────────────┬──────────────┼──────────────┬──────────────┐ ▼ ▼ ▼ ▼ ▼ ▼ claude api mina-pt :8766 cockpit :8767 vault insta-agent spotify (sonnet 4.6) (his coach) (brain score) (read+capture) :8765 search via osascript
Every tool is async, returns a short string Claude can summarise, and writes nothing destructive without a soft-capture step. Tools tagged new shipped this evening.
read_vault(path)Markdown read across allow-listed Second Brain folders. Denied: _secrets, _attachments.
read_cockpit()Snapshot of meta-dash cockpit (brain score + dashboard summary).
read_aria_state()Aria's own recent inbox + replies + unread count.
capture_thought(text, tag)Soft-write to today's _inbox/aria-captures/. NEVER touches project files directly.
list_captures_today()Used by the 22:00 cleanup mission to triage the day's captures.
query_mina_pt(question)Ask Mina's existing health coach about training, recovery, supplements, sleep.
get_mina_pt_morning_brief()Fetch the pre-built morning brief from mina-pt.
log_to_mina_pt(text)Free-text log into mina-pt — workouts, meals, sleep, mood.
remember_about_mina(fact, category)Append to Mina/aria-learnings.md. Loaded into system prompt every call. Cross-session memory.
search_insta_agent(query)Search Mina's saved IG reels corpus (354+ reels). PT, mobility, anatomy, recovery — voice-callable.
spotify(action)play / pause / next / previous / now_playing on macOS Spotify. AppleScript-based, no API key needed.
push_to_mina(message)Telegram + watch buzz mid-call. Used when Aria has something Mina should hear separately from her main reply.
ask_mina(question, options)Mission-only. Pauses the mission, pushes the question to Mina's watch, resumes when he replies. Round-trip async.
Four flows Aria runs daily. All proven live in the v3 build session.
launchd fires the morning brief. Aria reads _PLANS.md, fetches mina-pt's brief, snapshots cockpit, pushes 3 staged messages to watch.
Mina taps Aria → "Log to mina-pt that I had one low-carb beer." Aria routes through her log_to_mina_pt tool with the new [ALCOHOL] prefix → mina-pt's coach lands it in alcohol_logs (not meal_logs this time).
Mina dispatches a mission Aria can't fully decide alone. Mid-flow she calls ask_mina, which pushes the question + pauses. Mina taps Aria → speaks → mission resumes.
launchd fires the cleanup mission. Aria reads today's captures, proposes where each should land in Second Brain. Doesn't auto-merge.
v3 collapsed three iOS Shortcuts into one. Same UX, fewer items to remember, smarter routing. Tap once, Aria figures out what you need.
tap "Aria" complication
│
▼
GET /latest unread
│
┌───────────────┴───────────────┐
▼ ▼
unread > 0 unread = 0
│ │
speak each message │
Wait Until Finished │
│ │
└───────────────┬───────────────┘
▼
Dictate Text (mic on)
│
┌───────────────┴───────────────┐
▼ ▼
user spoke silence
│ │
┌─────────┴─────────┐ ▼
▼ ▼ silent exit
had unread = true no unread
│ │
POST /reply POST /tell with allow_tools
│ │
speak "Sent." get reply, speak it
Two new spokes since v1 — insta-agent (saved IG reels) and Spotify (macOS app via AppleScript). No new infra. No new credentials.
Obsidian vault — projects, plans, daily notes, identity files.
His existing AI coach. Training, recovery, nutrition, sleep, supplements.
Daily ops snapshot — brain score, dashboard health, break reminders. Aria panel inside cockpit shows turns + cost + unread + last reply.
Mina's saved IG reels (354+ reels, mostly PT / movement / nutrition). Voice-searchable.
macOS Spotify control via AppleScript. play / pause / next / now playing.
Persistent facts about Mina. Loaded into system prompt every call.
Outbound delivery. Watch buzzes via standard iOS notification on the bot DM.
Daily soft-write target. Reviewed at 22:00 by the cleanup mission.
Aria pushes a one-time alert at 50%, 80%, 95% of daily cap. Stateless threshold-crossing detection.
Aria is cheap, bounded, and graceful — these are the rails that make it safe to leave running.
If daily spend hits the cap, /tell and /mission return 429 until Sydney midnight. Three soft-warning pushes precede the hard stop (50%, 80%, 95%). Today's run cost $0.18 across 20 turns and 6 missions.
If Anthropic's API hangs, Aria returns "thinking too hard, try again" rather than blocking the iOS Shortcut. Typical reply latency: 1.5–3s for no-tool, 3–8s for tool-calling.
Vault writes go ONLY to _inbox/aria-captures/ — never project files. Vault reads exclude _secrets. Tools that take action (spotify, log_to_mina_pt, capture_thought) are scoped narrowly. No shell access in v1.
Aria is the operator surface. Per-customer Aria is the LeedAB consumer-facing endgame.
What Mina built today is the personal version of what every LeedAB customer business will eventually need. Same shape: a per-business voice channel sitting between the operator and their AI ops system. Same substrate: a per-customer brain (Obsidian vault) underneath. Same delivery: phone + earbuds, no desk required.
The 12 tools Aria has on Mina's stack map almost 1:1 to the tools a small-business operator would need: read your CRM, capture a customer thought mid-call, log to your finance brain, brief me on today's sales, remember that this customer prefers async, pause and ask me before sending the contract. We're not building from scratch — we're proving the shape on the easiest customer (Mina) before generalising.
_secrets/)ask_mina + /reply routingMina/aria-learnings.md) — proven recall[ALCOHOL] to catch coach-agent misrouting (proven live, beer correctly routed)aria/PHASE-5-n8n-trigger-plan.md.