# elastichq/elasticsearch-hq architecture

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

- Interactive diagram: https://gitdiagram.com/elastichq/elasticsearch-hq
- Repository: https://github.com/elastichq/elasticsearch-hq

## Overview

1. ElasticHQ is a two-tier application: a Python backend serves the API and HTML shell, and a JavaScript single-page UI provides the operator console. The system’s purpose is to monitor and administer one or more Elasticsearch clusters.

2. The primary external dependency is Elasticsearch itself. The backend talks to remote clusters for cluster state, node stats, indices, snapshots, queries, and diagnostics; the UI never talks directly to Elasticsearch and instead uses ElasticHQ’s HTTP API.

3. The backend entrypoints are `application.py` and `manage.py`, with production process configs in `deployment/` for Gunicorn, logging, and Supervisor. This suggests a Flask-style web server packaging that can run standalone, behind a process manager, or inside Docker/OpenShift.

4. Backend routing is organized under `elastichq/api/`. These modules split the HTTP surface by domain: clusters, nodes, indices, snapshots, diagnostics, query, status, REST passthrough, and a socket endpoint. `endpoints.py` and `hq.py` look like shared routing/landing-page concerns.

5. The backend service layer in `elastichq/service/` is the core orchestration boundary. It contains per-domain services such as `ClusterService`, `NodeService`, `IndicesService`, `SnapshotService`, `QueryService`, `DiagnosticsService`, `HQService`, plus `ConnectionService` for Elasticsearch connectivity. This layer likely transforms ES responses into UI-friendly payloads and centralizes business rules.

6. Persistence is separate from live cluster access. `elastichq/service/persistence/ClusterDBService.py` and the `migrations/` directory indicate a small local database for saved cluster definitions/settings, with Alembic-managed schema changes. Live cluster metrics remain ephemeral and are fetched from Elasticsearch on demand.

7. Background or asynchronous work is modeled explicitly in `elastichq/common/JobPool.py`, `TaskPool.py`, and `model/Task.py`. That implies some operations are queued or tracked over time, likely for longer-running actions such as diagnostics, indexing operations, or cluster tasks that the UI polls through the API.

8. The frontend lives under `ui/` and is built separately from the Python backend. It is a component/container-based AngularJS-era app with services, filters, factories, and many feature modules. Webpack configs at the repo root bundle assets into `elastichq/static/`, which the backend serves.

9. UI architecture is feature-oriented around clusters and Elasticsearch objects. Containers and components cover cluster overview, nodes, indices, aliases, snapshots, diagnostics, query, REST API browsing, and settings. The UI uses dedicated services such as `cluster-connection`, `cluster-indices`, `cluster-nodes`, and `hq` to call the backend API.

10. Real-time and dashboard-style views are a major presentation boundary. Components such as line graphs, summary cards, node tables, and index metric panels consume backend data and render operational status for cluster health, docs, search load, JVM, filesystem, process, and shard state.

11. The `templates/` and `static/` directories on the Python side show that the backend also serves the SPA shell and compiled assets. `elastichq/templates/index.html` is the host page, while bundled CSS/JS in `elastichq/static/` are the deployable frontend artifacts.

12. Testing is split along the same architectural lines. `tests/es_versions/` exercises Elasticsearch-version-specific backend behavior, `tests/combined/` covers integrated flows, and the various Docker Compose files under `tests/` spin up versioned Elasticsearch environments. This is important because compatibility across ES 2.x through 7.x is a first-class architectural constraint.

13. Deployment is container-friendly and environment-driven. The repository includes a root `Dockerfile`, example Compose setups, and OpenShift manifests/proxy config, which implies the app is commonly deployed as a single web container that connects outward to user-provided Elasticsearch clusters rather than co-locating with Elasticsearch.

14. Documentation is generated with Sphinx and versioned under `docs/`, but it is not part of runtime behavior. The doc tree mirrors the backend module structure, which reinforces the separation between API layer, service layer, model layer, and frontend UI.

15. In diagram form, the key flow is: browser UI → ElasticHQ HTTP endpoints → service layer → Elasticsearch clusters, with a side path to local persistence for saved cluster metadata and a separate path for task/background bookkeeping. The backend is the central control plane; Elasticsearch is the data source and execution target.

Main entry points: [`elastichq/service`](https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/service) (Service layer), [`elastichq/api`](https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/api) (API layer), [`ui/src/containers`](https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/containers) (Feature views), [`ui/src/services`](https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/services) (UI services)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_backend["Python backend"]
  node_application_py["application.py<br/>backend entrypoint<br/>[application.py]"]
  node_manage_py["manage.py<br/>cli entrypoint<br/>[manage.py]"]
  node_api_layer["API layer<br/>http routes"]
  node_api_clusters["Clusters API<br/>cluster endpoints<br/>[clusters.py]"]
  node_api_nodes["Nodes API<br/>node endpoints<br/>[nodes.py]"]
  node_api_indices["Indices API<br/>index endpoints<br/>[indices.py]"]
  node_api_snapshots["Snapshots API<br/>snapshot endpoints<br/>[snapshot.py]"]
  node_api_query["Query API<br/>query endpoints<br/>[query.py]"]
  node_api_diagnostics["Diagnostics API<br/>diagnostic endpoints<br/>[diagnostics.py]"]
  node_api_rest["REST passthrough<br/>proxy endpoints<br/>[rest.py]"]
  node_api_socket["Socket API<br/>realtime endpoint<br/>[socket.py]"]
  node_api_hq["HQ routes<br/>shell routes<br/>[hq.py]"]
  node_services["Service layer<br/>orchestration"]
  node_svc_connection["Connection<br/>es connectivity"]
  node_svc_cluster["Cluster service<br/>cluster orchestration<br/>[ClusterService.py]"]
  node_svc_nodes["Node service<br/>node orchestration<br/>[NodeService.py]"]
  node_svc_indices["Indices service<br/>index orchestration<br/>[IndicesService.py]"]
  node_svc_snapshots["Snapshot service<br/>snapshot orchestration<br/>[SnapshotService.py]"]
  node_svc_query["Query service<br/>query orchestration<br/>[QueryService.py]"]
  node_svc_diagnostics["Diagnostics service<br/>rules engine"]
  node_svc_hq["HQ service<br/>shared logic<br/>[HQService.py]"]
  node_persistence["Persistence<br/>local storage"]
  node_cluster_db[("Cluster DB<br/>database service")]
  node_task_model["Task model<br/>job record<br/>[Task.py]"]
  node_task_pools["Task pools<br/>async queue<br/>[TaskPool.py]"]
  node_job_pool["Job pool<br/>job queue<br/>[JobPool.py]"]
end

subgraph group_frontend["Web UI"]
  node_ui_shell["UI shell<br/>spa frontend"]
  node_ui_app["App module<br/>ui bootstrap<br/>[app.module.js]"]
  node_ui_services["UI services<br/>api clients"]
  node_ui_clusters_service["Cluster client<br/>ui api client"]
  node_ui_indices_service["Indices client<br/>ui api client"]
  node_ui_nodes_service["Nodes client<br/>ui api client"]
  node_ui_hq_service["HQ client<br/>ui api client<br/>[hq.service.js]"]
  node_ui_containers["Feature views<br/>route views"]
end

subgraph group_ops["Deploy & tests"]
end

node_application_py -->|"serves routes"| node_api_layer
node_application_py -->|"serves assets"| node_ui_shell
node_manage_py -.->|"drives config"| node_services
node_api_layer -->|"includes"| node_api_clusters
node_api_layer -->|"includes"| node_api_nodes
node_api_layer -->|"includes"| node_api_indices
node_api_layer -->|"includes"| node_api_snapshots
node_api_layer -->|"includes"| node_api_query
node_api_layer -->|"includes"| node_api_diagnostics
node_api_layer -->|"includes"| node_api_rest
node_api_layer -->|"includes"| node_api_socket
node_api_layer -->|"includes"| node_api_hq
node_api_clusters -->|"uses"| node_services
node_api_nodes -->|"uses"| node_services
node_api_indices -->|"uses"| node_services
node_api_snapshots -->|"uses"| node_services
node_api_query -->|"uses"| node_services
node_api_diagnostics -->|"uses"| node_services
node_api_rest -->|"proxied via"| node_svc_connection
node_services -->|"connects to"| node_svc_connection
node_services -->|"contains"| node_svc_cluster
node_services -->|"contains"| node_svc_nodes
node_services -->|"contains"| node_svc_indices
node_services -->|"contains"| node_svc_snapshots
node_services -->|"contains"| node_svc_query
node_services -->|"contains"| node_svc_diagnostics
node_services -->|"contains"| node_svc_hq
node_svc_cluster -->|"persists"| node_cluster_db
node_cluster_db -->|"part of"| node_persistence
node_svc_diagnostics -.->|"queues"| node_task_pools
node_task_pools -->|"coordinates"| node_job_pool
node_task_pools -->|"tracks"| node_task_model
node_ui_shell -->|"bootstraps"| node_ui_app
node_ui_shell -->|"contains"| node_ui_services
node_ui_shell -->|"contains"| node_ui_containers
node_ui_services -->|"includes"| node_ui_clusters_service
node_ui_services -->|"includes"| node_ui_indices_service
node_ui_services -->|"includes"| node_ui_nodes_service
node_ui_services -->|"includes"| node_ui_hq_service
node_ui_containers -->|"calls"| node_ui_clusters_service
node_ui_containers -->|"calls"| node_ui_indices_service
node_ui_containers -->|"calls"| node_ui_nodes_service
node_ui_containers -->|"calls"| node_ui_hq_service
node_ui_containers -->|"via HTTP"| node_api_layer
node_svc_connection -.->|"fetches state"| node_api_clusters

click node_application_py "https://github.com/elastichq/elasticsearch-hq/blob/master/application.py"
click node_manage_py "https://github.com/elastichq/elasticsearch-hq/blob/master/manage.py"
click node_api_layer "https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/api"
click node_api_clusters "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/clusters.py"
click node_api_nodes "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/nodes.py"
click node_api_indices "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/indices.py"
click node_api_snapshots "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/snapshot.py"
click node_api_query "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/query.py"
click node_api_diagnostics "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/diagnostics.py"
click node_api_rest "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/rest.py"
click node_api_socket "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/socket.py"
click node_api_hq "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/hq.py"
click node_services "https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/service"
click node_svc_connection "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/ConnectionService.py"
click node_svc_cluster "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/ClusterService.py"
click node_svc_nodes "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/NodeService.py"
click node_svc_indices "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/IndicesService.py"
click node_svc_snapshots "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/SnapshotService.py"
click node_svc_query "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/QueryService.py"
click node_svc_diagnostics "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/DiagnosticsService.py"
click node_svc_hq "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/HQService.py"
click node_persistence "https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/service/persistence"
click node_cluster_db "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/persistence/ClusterDBService.py"
click node_task_model "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/model/Task.py"
click node_task_pools "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/common/TaskPool.py"
click node_job_pool "https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/common/JobPool.py"
click node_ui_shell "https://github.com/elastichq/elasticsearch-hq/tree/master/ui"
click node_ui_app "https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/app.module.js"
click node_ui_services "https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/services"
click node_ui_clusters_service "https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-connection/cluster-connection.service.js"
click node_ui_indices_service "https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-indices/cluster-indices.service.js"
click node_ui_nodes_service "https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-nodes/cluster-nodes.service.js"
click node_ui_hq_service "https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/hq/hq.service.js"
click node_ui_containers "https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/containers"

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_application_py,node_manage_py,node_api_layer,node_api_clusters,node_api_nodes,node_api_indices,node_api_snapshots,node_api_query,node_api_diagnostics,node_api_rest,node_api_socket,node_api_hq,node_services,node_svc_connection,node_svc_cluster,node_svc_nodes,node_svc_indices,node_svc_snapshots,node_svc_query,node_svc_diagnostics,node_svc_hq,node_persistence,node_cluster_db,node_task_model,node_task_pools,node_job_pool toneBlue
class node_ui_shell,node_ui_app,node_ui_services,node_ui_clusters_service,node_ui_indices_service,node_ui_nodes_service,node_ui_hq_service,node_ui_containers toneAmber
```

## Components

### Python backend

Flask-style HTTP API, service orchestration, persistence, and process entrypoints.

- [application.py](https://github.com/elastichq/elasticsearch-hq/blob/master/application.py): backend entrypoint · WSGI/HTTP server entrypoint for the web app. · `application.py`
- [manage.py](https://github.com/elastichq/elasticsearch-hq/blob/master/manage.py): cli entrypoint · Administrative command entrypoint. · `manage.py`
- [API layer](https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/api): http routes · Domain HTTP endpoints and shared routing concerns. · `elastichq/api`
- [Clusters API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/clusters.py): cluster endpoints · Cluster-level HTTP operations and status. · `elastichq/api/clusters.py`
- [Nodes API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/nodes.py): node endpoints · Node statistics and node-facing operations. · `elastichq/api/nodes.py`
- [Indices API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/indices.py): index endpoints · Index administration and metrics endpoints. · `elastichq/api/indices.py`
- [Snapshots API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/snapshot.py): snapshot endpoints · Snapshot and repository operations. · `elastichq/api/snapshot.py`
- [Query API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/query.py): query endpoints · Search/query execution surface. · `elastichq/api/query.py`
- [Diagnostics API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/diagnostics.py): diagnostic endpoints · Cluster health checks and diagnostics surface. · `elastichq/api/diagnostics.py`
- [REST passthrough](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/rest.py): proxy endpoints · Generic Elasticsearch REST proxy surface. · `elastichq/api/rest.py`
- [Socket API](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/socket.py): realtime endpoint · Socket-based endpoint for live updates or tasks. · `elastichq/api/socket.py`
- [HQ routes](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/api/hq.py): shell routes · Landing-page and shared HQ routing concerns. · `elastichq/api/hq.py`
- [Service layer](https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/service): orchestration · Core business logic and Elasticsearch-facing orchestration. · `elastichq/service`
- [Connection](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/ConnectionService.py): es connectivity · Connection management to remote Elasticsearch clusters. · `elastichq/service/ConnectionService.py`
- [Cluster service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/ClusterService.py): cluster orchestration · Cluster state and cluster-level aggregation logic. · `elastichq/service/ClusterService.py`
- [Node service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/NodeService.py): node orchestration · Node stats and node detail assembly. · `elastichq/service/NodeService.py`
- [Indices service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/IndicesService.py): index orchestration · Index metadata, metrics, and admin operations. · `elastichq/service/IndicesService.py`
- [Snapshot service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/SnapshotService.py): snapshot orchestration · Snapshot and repository workflows. · `elastichq/service/SnapshotService.py`
- [Query service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/QueryService.py): query orchestration · Search execution and result shaping. · `elastichq/service/QueryService.py`
- [Diagnostics service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/DiagnosticsService.py): rules engine · Diagnostics execution and rule evaluation. · `elastichq/service/DiagnosticsService.py`
- [HQ service](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/HQService.py): shared logic · Shared application-level coordination for the shell and API. · `elastichq/service/HQService.py`
- [Persistence](https://github.com/elastichq/elasticsearch-hq/tree/master/elastichq/service/persistence): local storage · Small local database for saved cluster metadata and settings. · `elastichq/service/persistence`
- [Cluster DB](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/service/persistence/ClusterDBService.py): database service · Local cluster-definition persistence service. · `elastichq/service/persistence/ClusterDBService.py`
- [Task model](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/model/Task.py): job record · Tracked asynchronous task or job state. · `elastichq/model/Task.py`
- [Task pools](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/common/TaskPool.py): async queue · Job and task pooling for background or long-running work. · `elastichq/common/TaskPool.py`
- [Job pool](https://github.com/elastichq/elasticsearch-hq/blob/master/elastichq/common/JobPool.py): job queue · Queued task execution and polling support. · `elastichq/common/JobPool.py`

### Web UI

AngularJS-style single-page operator console and its bundle pipeline.

- [UI shell](https://github.com/elastichq/elasticsearch-hq/tree/master/ui): spa frontend · Standalone single-page operator console served as compiled assets. · `ui`
- [App module](https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/app.module.js): ui bootstrap · Frontend application bootstrap and module wiring. · `ui/src/app.module.js`
- [UI services](https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/services): api clients · Frontend services that call ElasticHQ HTTP endpoints. · `ui/src/services`
- [Cluster client](https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-connection/cluster-connection.service.js): ui api client · Cluster-related backend API client. · `ui/src/services/cluster-connection/cluster-connection.service.js`
- [Indices client](https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-indices/cluster-indices.service.js): ui api client · Index-related backend API client. · `ui/src/services/cluster-indices/cluster-indices.service.js`
- [Nodes client](https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/cluster-nodes/cluster-nodes.service.js): ui api client · Node-related backend API client. · `ui/src/services/cluster-nodes/cluster-nodes.service.js`
- [HQ client](https://github.com/elastichq/elasticsearch-hq/blob/master/ui/src/services/hq/hq.service.js): ui api client · Shared frontend API client for app-level operations. · `ui/src/services/hq/hq.service.js`
- [Feature views](https://github.com/elastichq/elasticsearch-hq/tree/master/ui/src/containers): route views · Page-level containers for cluster administration workflows. · `ui/src/containers`

## Connections

- application.py → API layer: serves routes · The backend entrypoint exposes the API surface.
- application.py → UI shell: serves assets · The backend serves the compiled SPA shell and static bundle.
- manage.py → Service layer: drives config · Administrative commands initialize and manage backend components.
- API layer → Clusters API: includes · Cluster HTTP surface is split into domain routes.
- API layer → Nodes API: includes · Node HTTP surface is split into domain routes.
- API layer → Indices API: includes · Index HTTP surface is split into domain routes.
- API layer → Snapshots API: includes · Snapshot HTTP surface is split into domain routes.
- API layer → Query API: includes · Query HTTP surface is split into domain routes.
- API layer → Diagnostics API: includes · Diagnostics HTTP surface is split into domain routes.
- API layer → REST passthrough: includes · Generic Elasticsearch passthrough routing.
- API layer → Socket API: includes · Realtime socket endpoint is part of the API layer.
- API layer → HQ routes: includes · Shared landing-page and HQ routing lives here.
- Clusters API → Service layer: uses · Cluster endpoints delegate to service orchestration.
- Nodes API → Service layer: uses · Node endpoints delegate to service orchestration.
- Indices API → Service layer: uses · Index endpoints delegate to service orchestration.
- Snapshots API → Service layer: uses · Snapshot endpoints delegate to service orchestration.
- Query API → Service layer: uses · Query endpoints delegate to service orchestration.
- Diagnostics API → Service layer: uses · Diagnostics endpoints delegate to service orchestration.
- REST passthrough → Connection: proxied via · REST passthrough goes through the Elasticsearch connection layer.
- Service layer → Connection: connects to · Shared connection handling underpins all cluster operations.
- Service layer → Cluster service: contains · Cluster orchestration is a primary service boundary.
- Service layer → Node service: contains · Node orchestration is a primary service boundary.
- Service layer → Indices service: contains · Index orchestration is a primary service boundary.
- Service layer → Snapshot service: contains · Snapshot orchestration is a primary service boundary.
- Service layer → Query service: contains · Query orchestration is a primary service boundary.
- Service layer → Diagnostics service: contains · Diagnostics orchestration is a primary service boundary.
- Service layer → HQ service: contains · Shared HQ coordination lives in the service layer.
- Cluster service → Cluster DB: persists · Cluster definitions and settings are stored locally.
- Cluster DB → Persistence: part of · Local persistence is grouped as a dedicated backend boundary.
- Diagnostics service → Task pools: queues · Long-running diagnostics or similar work can be queued.
- Task pools → Job pool: coordinates · Task and job pooling coordinate asynchronous execution.
- Task pools → Task model: tracks · Task records describe queued or running work.
- UI shell → App module: bootstraps · The frontend app module initializes the SPA.
- UI shell → UI services: contains · Frontend service layer groups HTTP clients.
- UI shell → Feature views: contains · Page-level views are organized as containers.
- UI services → Cluster client: includes · Cluster client is one of the core UI API services.
- UI services → Indices client: includes · Indices client is one of the core UI API services.
- UI services → Nodes client: includes · Nodes client is one of the core UI API services.
- UI services → HQ client: includes · Shared HQ client supports app-level UI flows.
- Feature views → Cluster client: calls · Feature views use dedicated backend API clients.
- Feature views → Indices client: calls · Feature views use dedicated backend API clients.
- Feature views → Nodes client: calls · Feature views use dedicated backend API clients.
- Feature views → HQ client: calls · Feature views use shared backend API clients.
- Feature views → API layer: via HTTP · The browser talks only to ElasticHQ API endpoints, not Elasticsearch directly.
- Connection → Clusters API: fetches state · Service layer retrieves cluster data from remote Elasticsearch clusters.
