Skip to main content
Turbo is the recommended successor to Mirror. For a complete feature-by-feature comparison, see Mirror vs. Turbo pipelines. This page walks you through the practical steps to migrate an existing Mirror pipeline.
In most cases (around 95%) a Mirror pipeline can be mapped 1:1 onto a Turbo pipeline. The remaining cases involve features that Turbo does not currently support — see When you can’t migrate yet before you start.

Before you start

  • Install the latest CLI. The Turbo commands live under goldsky turbo — see the Turbo CLI reference and the installation guide.
  • Read Mirror vs. Turbo pipelines so you know which sources, transforms, and sinks change shape.
  • Export your existing Mirror pipeline definition with goldsky pipeline get <name> so you have the YAML to translate.

When you can’t migrate yet

Turbo doesn’t (yet) replace every Mirror feature. Stay on Mirror if your pipeline depends on: If none of those apply, you’re good to migrate.

Step 1: Translate the YAML

Turbo’s YAML is similar to Mirror’s but drops a few fields and renames others.

Top-level changes

MirrorTurbo
apiVersion: 3 (required)Remove — Turbo doesn’t use apiVersion
resources: { size: s | m | l | xl | xxl }resource_size: xs | s | m | l | xl | xxl (top-level field, adds xs)
name, descriptionSame
See the full Turbo schema in Pipeline configuration.

Sources

Both products use type: dataset, but Turbo adds start_block / end_block for block ranges and uses start_at: latest | earliest for the starting position. Source-level Fast Scan filters on Mirror don’t carry over — in Turbo, filter inside a SQL transform instead. See:

Transforms

Sinks

Most sink types have direct equivalents. Watch out for these specific renames and reshapes:
  • PostgreSQL secrets — Mirror uses a JSON-object secret (type, host, port, …). Turbo uses a Postgres connection string (postgres://user:pass@host:port/db). Recreate the secret with goldsky secret create. See Turbo Postgres sink and Mirror secrets.
  • SQS — Mirror uses type: sqs; Turbo uses type: sqs_sink and lets you pass access_key_id / secret_access_key inline. See Turbo SQS sink.
  • S3 — In Mirror this goes through the object storage sink; Turbo has a native s3_sink.
  • Kafka — Turbo’s Kafka sink adds data_format, topic_partitions, schema_registry_url, and message_max_bytes.
  • Webhooks — Turbo’s webhook sink supports one_row_per_request, payload_version, and a primary_key, but does not support secret_name yet.
For the full matrix and per-sink tuning options see Mirror vs. Turbo § Sinks and § Sink tuning parameters.

Step 2: Validate the Turbo definition

Once you have a translated YAML file:
goldsky turbo validate path/to/pipeline.yaml
Then use live inspect to see the data flowing through each step before you point it at production sinks:
goldsky turbo inspect path/to/pipeline.yaml
A quick sanity check is to swap the real sink for the blackhole sink during inspection.

Step 3: Choose a cutover strategy

Mirror’s processed-data state does not carry over to Turbo, so plan for one of the two strategies below depending on how much double-write or downtime you can tolerate. Best when your sink can tolerate duplicate writes (e.g. Postgres with primary keys, ClickHouse with ReplacingMergeTree, or any idempotent webhook).
  1. Deploy the Turbo pipeline with start_at: latest in every dataset source so it begins at the chain tip.
  2. Leave the Mirror pipeline running.
  3. Once the Turbo pipeline is healthy and you see writes landing in your sink, pause the Mirror pipeline with goldsky pipeline pause <name>.
  4. After a buffer period to confirm Turbo is stable, delete the Mirror pipeline.
You may see a small window of duplicate inserts during the overlap; upserts or unique constraints will absorb them.

Option B — Block-number cutover

Best when your sink cannot dedupe and you want a clean handoff.
  1. Pick a future block X for the cutover.
  2. Edit the Mirror pipeline so it stops at block X (filter in your SQL transform or set an end_block on the source).
  3. Deploy the Turbo pipeline configured to start at block X+1 (use start_block on the source — see EVM sources).
  4. Once Mirror reaches block X and Turbo picks up at X+1, pause and remove the Mirror pipeline.

Option C — Cold cutover (downtime accepted)

If a short gap in your sink is fine, pause Mirror, deploy Turbo with start_at: latest, and accept the brief gap. Simplest, but you lose the blocks in between.

Step 4: Decommission Mirror

After the Turbo pipeline has been running cleanly for your chosen verification window:
goldsky pipeline delete <mirror-pipeline-name>
Mirror secrets can stay in place if they’re shared, or be removed via goldsky secret delete.

Common gotchas

  • Solana, Bitcoin, Stellar, and NEAR sources were removed from Mirror — they’re Turbo-only now. See Solana, Bitcoin, Stellar, and NEAR.
  • CLI namespace — every command moves from goldsky pipeline ... to goldsky turbo .... Update scripts and CI accordingly.
  • Resource sizes — Turbo adds an xs tier. If your Mirror pipeline was on s purely to control cost, xs may be enough.
  • Job mode — if your migration is actually a one-time backfill, consider Turbo job mode instead of a streaming pipeline.

Get help

If you hit anything that doesn’t translate cleanly, reach out to support or your Goldsky contact — we’re actively closing the remaining gaps and happy to help with the rewrite. For background on what differs between the two products, see Mirror vs. Turbo pipelines and the Turbo FAQ.