# akruijff/horizon architecture

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

- Interactive diagram: https://gitdiagram.com/akruijff/horizon
- Repository: https://github.com/akruijff/horizon

## Overview

Horizon monitors a user-selected app or window: a client captures screenshots and sends them to the server, which routes analysis to a plugin and returns instructions for the client to execute or display. Android and Windows clients share the client-side monitoring and connection libraries, while providing platform-specific capture and execution. Plugins include game-specific analysis, notably Nonogram solving, poker-hand evaluation, and Hustle Castle simulation. The graph combines the README’s product description, the tree, and sampled entry-point and protocol code; unsampled subsystem wiring is shown only where the documented workflow supports it.

Main entry points: [`Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/MonitorTarget.java`](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/MonitorTarget.java) (Monitor workflow), [`Library/src/main/java/org/mazarineblue/horizon/library/plugins/Plugin.java`](https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/plugins/Plugin.java) (Plugin API), [`Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/ConnectionToServer.java`](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/ConnectionToServer.java) (Client connection), [`Server/src/main/java/org/mazarineblue/horizon/server/ConnectionProtocolRunnable.java`](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/ConnectionProtocolRunnable.java) (Protocol runner)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client_apps["Client applications"]
  node_android_ui["Android service<br/>[MainService.java]"]
  node_android_executor["Android executor"]
  node_windows_ui["Windows UI<br/>[Main.java]"]
  node_windows_executor["Windows executor"]
end

subgraph group_client_runtime["Client runtime"]
  node_monitor["Monitor workflow<br/>[MonitorTarget.java]"]
  node_client_connection["Client connection"]
  node_client_stream["Stream protocol"]
  node_client_capture["Screenshot capture"]
end

subgraph group_server["Server"]
  node_server_main["Server application<br/>[Main.java]"]
  node_server_protocol["Protocol runner"]
  node_server_connection["Connection handler"]
  node_server_service["Socket service"]
  node_server_registry["Plugin registry"]
end

subgraph group_plugin_runtime["Plugin runtime"]
  node_plugin_api["Plugin API<br/>[Plugin.java]"]
  node_instructions["Instructions<br/>[Instruction.java]"]
  node_screenshots["Screenshot model<br/>[Screenshot.java]"]
end

subgraph group_plugins["Analysis plugins"]
  node_nonogram["Nonogram plugin"]
  node_nonogram_solver["Puzzle solver"]
  node_gop3["Poker evaluator"]
  node_hustle["Kingdom simulator"]
end

node_user(("User"))
node_target_app(("Target app or window"))

node_user -->|"selects target"| node_android_ui
node_user -->|"configures monitoring"| node_windows_ui
node_android_ui -->|"starts monitoring"| node_monitor
node_windows_ui -->|"starts monitoring"| node_monitor
node_monitor -->|"captures screenshot"| node_client_capture
node_target_app -->|"provides screen"| node_client_capture
node_monitor -->|"sends screenshot"| node_client_connection
node_client_connection -->|"uses streams"| node_client_stream
node_client_connection -->|"exchanges data"| node_server_connection
node_server_connection -->|"reads and writes"| node_server_service
node_server_protocol -->|"handles connection"| node_server_connection
node_server_main -->|"starts protocol"| node_server_protocol
node_server_main -->|"lists plugins"| node_server_registry
node_server_protocol -->|"resolves plugin"| node_server_registry
node_server_protocol -->|"dispatches analysis"| node_plugin_api
node_server_connection -->|"supplies image"| node_screenshots
node_plugin_api -->|"returns actions"| node_instructions
node_plugin_api -->|"analyzes image"| node_screenshots
node_nonogram -->|"solves puzzle"| node_nonogram_solver
node_nonogram -->|"implements"| node_plugin_api
node_gop3 -.->|"plugin capability"| node_plugin_api
node_hustle -->|"implements"| node_plugin_api
node_monitor -->|"executes actions"| node_android_executor
node_monitor -->|"executes actions"| node_windows_executor
node_client_connection -->|"receives actions"| node_instructions

click node_android_ui "https://github.com/akruijff/horizon/blob/master/Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/ui/MainService.java"
click node_android_executor "https://github.com/akruijff/horizon/blob/master/Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/executor/AndroidExecutor.java"
click node_windows_ui "https://github.com/akruijff/horizon/blob/master/Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/ui/Main.java"
click node_windows_executor "https://github.com/akruijff/horizon/blob/master/Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/application/executor/WindowsExecutor.java"
click node_monitor "https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/MonitorTarget.java"
click node_client_connection "https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/ConnectionToServer.java"
click node_client_stream "https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/util/StreamServiceImpl.java"
click node_client_capture "https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/ports/ScreenshotCaptor.java"
click node_server_main "https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/Main.java"
click node_server_protocol "https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/ConnectionProtocolRunnable.java"
click node_server_connection "https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionHandler.java"
click node_server_service "https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionService.java"
click node_server_registry "https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/plugins/registry/PluginRegistryImpl.java"
click node_plugin_api "https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/plugins/Plugin.java"
click node_instructions "https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/instruction/Instruction.java"
click node_screenshots "https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/screenshot/Screenshot.java"
click node_nonogram "https://github.com/akruijff/horizon/blob/master/Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/ui/NonogramPlugin.java"
click node_nonogram_solver "https://github.com/akruijff/horizon/blob/master/Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/application/NonogramSolver.java"
click node_gop3 "https://github.com/akruijff/horizon/tree/master/Plugin-GOP3/src/main/java/org/mazarineblue/horizon/plugins/gop3/version2"
click node_hustle "https://github.com/akruijff/horizon/blob/master/Plugin-HustleCastle/src/main/java/org/mazarineblue/horizon/plugins/com/my/hc/kingdom/simulator/HustleCastlePlugin.java"

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_android_ui,node_android_executor,node_windows_ui,node_windows_executor,node_user toneBlue
class node_monitor,node_client_connection,node_client_stream,node_client_capture toneAmber
class node_server_main,node_server_protocol,node_server_connection,node_server_service,node_server_registry toneMint
class node_plugin_api,node_instructions,node_screenshots toneRose
class node_nonogram,node_nonogram_solver,node_gop3,node_hustle,node_target_app toneIndigo
```

## Components

### Client applications

- [Android service](https://github.com/akruijff/horizon/blob/master/Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/ui/MainService.java): `Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/ui/MainService.java`
- [Android executor](https://github.com/akruijff/horizon/blob/master/Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/executor/AndroidExecutor.java): `Client-Android/app/src/main/java/org/mazarineblue/horizon/client/android/executor/AndroidExecutor.java`
- [Windows UI](https://github.com/akruijff/horizon/blob/master/Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/ui/Main.java): `Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/ui/Main.java`
- [Windows executor](https://github.com/akruijff/horizon/blob/master/Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/application/executor/WindowsExecutor.java): `Client-Windows/src/main/java/org/mazarineblue/horizon/client/windows/application/executor/WindowsExecutor.java`

### Client runtime

- [Monitor workflow](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/MonitorTarget.java): `Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/MonitorTarget.java`
- [Client connection](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/ConnectionToServer.java): `Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/ConnectionToServer.java`
- [Stream protocol](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/util/StreamServiceImpl.java): `Library-Client/src/main/java/org/mazarineblue/horizon/library/client/connection/util/StreamServiceImpl.java`
- [Screenshot capture](https://github.com/akruijff/horizon/blob/master/Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/ports/ScreenshotCaptor.java): `Library-Client/src/main/java/org/mazarineblue/horizon/library/client/application/ports/ScreenshotCaptor.java`

### Server

- [Server application](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/Main.java): `Server/src/main/java/org/mazarineblue/horizon/server/Main.java`
- [Protocol runner](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/ConnectionProtocolRunnable.java): `Server/src/main/java/org/mazarineblue/horizon/server/ConnectionProtocolRunnable.java`
- [Connection handler](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionHandler.java): `Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionHandler.java`
- [Socket service](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionService.java): `Server/src/main/java/org/mazarineblue/horizon/server/connection/ConnectionService.java`
- [Plugin registry](https://github.com/akruijff/horizon/blob/master/Server/src/main/java/org/mazarineblue/horizon/server/plugins/registry/PluginRegistryImpl.java): `Server/src/main/java/org/mazarineblue/horizon/server/plugins/registry/PluginRegistryImpl.java`

### Plugin runtime

- [Plugin API](https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/plugins/Plugin.java): `Library/src/main/java/org/mazarineblue/horizon/library/plugins/Plugin.java`
- [Instructions](https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/instruction/Instruction.java): `Library/src/main/java/org/mazarineblue/horizon/library/instruction/Instruction.java`
- [Screenshot model](https://github.com/akruijff/horizon/blob/master/Library/src/main/java/org/mazarineblue/horizon/library/screenshot/Screenshot.java): `Library/src/main/java/org/mazarineblue/horizon/library/screenshot/Screenshot.java`

### Analysis plugins

- [Nonogram plugin](https://github.com/akruijff/horizon/blob/master/Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/ui/NonogramPlugin.java): `Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/ui/NonogramPlugin.java`
- [Puzzle solver](https://github.com/akruijff/horizon/blob/master/Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/application/NonogramSolver.java): `Plugin-Nonogram.com/src/main/java/org/mazarineblue/horizon/plugin/com/easybrain/nonogram/application/NonogramSolver.java`
- [Poker evaluator](https://github.com/akruijff/horizon/tree/master/Plugin-GOP3/src/main/java/org/mazarineblue/horizon/plugins/gop3/version2): `Plugin-GOP3/src/main/java/org/mazarineblue/horizon/plugins/gop3/version2`
- [Kingdom simulator](https://github.com/akruijff/horizon/blob/master/Plugin-HustleCastle/src/main/java/org/mazarineblue/horizon/plugins/com/my/hc/kingdom/simulator/HustleCastlePlugin.java): `Plugin-HustleCastle/src/main/java/org/mazarineblue/horizon/plugins/com/my/hc/kingdom/simulator/HustleCastlePlugin.java`

### Other components

- **User**
- **Target app or window**

## Connections

- User → Android service: selects target
- User → Windows UI: configures monitoring
- Android service → Monitor workflow: starts monitoring
- Windows UI → Monitor workflow: starts monitoring
- Monitor workflow → Screenshot capture: captures screenshot
- Target app or window → Screenshot capture: provides screen
- Monitor workflow → Client connection: sends screenshot
- Client connection → Stream protocol: uses streams
- Client connection → Connection handler: exchanges data
- Connection handler → Socket service: reads and writes
- Protocol runner → Connection handler: handles connection
- Server application → Protocol runner: starts protocol
- Server application → Plugin registry: lists plugins
- Protocol runner → Plugin registry: resolves plugin
- Protocol runner → Plugin API: dispatches analysis
- Connection handler → Screenshot model: supplies image
- Plugin API → Instructions: returns actions
- Plugin API → Screenshot model: analyzes image
- Nonogram plugin → Puzzle solver: solves puzzle
- Nonogram plugin → Plugin API: implements
- Poker evaluator → Plugin API: plugin capability
- Kingdom simulator → Plugin API: implements
- Monitor workflow → Android executor: executes actions
- Monitor workflow → Windows executor: executes actions
- Client connection → Instructions: receives actions
