# matthewpdingle/gtopen architecture

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

- Interactive diagram: https://gitdiagram.com/matthewpdingle/gtopen
- Repository: https://github.com/matthewpdingle/gtopen

## Overview

GTOpen is a local no-limit hold’em solver with a browser UI. Users can build and solve multiway preflop scenarios, carry a heads-up flop into postflop setup, build and solve a postflop tree, then browse strategy and EV or generate cross-flop reports. The Rust server exposes the local application, while the solver crate contains the preflop model, postflop engine, and inspection logic. The README documents saved sessions and player models. Some connections below rely on README workflow descriptions; unsampled implementations are represented at their enclosing directory.

Main entry points: [`crates/server/src/main.rs`](https://github.com/matthewpdingle/gtopen/blob/master/crates/server/src/main.rs) (HTTP API), [`web/js/app.js`](https://github.com/matthewpdingle/gtopen/blob/master/web/js/app.js) (App workflow), [`crates/solver/src/preflop/mod.rs`](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/mod.rs) (Preflop engine), [`crates/solver/src/cfr.rs`](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/cfr.rs) (CFR solver)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_browser["Browser interface"]
  node_app["App workflow<br/>[app.js]"]
  node_preflab["Preflop lab<br/>[preflop_lab.js]"]
  node_browse["Strategy browser<br/>[browse.js]"]
  node_reports_ui["Reports UI<br/>[reports.js]"]
end

subgraph group_server["Local server"]
  node_http["HTTP API<br/>[main.rs]"]
  node_sessions["Session saves<br/>[save.rs]"]
end

subgraph group_preflop["Preflop solving"]
  node_pf_engine["Preflop engine<br/>[mod.rs]"]
  node_pf_equity["Preflop equity<br/>[equity.rs]"]
  node_multiway["Multiway model<br/>[multiway.rs]"]
  node_player_models[("Player models<br/>[dataset.rs]")]
end

subgraph group_postflop["Postflop solving"]
  node_post_context["Context models"]
  node_tree["Tree builder<br/>[tree.rs]"]
  node_cfr["CFR solver<br/>[cfr.rs]"]
  node_inspect["Strategy inspection<br/>[query.rs]"]
  node_evaluator["Hand evaluator<br/>[evaluator.rs]"]
  node_reports["Report engine<br/>[report.rs]"]
end

node_user(("Analyst"))

node_user -->|"uses"| node_app
node_app -->|"opens"| node_preflab
node_preflab -.->|"submits scenarios"| node_http
node_app -.->|"requests solves"| node_http
node_http -.->|"runs preflop"| node_pf_engine
node_pf_engine -->|"uses equity"| node_pf_equity
node_pf_engine -->|"models multiway"| node_multiway
node_pf_engine -.->|"loads models"| node_player_models
node_app -.->|"builds spot"| node_tree
node_http -.->|"builds tree"| node_tree
node_tree -->|"defines game"| node_cfr
node_cfr -.->|"evaluates hands"| node_evaluator
node_http -.->|"runs solve"| node_cfr
node_http -.->|"applies context"| node_post_context
node_browse -.->|"requests inspection"| node_http
node_http -.->|"queries strategy"| node_inspect
node_inspect -->|"reads solution"| node_cfr
node_app -->|"shows results"| node_browse
node_app -->|"opens reports"| node_reports_ui
node_reports_ui -.->|"requests reports"| node_http
node_http -.->|"generates reports"| node_reports
node_http -.->|"saves sessions"| node_sessions

click node_app "https://github.com/matthewpdingle/gtopen/blob/master/web/js/app.js"
click node_preflab "https://github.com/matthewpdingle/gtopen/blob/master/web/js/preflop_lab.js"
click node_browse "https://github.com/matthewpdingle/gtopen/blob/master/web/js/browse.js"
click node_reports_ui "https://github.com/matthewpdingle/gtopen/blob/master/web/js/reports.js"
click node_http "https://github.com/matthewpdingle/gtopen/blob/master/crates/server/src/main.rs"
click node_sessions "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/save.rs"
click node_pf_engine "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/mod.rs"
click node_pf_equity "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/equity.rs"
click node_multiway "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/multiway.rs"
click node_player_models "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/dataset.rs"
click node_post_context "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/contextual_postflop.rs"
click node_tree "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/tree.rs"
click node_cfr "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/cfr.rs"
click node_inspect "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/query.rs"
click node_evaluator "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/evaluator.rs"
click node_reports "https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/report.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_app,node_preflab,node_browse,node_reports_ui toneBlue
class node_http,node_sessions toneAmber
class node_pf_engine,node_pf_equity,node_multiway,node_player_models toneMint
class node_post_context,node_tree,node_cfr,node_inspect,node_evaluator,node_reports toneRose
class node_user toneIndigo
```

## Components

### Browser interface

- [App workflow](https://github.com/matthewpdingle/gtopen/blob/master/web/js/app.js): `web/js/app.js`
- [Preflop lab](https://github.com/matthewpdingle/gtopen/blob/master/web/js/preflop_lab.js): `web/js/preflop_lab.js`
- [Strategy browser](https://github.com/matthewpdingle/gtopen/blob/master/web/js/browse.js): `web/js/browse.js`
- [Reports UI](https://github.com/matthewpdingle/gtopen/blob/master/web/js/reports.js): `web/js/reports.js`

### Local server

- [HTTP API](https://github.com/matthewpdingle/gtopen/blob/master/crates/server/src/main.rs): `crates/server/src/main.rs`
- [Session saves](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/save.rs): `crates/solver/src/save.rs`

### Preflop solving

- [Preflop engine](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/mod.rs): `crates/solver/src/preflop/mod.rs`
- [Preflop equity](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/equity.rs): `crates/solver/src/preflop/equity.rs`
- [Multiway model](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/multiway.rs): `crates/solver/src/preflop/multiway.rs`
- [Player models](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/preflop/dataset.rs): `crates/solver/src/preflop/dataset.rs`

### Postflop solving

- [Context models](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/contextual_postflop.rs): `crates/solver/src/contextual_postflop.rs`
- [Tree builder](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/tree.rs): `crates/solver/src/tree.rs`
- [CFR solver](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/cfr.rs): `crates/solver/src/cfr.rs`
- [Strategy inspection](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/query.rs): `crates/solver/src/query.rs`
- [Hand evaluator](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/evaluator.rs): `crates/solver/src/evaluator.rs`
- [Report engine](https://github.com/matthewpdingle/gtopen/blob/master/crates/solver/src/report.rs): `crates/solver/src/report.rs`

### Other components

- **Analyst**

## Connections

- Analyst → App workflow: uses
- App workflow → Preflop lab: opens (evidence: `web/js/app.js`)
- Preflop lab → HTTP API: submits scenarios
- App workflow → HTTP API: requests solves
- HTTP API → Preflop engine: runs preflop
- Preflop engine → Preflop equity: uses equity (evidence: `crates/solver/src/preflop/mod.rs`)
- Preflop engine → Multiway model: models multiway (evidence: `crates/solver/src/preflop/mod.rs`)
- Preflop engine → Player models: loads models (evidence: `crates/solver/src/preflop/mod.rs`)
- App workflow → Tree builder: builds spot
- HTTP API → Tree builder: builds tree
- Tree builder → CFR solver: defines game (evidence: `crates/solver/src/cfr.rs`)
- CFR solver → Hand evaluator: evaluates hands
- HTTP API → CFR solver: runs solve
- HTTP API → Context models: applies context
- Strategy browser → HTTP API: requests inspection
- HTTP API → Strategy inspection: queries strategy
- Strategy inspection → CFR solver: reads solution (evidence: `crates/solver/src/query.rs`)
- App workflow → Strategy browser: shows results (evidence: `web/js/app.js`)
- App workflow → Reports UI: opens reports (evidence: `web/js/app.js`)
- Reports UI → HTTP API: requests reports
- HTTP API → Report engine: generates reports
- HTTP API → Session saves: saves sessions
