Skip to content

Repository files navigation

OpenClient

OpenClient

Platform Xcode Swift SwiftUI License

Description

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=…, or openclient://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

🌐 Project website

Download on the App Store

macOS: Download the latest signed and notarized .dmg directly from the Releases page.

Screenshots

Models   New Chat   Chat   Chats

Technologies

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).

Architecture

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.

Usage

  1. Clone the repository:
    git clone https://github.com/ArtCC/openclient-llm.git
    cd openclient-llm
  2. 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.xcconfig is gitignored. Xcode Cloud creates it through ci_scripts/ci_post_clone.sh.
  3. Open in Xcode:
    open openclient-llm.xcodeproj
  4. Configure your server URL in the app settings:
    • LiteLLM: http://your-server:4000
    • Ollama (direct): http://your-server:11434/v1 OpenClient appends API paths to this value without adding or removing /v1: LiteLLM uses paths such as /models and /chat/completions, while direct Ollama requires its /v1 OpenAI-compatible base.
  5. Run on your device or simulator

Requirements

  • 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 /v1 endpoint). See Ollama.md. Note: using Ollama through LiteLLM is preferred as it unlocks multi-provider support, virtual keys, and cost tracking.

Self-hosting guides

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)

License

This project is licensed under the GNU Affero General Public License v3.0.

Contributing

Contributions are welcome. Please read CONTRIBUTING.md for guidelines on how to report issues, propose features, and submit pull requests.

Feedback

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.

Author

Arturo Carretero Calvo

Your AI. Your server. Your rules

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.

About

Native Apple client for LiteLLM, a self-hosted LLM proxy server. Connect to any LLM provider (Ollama, OpenAI, Anthropic, Groq, and more) through a single unified endpoint with a beautiful, native iOS, iPadOS, and macOS experience.

Topics

Resources

Contributing

Stars

11 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages