# quickwit-oss/quickwit architecture

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

- Interactive diagram: https://gitdiagram.com/quickwit-oss/quickwit
- Repository: https://github.com/quickwit-oss/quickwit

## Overview

Quickwit is a cloud-storage-oriented search engine for logs and traces. Users send data through ingestion APIs or configured sources; indexing turns documents into searchable splits, which are published to storage and queried through REST-compatible search APIs. Control-plane services coordinate indexing and ingestion across nodes, while document mapping supplies schema and query interpretation. The README documents integrations and capabilities; sampled source excerpts are partial, so several cross-service links below are documented at product level rather than verified call chains.

Main entry points: [`quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs`](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs) (Indexing pipeline), [`quickwit/quickwit-control-plane/src/control_plane.rs`](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/control_plane.rs) (Control plane), [`quickwit/quickwit-serve/src`](https://github.com/quickwit-oss/quickwit/tree/main/quickwit/quickwit-serve/src) (REST API handlers), [`quickwit/quickwit-search/src/service.rs`](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-search/src/service.rs) (Search service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["APIs and search"]
  node_rest["REST API handlers"]
  node_search["Search service<br/>[service.rs]"]
  node_esparams["ES query parameters"]
  node_jaeger["Jaeger API"]
  node_otel["OTel API<br/>[rest_handler.rs]"]
end

subgraph group_ingest["Ingestion coordination"]
  node_ingestapi["Ingest API service"]
  node_ingestv2["Ingest router<br/>[router.rs]"]
  node_ingestctrl["Shard controller"]
end

subgraph group_index["Indexing and splits"]
  node_sourcefactory["Source factory<br/>[source_factory.rs]"]
  node_pipeline["Indexing pipeline"]
  node_docprocessor["Document processor<br/>[doc_processor.rs]"]
  node_indexer["Indexer<br/>[indexer.rs]"]
  node_indexservice["Indexing service"]
  node_merge["Merge pipeline<br/>[merge_pipeline.rs]"]
  node_mergeplanner["Merge planner<br/>[merge_planner.rs]"]
  node_publisher["Split publisher<br/>[publisher.rs]"]
end

subgraph group_data["Mapping and storage"]
  node_mapper["Document mapper<br/>[doc_mapper_impl.rs]"]
  node_fieldmapping["Field mapping"]
  node_querybuilder["Query builder<br/>[query_builder.rs]"]
  node_storage["Storage interface<br/>[storage.rs]"]
  node_s3["S3-compatible storage"]
end

subgraph group_ops["Distributed operations"]
  node_control["Control plane<br/>[control_plane.rs]"]
  node_metrics["Control-plane metrics<br/>[metrics.rs]"]
end

node_users(("Search and ingest clients"))

node_users -->|"sends requests"| node_rest
node_rest -.->|"serves searches"| node_search
node_rest -.->|"parses queries"| node_esparams
node_users -->|"submits documents"| node_ingestapi
node_users -->|"sends traces"| node_jaeger
node_users -->|"sends telemetry"| node_otel
node_ingestapi -.->|"routes ingest"| node_ingestv2
node_ingestctrl -->|"coordinates shards"| node_ingestv2
node_control -->|"coordinates ingestion"| node_ingestctrl
node_control -->|"coordinates indexing"| node_indexservice
node_sourcefactory -.->|"supplies sources"| node_pipeline
node_pipeline -->|"spawns actors"| node_docprocessor
node_pipeline -->|"spawns actors"| node_indexer
node_indexservice -->|"spawns pipelines"| node_pipeline
node_pipeline -->|"coordinates publishing"| node_publisher
node_indexservice -.->|"manages merges"| node_merge
node_merge -->|"runs merge planning"| node_mergeplanner
node_mapper -.->|"uses mappings"| node_fieldmapping
node_search -.->|"builds queries"| node_querybuilder
node_publisher -.->|"writes splits"| node_storage
node_search -->|"reads splits"| node_storage
node_s3 -->|"implements storage"| node_storage
node_control -->|"records metrics"| node_metrics

click node_rest "https://github.com/quickwit-oss/quickwit/tree/main/quickwit/quickwit-serve/src"
click node_search "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-search/src/service.rs"
click node_esparams "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-serve/src/elasticsearch_api/model/search_query_params.rs"
click node_jaeger "https://github.com/quickwit-oss/quickwit/tree/main/quickwit/quickwit-jaeger/src"
click node_otel "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-serve/src/otlp_api/rest_handler.rs"
click node_ingestapi "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-ingest/src/ingest_api_service.rs"
click node_ingestv2 "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-ingest/src/ingest_v2/router.rs"
click node_ingestctrl "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/ingest/ingest_controller.rs"
click node_control "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/control_plane.rs"
click node_sourcefactory "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/source/source_factory.rs"
click node_pipeline "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs"
click node_docprocessor "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/doc_processor.rs"
click node_indexer "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexer.rs"
click node_indexservice "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexing_service.rs"
click node_merge "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/merge_pipeline.rs"
click node_mergeplanner "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/merge_planner.rs"
click node_publisher "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/publisher.rs"
click node_mapper "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/doc_mapper/doc_mapper_impl.rs"
click node_fieldmapping "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/doc_mapper/field_mapping_entry.rs"
click node_querybuilder "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/query_builder.rs"
click node_storage "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-storage/src/storage.rs"
click node_s3 "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-storage/src/object_storage/s3_compatible_storage.rs"
click node_metrics "https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/metrics.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_rest,node_search,node_esparams,node_jaeger,node_otel,node_users toneBlue
class node_ingestapi,node_ingestv2,node_ingestctrl toneAmber
class node_sourcefactory,node_pipeline,node_docprocessor,node_indexer,node_indexservice,node_merge,node_mergeplanner,node_publisher toneMint
class node_mapper,node_fieldmapping,node_querybuilder,node_storage,node_s3 toneRose
class node_control,node_metrics toneIndigo
```

## Components

### APIs and search

- [REST API handlers](https://github.com/quickwit-oss/quickwit/tree/main/quickwit/quickwit-serve/src): `quickwit/quickwit-serve/src`
- [Search service](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-search/src/service.rs): `quickwit/quickwit-search/src/service.rs`
- [ES query parameters](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-serve/src/elasticsearch_api/model/search_query_params.rs): `quickwit/quickwit-serve/src/elasticsearch_api/model/search_query_params.rs`
- [Jaeger API](https://github.com/quickwit-oss/quickwit/tree/main/quickwit/quickwit-jaeger/src): `quickwit/quickwit-jaeger/src`
- [OTel API](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-serve/src/otlp_api/rest_handler.rs): `quickwit/quickwit-serve/src/otlp_api/rest_handler.rs`

### Ingestion coordination

- [Ingest API service](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-ingest/src/ingest_api_service.rs): `quickwit/quickwit-ingest/src/ingest_api_service.rs`
- [Ingest router](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-ingest/src/ingest_v2/router.rs): `quickwit/quickwit-ingest/src/ingest_v2/router.rs`
- [Shard controller](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/ingest/ingest_controller.rs): `quickwit/quickwit-control-plane/src/ingest/ingest_controller.rs`

### Indexing and splits

- [Source factory](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/source/source_factory.rs): `quickwit/quickwit-indexing/src/source/source_factory.rs`
- [Indexing pipeline](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs): `quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs`
- [Document processor](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/doc_processor.rs): `quickwit/quickwit-indexing/src/actors/doc_processor.rs`
- [Indexer](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexer.rs): `quickwit/quickwit-indexing/src/actors/indexer.rs`
- [Indexing service](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/indexing_service.rs): `quickwit/quickwit-indexing/src/actors/indexing_service.rs`
- [Merge pipeline](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/merge_pipeline.rs): `quickwit/quickwit-indexing/src/actors/merge_pipeline.rs`
- [Merge planner](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/merge_planner.rs): `quickwit/quickwit-indexing/src/actors/merge_planner.rs`
- [Split publisher](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-indexing/src/actors/publisher.rs): `quickwit/quickwit-indexing/src/actors/publisher.rs`

### Mapping and storage

- [Document mapper](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/doc_mapper/doc_mapper_impl.rs): `quickwit/quickwit-doc-mapper/src/doc_mapper/doc_mapper_impl.rs`
- [Field mapping](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/doc_mapper/field_mapping_entry.rs): `quickwit/quickwit-doc-mapper/src/doc_mapper/field_mapping_entry.rs`
- [Query builder](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-doc-mapper/src/query_builder.rs): `quickwit/quickwit-doc-mapper/src/query_builder.rs`
- [Storage interface](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-storage/src/storage.rs): `quickwit/quickwit-storage/src/storage.rs`
- [S3-compatible storage](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-storage/src/object_storage/s3_compatible_storage.rs): `quickwit/quickwit-storage/src/object_storage/s3_compatible_storage.rs`

### Distributed operations

- [Control plane](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/control_plane.rs): `quickwit/quickwit-control-plane/src/control_plane.rs`
- [Control-plane metrics](https://github.com/quickwit-oss/quickwit/blob/main/quickwit/quickwit-control-plane/src/metrics.rs): `quickwit/quickwit-control-plane/src/metrics.rs`

### Other components

- **Search and ingest clients**

## Connections

- Search and ingest clients → REST API handlers: sends requests
- REST API handlers → Search service: serves searches
- REST API handlers → ES query parameters: parses queries (evidence: `quickwit/quickwit-serve/src/elasticsearch_api/model/search_query_params.rs`)
- Search and ingest clients → Ingest API service: submits documents
- Search and ingest clients → Jaeger API: sends traces
- Search and ingest clients → OTel API: sends telemetry
- Ingest API service → Ingest router: routes ingest
- Shard controller → Ingest router: coordinates shards (evidence: `quickwit/quickwit-control-plane/src/ingest/ingest_controller.rs`)
- Control plane → Shard controller: coordinates ingestion (evidence: `quickwit/quickwit-control-plane/src/control_plane.rs`)
- Control plane → Indexing service: coordinates indexing (evidence: `quickwit/quickwit-control-plane/src/control_plane.rs`)
- Source factory → Indexing pipeline: supplies sources
- Indexing pipeline → Document processor: spawns actors (evidence: `quickwit/quickwit-indexing/src/actors/mod.rs`)
- Indexing pipeline → Indexer: spawns actors (evidence: `quickwit/quickwit-indexing/src/actors/mod.rs`)
- Indexing service → Indexing pipeline: spawns pipelines (evidence: `quickwit/quickwit-indexing/src/actors/mod.rs`)
- Indexing pipeline → Split publisher: coordinates publishing (evidence: `quickwit/quickwit-indexing/src/actors/indexing_pipeline.rs`)
- Indexing service → Merge pipeline: manages merges
- Merge pipeline → Merge planner: runs merge planning (evidence: `quickwit/quickwit-indexing/src/actors/merge_pipeline.rs`)
- Document mapper → Field mapping: uses mappings
- Search service → Query builder: builds queries
- Split publisher → Storage interface: writes splits
- Search service → Storage interface: reads splits
- S3-compatible storage → Storage interface: implements storage (evidence: `quickwit/quickwit-storage/src/object_storage/s3_compatible_storage.rs`)
- Control plane → Control-plane metrics: records metrics (evidence: `quickwit/quickwit-control-plane/src/control_plane.rs`)
