A native iOS client for NullClaw AI Gateways.
| iOS / iPadOS | 26.0+ |
| Xcode | 26+ |
| Swift | 6 (strict concurrency) |
| Servers Dashboard | Chat |
| Server Settings | Cron Jobs |
| MCP Servers | |
- Multi-gateway chat — connect to multiple NullClaw Gateways; switch instantly with the title-bar picker
- Real-time streaming — SSE-based streaming with exponential back-off reconnect
- Conversation history — searchable list of past conversations with expand/collapse; tap to resume
- Secure pairing — Bearer tokens stored in the system Keychain, keyed per gateway
- Cron Jobs — view, create, pause, resume, run, and delete scheduled jobs
- MCP Servers — view registered servers with live health status (auto-checked on load), add new servers
- Channels — view connection status of configured communication channels
- Agent Configuration — adjust model, temperature, system prompt, and limits
- Autonomy & Safety — set autonomy level and safety controls
- Multi-modal input — attach images and documents when the gateway supports it
- Health monitoring — per-gateway online/offline status with resource counts on the server card
- Cost & Usage — hidden pending REST API endpoint (code preserved)
NullClawUI communicates with the gateway via two protocols:
- A2A protocol (JSON-RPC over HTTP/SSE) for chat and task management
- Gateway REST API (
/api/*) for management features
Several REST endpoints used by this app have not yet been merged into the NullClaw core. Features that depend on unmerged endpoints may return errors or show placeholder data. Key endpoints in use:
| Endpoint | Purpose | Status |
|---|---|---|
GET /api/cron |
List cron jobs | Pending merge |
POST /api/cron |
Create cron job | Pending merge |
GET /api/mcp |
List MCP servers | Pending merge |
GET /api/mcp/:name |
MCP server status | Pending merge |
GET /api/channels |
List channels | Pending merge |
GET /api/capabilities |
Gateway capabilities | Pending merge |
GET /api/config/* |
Read/write config | Pending merge |
GET /api/doctor |
Health diagnostics | Pending merge |
Additional endpoints need to be implemented to enable features like adding/configuring channels directly from the app.
NullClawUI/
├── App/ # @main entry, AppModel, DesignTokens, GatewayStore
├── Views/ # SwiftUI screens (ChatView, ServersView, etc.)
├── ViewModels/ # @Observable view models
├── Networking/ # GatewayClient (URLSession, SSE, JSON-RPC)
├── Security/ # KeychainService
├── Models/ # Codable types (AgentCard, ConversationRecord, REST API models)
└── Resources/ # Assets.xcassets, Info.plist
NullClawUITests/ # Unit tests
NullClawUIUITests/ # UI tests
- Xcode 26+
- A running NullClaw Gateway instance (default:
http://localhost:5111) - xcodegen — run
brew install xcodegen - SwiftLint —
brew install swiftlint - SwiftFormat —
brew install swiftformat
git clone <repo-url> && cd NullClawUI
# Regenerate the Xcode project (needed after any source file changes)
xcodegen generate
# Open in Xcode
open NullClawUI.xcodeprojSet your development team in Signing & Capabilities before building.
xcodebuild test \
-scheme NullClawUI \
-destination 'platform=iOS Simulator,name=iPhone 17'swiftlint --strict
swiftformat --lint .| Layer | Technology |
|---|---|
| State management | @Observable macro (Swift 6) |
| Navigation | NavigationStack with programmatic NavigationPath |
| Networking | URLSession + async/await; AsyncSequence for SSE |
| Persistence | SwiftData (ConversationRecord, GatewayProfile) |
| Credentials | System Keychain (Security framework) |
| Markdown | AttributedString (native) |
| Code generation | xcodegen (project.yml) |
All UI mutations are @MainActor-isolated. No DispatchQueue usage.
Bearer tokens are stored exclusively in the system Keychain, keyed by the normalized gateway URL. No tokens are written to UserDefaults, disk files, or iCloud.
See CONTRIBUTING.md for guidelines.
MIT — see LICENSE.