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 for one-time batch runs |
| CLI namespace | goldsky pipeline <cmd> | goldsky turbo <cmd> |
| Live inspect | Not supported | goldsky turbo inspect |
| Delivery semantics | At-least-once | At-least-once with checkpointing |
| Startup time | Slower | Under 5 seconds |
Sources
| Source type | Mirror | Turbo | Notes |
|---|---|---|---|
| Dataset (direct indexing) | Supported | Supported | Both support curated datasets |
| Subgraph entity | Supported | Not supported | Mirror-only source type |
| EVM chains | 130+ chains | Supported | |
| Solana | Not supported | Supported | Full historical data from genesis |
| Bitcoin | Not supported | Supported | |
| Stellar | Not supported | Supported | |
| NEAR | Not supported | Supported | |
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 | Limited SQL | Turbo uses Apache DataFusion; no joins, aggregations, or window functions in streaming mode |
| WebAssembly / TypeScript | Not supported | Supported | Custom logic compiled to WASM |
| External HTTP handler | Supported | Supported | |
| Dynamic tables | Not supported | Supported | 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 | Supported | Turbo adds on_conflict, update_where, and parallelism options |
| PostgreSQL aggregation | Not supported | Supported | Trigger-based real-time aggregations |
| ClickHouse | Supported | Supported | See sink tuning section below |
| MySQL | Supported | Supported | |
| Elasticsearch | Supported | Not supported | |
| Timescale | Supported | Not supported | |
| Kafka | Supported | Supported | Turbo adds data_format, topic_partitions, message_max_bytes |
| Object storage / File | Supported | Not supported | |
| S3 | Via object storage sink | Native s3_sink | |
| SQS | Supported (type: sqs) | Supported (type: sqs_sink) | Different type names |
| DynamoDB | Supported | Not supported | |
| Snowflake | Via S3 | Not supported | Not a native Mirror sink; load periodically from S3 |
| Webhook | Supported | Supported | See webhook options and secrets sections below |
| Google Cloud Pub/Sub | Not supported | Supported | Turbo-only |
| S2 | Not supported | Supported | |
| Blackhole | Not supported | Supported | 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 | 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 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 |
Choosing between Mirror and Turbo
Use Mirror when you need:- Subgraph entity sources
- Elasticsearch, Timescale, or DynamoDB sinks
- Sink buffer tuning parameters
- Non-EVM chains (Solana, Bitcoin, Stellar, NEAR)
- TypeScript/WASM transforms
- Dynamic tables
- Live pipeline inspection
- Job mode for batch processing
- PostgreSQL aggregations
- Block range filtering (
start_block/end_block)