You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lightweight embedded HTTP server for receiving commands
mDNS
NWListener + NWBrowser (Network framework)
Built into iOS — zero dependencies. Replaces deprecated NetService (iOS 16+)
MCP Server
Custom implementation over HTTP transport
MCP protocol over the same HTTP server
Networking
URLSession
Standard iOS networking
Min Target
iOS 16+
WKWebView snapshot API stability
iOS — Required Info.plist Entries
<!-- Local network access prompt (required iOS 14+) -->
<key>NSLocalNetworkUsageDescription</key>
<string>Kelpie uses the local network to receive browser automation commands from the CLI.</string>
<!-- Bonjour service types for mDNS (required for NWListener/NWBrowser) -->
<key>NSBonjourServices</key>
<array>
<string>_kelpie._tcp</string>
</array>
Without these entries, iOS will silently block local network access and mDNS advertisement.
iOS — Key APIs
WKWebView.evaluateJavaScript(_:) — DOM queries and reads via native bridge
packages/
cli/ # @unlikeotherai/kelpie
src/
commands/ # Commander command definitions
discovery/ # mDNS browser discovery
client/ # HTTP client for browser communication
group/ # Group command orchestration
mcp/ # MCP server implementation
help/ # LLM help system
bin/
kelpie.ts # Entry point
package.json
Shared / Cross-Cutting
Concern
Choice
Notes
Protocol
HTTP/JSON
All browser-CLI communication over REST
MCP Transport
Streamable HTTP (SSE)
Standard MCP transport for both browser and CLI servers
mDNS Service Type
_kelpie._tcp
Service discovery identifier
mDNS TXT Records
id, name, model, platform, width, height, port, version
Device metadata for discovery
API Versioning
URL prefix /v1/
Forward-compatible
Image Format
PNG (screenshots)
Lossless, LLM-friendly
Shared Native Core
C++17 static libraries under native/
Shared protocol, state, automation, MCP, and desktop Chromium engine foundations
Monorepo
pnpm workspaces
CLI, shared types, and native app projects all in one repo
Repository Structure
kelpie/
native/
core-protocol/ # Shared native protocol constants and enums
core-state/ # Shared native bookmark/history/console/network stores
core-automation/ # Shared handler context and renderer abstraction
core-mcp/ # Shared browser-side MCP registry
engine-chromium-desktop/ # Shared CEF-based desktop engine for Linux/Windows shells
packages/
cli/ # Node.js CLI — @unlikeotherai/kelpie
shared/ # Shared TypeScript types and constants
apps/
ios/ # Xcode project — Kelpie Browser
android/ # Android Studio project — Kelpie Browser
macos/ # Xcode project — Kelpie Browser for macOS
linux/ # Linux app shell consuming the shared desktop engine
windows/ # Windows app shell consuming the shared desktop engine
docs/ # This documentation
Dependencies Summary
iOS (Swift Package Manager)
Package
Purpose
Swifter or Telegraph
Embedded HTTP server
Everything else is built into iOS SDK (WKWebView, NetService, URLSession).
Android (Gradle)
Package
Purpose
Ktor Server (Netty)
Embedded HTTP server
Kotlinx Serialization
JSON handling
Material 3
UI components
WebView, NsdManager, PixelCopy are all Android SDK built-ins.
CLI (npm)
Package
Purpose
commander
CLI framework
bonjour-service
mDNS discovery
@modelcontextprotocol/sdk
MCP server
chalk
Terminal colors
cli-table3
Table formatting
tsup
Build/bundle
typescript
Language
Build & Run
Component
Build Command
Run Command
CLI
pnpm build
kelpie (global) or pnpm dev
iOS
Xcode build
Run on device/simulator
Android
./gradlew assembleDebug
Run on device/emulator
macOS
Xcode build
Run on Mac
Windows desktop release
Windows ships a CEF 152.0.6 sandbox bootstrap (kelpie.exe) and application DLL (kelpie.dll),
with matching CEF runtime assets. The Windows application version is owned by
apps/windows/CMakeLists.txt (KELPIE_WINDOWS_VERSION, currently 0.1.3); it does not share
Apple mobile version fields. The local control server is loopback-only and uses an ACL-protected
per-launch readiness token rather than mDNS pairing.