Mobile App
Expo setup, dual providers, voice input, goals, and MCP trust.
The mobile app is a React Native + Expo surface built on the same runtime packages as the desktop: the same identity, memory, and governance code, a different body. It is built from source today — it is not distributed through the App Store or Play Store — and on-device testing is not yet complete, so treat feature parity with desktop as a design target rather than a verified state. The creature renders via expo-gl + Three.js, and all persistence uses expo-sqlite with the same adapter pattern.
Running the mobile app
pnpm --filter @motebit/mobile startThis launches the Expo dev server. Scan the QR code with Expo Go, or press i for iOS simulator / a for Android emulator.
First launch
On first launch, the app generates an Ed25519 keypair, stores the private key in the device keychain (expo-secure-store), and creates your motebit identity. No account creation, no server — the identity lives on your device.
Choosing a provider
Open settings (gear icon, top right) to configure your LLM:
| Provider | Setup |
|---|---|
| Ollama (default) | Requires a running Ollama instance. Set the endpoint URL in settings (default http://localhost:11434). |
| Anthropic | Enter your API key. Stored in the device keychain, never on disk. |
Set the model name in the Model field. Default: qwen3.
Voice input
Voice input uses a 5-state pipeline:
- Off — Microphone disabled
- Ambient — VAD (Voice Activity Detection) listens for speech onset
- Voice — Recording active, user is speaking
- Transcribing — Whisper STT processes the audio
- Speaking — TTS plays the agent's response
Enable voice in the Voice settings tab. Requirements:
- STT: Requires an OpenAI API key (Whisper transcription)
- TTS: OpenAI TTS (with expo-speech as fallback if no key)
- VAD: Neural model enabled by default for accurate speech detection
Voice settings:
| Setting | Default | Description |
|---|---|---|
| Voice enabled | Off | Master toggle for voice pipeline |
| TTS voice | alloy | OpenAI voice (alloy, echo, fable, onyx, nova, shimmer) |
| Auto-send | On | Automatically send transcribed text |
| Voice response | On | Speak the agent's reply aloud |
| Neural VAD | On | Use neural model for speech detection |
Slash commands
Type / in the chat input to use commands:
| Command | Action |
|---|---|
/model <name> | Switch model |
/conversations | List past conversations |
/new | Start a new conversation |
/memories | Browse stored memories |
/sync | Trigger manual sync |
/export | Export all data (JSON) |
/settings | Open settings |
/summarize | Summarize current conversation |
/help | Show available commands |
Goal execution
The mobile app supports plan-based goal execution — the same system as the desktop and CLI. Goals run on a 60-second scheduler tick in the background.
Access goals from the top-left Goals button. When a goal executes:
- The PlanEngine breaks it into steps
- Each step runs with tool access
- Tool calls that require approval surface as approval cards in chat
- A running indicator shows goal status
Goal outcomes (completed/failed) appear as system messages with summaries.
MCP servers
Connect external tools via MCP (Model Context Protocol). Mobile supports HTTP transport only (no stdio).
In the Capabilities panel (not the settings modal):
- Tap Add Server — enter name, URL, and optional trust toggle
- On connect, the manifest is SHA-256 hashed and pinned
- Subsequent connections verify the manifest matches — trust is revoked on mismatch
Per-server trust
Each MCP server has a trust toggle:
| Trust level | Behavior |
|---|---|
| Untrusted (default) | Every tool call requires explicit approval |
| Trusted | Tools execute automatically (same as builtin tools) |
Toggle trust on any connected server from the Tools tab. Trust changes take effect immediately — tools are re-registered with updated approval requirements.
Operator mode
Operator mode unlocks high-risk tools. Toggle it in settings:
- First time: set a 4-6 digit PIN
- Subsequent times: enter your PIN to enable
- Reset PIN available in settings
Multi-device pairing
Pair with another device running the same motebit identity:
- On existing device: Initiate pairing (generates a 6-character code)
- On new device: Claim pairing with the code
- On existing device: Approve or deny the claim
- Sync link establishes automatically
Requires a sync relay URL (configured in settings).
Settings overview
The settings modal has 5 tabs:
| Tab | Controls |
|---|---|
| Appearance | Color preset grid (7 presets: moonlight, amber, rose, violet, cyan, ember, sage), custom hue/saturation sliders, theme toggle |
| Governance | Operator mode + PIN, tool approval preset (cautious/balanced/autonomous), memory persistence threshold, reject-secrets switch, max tool calls per turn |
| Identity | Motebit ID, DID, device ID, public key (copy-to-clipboard), rotate key, link device, export identity file, export all data |
| Intelligence | Provider mode (Motebit Cloud / BYOK / on-device), model, BYOK vendor, on-device backend (Apple FM / MLX / local server), voice settings (TTS, auto-send, neural VAD, TTS voice) |
| Billing | Motebit Cloud balance and funding for this motebit (BillingPanel) |
MCP servers (server list with trust toggles, add/remove, motebit-pinned public keys) live in the Capabilities panel, not in the settings modal.
Configuration storage
| Data | Storage |
|---|---|
| Settings JSON | AsyncStorage (@motebit/settings) |
| API keys | Device keychain (expo-secure-store) |
| Identity, events, memories | SQLite (expo-sqlite, WAL mode) |
| MCP server configs | AsyncStorage (@motebit/mcp_servers) |
| Identity file | AsyncStorage (@motebit/identity_file) |