A native macOS and iOS chat app for local AI models, built with SwiftUI.
Mira runs entirely on your own hardware — no cloud, no subscription, no data leaving your machine. It connects to a local Python server that runs inference on a local backend (mira-core's own mira-mlx by default), embeds documents locally for RAG, and can search the web on your behalf. The iPhone app pairs with the Mac over Bonjour or Tailscale for the same experience on the go.
See CHANGELOG.md for recent changes.
The apps are the SwiftUI front end for mira-core — the local FastAPI server that does inference, RAG, web search, and tool calling. The server must be running for the apps to work; see askmira.es for an overview and TestFlight access.
Testing it? Feedback and whether it's useful go in Discussions; bugs and crashes go in Issues. I read both.
- Local-first — inference runs on your Mac via mira-mlx (or oMLX / dFlash / mlx-lm / vllm-mlx / Ollama); nothing is sent to external APIs
- Streaming responses — server-sent events for real-time token output
- Adaptive thinking — extended reasoning on complex questions; tri-state toggle (off / adaptive / force-on)
- Web search — the model can search the web and fetch pages when it needs to; sources surface as clickable links
- RAG — attach documents and let the model search them before answering
- Long-term memory — save facts across conversations; model uses them automatically
- Voice input — tap the mic to dictate; live transcription via Apple Speech (on-device, iOS only)
- Conversation history — persistent, named conversations with a sidebar
- Markdown rendering — code blocks, tables, and inline formatting via MarkdownUI
- Model picker — reads the server's real library: which backends are installed, which models are on disk and how big they are. Adding a model in
mira.yamlshows up without an app update, the running model is always listed and marked, and anything that cannot be selected says why - iOS companion — iPhone app connects to the Mac server over WiFi (Bonjour) or remotely (Tailscale over HTTPS), authenticating with a shared bearer token
- Splash screens — animated Mira logo while the server and model load (macOS and iOS)
- About screen — accessible from the macOS app menu and iOS info button
- Adaptive app icon — light, dark, and tinted variants for iOS 18 home screen modes
- Dark mode — warm stone palette
| Component | Version |
|---|---|
| Xcode | 26+ |
| macOS (dev machine) | 15+ |
| iOS (device) | 18+ |
| Swift | 6 |
| Python | 3.12+ (for the server) |
| Inference backend | mira-mlx by default, ships with mira-core. oMLX 0.4.3+, dFlash, mlx-lm, vllm-mlx and Ollama also selectable |
The server, inference backend, and default model (Qwen3.6-35B-A3B) are set up by mira-core — see its README for the one-command installer.
OllamaSearch/
├── OllamaSearchApp.swift # both platforms' scene graph; MacRootView and the iOS root views live in here
├── Shared/ # Views, ViewModels, Models, Networking — runs on both platforms
│ ├── Views/ # ChatView, MiraLogo, AboutView, SplashView helpers, …
│ ├── ViewModels/
│ ├── Models/
│ └── Networking/
├── macOS/ # ServerManager, TokenStore, SplashView, file picker
├── iOS/ # Bonjour discovery, ConnectionView, file picker
└── Assets.xcassets/ # App icon (light / dark / tinted), accent colour
Design/
└── AppIcon.svg # Source SVG for the app icon (eye + star mark)
iPhone (Mira iOS)
└── Bonjour / Tailscale (HTTPS :8443) ──► Mac (Mira macOS)
└── localhost:8000 ──► Python server (FastAPI, mira-core)
├── mira-mlx (inference, port 8080)
├── nomic-embed-text-v1.5 (RAG embeddings, local)
└── web search + page fetch (sources as links)
The macOS app connects to the Python server (mira-core), which runs as a macOS LaunchAgent (com.mab.mira) installed separately from the app. Whichever backend mira.yaml names is started and managed by the server. The iOS app discovers the Mac over Bonjour (_ollamasearch._tcp) on the local network, or connects manually using a Tailscale hostname.
The app requires the Mac server to run. There is no standalone offline mode — inference happens on the Mac. For access outside your home network, install Tailscale on both devices and use the Manual URL option with your Tailscale hostname (the server listens on HTTPS port 8443 for remote access).
Once the server is reachable beyond loopback, it requires a shared token. Set auth_token: in the server's mira.yaml (or the MIRA_TOKEN env var); the apps send it as Authorization: Bearer <token> on every request automatically. See the mira-core README for details.
iOS 18 manages icon appearance (light/dark/tinted) separately from system dark mode. To see the dark icon variant:
Home screen → long-press → Customize → select Dark or Automatic
See XCODE_SETUP.md for the full step-by-step Xcode setup.
Quick start for an already-configured project:
- Ensure the Mira server LaunchAgent is installed and running (see mira-core)
- Open
OllamaSearch.xcodeprojin Xcode - Select the macOS destination → ⌘R
- For iOS, connect your iPhone and select it as the destination → ⌘R
Mira is the Spanish imperative of mirar — "look" — and the name of one of the oldest variable stars observed by astronomers, a red giant whose brightness pulses on a 332-day cycle. The pulsing glow in the splash screen is a small nod to that.
This project is the result of a strategic collaboration between human design and AI-assisted code generation.
- Architecture & Logic: Fully defined by the author. This includes app structure, UI/UX decisions, state management patterns, and the client–server contract.
- Code Generation: The syntactic implementation and line-by-line SwiftUI code was written by Claude Code, following precise and iterative instructions provided by the author.
- Supervision & Refinement: All code was manually reviewed, tested on simulator and device, and adjusted to ensure quality, consistency, and compliance with project standards.
This approach demonstrates the ability to direct advanced AI tools to accelerate development without sacrificing creative control or technical quality.
Issues, ideas, and pull requests are welcome — see CONTRIBUTING.md for setup and conventions. Found a security issue? Please follow SECURITY.md rather than opening a public issue. Feel free to fork this project and build your own.
See PRIVACY.md for the privacy policy — no data is collected.
This project is licensed under the MIT License — see the LICENSE file for the full text.
Note on authorship: Although much of the source code was generated by an AI, the creative direction, architecture, and final integration are human work. Usage rights are granted under the terms of the MIT License.