Jarvis is a local-first macOS menu bar assistant built with SwiftUI + AppKit.
It runs fully offline with Ollama on your Mac and opens with global Cmd+J.
The same project now also includes an iPhone-native target (JarvisIOS) with App Shortcuts, deep links, and on-device GGUF runtime scaffolding.
- macOS 14+
- Xcode 16+ (Apple Silicon recommended)
- Ollama installed locally
- A pulled local model (example:
gemma3:12b) - For iPhone target: iOS 17+ simulator/device in Xcode
- Clone:
git clone <YOUR_GITHUB_REPO_URL> JARVIS cd JARVIS
- Verify project is readable:
xcodebuild -list -project Jarvis.xcodeproj
- Install/start Ollama and pull a model:
ollama pull gemma3:12b ollama serve
- In another terminal, confirm Ollama is reachable:
curl http://127.0.0.1:11434/api/tags
- Open project in Xcode:
open Jarvis.xcodeproj
- Select scheme:
- Jarvis for macOS menu bar app
- JarvisIOS for iPhone app
- Select run destination:
My MacforJarvis- iPhone simulator/device for
JarvisIOS
Signing & Capabilities:- For target
Jarvis: choose your Apple Development team. - For target
JarvisMailExtension: use same team.
- For target
- Build once:
Cmd+B. - Run app:
Cmd+R.
If Xcode asks "Choose an app to run this extension with", you are running the extension scheme by mistake.
Switch scheme back to Jarvis.
JarvisIOS is an iPhone-first shell, not a resized macOS overlay.
- Home screen optimized for fast first action
- First-run setup that requires importing a local model
- Assistant sheet with local model state + streaming UI
- Local knowledge surface (search saved conversation outputs)
- Model Library with active model switching/revalidate/remove
- Settings/status screen for model state and quick-launch guidance
- App Intents + App Shortcuts:
- Open Jarvis
- Ask Jarvis
- Quick Capture
- Summarize Text
- Search Local Knowledge
- Continue Last Conversation
JarvisIOS does not use hardcoded model paths.
- Import model files from Files using the in-app
Import Modelflow. - Current supported format is
GGUF (.gguf). - Imported files are copied into app sandbox storage and tracked in the in-app model library.
- Set one imported model as active before using Ask/Capture/Summarize actions.
Grant only what Jarvis needs:
- Accessibility (global hotkey and optional automation)
- Screen Recording (window/area capture for OCR)
- Notifications (priority inbox features)
- File access is user-selected via Open Panel/bookmarks
Then restart Jarvis once after granting permissions.
- Jarvis icon appears in menu bar.
- Press
Cmd+Jfrom any app -> overlay opens. - Diagnostics tab shows:
- Ollama: Connected
- Model: selected and available
- Import a document in Documents tab and run
Summarize.
Jarvis now uses a unified local retrieval pipeline:
- OCR + text extraction feeds normalized content into a chunk index.
- Indexing stores file metadata (path/type/timestamps/page count/OCR confidence/content hash).
- Search uses intent-aware lexical retrieval + reranking + duplicate suppression.
- Results include lightweight reasoning and optional debug details in the Search tab.
See /Users/sanks04/Desktop/JARVIS/docs/retrieval-pipeline.md for architecture details.
The main app works without this.
To enable and use the extension in Apple Mail:
- Build and run Jarvis once.
- Open Mail -> Settings -> Extensions.
- Enable
JarvisMailExtensionif listed. - Open a new compose window or click Reply on any email.
- In the compose toolbar, click the Extensions button, then select Jarvis.
- The Jarvis panel appears with:
Draft with JarvisImprove toneSummarize thread
- If thread/body text is limited by MailKit, click
Paste from clipboardafter copying the relevant text. - Use
Copy to clipboard, then paste into the Mail body (Insertshows guidance when direct insertion is unavailable).
If it does not appear:
- Ensure both targets are signed with the same non-adhoc Apple Development team.
- Quit and reopen Mail.
- Rebuild Jarvis.
- Open a new compose/reply window after enabling the extension (Mail does not attach already-open compose windows).
- Check Console logs using subsystem
com.offline.Jarvis.MailExtensionto confirm callbacks:handler(for:) requestedmailComposeSessionDidBeginviewController(for:) requested
- Confirm scheme is
Jarvis. - Confirm Jarvis is running (menu bar icon visible).
- Re-check Accessibility permission.
- Quit and relaunch Jarvis.
Use:
curl http://127.0.0.1:11434/api/tags- If it fails, start Ollama:
ollama serve
- If
address already in use, Ollama is already running; do not start a second instance.
- System Settings -> Privacy & Security -> Screen & System Audio Recording.
- Toggle Jarvis off/on.
- Quit Jarvis fully and relaunch.
- In Search tab, click
Re-indexfor configured folders. - Enable
Debug rankingto inspect why each result was ranked. - Confirm indexed folders are scoped correctly (All indexed folders vs Single folder).
Set Apple Mail as default mail app: Mail -> Settings -> General -> Default email reader.
This is a warning only. Build can still succeed.
Build:
xcodebuild -project Jarvis.xcodeproj -scheme Jarvis -configuration Debug -destination 'generic/platform=macOS' buildiPhone build (simulator, no signing required):
xcodebuild -project Jarvis.xcodeproj -scheme JarvisIOS -configuration Debug -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO buildRun tests:
xcodebuild test -project Jarvis.xcodeproj -scheme Jarvis -destination 'platform=macOS'Jarvis.xcodeproj/ Xcode project
Jarvis/ App source (UI, view models, services)
JarvisMailExtension/ Optional Apple Mail extension target
JarvisTests/ Unit tests
README.md Setup + usage docs
Recommended flow for each update:
- Create feature branch:
git checkout -b codex/<feature-name>
- Implement + test (
Cmd+B,Cmd+U). - Update
README.mdfor user-facing changes. - Commit with clear message.
- Push and open PR to
main.
Jarvis is designed to stay local-first as features grow: keep network optional and disabled by default.