> ## Documentation Index
> Fetch the complete documentation index at: https://docs.goldsky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mirror vs. Turbo pipelines

> A detailed comparison of configuration, sources, transforms, sinks, and secrets between Mirror and Turbo pipelines.

Both [Mirror](/mirror/introduction) and [Turbo](/turbo-pipelines/introduction) stream onchain data to your infrastructure, but they differ in configuration, supported features, and operational behavior. Use this page to understand the differences when choosing between them or migrating from one to the other.

## Top-level configuration

| Feature            | Mirror                     | Turbo                                                               |
| ------------------ | -------------------------- | ------------------------------------------------------------------- |
| `apiVersion` field | Required (`apiVersion: 3`) | Not used                                                            |
| Resource sizes     | `s`, `m`, `l`, `xl`, `xxl` | `xs`, `s`, `m`, `l`, `xl`, `xxl`                                    |
| Job mode           | Not supported              | [`job: true`](/turbo-pipelines/job-mode) for one-time batch runs    |
| CLI namespace      | `goldsky pipeline <cmd>`   | `goldsky turbo <cmd>`                                               |
| Live inspect       | Not supported              | [`goldsky turbo inspect`](/turbo-pipelines/live-inspect)            |
| Delivery semantics | At-least-once              | [At-least-once with checkpointing](/turbo-pipelines/sinks/overview) |
| Startup time       | Slower                     | Under 5 seconds                                                     |

## Sources

| Source type                  | Mirror                                                          | Turbo                                         | Notes                                                       |
| ---------------------------- | --------------------------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- |
| Dataset (direct indexing)    | Supported                                                       | Supported                                     | Both support [curated datasets](/chains/supported-networks) |
| Subgraph entity              | [Supported](/mirror/sources/subgraphs)                          | Not supported                                 | Mirror-only source type                                     |
| EVM chains                   | [130+ chains](/mirror/sources/direct-indexing#supported-chains) | [Supported](/turbo-pipelines/sources/evm)     |                                                             |
| Solana                       | Not supported                                                   | [Supported](/turbo-pipelines/sources/solana)  | Full historical data from genesis                           |
| Bitcoin                      | Not supported                                                   | [Supported](/turbo-pipelines/sources/bitcoin) |                                                             |
| Stellar                      | Not supported                                                   | [Supported](/turbo-pipelines/sources/stellar) |                                                             |
| NEAR                         | Not supported                                                   | [Supported](/turbo-pipelines/sources/near)    |                                                             |
| `start_block` / `end_block`  | Not supported                                                   | Supported                                     | Block range filtering                                       |
| `start_at` (latest/earliest) | Supported on dataset sources                                    | Supported                                     | Starting position control                                   |
| `in_order` mode              | Not supported                                                   | Supported (Solana only)                       | Ensures blocks are emitted in sequential slot order         |

## Transforms

| Transform type                 | Mirror                                            | Turbo                                                   | Notes                                                                                       |
| ------------------------------ | ------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| SQL                            | [Full SQL](/mirror/transforms/sql-transforms)     | [Limited SQL](/turbo-pipelines/transforms/sql)          | Turbo uses Apache DataFusion; no joins, aggregations, or window functions in streaming mode |
| WebAssembly / TypeScript       | Not supported                                     | [Supported](/turbo-pipelines/transforms/typescript)     | Custom logic compiled to WASM                                                               |
| External HTTP handler          | [Supported](/mirror/transforms/external-handlers) | [Supported](/turbo-pipelines/transforms/http-handler)   |                                                                                             |
| Dynamic tables                 | Not supported                                     | [Supported](/turbo-pipelines/transforms/dynamic-tables) | Real-time updatable lookup tables                                                           |
| Handler `schema_override`      | Supported                                         | Supported                                               | Add, change, or drop columns                                                                |
| Handler `payload_columns`      | Supported                                         | Not supported                                           | Bandwidth optimization for Mirror handlers                                                  |
| Handler `batch_size`           | Supported (default 100)                           | Supported                                               |                                                                                             |
| Handler `batch_flush_interval` | Supported (default 1s)                            | Supported                                               |                                                                                             |
| Handler `one_row_per_request`  | Supported                                         | Supported                                               | When `true`, sends one HTTP request per row instead of batched arrays                       |
| Handler `payload_version`      | Supported                                         | Supported                                               | `0` (flat JSON, default) or `1` (envelope with `metadata.op` + `data`)                      |
| Handler `secret_name`          | Supported                                         | Supported                                               | Reference a stored secret instead of inline `headers`                                       |
| `_gs_op` column tracking       | Not documented                                    | Supported                                               | Tracks insert/update/delete operations                                                      |

## Sinks

| Sink type              | Mirror                                           | Turbo                                                      | Notes                                                               |
| ---------------------- | ------------------------------------------------ | ---------------------------------------------------------- | ------------------------------------------------------------------- |
| PostgreSQL             | [Supported](/mirror/sinks/postgres)              | [Supported](/turbo-pipelines/sinks/postgres)               | Turbo adds `on_conflict`, `update_where`, and `parallelism` options |
| PostgreSQL aggregation | Not supported                                    | [Supported](/turbo-pipelines/sinks/postgres-aggregate)     | Trigger-based real-time aggregations                                |
| ClickHouse             | [Supported](/mirror/sinks/clickhouse)            | [Supported](/turbo-pipelines/sinks/clickhouse)             | See sink tuning section below                                       |
| MySQL                  | [Supported](/mirror/sinks/mysql)                 | [Supported](/turbo-pipelines/sinks/mysql)                  |                                                                     |
| Elasticsearch          | [Supported](/mirror/sinks/elasticsearch)         | Not supported                                              |                                                                     |
| Timescale              | [Supported](/mirror/sinks/timescale)             | Not supported                                              |                                                                     |
| Kafka                  | [Supported](/mirror/sinks/kafka)                 | [Supported](/turbo-pipelines/sinks/kafka)                  | Turbo adds `data_format`, `topic_partitions`, `message_max_bytes`   |
| Object storage / File  | [Supported](/mirror/sinks/object-storage)        | Not supported                                              |                                                                     |
| S3                     | Via object storage sink                          | [Native `s3_sink`](/turbo-pipelines/sinks/s3)              |                                                                     |
| SQS                    | [Supported](/mirror/sinks/aws-sqs) (`type: sqs`) | [Supported](/turbo-pipelines/sinks/sqs) (`type: sqs_sink`) | Different type names                                                |
| DynamoDB               | Supported                                        | Not supported                                              |                                                                     |
| Snowflake              | [Via S3](/mirror/sinks/snowflake)                | Not supported                                              | Not a native Mirror sink; load periodically from S3                 |
| Webhook                | [Supported](/mirror/sinks/webhook)               | [Supported](/turbo-pipelines/sinks/webhook)                | See webhook options and secrets sections below                      |
| Google Cloud Pub/Sub   | Not supported                                    | [Supported](/turbo-pipelines/sinks/pubsub)                 | Turbo-only                                                          |
| S2                     | Not supported                                    | [Supported](/turbo-pipelines/sinks/s2)                     |                                                                     |
| Blackhole              | Not supported                                    | [Supported](/turbo-pipelines/sinks/blackhole)              | Testing sink                                                        |

## Sink tuning parameters

Mirror and Turbo expose tuning parameters at different layers. Mirror applies buffering at the pipeline level, while Turbo configures batching and concurrency per sink.

### Batching and throughput

| Capability               | Mirror                                  | Turbo                                                                            |
| ------------------------ | --------------------------------------- | -------------------------------------------------------------------------------- |
| Batch size               | `sink_buffer_max_rows` (pipeline-level) | `batch_size` (per sink: PostgreSQL, ClickHouse, MySQL, Kafka, Webhook)           |
| Batch flush interval     | `sink_buffer_interval` (pipeline-level) | `batch_flush_interval` (per sink: PostgreSQL, ClickHouse, MySQL, Kafka, Webhook) |
| Parallelism              | Not configurable                        | `parallelism` (PostgreSQL, ClickHouse, Kafka)                                    |
| Kafka message size limit | Not configurable                        | `message_max_bytes`                                                              |

### PostgreSQL

| Parameter      | Mirror        | Turbo                         |
| -------------- | ------------- | ----------------------------- |
| `on_conflict`  | Not supported | Supported (default: `update`) |
| `update_where` | Not supported | Supported                     |

### ClickHouse

| Parameter           | Mirror                       | Turbo         |
| ------------------- | ---------------------------- | ------------- |
| `append_only_mode`  | Supported                    | Supported     |
| `schema_override`   | Supported (`schemaOverride`) | Supported     |
| `versionColumnName` | Supported                    | Not supported |

## Webhook and handler options

Both webhooks (sinks) and external HTTP handlers (transforms) share several configuration options:

| Option                | Mirror                             | Turbo     | Notes                                                                                        |
| --------------------- | ---------------------------------- | --------- | -------------------------------------------------------------------------------------------- |
| `one_row_per_request` | Supported                          | Supported | When `false` (default), rows are sent as a JSON array. When `true`, one HTTP request per row |
| `payload_version`     | Supported                          | Supported | `0` (default, flat JSON) or `1` (envelope format with `metadata.op` + `data`)                |
| `primary_key`         | Not supported                      | Supported | Turbo webhook sinks only                                                                     |
| `secret_name`         | [Supported](/mirror/sinks/webhook) | Supported | Reference a stored secret instead of inline `headers`                                        |

## Secrets and authentication

| Feature               | Mirror                                                               | Turbo                                                                        | Notes                             |
| --------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------- |
| Database sink secrets | `secret_name` with JSON object format (`type`, `host`, `port`, etc.) | `secret_name` with connection string format (`postgres://user:pass@host/db`) | Different formats                 |
| Webhook secrets       | [`secret_name`](/mirror/sinks/webhook) with `httpauth` type          | `secret_name` or inline `headers`                                            | See webhook options section above |
| SQS secrets           | `secret_name` only                                                   | `secret_name` or direct `access_key_id`/`secret_access_key` inline           | Turbo allows inline credentials   |
| S3 secrets            | N/A                                                                  | `secret_name` or direct credentials                                          |                                   |

For more details on managing secrets, see [Mirror secrets](/mirror/manage-secrets).

## Choosing between Mirror and Turbo

Use **Mirror** when you need:

* [Subgraph entity sources](/mirror/sources/subgraphs)
* Elasticsearch, Timescale, or DynamoDB sinks
* Sink buffer tuning parameters

Use **Turbo** when you need:

* Non-EVM chains (Solana, Bitcoin, Stellar, NEAR)
* [TypeScript/WASM transforms](/turbo-pipelines/transforms/typescript)
* [Dynamic tables](/turbo-pipelines/transforms/dynamic-tables)
* [Live pipeline inspection](/turbo-pipelines/live-inspect)
* [Job mode](/turbo-pipelines/job-mode) for batch processing
* [PostgreSQL aggregations](/turbo-pipelines/sinks/postgres-aggregate)
* Block range filtering (`start_block` / `end_block`)
