Security Audit Report

How Lumi Protects Your Data

Lumi stores everything locally on your Mac. Your resume, notes, API keys, and sessions never leave your machine. This report details every security measure in the app.

Last audited: April 2026 — All critical and high-severity findings have been resolved. 328 automated tests verify security properties on every build.

Overview

AreaProtectionStatus
API keys at restAES-256-GCM encryption, HKDF key derivationPass
Playbook documentsAES-256-GCM encrypted .enc filesPass
File permissionsOwner-only (0600) on all encrypted filesPass
License verificationURL-encoded POST, format-validated, HTTPS-onlyPass
Network transportAll API calls over TLS (HTTPS)Pass
Update integrityEd25519 signed .lumi update filesPass
Speech processing8-layer anti-hallucination filterPass
Screen sharingsharingType = .none on all windowsPass
Data residencyEverything local — no cloud, no telemetryPass
Account requiredNone — no email, no signupPass

Encryption

How your data is encrypted

All sensitive data (API keys, playbook documents) is encrypted using AES-256-GCM — the same standard used by banks and governments.

Verified by tests: We save a file, read the raw bytes, and confirm that plaintext content is NOT visible. Then we decrypt and verify the content matches. This runs on every build.

What is encrypted

DataLocationEncrypted
OpenAI API key~/Library/Application Support/Lumi/.*.encYes
Anthropic API key~/Library/Application Support/Lumi/.*.encYes
License key~/Library/Application Support/Lumi/.*.encYes
Playbook documents~/Library/Application Support/Lumi/playbooks/*.encYes
Session data~/Library/Application Support/Lumi/sessions/*.jsonNo (JSON)
User preferencesUserDefaultsNo (non-sensitive)

Network Security

Lumi only makes network requests to three services — all over HTTPS:

ServicePurposeData sent
OpenAI APIWhisper transcription, GPT chat, GPT-4o visionAudio chunks, text queries, screenshots
Anthropic APIClaude chat (optional)Text queries only
Gumroad APILicense key verificationProduct ID + license key (URL-encoded)

License Verification

When you enter a license key, Lumi verifies it with Gumroad's API:

Screen Share Invisibility

Lumi uses macOS sharingType = .none — an OS-level API that excludes windows from all screen capture APIs. This is not a CSS hack or opacity trick.

Speech Anti-Hallucination

Whisper (OpenAI's speech-to-text) can produce garbage output from silence, music, or cross-language audio. Lumi applies 8 layers of filtering:

LayerWhat it catches
1. Energy gateSilence — no API call if audio is below energy threshold
2. Speech confidenceno_speech_prob > 0.95 — Whisper says it's not speech
3. Language mismatchRequested English, Whisper detected Welsh — reject
4. Script detectionVietnamese/CJK characters in English mode — reject
5. Pattern filter"subscribe", prompt echoes, ALL CAPS, repetitive text
6. Cross-chunk dedupSame phrase from different audio chunks — reject duplicate
7. Music loop3+ consecutive identical outputs — suppress as music
8. Gibberish flood4+ consecutive short disconnected phrases — suppress as noise
37 automated tests verify the filter catches silence, Welsh, Vietnamese garbage, repetitive text, music lyrics, prompt echoes, and gibberish — while allowing normal speech through.

Update Security

What We Don't Do

How to Delete All Data

Remove the app and all stored data in one step:

rm -rf ~/Library/Application\ Support/Lumi/
rm -rf /Applications/Lumi.app

This removes all encrypted API keys, playbooks, sessions, and preferences. Nothing remains.

Audit Details

FindingSeverityStatus
License key URL encodingCriticalFixed
Key derivation (SHA256 → HKDF)HighFixed
File permissions (644 → 600)MediumFixed
License key format validationMediumFixed
Prompt echo hallucinationMediumFixed
Gibberish flood detectionMediumFixed
Legacy encryption migrationMediumFixed
Update signer public keyLowPending (pre-release)
API keys in memoryLowAccepted (desktop app risk model)
Certificate pinningLowAccepted (HTTPS sufficient)
Responsible disclosure: If you find a security issue, please email kien.15@gmail.com.