# fanqin314/image-scheduler-rs architecture

> Architecture diagram of the GitHub repository fanqin314/image-scheduler-rs, 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/fanqin314/image-scheduler-rs
- Repository: https://github.com/fanqin314/image-scheduler-rs

## Overview

image-scheduler-rs is a local Rust image/video analysis service with a Web UI and an optional Chrome real-time video extension. The primary workflow uploads an image or video, extracts and evaluates visual features, then returns decisions and visualizations for display. Video uploads are decoded and screened for key frames before full analysis; the extension instead captures frames from playing videos and proxies them to the service. README capabilities guide the unsampled Web UI and extension links; sampled source supports the core analysis and proxy relationships. CLOUD/LOCAL are decisions, not demonstrated dispatches to compute services.

Main entry points: [`src/handlers.rs`](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/handlers.rs) (Request handlers), [`realtime-extension/background.js`](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/background.js) (Extension worker), [`realtime-extension/content.js`](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/content.js) (Video capture), [`src/main.rs`](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/main.rs) (Axum server)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_webui["Web UI<br/>[index.html]"]
end

subgraph group_extension["Chrome extension"]
  node_popup["Extension popup<br/>[popup.js]"]
  node_content["Video capture<br/>[content.js]"]
  node_shadow["Shadow DOM hook<br/>[shadow-hook.js]"]
  node_background["Extension worker<br/>[background.js]"]
  node_logs[("Analysis logs")]
end

subgraph group_api["HTTP service"]
  node_server["Axum server<br/>[main.rs]"]
  node_handlers["Request handlers<br/>[handlers.rs]"]
  node_types["API data types<br/>[types.rs]"]
end

subgraph group_analysis["Image analysis"]
  node_config["Analysis settings<br/>[config.rs]"]
  node_features["Feature extraction<br/>[features.rs]"]
  node_evaluation["Value evaluation<br/>[evaluator.rs]"]
  node_visualization["Image annotation<br/>[visualization.rs]"]
end

subgraph group_video["Video analysis"]
  node_decoder["Video decoder<br/>[video.rs]"]
  node_screening["Key-frame screening<br/>[handlers.rs]"]
end

node_user(("User"))
node_native["Native host"]
node_sitevideo["Playing video"]

node_user -->|"uploads image/video"| node_webui
node_webui -->|"HTTP requests"| node_server
node_server -->|"routes requests"| node_handlers
node_handlers -->|"extracts features"| node_features
node_features -->|"feature map"| node_evaluation
node_handlers -->|"requests annotation"| node_visualization
node_handlers -->|"decodes video"| node_decoder
node_decoder -->|"sampled frames"| node_screening
node_screening -->|"analyzes key frames"| node_features
node_screening -->|"evaluates frames"| node_evaluation
node_handlers -->|"builds responses"| node_types
node_handlers -->|"returns results"| node_webui
node_user -->|"starts analysis"| node_popup
node_sitevideo -->|"provides frames"| node_content
node_shadow -->|"opens shadow roots"| node_content
node_content -->|"forwards captured frames"| node_background
node_popup -->|"sends commands"| node_background
node_background -->|"proxies frame requests"| node_server
node_background -->|"sets region"| node_server
node_server -->|"routes frame requests"| node_handlers
node_handlers -->|"returns frame results"| node_content
node_content -->|"saves analysis log"| node_background
node_background -->|"reads/writes logs"| node_logs
node_popup -->|"manages saved logs"| node_background
node_background -.->|"starts backend"| node_native
node_config -->|"supplies parameters"| node_features
node_config -->|"supplies weights"| node_evaluation
node_config -->|"supplies thresholds"| node_screening
node_config -->|"supplies sampling limits"| node_decoder

click node_webui "https://github.com/fanqin314/image-scheduler-rs/blob/main/templates/index.html"
click node_popup "https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/popup.js"
click node_content "https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/content.js"
click node_shadow "https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/shadow-hook.js"
click node_background "https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/background.js"
click node_server "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/main.rs"
click node_handlers "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/handlers.rs"
click node_types "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/types.rs"
click node_config "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/config.rs"
click node_features "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/features.rs"
click node_evaluation "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/evaluator.rs"
click node_visualization "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/visualization.rs"
click node_decoder "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/video.rs"
click node_screening "https://github.com/fanqin314/image-scheduler-rs/blob/main/src/handlers.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_webui,node_user toneBlue
class node_popup,node_content,node_shadow,node_background,node_logs toneAmber
class node_server,node_handlers,node_types toneMint
class node_config,node_features,node_evaluation,node_visualization toneRose
class node_decoder,node_screening,node_native,node_sitevideo toneIndigo
```

## Components

### Web interface

- [Web UI](https://github.com/fanqin314/image-scheduler-rs/blob/main/templates/index.html): `templates/index.html`

### Chrome extension

- [Extension popup](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/popup.js): `realtime-extension/popup.js`
- [Video capture](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/content.js): `realtime-extension/content.js`
- [Shadow DOM hook](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/shadow-hook.js): `realtime-extension/shadow-hook.js`
- [Extension worker](https://github.com/fanqin314/image-scheduler-rs/blob/main/realtime-extension/background.js): `realtime-extension/background.js`
- **Analysis logs**

### HTTP service

- [Axum server](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/main.rs): `src/main.rs`
- [Request handlers](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/handlers.rs): `src/handlers.rs`
- [API data types](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/types.rs): `src/types.rs`

### Image analysis

- [Analysis settings](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/config.rs): `src/config.rs`
- [Feature extraction](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/features.rs): `src/features.rs`
- [Value evaluation](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/evaluator.rs): `src/evaluator.rs`
- [Image annotation](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/visualization.rs): `src/visualization.rs`

### Video analysis

- [Video decoder](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/video.rs): `src/video.rs`
- [Key-frame screening](https://github.com/fanqin314/image-scheduler-rs/blob/main/src/handlers.rs): `src/handlers.rs`

### Other components

- **User**
- **Native host**
- **Playing video**

## Connections

- User → Web UI: uploads image/video
- Web UI → Axum server: HTTP requests
- Axum server → Request handlers: routes requests
- Request handlers → Feature extraction: extracts features
- Feature extraction → Value evaluation: feature map
- Request handlers → Image annotation: requests annotation
- Request handlers → Video decoder: decodes video
- Video decoder → Key-frame screening: sampled frames
- Key-frame screening → Feature extraction: analyzes key frames
- Key-frame screening → Value evaluation: evaluates frames
- Request handlers → API data types: builds responses
- Request handlers → Web UI: returns results
- User → Extension popup: starts analysis
- Playing video → Video capture: provides frames
- Shadow DOM hook → Video capture: opens shadow roots
- Video capture → Extension worker: forwards captured frames
- Extension popup → Extension worker: sends commands
- Extension worker → Axum server: proxies frame requests
- Extension worker → Axum server: sets region
- Axum server → Request handlers: routes frame requests
- Request handlers → Video capture: returns frame results
- Video capture → Extension worker: saves analysis log
- Extension worker → Analysis logs: reads/writes logs
- Extension popup → Extension worker: manages saved logs
- Extension worker → Native host: starts backend
- Analysis settings → Feature extraction: supplies parameters
- Analysis settings → Value evaluation: supplies weights
- Analysis settings → Key-frame screening: supplies thresholds
- Analysis settings → Video decoder: supplies sampling limits
