Skip to main content
Both Mirror and Turbo 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

FeatureMirrorTurbo
apiVersion fieldRequired (apiVersion: 3)Not used
Resource sizess, m, l, xl, xxlxs, s, m, l, xl, xxl
Job modeNot supportedjob: true for one-time batch runs
CLI namespacegoldsky pipeline <cmd>goldsky turbo <cmd>
Live inspectNot supportedgoldsky turbo inspect
Delivery semanticsAt-least-onceAt-least-once with checkpointing
Startup timeSlowerUnder 5 seconds

Sources

Source typeMirrorTurboNotes
Dataset (direct indexing)SupportedSupportedBoth support curated datasets
Subgraph entitySupportedNot supportedMirror-only source type
EVM chains130+ chainsSupported
SolanaNot supportedSupportedFull historical data from genesis
BitcoinNot supportedSupported
StellarNot supportedSupported
NEARNot supportedSupported
start_block / end_blockNot supportedSupportedBlock range filtering
start_at (latest/earliest)Supported on dataset sourcesSupportedStarting position control
in_order modeNot supportedSupported (Solana only)Ensures blocks are emitted in sequential slot order

Transforms

Transform typeMirrorTurboNotes
SQLFull SQLLimited SQLTurbo uses Apache DataFusion; no joins, aggregations, or window functions in streaming mode
WebAssembly / TypeScriptNot supportedSupportedCustom logic compiled to WASM
External HTTP handlerSupportedSupported
Dynamic tablesNot supportedSupportedReal-time updatable lookup tables
Handler schema_overrideSupportedSupportedAdd, change, or drop columns
Handler payload_columnsSupportedNot supportedBandwidth optimization for Mirror handlers
Handler batch_sizeSupported (default 100)Supported
Handler batch_flush_intervalSupported (default 1s)Supported
Handler one_row_per_requestSupportedSupportedWhen true, sends one HTTP request per row instead of batched arrays
Handler payload_versionSupportedSupported0 (flat JSON, default) or 1 (envelope with metadata.op + data)
Handler secret_nameSupportedSupportedReference a stored secret instead of inline headers
_gs_op column trackingNot documentedSupportedTracks insert/update/delete operations

Sinks

Sink typeMirrorTurboNotes
PostgreSQLSupportedSupportedTurbo adds on_conflict, update_where, and parallelism options
PostgreSQL aggregationNot supportedSupportedTrigger-based real-time aggregations
ClickHouseSupportedSupportedSee sink tuning section below
MySQLSupportedSupported
ElasticsearchSupportedNot supported
TimescaleSupportedNot supported
KafkaSupportedSupportedTurbo adds data_format, topic_partitions, message_max_bytes
Object storage / FileSupportedNot supported
S3Via object storage sinkNative s3_sink
SQSSupported (type: sqs)Supported (type: sqs_sink)Different type names
DynamoDBSupportedNot supported
SnowflakeVia S3Not supportedNot a native Mirror sink; load periodically from S3
WebhookSupportedSupportedSee webhook options and secrets sections below
Google Cloud Pub/SubNot supportedSupportedTurbo-only
S2Not supportedSupported
BlackholeNot supportedSupportedTesting 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

CapabilityMirrorTurbo
Batch sizesink_buffer_max_rows (pipeline-level)batch_size (per sink: PostgreSQL, ClickHouse, MySQL, Kafka, Webhook)
Batch flush intervalsink_buffer_interval (pipeline-level)batch_flush_interval (per sink: PostgreSQL, ClickHouse, MySQL, Kafka, Webhook)
ParallelismNot configurableparallelism (PostgreSQL, ClickHouse, Kafka)
Kafka message size limitNot configurablemessage_max_bytes

PostgreSQL

ParameterMirrorTurbo
on_conflictNot supportedSupported (default: update)
update_whereNot supportedSupported

ClickHouse

ParameterMirrorTurbo
append_only_modeSupportedSupported
schema_overrideSupported (schemaOverride)Supported
versionColumnNameSupportedNot supported

Webhook and handler options

Both webhooks (sinks) and external HTTP handlers (transforms) share several configuration options:
OptionMirrorTurboNotes
one_row_per_requestSupportedSupportedWhen false (default), rows are sent as a JSON array. When true, one HTTP request per row
payload_versionSupportedSupported0 (default, flat JSON) or 1 (envelope format with metadata.op + data)
primary_keyNot supportedSupportedTurbo webhook sinks only
secret_nameSupportedSupportedReference a stored secret instead of inline headers

Secrets and authentication

FeatureMirrorTurboNotes
Database sink secretssecret_name with JSON object format (type, host, port, etc.)secret_name with connection string format (postgres://user:pass@host/db)Different formats
Webhook secretssecret_name with httpauth typesecret_name or inline headersSee webhook options section above
SQS secretssecret_name onlysecret_name or direct access_key_id/secret_access_key inlineTurbo allows inline credentials
S3 secretsN/Asecret_name or direct credentials
For more details on managing secrets, see Mirror secrets.

Choosing between Mirror and Turbo

Use Mirror when you need: Use Turbo when you need: