A fully on-device, encrypted personal knowledge base with voice capture, AI classification, semantic search, and distilled memory intelligence.
Aura is a second brain that captures your thoughts via voice or text, classifies them with on-device AI, and organizes them across five encrypted vaults:
| Vault | Color | Purpose |
|---|---|---|
| Corporate | #00D4FF Electric Blue |
Office notes, courses, career, professional learning |
| Trading | #7B61FF Purple |
Trade ideas, market observations, strategy notes |
| Family | #FFB627 Gold |
Milestones, personal memories, legacy |
| Personal | #00E5A0 Green |
Health, hobbies, journal, self-improvement |
| Projects | #FF6B6B Coral |
Side projects, builds, active learning |
Everything runs on-device: speech recognition, AI classification, transcript cleanup, semantic search, weekly/monthly intelligence reports, and the Ask Aura chat — no cloud AI services, no Mac pipeline, no external dependencies.
┌──────────────────────────────────────────────────────────────────┐
│ iPhone (iOS 17+) │
│ │
│ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐ │
│ │ Capture │ │Daily Pulse│ │ Aura │ │ Vault │ │
│ │ Voice │ │ Morning │ │ RAG AI │ │ Browser │ │
│ │ + Type │ │ Briefing │ │ Chat │ │ + Editor │ │
│ └────┬─────┘ └─────┬─────┘ └────┬─────┘ └───────────┘ │
│ │ │ │ │
│ ┌────▼──────────────▼──────────────▼──────────────────────────┐ │
│ │ Core Services (async/await) │ │
│ │ VaultService · GitService · SearchService · TaskService │ │
│ │ AuraAIService · LocalLLMService · DistillationService │ │
│ │ WhisperService · SyncService · FrontmatterParser │ │
│ └──────────────────────┬──────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────────────────┐ │
│ │ On-Device Intelligence │ │
│ │ MLX Swift + Qwen 3 1.7B 4-bit │ │
│ │ ├── Auto-classification (tags, deadlines, type) │ │
│ │ ├── Transcript cleanup (grammar, filler removal) │ │
│ │ ├── Morning briefing (personalized, cached daily) │ │
│ │ ├── Ask Aura chat (RAG: memories + search + notes) │ │
│ │ ├── Cross-vault connection detection │ │
│ │ └── Weekly/monthly distillation reports │ │
│ │ │ │
│ │ Apple NLEmbedding (semantic search, zero download) │ │
│ │ SFSpeechRecognizer (on-device speech-to-text) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
└─────────────────────────┼────────────────────────────────────────┘
│ GitHub REST API (encrypted push/pull)
▼
┌──────────────┐
│ GitHub │
│ (git-crypt │ ← backup only, not primary
│ encrypted) │
└──────────────┘
MVVM + Clean Core: The Core/ layer is pure Swift with zero SwiftUI imports. All services use Swift Concurrency (async/await) — no Combine, no callbacks.
All AI runs locally on the iPhone. No cloud. No Mac. No network required.
The on-device LLM handles six functions:
| Function | When | What it does |
|---|---|---|
| Auto-classification | After every note save | Extracts tags, deadlines, action type, evergreen flag, suggested title |
| Transcript cleanup | After voice capture | Fixes grammar, removes filler words, preserves meaning |
| Daily briefing | Daily Pulse refresh | Reflection-focused briefing on yesterday's notes, patterns, and connections |
| Weekly briefing | Sundays only | Week-in-review: themes, cross-vault connections, tag patterns, standout notes |
| Ask Aura chat | User asks a question | RAG-powered answers grounded in your notes and memories |
| Cross-vault connections | After note save | Detects links between notes across all five vaults |
| Distillation | Weekly (Sunday) / Monthly (1st) | Generates intelligence reports — patterns, insights, knowledge summaries |
When you ask Aura a question, context is assembled in priority order:
Layer 3: Monthly distilled memories → life patterns, knowledge summaries
Layer 2: Weekly distilled summaries → recent decisions, open threads
Layer 1: Semantic search + recent → relevant raw notes + freshness
This mirrors how human memory works — patterns before details.
Weekly and monthly intelligence reports are generated per vault and stored in _distilled/ subfolders:
~/Documents/AuraVault/
Corporate/
2026-03-09_meeting-prep.md
_distilled/
weekly_2026-03-02.md ← "Week at a Glance, Key Decisions, Open Threads, Hidden Insight"
monthly_2026-03.md ← "Life Patterns, Knowledge Gained, Cross-Vault Connections"
Trading/_distilled/
Family/_distilled/
- Weekly (Sunday): 4-section report + Swift-computed numbers. Skips weeks with <3 notes.
- Monthly (1st): 5-section report reading weekly summaries + top 10 significant notes. Skips months with <10 notes.
Apple NLEmbedding (NaturalLanguage.framework) — built-in sentence embeddings, zero download, fully offline. Keyword search always available as fallback.
All prompts use the /no_think directive for Qwen 3 and strip <think> tags from output. Each prompt is carefully tuned to produce structured, parseable output from a small 1.7B model.
Triggered: After every note save in CaptureViewModel.classifyAndEnrich()
Context provided: Today's date, vault name, first 800 characters of note body.
Output: JSON with tags, action_kind, deadline, time, is_time_specific, evergreen, suggested_type, suggested_title.
You are a note classifier. Analyze this note and return ONLY valid JSON.
Return this exact JSON structure:
{
"tags": ["tag1", "tag2"],
"action_kind": "reminder" or "calendar" or "none",
"deadline": "YYYY-MM-DD" or null,
"time": "HH:MM" or null,
"is_time_specific": false,
"evergreen": false,
"suggested_type": "task" or "note" or "idea" or "log" or null,
"suggested_title": "short title" or null
}
Rules:
- tags: 2-5 relevant keywords from the content, lowercase
- action_kind: STRICT rules — most notes should be "none"
• "none" — DEFAULT. Use for observations, ideas, logs, meeting notes, learning notes,
reflections, and anything without an explicit task/deadline
• "reminder" — ONLY if the user explicitly requests to be reminded or sets a deadline
(e.g. "remind me to...", "deadline is Friday", "todo: submit report by March 15")
• "calendar" — ONLY if the user explicitly mentions a scheduled event with a specific time
(e.g. "meeting at 3pm", "dentist appointment Thursday 2pm")
• When in doubt, use "none"
- deadline: ONLY set if action_kind is "reminder" or "calendar". Must be null when action_kind
is "none". Resolve relative dates to YYYY-MM-DD using today's date
- time: only if a specific time is explicitly mentioned ("at 9am" → "09:00"). null otherwise
- is_time_specific: true only if an exact time was stated
- evergreen: true if this is timeless wisdom/knowledge (not a task or fleeting note)
- suggested_type: "task" ONLY if the note is clearly an actionable todo with a deadline.
Use "note" for general notes, "idea" for brainstorms, "log" for daily logs
- suggested_title: a concise 3-8 word title capturing the essence
Post-LLM validation (Swift-side):
- If
action_kindis notnonebutdeadlineis nil → forced tonone - If
action_kindis notnonebutsuggested_typeis nottask→ forced tonone - Both conditions must pass for an iOS Reminder or Calendar event to be created
Triggered: After voice transcription, before showing editable text.
Clean up this voice transcript. Fix grammar, punctuation, and remove filler words
(um, uh, like, you know). Keep the meaning and tone intact. Do not add new information.
Return ONLY the cleaned text, nothing else.
Triggered: On Daily Pulse refresh, cached once per day.
Context provided: Today's date, vault totals, new notes count, yesterday's notes (up to 8) with vault/title/tags/body preview, evergreen resurface note.
You are Aura, a personal intelligence system. Write a daily reflection briefing based on
the user's recent notes. Return ONLY the briefing lines.
YOUR PURPOSE: Help the user reflect on what they captured recently. Surface patterns,
connections between notes, and insights they might have missed. Do NOT list today's tasks
— those are shown separately.
FORMAT — each line starts with an emoji, then a concise insight (max 15 words per line):
🔍 [reflection — what the user was thinking about or working on recently]
💡 [insight — a pattern, connection, or theme across recent notes]
📊 [activity — which vault is growing, capture momentum]
🌿 [evergreen — if an evergreen note resurfaced, connect it to recent work]
⚡ [nudge — a gentle suggestion based on what you see in the notes]
RULES:
- Start with a one-line warm reflection (no emoji) that references specific note content
- Then 3-4 emoji lines — skip categories with no data
- Reference actual note titles and content — be specific, not generic
- Find connections between notes across different vaults if possible
- If no recent notes, keep it brief and encouraging
- Sound like a thoughtful advisor who actually read the notes
Triggered: On Daily Pulse refresh, only on Sundays, cached once per Sunday.
Context provided: Week ending date, total notes this week, per-vault weekly counts, note types breakdown, top 8 tags with frequency, up to 10 note summaries with weekday labels.
You are Aura, a personal intelligence system. Write a weekly reflection briefing
for Sunday. Return ONLY the briefing lines.
YOUR PURPOSE: Help the user see the bigger picture of their week. Find themes,
patterns, and progress across all their notes. This is their weekly moment of clarity.
FORMAT — each line starts with an emoji, then a concise insight (max 15 words per line):
📅 [week summary — total captures, most active vault, overall momentum]
🧠 [theme — the dominant topic or thread running through the week]
🔗 [connections — patterns or links between notes across different vaults]
📈 [progress — any goals, projects, or ideas that advanced this week]
🏷️ [tags — what the top tags reveal about focus areas]
💎 [standout — the most interesting or valuable note of the week]
🎯 [next week — one focused suggestion for the week ahead]
RULES:
- Start with a one-line warm weekly summary (no emoji) that captures the week's energy
- Then 4-6 emoji lines — skip categories with no meaningful data
- Be specific — mention note titles, vault names, tag patterns
- Look for cross-vault connections (e.g. a Trading insight that relates to a Corporate note)
- Identify what the user was most focused on and where momentum is building
- Sound like a thoughtful weekly review, not a dry summary
Triggered: After classification, searches for links between the new note and notes in other vaults.
Context provided: Source note (vault, title, tags, body), up to 15 candidate notes from other vaults with title, tags, and body preview.
You are a connection finder. Given a source note and candidate notes from other vaults,
find meaningful connections. Return ONLY valid JSON.
Return an array of connections (0-3 max):
[{"index": 0, "reason": "brief connection reason"}]
Rules:
- Only return genuine thematic or actionable connections
- "index" is the candidate note's position (0-based)
- "reason" should be 5-10 words explaining the link
- Return empty array [] if no meaningful connections exist
Triggered: When user asks a question in the Ask Aura chat.
Context provided: Three-tier RAG context (distilled memories → weekly summaries → semantic search + recent notes), up to 20 most recent notes.
You are Aura, a personal AI assistant with access to the user's second brain.
Answer questions using ONLY the context provided below. If the context doesn't
contain relevant information, say so honestly.
Be conversational, specific, and reference note titles when relevant.
Keep answers concise — 2-4 sentences unless the question requires more detail.
- Auto-classification prompt now defaults
action_kindto"none"— reminders only created when the user explicitly asks (e.g. "remind me to...", "deadline is...") - Post-LLM validation requires BOTH
suggested_type == taskAND a validdeadline— prevents false positive reminders on plain notes
- Renamed from "YOUR BRIEFING" to "DAILY BRIEFING"
- Reflection-focused: analyzes yesterday's notes (or last 5) for patterns and connections instead of repeating today's tasks
- Emoji-bulleted format with distinct greeting line and structured insight lines
- New
WEEKLY BRIEFINGcard appears only on Sundays with purple accent - Analyzes all notes from the past 7 days: themes, tag frequency, cross-vault connections, progress, standout notes
- Cached separately so it persists through the day
- Two new vault presets: Personal (green,
#00E5A0) and Projects (coral,#FF6B6B) - Each vault has an SF Symbol icon and short name for compact display
- Vault directories auto-create on first note save
- All
Vault.allCasesloops, color mappings, and UI elements updated across the app
VaultChipnow supportscompactmode: icon + short name, tighter padding- Capture sheet uses compact chips in a horizontal
ScrollView— all 5 vaults fit cleanly - Vault Browser tab header uses the same chip design for visual consistency
- Capture sheet "Save to Vault" redesigned: solid green background, dark text, document icon, green glow shadow
- Clear visual distinction between enabled and disabled states
- New "Export Vault Notes" option in Settings under a DATA section
- Creates a zip file preserving folder structure (
AuraVault/Corporate/*.md, etc.) - Uses
NSFileCoordinatorwith.forUploading— zero external dependencies - iOS share sheet for saving to Files, AirDrop, or opening in Obsidian
| Component | Technology |
|---|---|
| Platform | iOS 17+, Swift 5.10 |
| UI Framework | SwiftUI, dark mode only |
| State Management | @Observable macro (iOS 17+) |
| Async | Swift Concurrency (async/await) |
| On-Device LLM | MLX Swift + Qwen 3 1.7B 4-bit |
| Speech | SFSpeechRecognizer (on-device) |
| Semantic Search | Apple NLEmbedding (NaturalLanguage.framework) |
| Reminders/Calendar | EventKit |
| Lock Screen Widget | WidgetKit |
| Markdown Rendering | MarkdownUI (gonzalezreal/swift-markdown-ui) |
| Git Sync | GitHub REST API (Contents API) |
| Encryption | git-crypt (AES-256) |
| Secrets | iOS Keychain (PAT storage) |
- Mac with Apple Silicon (M1+) or Intel — for building in Xcode
- Xcode 16+ with iOS 17 SDK
- iOS 17+ device (iPhone recommended for speech + haptics)
- Apple Developer Account (free works for personal device, paid for TestFlight/App Store)
- GitHub account (optional — only needed for cloud backup)
No Mac pipeline, no Python, no Ollama, no cloud AI required. Everything runs on the iPhone.
If you don't have Xcode installed:
- Open App Store on your Mac → search Xcode → Install (it's free, ~12 GB)
- After install, open Xcode once and accept the license agreement
- Install command-line tools if prompted:
xcode-select --install
- In Xcode → Settings > Platforms, make sure iOS 17 SDK is installed
- Fork this repo on GitHub (click the Fork button at top-right)
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/aura-vault-private.git ~/Documents/Developer/Aura
open ~/Documents/Developer/Aura/Aura.xcodeprojXcode will automatically resolve SPM packages (MarkdownUI, mlx-swift-examples). This may take 2-3 minutes on first open.
This is required for running on a real iPhone:
- In Xcode, select the Aura project in the navigator (blue icon at top)
- Select the Aura target → Signing & Capabilities tab
- Check "Automatically manage signing"
- Select your Team (your Apple ID — "Personal Team" works for free accounts)
- Change the Bundle Identifier to something unique:
com.YOUR_NAME.aura - Repeat for the AuraWidgetExtension target — use:
com.YOUR_NAME.aura.widget - Update the App Group in both targets' entitlements to match:
group.com.YOUR_NAME.aura
Note: Free Apple Developer accounts can run on your personal device for 7 days before re-signing. A paid account ($99/year) removes this limit.
The app stores notes locally on the iPhone at Documents/AuraVault/. The vault directories are created automatically when you save your first note to each vault. No manual setup needed.
For local development/testing on Mac:
mkdir -p ~/Documents/AuraVault/{Corporate,Trading,Family/attachments,Personal,Projects}- Connect your iPhone via USB (or use wireless debugging)
- Select your device in the Xcode toolbar
- Hit Cmd+R to build and run
- On first launch, trust the developer certificate on your iPhone: Settings > General > VPN & Device Management > your Apple ID > Trust
- In the app: Settings > On-Device AI
- Download Qwen 3 1.7B (recommended) — ~1 GB download, ~1.2 GB RAM at runtime
- The model auto-loads on subsequent app launches
- Without a model, the app still works — classification, briefings, and Ask Aura will be disabled
This is optional — the app works fully offline without it. If you want cloud backup:
- Create a private repo on GitHub (e.g.
aura-vault-notes) - Generate a fine-grained Personal Access Token with read/write Contents access to that repo
- In the app: Settings > Sync → enter your GitHub username, repo name, and PAT
- The PAT is stored securely in the iOS Keychain — never in code or UserDefaults
Vaults: The app ships with 5 preset vaults (Corporate, Trading, Family, Personal, Projects). To add or rename vaults, edit Vault.swift — add a new enum case, color in AuraTheme.swift, and icon/shortName.
Colors: All colors are defined in AuraTheme.swift as design tokens. Dark mode only.
AI Model: You can use any MLX-compatible model from HuggingFace. Add it to LocalLLMCatalogue.swift.
| Tab | Screen | Description |
|---|---|---|
| Capture | Voice + Type modes | Record or type thoughts, AI classifies after save |
| Pulse | Daily dashboard | Morning briefing, today's tasks, morning moment animation |
| Aura | RAG AI chat | Ask questions about your notes — grounded in distilled memories + semantic search |
| Vault | Note browser | Browse by vault, keyword search, swipe actions, note editor with markdown preview |
| Settings | Configuration | GitHub sync, on-device AI model management, vault export, privacy |
Aura/
├── CLAUDE.md # AI development context file
├── CONTRIBUTING.md # Contributor guidelines
├── CLAUDE_CODE_LEARNINGS.md # AI-assisted dev learnings
├── tasks/
│ ├── todo.md # Session planning
│ └── lessons.md # Cross-session mistake log
├── AuraWidget/
│ ├── AuraWidgetBundle.swift
│ └── CaptureWidget.swift # Lock Screen capture widget
└── Aura/Sources/
├── Core/ # Pure Swift — zero SwiftUI imports
│ ├── Models/
│ │ ├── Note.swift # Note struct + NoteType enum (incl. distilled types)
│ │ ├── NoteAction.swift # Action kind, deadline, time
│ │ └── Vault.swift # 5 vaults: Corporate/Trading/Family/Personal/Projects
│ ├── Services/
│ │ ├── VaultService.swift # File system + frontmatter CRUD
│ │ ├── GitService.swift # GitHub REST API sync
│ │ ├── SyncService.swift # Pull notes + create reminders
│ │ ├── SearchService.swift # Semantic (NLEmbedding) + keyword search
│ │ ├── TaskService.swift # EventKit reminders + calendar
│ │ ├── WhisperService.swift # SFSpeechRecognizer wrapper
│ │ ├── AuraAIService.swift # Unified AI gateway (classification, cleanup, chat)
│ │ ├── LocalLLMService.swift # MLX Swift model management
│ │ ├── DistillationService.swift # Weekly/monthly intelligence reports
│ │ ├── VaultExportService.swift # Export all notes as zip
│ │ └── AudioRecorderService.swift
│ ├── Utilities/
│ │ ├── FrontmatterParser.swift
│ │ ├── RelativeDateResolver.swift
│ │ └── KeychainHelper.swift
│ └── AppDependencies.swift # Central dependency container
├── Features/
│ ├── Capture/ # Voice + text capture
│ ├── DailyPulse/ # Morning dashboard + briefing
│ ├── AskAura/ # RAG-powered AI chat (Membrane aesthetic)
│ ├── Vault/ # Browse, edit, note editor
│ ├── Family/ # Ahaan timeline (gold accent)
│ └── Settings/ # Git config, on-device AI, privacy
└── DesignSystem/
├── AuraTheme.swift # Color tokens + vault colors
├── Typography.swift # Font.aura* definitions
├── GlassPanel.swift # Glass morphism card component
├── PulseButton.swift # Animated record button
└── VaultChip.swift # Vault selection chip
Aura uses two separate Git repositories to keep app code and user data cleanly separated:
| App Code | Vault Data | |
|---|---|---|
| Repo | aura-vault-private |
aura-vault-notes |
| Local Path | ~/Documents/Developer/Aura/ |
~/Documents/AuraVault/ |
| Contains | Swift code, Xcode project, docs | .md notes, _distilled/ reports |
| Pushed by | Developer (you) | iPhone app (GitService) |
| Encrypted | No | Yes (git-crypt) |
Boundary rules:
- Never push
.mdnotes into the app repo - Never push Swift code into the vault repo
GitServiceon iPhone always targetsaura-vault-notes
Aura uses a strict design token system. Dark mode only.
// Vault accent colors
Color.auraCorporate // #00D4FF — electric blue
Color.auraTrading // #7B61FF — purple
Color.auraFamily // #FFB627 — gold
Color.auraPersonal // #00E5A0 — green
Color.auraProjects // #FF6B6B — coral
// Semantic
Color.auraSuccess // #00E5A0 — confirmations
Color.auraDanger // #FF4757 — errors, destructive
// Backgrounds
Color.auraVoid // #060810 — base background
Color.auraSurface // #0D1117 — card background
Color.auraElevated // #161B22 — modal/sheet background
// Text hierarchy
Color.auraTextPrimary // #E6EDF3 — body content, note text
Color.auraTextSecondary // #7D8590 — section headers, labels, placeholders
Color.auraTextDim // #3D444D — timestamps, metadata onlyFont.auraDisplay // 48pt thin rounded — hero numbers
Font.auraHeadline // 24pt semibold rounded — section titles
Font.auraBody // 16pt regular — body text
Font.auraMono // 13pt monospaced — metadata, tags- GlassPanel — Glass morphism card used for all content cards
- PulseButton — Animated capture button with ripple rings
- VaultChip — Color-coded vault selection pill
- AmbientBlob — Breathing glow animation (Aura tab header)
Every note is a Markdown file with YAML frontmatter:
---
title: Q1 Planning Meeting
vault: Corporate
type: task
tags: [planning, q1, roadmap]
cross_vault_refs: []
status: indexed
evergreen: false
action:
kind: reminder
deadline: 2026-03-15
time: "09:00"
is_time_specific: true
created: 2026-02-28T14:32:00Z
modified: 2026-02-28T14:32:00Z
---
Meeting notes content here...| Field | Values | Description |
|---|---|---|
vault |
Corporate, Trading, Family, Personal, Projects | Which vault this note belongs to |
type |
task, note, log, idea, distilled_weekly, distilled_monthly | Note classification |
status |
pending_classification, indexed | Processing state |
evergreen |
true/false | Resurfaces in Daily Pulse |
action.kind |
reminder, calendar, none | Creates iOS Reminder or Calendar event |
action.deadline |
ISO date | When the action is due |
action.is_time_specific |
true/false | Calendar event vs all-day |
- On-device speech: SFSpeechRecognizer with
requiresOnDeviceRecognition— audio never leaves your phone - On-device AI: MLX Swift runs Qwen 3 locally — no cloud AI APIs, no data sent anywhere
- git-crypt encryption: All
.mdfiles and attachments are AES-256 encrypted before push to GitHub - Keychain storage: GitHub PAT stored in iOS Keychain, never in UserDefaults
- Zero telemetry: No analytics, no tracking, no outbound data of any kind
Aura was built across 16+ sessions in 6 phases:
| Phase | Sessions | Focus |
|---|---|---|
| 1. Foundation | 1-4 | Project structure, VaultService, Capture, Widget |
| 2. Mac Pipeline | 5-7 | launchd sync, Ollama classification, mlx-embeddings |
| 3. Intelligence | 8-10 | Daily Pulse, Search, Note Editor |
| 4. Vault Browser | 11-12 | Vault browser, git time travel |
| 5. Polish | 13-15 | Family vault, photo attachments, onboarding |
| 6. On-Device AI | 16+ | MLX Swift LLM, on-device classification, RAG chat, distillation, Mac pipeline removed |
MIT License — see LICENSE for details.
This entire app was built using Claude Code, Anthropic's CLI for AI-assisted development.
Read about the development process and lessons learned: CLAUDE_CODE_LEARNINGS.md