OpenClient connects directly to the AI server you configure, without an OpenClient-hosted proxy or subscription. Requests may still reach providers configured behind your server, and the optional in-app feedback screen uses Votice.
It works with LiteLLM, Ollama, and OpenAI-compatible servers that provide the endpoints used by your selected features; point the app at your URL and use the models it exposes.
Chat
- Real-time streaming responses with Markdown and code block rendering
- Collapsible Thinking block for reasoning models (DeepSeek, o1, Gemini Thinking, and more)
- Attach photos, camera shots, and PDF documents for multimodal conversations
- Drag and drop text, images, and files from any app directly into the chat (Split View, Stage Manager, Finder on macOS)
- Dictate messages with Speech-to-Text; have responses read aloud with Text-to-Speech
- Receive generated images from compatible models and servers that return images in chat-completion streams
- Web search powered by your server's configured provider (Brave, Firecrawl, and more)
- Agentic tool-calling loop for models that support function calling
- MCP (Model Context Protocol) tools — connect to external services (GitHub, filesystems, databases, and more) through MCP servers configured on your LiteLLM backend; discover, enable, and execute them from the chat input bar
- Favourite any message to bookmark it and jump back instantly
- Custom system prompt and model parameters (temperature, max tokens, top-p) per conversation
Conversations
- Full conversation history with search, pins, and tags
- Branch from any message to explore alternative responses; edit and regenerate
- Media & Files gallery: browse all attached images and documents in one place
- Share content from any app (Safari, Telegram, Photos, Files…) directly into a new conversation via the system Share sheet
- Deep-link into the app with
openclient://chat?text=…,openclient://chat?url=…, oropenclient://conversation?id=…for third-party automation - Apple Shortcuts integration: "New Chat", "Search Chats", and "Send File to Chat" actions available in the Shortcuts app and via Siri
- Control Center toggle: add a "New Chat" button for instant one-tap access from any screen or the lock screen
- Home-screen widgets: New Chat (small), Search (small), Quick Actions (medium), and Recent Conversations (medium/large) — tap any widget to jump directly into the app
- iCloud sync across all your Apple devices
- Export individual conversations or full JSON backups, and restore backups on another device (format specification)
- Private Chat: start a session-only chat whose messages and attachments are discarded when you close it; personal memory is neither read nor changed
- Token usage per message and estimated conversation cost
Models
- Browse all available models with capability badges (vision, tools, JSON mode, image generation...)
- Model detail sheet: context window, pricing (per token), provider, mode, and capabilities at a glance
- Voice selector for Text-to-Speech models
- Switch models per conversation
Personalization
- Prompt template library: save and reuse system prompts for any workflow
- User profile: set your name and context so every model addresses you personally
- Memory: save facts and preferences (manually or let the model save them automatically); injected into every conversation's system prompt and synced via iCloud
macOS
- Menu bar companion for instant access without opening the main window
macOS: Download the latest signed and notarized .dmg directly from the Releases page.
| Technology | Purpose |
|---|---|
| Swift 6+ | Language |
| SwiftUI | UI Framework |
| Liquid Glass | Design language (iOS 26+) |
| async/await | Concurrency |
| URLSession + SSE | Networking & streaming |
| Keychain | Secure storage |
| SwiftLintPlugins | Build-time code linting |
| ConfettiSwiftUI | Tip-jar celebration effect |
| SF Symbols | Iconography |
| AppIntents | Apple Shortcuts, Siri & Control Center integration |
| WidgetKit | Control Center toggle and home-screen widgets (New Chat, Search, Quick Actions, Recent Conversations) |
| Votice | In-app feedback & feature requests |
This project was developed entirely with Xcode, Visual Studio Code and GitHub Copilot (with Claude Opus / Sonnet 4.6).
The project follows MVVM + UseCase + Repository + Manager with Swift strict concurrency and async/await. Code is organized by feature under Shared/, shared across iOS and macOS targets. Platform-specific UI lives in each target's own folder.
See ARCHITECTURE.md for the full project tree and layer responsibilities.
- Clone the repository:
git clone https://github.com/ArtCC/openclient-llm.git cd openclient-llm - Create the required local secrets configuration. Empty placeholders are sufficient to build; real credentials
are required for the in-app Votice feedback screen:
cat > Secrets.xcconfig <<'EOF' VOTICE_API_KEY = VOTICE_API_SECRET = VOTICE_APP_ID = EOF
Secrets.xcconfigis gitignored. Xcode Cloud creates it throughci_scripts/ci_post_clone.sh. - Open in Xcode:
open openclient-llm.xcodeproj
- Configure your server URL in the app settings:
- LiteLLM:
http://your-server:4000 - Ollama (direct):
http://your-server:11434/v1OpenClient appends API paths to this value without adding or removing/v1: LiteLLM uses paths such as/modelsand/chat/completions, while direct Ollama requires its/v1OpenAI-compatible base.
- LiteLLM:
- Run on your device or simulator
- Xcode 26+
- iOS 26+ / macOS 26+
- A running LiteLLM server — recommended backend; proxies Ollama and cloud providers (OpenAI, Anthropic, Google…) under a single endpoint. See LiteLLM.md.
- Or a running Ollama instance directly (OpenAI-compatible
/v1endpoint). See Ollama.md. Note: using Ollama through LiteLLM is preferred as it unlocks multi-provider support, virtual keys, and cost tracking.
OpenClient works with servers that implement the OpenAI-compatible endpoints used by the selected features. Basic chat requires model listing and chat completions; LiteLLM-only enrichment and search are optional. The two common setups are:
- Ollama only — run open-source models locally on your own hardware.
- LiteLLM + Ollama — add a proxy layer to combine local models with cloud providers (OpenAI, Anthropic, Google…) under a single endpoint.
The guides below cover Docker Compose configurations, reference .env files, and common operational commands:
- Ollama.md — Run Ollama with Docker (CPU and NVIDIA GPU)
- LiteLLM.md — Run LiteLLM with Docker (Postgres, local + cloud models)
This project is licensed under the GNU Affero General Public License v3.0.
Contributions are welcome. Please read CONTRIBUTING.md for guidelines on how to report issues, propose features, and submit pull requests.
To suggest features or report bugs from within the app, go to Settings and use the built-in feedback option powered by Votice, another open source project by the same author.
Arturo Carretero Calvo
OpenClient is built on the belief that generative AI should be something you control — not something that controls your data.
Run local models entirely on your own hardware, or route cloud providers through your own self-hosted proxy.
Either way, you choose the server and any upstream providers it uses. OpenClient does not relay AI requests through an OpenClient-operated service.
Open source. No advertising tracking. Full control.



