A personal AI assistant that has analyzed 567,090 iMessages, 139,000 photos, and 1,002 Google Voice records — built across 5 repos, 18+ integrations, and 9 device data streams.
Five repositories, each with a focused responsibility. A shared PostgreSQL database ties them together. The iOS app connects via API. External AI clients connect via MCP.
The main web application and API layer. Chat UI with SSE streaming, 21 tool modules dispatching 133 tools, system prompt construction, memory extraction, and all integration endpoints.
The background job worker. Polls the shared database for queued jobs and processes them with a 3-provider LLM router. Runs the proactive intelligence pipeline, journal generation, report compilation, and 38 distinct job handlers.
Shared TypeScript library defining job type contracts. Type-safe payload interfaces, Zod validation schemas, and the TempoClient class for enqueueing jobs. Used by both aria and aria-tempo.
Model Context Protocol server exposing ARIA's capabilities to external AI clients like Claude.ai, Claude Desktop, and Claude Code. Memory CRUD, conversation history, owner context, and Tempo job scheduling.
Native iOS client built with Swift 6 and SwiftUI. Syncs 9 device data streams to the server, handles push notifications, and provides a polished chat interface with SSE streaming. Background fetch, geofencing, Spotlight indexing, app shortcuts, and a watchOS companion app.
Five named systems give ARIA her cognitive architecture. Each handles a distinct dimension of intelligence — from personality to prediction, from classification to knowledge.
Two-layer prompt architecture separating immutable capabilities (kernel) from swappable personality overlays (personas). Seven distinct cognitive modes — from Chief of Staff to Provocateur — with seamless mid-conversation switching and team-style handoff patterns.
Autonomous three-gate pipeline monitoring 15+ data sources against watermarks. Detects changes, classifies significance, performs deep analysis, and delivers actionable insights via push notifications or email — all without being asked.
Significance classification layer powered by Gemini Flash-Lite. Sits between raw data changes and expensive analysis. Filters noise from signal with near-zero cost, ensuring only meaningful changes trigger Claude Sonnet analysis.
Knowledge graph storing structured facts about people, places, events, and preferences. Entity resolution, confidence scoring, temporal validity, and evidence tracking. Continuously enriched from conversations, device data, and proactive analysis.
Structured owner profile with 131,016 facts across 9+ domains: events, people, preferences, lifestyle, work, health, places, media, and more. Every fact carries confidence scores, source attribution, and temporal validity. The foundation ARIA uses to truly know her owner.
Every message traverses a carefully orchestrated pipeline — from authentication through context assembly to streaming response. Here's the path a single chat request takes.
ARIA doesn't wait to be asked. The Proactive Intelligence Engine runs continuously, monitoring data sources and surfacing insights before the owner needs them.
Monitors 15+ data sources against watermarks. Detects meaningful changes. Runs every 5 minutes.
Gemini Flash-Lite classifies changes as significant or noise. Filters ~80% of events. Auto-chained from Gate 1.
Claude Sonnet performs deep analysis on significant changes. Generates actionable insights with reasoning and evidence.
Routes insights to configured notification methods: push notifications, email, or in-app display.
ARIA connects to 18+ services and APIs. Each integration follows a consistent two-file pattern: tool definitions with input schemas, and an API wrapper with service logic. All dispatched by prefix in the chat route.
*-tools.ts defines tool names, descriptions, and input schemas. *.ts wraps the actual API. Tools are conditionally registered based on connection status. All non-read-only calls are logged to event_log.The iOS app syncs 9 distinct data streams to the server in near real-time. Each stream uses sync hash optimization for efficient change detection — only deltas are transmitted.
EventKit → /api/device-calendar/
ContactsFramework → /api/device-contacts/
EventKit → /api/device-reminders/
CoreLocation → /api/device-location/
CoreMotion → /api/device-activity/
HealthKit → /api/health-data/
MusicKit → /api/device-music/
HomeKit → /api/device-homekit/
PhotosFramework → /api/photos/metadata
Every LLM call in ARIA is routed through a tiered provider chain. If the primary model fails or is unavailable, the request automatically falls through to the next provider. Each tier is optimized for its use case.
| Tier | Use Case | Primary | Fallback 1 | Fallback 2 |
|---|---|---|---|---|
| Reasoning | Chat, deep analysis, tool use, memory extraction | Claude Sonnet 4.6 | GPT-4o | Claude Haiku 4.5 |
| Generation | Journal entries, briefings, reports, summaries | Claude Haiku 4.5 | Gemini 2.0 Flash | GPT-4o-mini |
| Classification | Significance checks, quality scoring, fast-track gating | Gemini 2.5 Flash-Lite | Claude Haiku 4.5 | GPT-4o-mini |
If a provider returns an error or times out, the router transparently retries with the next provider in the chain. No user-visible interruption.
Every LLM call is logged to the llm_usage table with model, tokens, cost, and latency. Monthly cost reports are generated automatically.
Model assignments are stored in llm_model_config and can be changed without code deploys. 9 chain entries cover all use cases.
Production infrastructure on AWS. Push-to-deploy for server-side services. Manual upload to TestFlight for iOS. All secrets managed centrally via AWS Secrets Manager.
aria + aria-tempo
Auto-deploy on push
Shared database
48+ tables, 39 migrations
aria-mcp-server
OAuth 2.1 + PKCE
aria-ios
Manual upload via script
Schema lives in aria/sql/ with 39+ migration files. Applied manually via psql before deploys. Migrations must land before new code goes live, or API routes fail on missing columns.
The schema_registry table declares required tables and columns for each job type. Pre-flight validation prevents runtime failures from missing migrations. Every new job handler must register its schema requirements.