# adamski201/iron-herblore architecture

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

- Interactive diagram: https://gitdiagram.com/adamski201/iron-herblore
- Repository: https://github.com/adamski201/iron-herblore

## Overview

Iron Herblore is a RuneLite plugin for ironmen that turns banked items into estimated Herblore XP, product quantities, and secondary-reagent balances. RuneLite item sources are adapted into quantities; recipe selections and settings determine production chains; calculators produce XP and reagent-demand results; the plugin UI presents editable rows, gear choices, and breakdowns. The graph preserves the README’s storage, precursor, gear, and configuration capabilities. Some implementation files were not sampled, so those subsystem links are omitted or marked unverified rather than inferred from names alone.

Main entry points: [`src/main/java/adamski/app/HerbloreApp.java`](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreApp.java) (Herblore App), [`src/main/java/adamski/infrastructure/RuneLiteAdapter.java`](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/RuneLiteAdapter.java) (RuneLite Adapter), [`src/main/java/adamski/HerblorePlugin.java`](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/HerblorePlugin.java) (Plugin Lifecycle), [`src/main/java/adamski/ui/HerblorePanel.java`](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/HerblorePanel.java) (Herblore Panel)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Plugin Runtime"]
  node_plugin["Plugin Lifecycle"]
  node_config["Plugin Config"]
  node_app["Herblore App<br/>[HerbloreApp.java]"]
  node_store["App Store<br/>[HerbloreStore.java]"]
  node_persistence["State Persistence"]
  node_result["App Result"]
end

subgraph group_inputs["Inputs &amp; Recipes"]
  node_adapter["RuneLite Adapter"]
  node_storage_adapter["Potion Storage"]
  node_item_sources["Item Sources<br/>[ItemSource.java]"]
  node_quantities["Item Quantities"]
  node_recipes["Recipe Catalog<br/>[Recipes.java]"]
  node_doses["Potion Doses<br/>[PotionDoses.java]"]
  node_precursors["Secondary Precursors"]
end

subgraph group_calculation["Domain Calculation"]
  node_recipe_graph["Recipe Graph<br/>[RecipeGraph.java]"]
  node_selection["Recipe Selection"]
  node_chain_resolver["Chain Resolver"]
  node_chain_calculator["XP Calculator"]
  node_chain_result["Chain Results<br/>[ChainResult.java]"]
  node_balance["Secondary Balance"]
  node_amulet["Amulet Calculator"]
end

subgraph group_presentation["UI &amp; State"]
  node_settings["Settings"]
  node_panel["Herblore Panel<br/>[HerblorePanel.java]"]
  node_row_factory["Row View Factory"]
  node_row_panel["Recipe Rows<br/>[RowPanel.java]"]
  node_amounts["Amount Formatting<br/>[Amounts.java]"]
end

node_player(("Ironman"))
node_runelite["RuneLite Sources"]

node_player -->|"uses"| node_panel
node_runelite -.->|"provides items"| node_adapter
node_plugin -->|"creates"| node_app
node_plugin -->|"configures"| node_adapter
node_plugin -->|"configures"| node_config
node_plugin -->|"configures"| node_persistence
node_plugin -->|"creates"| node_panel
node_adapter -->|"uses"| node_storage_adapter
node_adapter -->|"produces"| node_quantities
node_storage_adapter -->|"produces"| node_quantities
node_adapter -->|"uses"| node_doses
node_adapter -->|"uses"| node_precursors
node_app -->|"updates"| node_store
node_app -->|"reads"| node_settings
node_app -->|"uses"| node_recipe_graph
node_app -->|"reads"| node_selection
node_app -->|"resolves chains"| node_chain_resolver
node_app -->|"calculates XP"| node_chain_calculator
node_app -->|"calculates gear"| node_amulet
node_app -.->|"publishes"| node_result
node_recipe_graph -->|"indexes"| node_recipes
node_chain_calculator -->|"builds"| node_chain_result
node_chain_result -->|"supplies demand"| node_balance
node_panel -->|"sends choices"| node_app
node_panel -->|"builds views"| node_row_factory
node_row_factory -->|"renders"| node_chain_result
node_row_factory -->|"renders"| node_balance
node_panel -->|"displays"| node_row_panel
node_row_panel -->|"formats"| node_amounts
node_config -->|"loads settings"| node_settings
node_persistence -->|"saves state"| node_selection
node_recipes -.->|"defines recipes"| node_recipe_graph
node_player -.->|"owns inventory"| node_adapter

click node_plugin "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/HerblorePlugin.java"
click node_adapter "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/RuneLiteAdapter.java"
click node_storage_adapter "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/PotionStorageAdapter.java"
click node_item_sources "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/ItemSource.java"
click node_quantities "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/ItemQuantities.java"
click node_recipes "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/Recipes.java"
click node_doses "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/PotionDoses.java"
click node_precursors "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/SecondaryPrecursors.java"
click node_settings "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreSettings.java"
click node_config "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/HerbloreConfig.java"
click node_app "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreApp.java"
click node_store "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreStore.java"
click node_persistence "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/AppStatePersistence.java"
click node_recipe_graph "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeGraph.java"
click node_selection "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeSelection.java"
click node_chain_resolver "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeChainResolver.java"
click node_chain_calculator "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/ChainResultCalculator.java"
click node_chain_result "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/ChainResult.java"
click node_balance "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/balance/SecondaryBalanceCalculator.java"
click node_amulet "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/AlchemistAmuletCalculator.java"
click node_result "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreResult.java"
click node_panel "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/HerblorePanel.java"
click node_row_factory "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/RowViewFactory.java"
click node_row_panel "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/RowPanel.java"
click node_amounts "https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/Amounts.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_plugin,node_config,node_app,node_store,node_persistence,node_result toneBlue
class node_adapter,node_storage_adapter,node_item_sources,node_quantities,node_recipes,node_doses,node_precursors toneAmber
class node_recipe_graph,node_selection,node_chain_resolver,node_chain_calculator,node_chain_result,node_balance,node_amulet toneMint
class node_settings,node_panel,node_row_factory,node_row_panel,node_amounts toneRose
class node_player,node_runelite toneIndigo
```

## Components

### Plugin Runtime

- [Plugin Lifecycle](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/HerblorePlugin.java): `src/main/java/adamski/HerblorePlugin.java`
- [Plugin Config](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/HerbloreConfig.java): `src/main/java/adamski/infrastructure/HerbloreConfig.java`
- [Herblore App](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreApp.java): `src/main/java/adamski/app/HerbloreApp.java`
- [App Store](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreStore.java): `src/main/java/adamski/app/HerbloreStore.java`
- [State Persistence](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/AppStatePersistence.java): `src/main/java/adamski/infrastructure/AppStatePersistence.java`
- [App Result](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreResult.java): `src/main/java/adamski/app/HerbloreResult.java`

### Inputs & Recipes

- [RuneLite Adapter](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/RuneLiteAdapter.java): `src/main/java/adamski/infrastructure/RuneLiteAdapter.java`
- [Potion Storage](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/infrastructure/PotionStorageAdapter.java): `src/main/java/adamski/infrastructure/PotionStorageAdapter.java`
- [Item Sources](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/ItemSource.java): `src/main/java/adamski/domain/ItemSource.java`
- [Item Quantities](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/ItemQuantities.java): `src/main/java/adamski/domain/ItemQuantities.java`
- [Recipe Catalog](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/Recipes.java): `src/main/java/adamski/data/Recipes.java`
- [Potion Doses](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/PotionDoses.java): `src/main/java/adamski/data/PotionDoses.java`
- [Secondary Precursors](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/data/SecondaryPrecursors.java): `src/main/java/adamski/data/SecondaryPrecursors.java`

### Domain Calculation

- [Recipe Graph](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeGraph.java): `src/main/java/adamski/domain/route/RecipeGraph.java`
- [Recipe Selection](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeSelection.java): `src/main/java/adamski/domain/route/RecipeSelection.java`
- [Chain Resolver](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/route/RecipeChainResolver.java): `src/main/java/adamski/domain/route/RecipeChainResolver.java`
- [XP Calculator](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/ChainResultCalculator.java): `src/main/java/adamski/domain/result/ChainResultCalculator.java`
- [Chain Results](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/ChainResult.java): `src/main/java/adamski/domain/result/ChainResult.java`
- [Secondary Balance](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/balance/SecondaryBalanceCalculator.java): `src/main/java/adamski/domain/balance/SecondaryBalanceCalculator.java`
- [Amulet Calculator](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/domain/result/AlchemistAmuletCalculator.java): `src/main/java/adamski/domain/result/AlchemistAmuletCalculator.java`

### UI & State

- [Settings](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/app/HerbloreSettings.java): `src/main/java/adamski/app/HerbloreSettings.java`
- [Herblore Panel](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/HerblorePanel.java): `src/main/java/adamski/ui/HerblorePanel.java`
- [Row View Factory](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/RowViewFactory.java): `src/main/java/adamski/ui/RowViewFactory.java`
- [Recipe Rows](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/RowPanel.java): `src/main/java/adamski/ui/RowPanel.java`
- [Amount Formatting](https://github.com/adamski201/iron-herblore/blob/master/src/main/java/adamski/ui/Amounts.java): `src/main/java/adamski/ui/Amounts.java`

### Other components

- **Ironman**
- **RuneLite Sources**

## Connections

- Ironman → Herblore Panel: uses
- RuneLite Sources → RuneLite Adapter: provides items
- Plugin Lifecycle → Herblore App: creates (evidence: `src/main/java/adamski/HerblorePlugin.java`)
- Plugin Lifecycle → RuneLite Adapter: configures (evidence: `src/main/java/adamski/HerblorePlugin.java`)
- Plugin Lifecycle → Plugin Config: configures (evidence: `src/main/java/adamski/HerblorePlugin.java`)
- Plugin Lifecycle → State Persistence: configures (evidence: `src/main/java/adamski/HerblorePlugin.java`)
- Plugin Lifecycle → Herblore Panel: creates (evidence: `src/main/java/adamski/HerblorePlugin.java`)
- RuneLite Adapter → Potion Storage: uses (evidence: `src/main/java/adamski/infrastructure/RuneLiteAdapter.java`)
- RuneLite Adapter → Item Quantities: produces (evidence: `src/main/java/adamski/infrastructure/RuneLiteAdapter.java`)
- Potion Storage → Item Quantities: produces (evidence: `src/main/java/adamski/infrastructure/PotionStorageAdapter.java`)
- RuneLite Adapter → Potion Doses: uses (evidence: `src/main/java/adamski/infrastructure/RuneLiteAdapter.java`)
- RuneLite Adapter → Secondary Precursors: uses (evidence: `src/main/java/adamski/infrastructure/RuneLiteAdapter.java`)
- Herblore App → App Store: updates (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → Settings: reads (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → Recipe Graph: uses (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → Recipe Selection: reads (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → Chain Resolver: resolves chains (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → XP Calculator: calculates XP (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → Amulet Calculator: calculates gear (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Herblore App → App Result: publishes (evidence: `src/main/java/adamski/app/HerbloreApp.java`)
- Recipe Graph → Recipe Catalog: indexes (evidence: `src/main/java/adamski/domain/route/RecipeGraph.java`)
- XP Calculator → Chain Results: builds (evidence: `src/main/java/adamski/domain/result/ChainResultCalculator.java`)
- Chain Results → Secondary Balance: supplies demand (evidence: `src/main/java/adamski/domain/balance/SecondaryBalanceCalculator.java`)
- Herblore Panel → Herblore App: sends choices (evidence: `src/main/java/adamski/ui/HerblorePanel.java`)
- Herblore Panel → Row View Factory: builds views (evidence: `src/main/java/adamski/ui/HerblorePanel.java`)
- Row View Factory → Chain Results: renders (evidence: `src/main/java/adamski/ui/RowViewFactory.java`)
- Row View Factory → Secondary Balance: renders (evidence: `src/main/java/adamski/ui/RowViewFactory.java`)
- Herblore Panel → Recipe Rows: displays (evidence: `src/main/java/adamski/ui/HerblorePanel.java`)
- Recipe Rows → Amount Formatting: formats (evidence: `src/main/java/adamski/ui/RowPanel.java`)
- Plugin Config → Settings: loads settings
- State Persistence → Recipe Selection: saves state (evidence: `src/main/java/adamski/infrastructure/AppStatePersistence.java`)
- Recipe Catalog → Recipe Graph: defines recipes
- Ironman → RuneLite Adapter: owns inventory
