# hackyguru/botato architecture

> Architecture diagram of the GitHub repository hackyguru/botato, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hackyguru/botato
- Repository: https://github.com/hackyguru/botato

## Overview

Botato is a local-first desktop environment for creating persistent bots, chatting with them individually or in rooms, and letting them work on schedules. The desktop UI sends commands to the Tauri backend, which runs turns through each bot’s chosen engine and streams results back; the backend also owns bot data, tools, and optional computer and voice capabilities. The phone app pairs directly with the desktop and presents its state and actions. Some subsystem links are based on README descriptions because their source was not sampled.

Main entry points: [`src-tauri/src/lib.rs`](https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs) (Command backend), [`mobile/App.tsx`](https://github.com/hackyguru/botato/blob/main/mobile/App.tsx) (Phone app), [`src/main.ts`](https://github.com/hackyguru/botato/blob/main/src/main.ts) (Desktop UI), [`src-tauri/src/inference.rs`](https://github.com/hackyguru/botato/blob/main/src-tauri/src/inference.rs) (Engine adapters)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop experience"]
  node_desktop_ui["Desktop UI<br/>[main.ts]"]
  node_command_backend["Command backend<br/>[lib.rs]"]
  node_bot_roster[("Bots and settings<br/>[lib.rs]")]
  node_rooms[("Rooms and routines<br/>[rooms.rs]")]
end

subgraph group_runtime["Bot runtime"]
  node_turn_runner["Turn runner<br/>[lib.rs]"]
  node_engine_adapter["Engine adapters<br/>[inference.rs]"]
  node_transcript[("Transcript and memory<br/>[transcript.rs]")]
end

subgraph group_capabilities["Bot capabilities"]
  node_connector_flows["Connectors and OAuth<br/>[connectors.rs]"]
  node_mcp_tools["MCP tools<br/>[mcp.rs]"]
  node_mcp_client["MCP client<br/>[mcp_client.rs]"]
  node_files["Workspace files<br/>[files.rs]"]
  node_computer["Bot computer<br/>[sandbox.rs]"]
  node_container_engine["Container engine<br/>[engine.rs]"]
  node_voice["Speech and voice<br/>[speech.rs]"]
  node_hearing["Local speech input<br/>[hearing.rs]"]
  node_backup["Encrypted backups<br/>[backup.rs]"]
end

subgraph group_phone["Phone access"]
  node_phone_app["Phone app<br/>[App.tsx]"]
  node_phone_api["Phone API<br/>[api.ts]"]
  node_phone_transport["Peer transport<br/>[lib.rs]"]
  node_desktop_peer["Desktop peer service<br/>[p2p.rs]"]
  node_phone_storage[("Pairing credential storage<br/>[storage.ts]")]
end

node_user(("User"))
node_model_engine["Model engines"]
node_phone_user(("Phone user"))

node_user -->|"uses"| node_desktop_ui
node_desktop_ui -->|"invokes commands"| node_command_backend
node_command_backend -->|"manages bots"| node_bot_roster
node_command_backend -->|"manages rooms"| node_rooms
node_command_backend -->|"starts turns"| node_turn_runner
node_turn_runner -->|"runs turn"| node_engine_adapter
node_engine_adapter -->|"invokes engine"| node_model_engine
node_turn_runner -->|"reads and records"| node_transcript
node_turn_runner -.->|"uses when enabled"| node_computer
node_turn_runner -->|"provides file tools"| node_files
node_turn_runner -->|"serves desktop tools"| node_mcp_tools
node_turn_runner -.->|"routes external tools"| node_mcp_client
node_mcp_client -.->|"uses configured connectors"| node_connector_flows
node_computer -->|"uses managed engine"| node_container_engine
node_command_backend -->|"provides speech"| node_voice
node_command_backend -->|"provides speech input"| node_hearing
node_command_backend -->|"creates backups"| node_backup
node_phone_user -->|"uses"| node_phone_app
node_phone_app -->|"requests and listens"| node_phone_api
node_phone_app -->|"loads pairing token"| node_phone_storage
node_phone_api -->|"sends requests"| node_phone_transport
node_phone_transport -->|"connects directly"| node_desktop_peer
node_desktop_peer -->|"forwards desktop actions"| node_command_backend

click node_desktop_ui "https://github.com/hackyguru/botato/blob/main/src/main.ts"
click node_command_backend "https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs"
click node_bot_roster "https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs"
click node_rooms "https://github.com/hackyguru/botato/blob/main/src-tauri/src/rooms.rs"
click node_turn_runner "https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs"
click node_engine_adapter "https://github.com/hackyguru/botato/blob/main/src-tauri/src/inference.rs"
click node_transcript "https://github.com/hackyguru/botato/blob/main/src-tauri/src/transcript.rs"
click node_connector_flows "https://github.com/hackyguru/botato/blob/main/src-tauri/src/connectors.rs"
click node_mcp_tools "https://github.com/hackyguru/botato/blob/main/src-tauri/src/mcp.rs"
click node_mcp_client "https://github.com/hackyguru/botato/blob/main/src-tauri/src/mcp_client.rs"
click node_files "https://github.com/hackyguru/botato/blob/main/src-tauri/src/files.rs"
click node_computer "https://github.com/hackyguru/botato/blob/main/src-tauri/src/sandbox.rs"
click node_container_engine "https://github.com/hackyguru/botato/blob/main/src-tauri/src/engine.rs"
click node_voice "https://github.com/hackyguru/botato/blob/main/src-tauri/src/speech.rs"
click node_hearing "https://github.com/hackyguru/botato/blob/main/src-tauri/src/hearing.rs"
click node_backup "https://github.com/hackyguru/botato/blob/main/src-tauri/src/backup.rs"
click node_phone_app "https://github.com/hackyguru/botato/blob/main/mobile/App.tsx"
click node_phone_api "https://github.com/hackyguru/botato/blob/main/mobile/src/api.ts"
click node_phone_transport "https://github.com/hackyguru/botato/blob/main/mobile/rust/botato-p2p/src/lib.rs"
click node_desktop_peer "https://github.com/hackyguru/botato/blob/main/src-tauri/src/p2p.rs"
click node_phone_storage "https://github.com/hackyguru/botato/blob/main/mobile/src/storage.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_desktop_ui,node_command_backend,node_bot_roster,node_rooms,node_user,node_phone_user toneBlue
class node_turn_runner,node_engine_adapter,node_transcript toneAmber
class node_connector_flows,node_mcp_tools,node_mcp_client,node_files,node_computer,node_container_engine,node_voice,node_hearing,node_backup toneMint
class node_phone_app,node_phone_api,node_phone_transport,node_desktop_peer,node_phone_storage toneRose
class node_model_engine toneIndigo
```

## Components

### Desktop experience

- [Desktop UI](https://github.com/hackyguru/botato/blob/main/src/main.ts): `src/main.ts`
- [Command backend](https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs): `src-tauri/src/lib.rs`
- [Bots and settings](https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs): `src-tauri/src/lib.rs`
- [Rooms and routines](https://github.com/hackyguru/botato/blob/main/src-tauri/src/rooms.rs): `src-tauri/src/rooms.rs`

### Bot runtime

- [Turn runner](https://github.com/hackyguru/botato/blob/main/src-tauri/src/lib.rs): `src-tauri/src/lib.rs`
- [Engine adapters](https://github.com/hackyguru/botato/blob/main/src-tauri/src/inference.rs): `src-tauri/src/inference.rs`
- [Transcript and memory](https://github.com/hackyguru/botato/blob/main/src-tauri/src/transcript.rs): `src-tauri/src/transcript.rs`

### Bot capabilities

- [Connectors and OAuth](https://github.com/hackyguru/botato/blob/main/src-tauri/src/connectors.rs): `src-tauri/src/connectors.rs`
- [MCP tools](https://github.com/hackyguru/botato/blob/main/src-tauri/src/mcp.rs): `src-tauri/src/mcp.rs`
- [MCP client](https://github.com/hackyguru/botato/blob/main/src-tauri/src/mcp_client.rs): `src-tauri/src/mcp_client.rs`
- [Workspace files](https://github.com/hackyguru/botato/blob/main/src-tauri/src/files.rs): `src-tauri/src/files.rs`
- [Bot computer](https://github.com/hackyguru/botato/blob/main/src-tauri/src/sandbox.rs): `src-tauri/src/sandbox.rs`
- [Container engine](https://github.com/hackyguru/botato/blob/main/src-tauri/src/engine.rs): `src-tauri/src/engine.rs`
- [Speech and voice](https://github.com/hackyguru/botato/blob/main/src-tauri/src/speech.rs): `src-tauri/src/speech.rs`
- [Local speech input](https://github.com/hackyguru/botato/blob/main/src-tauri/src/hearing.rs): `src-tauri/src/hearing.rs`
- [Encrypted backups](https://github.com/hackyguru/botato/blob/main/src-tauri/src/backup.rs): `src-tauri/src/backup.rs`

### Phone access

- [Phone app](https://github.com/hackyguru/botato/blob/main/mobile/App.tsx): `mobile/App.tsx`
- [Phone API](https://github.com/hackyguru/botato/blob/main/mobile/src/api.ts): `mobile/src/api.ts`
- [Peer transport](https://github.com/hackyguru/botato/blob/main/mobile/rust/botato-p2p/src/lib.rs): `mobile/rust/botato-p2p/src/lib.rs`
- [Desktop peer service](https://github.com/hackyguru/botato/blob/main/src-tauri/src/p2p.rs): `src-tauri/src/p2p.rs`
- [Pairing credential storage](https://github.com/hackyguru/botato/blob/main/mobile/src/storage.ts): `mobile/src/storage.ts`

### Other components

- **User**
- **Model engines**
- **Phone user**

## Connections

- User → Desktop UI: uses
- Desktop UI → Command backend: invokes commands
- Command backend → Bots and settings: manages bots
- Command backend → Rooms and routines: manages rooms
- Command backend → Turn runner: starts turns
- Turn runner → Engine adapters: runs turn
- Engine adapters → Model engines: invokes engine
- Turn runner → Transcript and memory: reads and records
- Turn runner → Bot computer: uses when enabled
- Turn runner → Workspace files: provides file tools
- Turn runner → MCP tools: serves desktop tools
- Turn runner → MCP client: routes external tools
- MCP client → Connectors and OAuth: uses configured connectors
- Bot computer → Container engine: uses managed engine
- Command backend → Speech and voice: provides speech
- Command backend → Local speech input: provides speech input
- Command backend → Encrypted backups: creates backups
- Phone user → Phone app: uses
- Phone app → Phone API: requests and listens
- Phone app → Pairing credential storage: loads pairing token
- Phone API → Peer transport: sends requests
- Peer transport → Desktop peer service: connects directly
- Desktop peer service → Command backend: forwards desktop actions
