# gianniacquisto/tandem architecture

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

- Interactive diagram: https://gitdiagram.com/gianniacquisto/tandem
- Repository: https://github.com/gianniacquisto/tandem

## Overview

Tandem is a local ticket board and shared markdown-notes tool for people and AI coding agents. The main workflows are serving the board in a browser and handling agent requests through MCP; both use the local home, while doctor reports its health. Inside the core, RPC dispatches domain operations, and the domain/store seam commits board state. Groups and paths follow the repository tree. Some links are based on README statements or source-index references; unsampled modules are not treated as inspected.

Main entry points: [`rust/core/src/rpc/mod.rs`](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/rpc/mod.rs) (RPC dispatch), [`rust/core/src/serve/mod.rs`](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/mod.rs) (Board server), [`rust/core/src/domain/board.rs`](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/board.rs) (Board operations), [`rust/core/src/store/mod.rs`](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/store/mod.rs) (SQLite store)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_faces["User and agent faces"]
  node_cli["CLI<br/>[main.rs]"]
  node_web["Board server<br/>[mod.rs]"]
  node_board_ui["Board and sheets<br/>[board.rs]"]
  node_notes_ui["Notes interface<br/>[notes.rs]"]
  node_mcp["MCP server<br/>[mcp.rs]"]
end

subgraph group_core["Core and domain"]
  node_rpc["RPC dispatch<br/>[mod.rs]"]
  node_wire["Wire contract<br/>[rpc.rs]"]
  node_board_domain["Board operations<br/>[board.rs]"]
  node_ticket_query["Ticket filtering<br/>[query.rs]"]
  node_ticket_model["Ticket model<br/>[ticket.rs]"]
  node_markdown["Ticket markdown<br/>[markdown.rs]"]
end

subgraph group_notes["Notes and diagnostics"]
  node_notes["Notes vault<br/>[mod.rs]"]
  node_doctor["Health report<br/>[diagnostics.rs]"]
end

subgraph group_persistence["Local persistence"]
  node_store[("SQLite store<br/>[mod.rs]")]
  node_home[("Local home and files")]
end

node_person(("Person"))
node_agent(("AI agent"))

node_person -->|"uses board"| node_web
node_web -->|"routes requests"| node_board_ui
node_web -->|"routes requests"| node_notes_ui
node_person -->|"runs commands"| node_cli
node_agent -->|"sends requests"| node_mcp
node_mcp -->|"uses protocol"| node_rpc
node_rpc -->|"dispatches frames"| node_wire
node_rpc -->|"calls operations"| node_board_domain
node_rpc -->|"calls note actions"| node_notes
node_board_domain -->|"reads and writes"| node_store
node_board_domain -->|"updates tickets"| node_ticket_model
node_ticket_query -->|"filters tickets"| node_ticket_model
node_rpc -.->|"parses blocks"| node_markdown
node_notes -->|"reads and writes files"| node_home
node_store -->|"persists local data"| node_home
node_cli -->|"runs health check"| node_doctor
node_doctor -->|"checks store health"| node_store

click node_cli "https://github.com/gianniacquisto/tandem/blob/main/rust/cli/src/main.rs"
click node_web "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/mod.rs"
click node_board_ui "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/board.rs"
click node_notes_ui "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/notes.rs"
click node_mcp "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/mcp.rs"
click node_rpc "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/rpc/mod.rs"
click node_wire "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/wire/rpc.rs"
click node_board_domain "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/board.rs"
click node_ticket_query "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/query.rs"
click node_ticket_model "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/ticket.rs"
click node_markdown "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/markdown.rs"
click node_notes "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/bikeshed/mod.rs"
click node_doctor "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/diagnostics.rs"
click node_store "https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/store/mod.rs"

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_cli,node_web,node_board_ui,node_notes_ui,node_mcp toneBlue
class node_rpc,node_wire,node_board_domain,node_ticket_query,node_ticket_model,node_markdown toneAmber
class node_notes,node_doctor toneMint
class node_store,node_home toneRose
class node_person,node_agent toneIndigo
```

## Components

### User and agent faces

- [CLI](https://github.com/gianniacquisto/tandem/blob/main/rust/cli/src/main.rs): `rust/cli/src/main.rs`
- [Board server](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/mod.rs): `rust/core/src/serve/mod.rs`
- [Board and sheets](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/board.rs): `rust/core/src/serve/board.rs`
- [Notes interface](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/serve/notes.rs): `rust/core/src/serve/notes.rs`
- [MCP server](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/mcp.rs): `rust/core/src/mcp.rs`

### Core and domain

- [RPC dispatch](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/rpc/mod.rs): `rust/core/src/rpc/mod.rs`
- [Wire contract](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/wire/rpc.rs): `rust/core/src/wire/rpc.rs`
- [Board operations](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/board.rs): `rust/core/src/domain/board.rs`
- [Ticket filtering](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/query.rs): `rust/core/src/domain/query.rs`
- [Ticket model](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/ticket.rs): `rust/core/src/domain/ticket.rs`
- [Ticket markdown](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/domain/markdown.rs): `rust/core/src/domain/markdown.rs`

### Notes and diagnostics

- [Notes vault](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/bikeshed/mod.rs): `rust/core/src/bikeshed/mod.rs`
- [Health report](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/diagnostics.rs): `rust/core/src/diagnostics.rs`

### Local persistence

- [SQLite store](https://github.com/gianniacquisto/tandem/blob/main/rust/core/src/store/mod.rs): `rust/core/src/store/mod.rs`
- **Local home and files**

### Other components

- **Person**
- **AI agent**

## Connections

- Person → Board server: uses board (evidence: `README.md`)
- Board server → Board and sheets: routes requests (evidence: `rust/core/src/serve/mod.rs`)
- Board server → Notes interface: routes requests (evidence: `rust/core/src/serve/mod.rs`)
- Person → CLI: runs commands (evidence: `README.md`)
- AI agent → MCP server: sends requests (evidence: `README.md`)
- MCP server → RPC dispatch: uses protocol (evidence: `rust/core/src/mcp.rs`)
- RPC dispatch → Wire contract: dispatches frames (evidence: `rust/core/src/rpc/mod.rs`)
- RPC dispatch → Board operations: calls operations (evidence: `rust/core/src/rpc/mod.rs`)
- RPC dispatch → Notes vault: calls note actions (evidence: `rust/core/src/rpc/mod.rs`)
- Board operations → SQLite store: reads and writes (evidence: `rust/core/src/domain/board.rs`)
- Board operations → Ticket model: updates tickets (evidence: `rust/core/src/domain/board.rs`)
- Ticket filtering → Ticket model: filters tickets (evidence: `rust/core/src/domain/query.rs`)
- RPC dispatch → Ticket markdown: parses blocks
- Notes vault → Local home and files: reads and writes files (evidence: `README.md`)
- SQLite store → Local home and files: persists local data (evidence: `README.md`)
- CLI → Health report: runs health check (evidence: `README.md`)
- Health report → SQLite store: checks store health (evidence: `rust/core/src/diagnostics.rs`)
