
turbo-builder
Build and deploy new Goldsky Turbo pipelines: requirements, dataset selection, YAML, validation, and deployment. Use for 'build a pipeline', 'index X on Y chain', or moving chain/contract data into Postgres, MySQL, ClickHouse, Kafka, Pub/Sub, S3, SQS, or webhooks. Also use for data goals such as Polymarket fills/positions/PnL, prediction markets, stablecoin or circulating supply, proof of reserves, sanctions/AML transfer monitoring, deposit detection, CCTP burns/mints, cross-chain settlement, payment reconciliation, wallet history streamed into the user's own database, token holder registries, tokenized equities/RWA, and wash-trading detection. A REST lookup of one wallet's balances or transfers is /feeds, not a pipeline, and so is a read of Polymarket activity, positions or balances. Debug existing pipelines with /turbo-doctor; look up syntax with /turbo-pipelines.
- Installs
- 3.8K
- Last 24h
- +235
- Trending rank
- #1153
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/goldsky-io/goldsky-agent --skill turbo-builder- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads turbo-builder automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Pipeline Builder
Boundaries
- Build NEW pipelines. Do not diagnose broken pipelines — that belongs to
/turbo-doctor. - Do not serve as a YAML reference. If the user only needs to look up a field or syntax, use the
/turbo-pipelinesskill instead. - For dataset lookups, use
/datasets. - A REST lookup of one wallet's balances or transfers is
/feeds. Build a pipeline only when the rows need to land in the user's own database or webhook.
Walk the user through building a complete pipeline from scratch, step by step. Generate a valid YAML configuration, validate it, and deploy it.
Builder Workflow
Step 1: Verify Authentication
Run goldsky project list 2>&1 to check login status.
- If logged in: Note the current project and continue.
- If not logged in: Use the
/auth-setupskill for guidance.
Step 2: Understand the Goal
Ask the user what they want to index. Good questions:
- What blockchain/chain? (Ethereum, Base, Polygon, Solana, etc.)
- What data? (transfers, swaps, events from a specific contract, all transactions, etc.)
- Where should the data go? (PostgreSQL, ClickHouse, Kafka, S3, etc.)
- Do they need transforms? (filtering, aggregation, enrichment)
- One-time backfill or continuous streaming?
If the user already described their goal, extract answers from their description.
Step 3: Choose the Dataset
Use the /datasets skill to find the right dataset.
Key points:
- Common datasets:
<chain>.raw_logs,<chain>.raw_transactions,<chain>.erc20_transfers,<chain>.raw_traces - For decoded contract events on EVM chains: source from
<chain>.raw_logswith a filter onaddressONLY, then add a SQL transform that calls_gs_log_decode(_gs_fetch_abi(<explorer-url>, <source>), topics, data) AS decoded, then filter downstream byWHERE decoded.event_signature = '<EventName>(<types>)'. Never put topic0 hashes in the source filter — see/turbo-transformsfor the full pattern. There is no consumable<chain>.decoded_logsdataset; decoding always happens in a transform. - For pre-decoded common token events:
<chain>.erc20_transfers,<chain>.erc721_transfers,<chain>.erc1155_transfersare available and don't need decoding transforms. - For Solana: use
solana.transactions,solana.token_transfers, etc.
Present the dataset choice to the user for confirmation.
Step 4: Configure the Source
Build the source section of the YAML:
sources:
my_source:
type: dataset
dataset_name: <chain>.<dataset>
version: 1.0.0
start_at: latest # REQUIRED — see below. `latest` or `earliest` (Solana uses `start_block` instead)
A start position is required, not optional. Never emit a dataset source without an explicit start_at — that is the field on EVM, NEAR, Bitcoin, and Stellar. Omitting it does not mean "start now": the backend starts from the earliest available data, so the pipeline silently backfills the entire chain history. That is how a pipeline ends up running for days, writing millions of rows, and filling its sink before it ever reaches live data. Solana is the exception — it uses the numeric start_block, and omitting that starts at the latest slot, so state which you did rather than leaving the user to guess.
If the user has not stated a start position, ask before writing YAML — offer exactly three options:
- From now (
start_at: latest) — no backfill, live data only. - From a specific point in history —
start_at: earliestplus ablock_numberpredicate in the sourcefilter(pre-applied at the source, so the excluded range never reaches the sink). On Solana use the numericstart_blockinstead, and on Stellar a ledger sequence number is also accepted (start_at: 60000000). A block number is not a validstart_atvalue on the other chains: EVM, NEAR, and Bitcoin takeearliestorlatestand nothing else. - Full history (
start_at: earliest) — state plainly that this replays the entire chain history: days of backfill and millions of rows before live data arrives, and the sink must have room for all of it.
Also ask about:
- End block: Solana job-mode backfills only —
end_blockis silently ignored on EVM dataset sources, so bound an EVM range with ablock_numberpredicate infilter. Omit for streaming. - Source-level filter: Optional filter to reduce data at the source (e.g., specific contract address)
Step 5: Configure Transforms (if needed)
If the user needs transforms, use the /turbo-transforms skill to help:
- SQL transforms — filter, aggregate, join, or reshape data using DataFusion SQL
- TypeScript transforms — custom logic, external API calls, complex processing
- Dynamic tables — join with a PostgreSQL table or in-memory allowlist
Build the transforms section:
transforms:
my_transform:
type: sql
primary_key: id
sql: |
SELECT * FROM my_source
WHERE <conditions>
Step 6: Configure the Sink(s)
Ask where the data should go. Use the /turbo-pipelines skill for sink configuration:
| Sink | Key config |
|---|---|
| PostgreSQL | secret_name, schema, table, primary_key (optional, enables upsert) |
| MySQL | secret_name, schema, table, primary_key (optional, enables upsert) |
| ClickHouse | secret_name, table, primary_key (required, sets ordering and deduplication) |
| Kafka | secret_name, topic |
| Pub/Sub (Turbo-only) | secret_name, topic |
| SQS | secret_name, queue_url |
| S3 | bucket, region, prefix, format |
| Webhook | url, format |
If the user names more than one destination, generate ONE pipeline with multiple sinks — do not generate a separate pipeline per destination. Each sink has a from: field that references the source (or a transform) by name, and sinks run independently. Use a fan-out pattern when different sinks want different views of the same source — add an SQL transform per view, then point each sink's from: at the appropriate transform. See references/architecture-patterns.md in /turbo-pipelines and templates/multi-sink-pipeline.yaml for examples.
Only split into separate pipelines when sources are fundamentally different (e.g., different chains with independent lifecycles) or the user explicitly asks for separate pipelines.
For sinks requiring secret_name, check if the secret exists:
goldsky secret list
If it doesn't exist, help create it using the /secrets skill.
No Postgres database yet? On the Scale plan (or above), you can provision a Goldsky-hosted Postgres (Neon) database and have its credentials stored as a secret in one step:
goldsky hosted-sink create --type postgres
This prints the created secret's name, ID, and type (the connection string is never printed). Use the printed name as the sink secret_name. If the account lacks access, the command returns a Scale-plan upgrade message with the team's billing URL — fall back to bringing an external Postgres via the /secrets skill.
Size the sink against the backfill before recommending it. If the start position from Step 4 is earliest or the user described a multi-month or full-history range, say so explicitly before pointing them at a free-tier database — their own or a newly provisioned one. A 512 MB free tier cannot hold a multi-month backfill of a high-volume dataset, and the failure mode is silent: the pipeline validates, deploys, reports Running, and then errors could not extend file because project size limit (512 MB) has been exceeded with checkpoints timing out while writing nothing. Recommend a paid/sized database, or narrow the start position, before deploying. See the storage-exceeded row in /turbo-operations for the post-hoc diagnosis.
Step 7: Choose Mode
Use the /turbo-pipelines skill for guidance:
- Streaming (default) — continuous processing, no
end_block, runs indefinitely - Job mode — one-time backfill, set
job: trueplus a bound: ablock_numberupper bound in the sourcefilteron EVM (which also makes the source bounded),end_blockon Solana
Step 8: Generate, Validate, and Present
Assemble the complete pipeline YAML. Use a descriptive name following the convention: <chain>-<data>-<sink> (e.g., base-erc20-transfers-postgres).
- Write the YAML file to disk (e.g.,
<pipeline-name>.yaml). - Run validation BEFORE showing the YAML to the user:
goldsky turbo validate <pipeline-name>.yaml
-
If validation fails, fix the issues and re-validate. Do NOT present the YAML until validation passes. Common fixes:
- Missing
versionfield on dataset source - Invalid dataset name (check chain prefix)
- Missing
secret_namefor database sinks - SQL syntax errors in transforms
- Missing
-
Once validation passes, present the full YAML to the user for review.
Step 9: Deploy
After user confirms the YAML looks good:
goldsky turbo apply <pipeline-name>.yaml
Step 10: Verify
After deployment:
goldsky turbo list
Suggest running inspect to verify data flow:
goldsky turbo inspect <pipeline-name> -p
To filter to a specific node: goldsky turbo inspect <pipeline-name> -n <node-name> -p.
Present a summary:
## Pipeline Deployed
**Name:** [name]
**Chain:** [chain]
**Dataset:** [dataset]
**Sink:** [sink type]
**Mode:** [streaming/job]
**Next steps:**
- Verify data flow with `goldsky turbo inspect <name> -p`
- Check logs with `goldsky turbo logs <name>`
- Use /turbo-doctor if you run into issues
Important Rules
- Always validate before presenting complete YAML to the user. Never show unvalidated complete pipeline YAML.
- Always validate before deploying.
- Always show the user the complete YAML before deploying.
- For job-mode pipelines, remind the user they auto-cleanup ~1hr after completion.
- Use
blackholesink for testing pipelines without writing to a real destination. - If the user wants to modify an existing pipeline, check if it's streaming (update in place) or job-mode (must delete first).
- Never emit a dataset source without an explicit start position. Never default to
start_at: earliest— ask (from now / from a specific point in history / full history), and when the answer is full history, warn that it replays the entire chain history before live data and check the sink has room for it. - Never recommend a free-tier database (512 MB) as the sink for a multi-month or full-history backfill.
- Always include
version: 1.0.0on dataset sources.
Related
/turbo-pipelines— YAML configuration and architecture reference/turbo-doctor— Diagnose and fix pipeline issues/turbo-operations— Lifecycle commands and monitoring reference/turbo-transforms— SQL and TypeScript transform reference/datasets— Dataset names and chain prefixes/secrets— Sink credential management
FAQ
What does the turbo-builder skill do?
Build and deploy new Goldsky Turbo pipelines: requirements, dataset selection, YAML, validation, and deployment. Use for 'build a pipeline', 'index X on Y chain', or moving chain/contract data into Postgres, MySQL, ClickHouse, Kafka, Pub/Sub, S3, SQS, or webhooks. Also use for data goals such as Polymarket fills/positions/PnL, prediction markets, stablecoin or circulating supply, proof of reserves, sanctions/AML transfer monitoring, deposit detection, CCTP burns/mints, cross-chain settlement, payment reconciliation, wallet history streamed into the user's own database, token holder registries, tokenized equities/RWA, and wash-trading detection. A REST lookup of one wallet's balances or transfers is /feeds, not a pipeline, and so is a read of Polymarket activity, positions or balances. Debug existing pipelines with /turbo-doctor; look up syntax with /turbo-pipelines.
How do I install turbo-builder?
Run npx skills add https://github.com/goldsky-io/goldsky-agent --skill turbo-builder in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/turbo-builder/ (personal) or .claude/skills/turbo-builder/ (project).
Which AI agents can use turbo-builder?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is turbo-builder safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains turbo-builder?
It is published by goldsky-io in goldsky-io/goldsky-agent. It has 3,788 recorded installs.
More from goldsky-io/goldsky-agent
turbo-pipelines
goldsky-io/goldsky-agent
Turbo pipeline YAML reference and architecture guide. Covers: YAML field syntax (startat, from, version, primarykey), source/transform/sink configuration, validation errors, resource sizing (xs–xxl), architecture decisions (dataset vs kafka, streaming vs job, fan-out vs fan-in, sink selection, pipeline splitting). Triggers on: 'what does field X do', 'what fields does a postgres sink need', 'what resource size', 'should I use kafka or dataset', 'how to structure my pipeline'. For writing transforms, use /turbo-transforms. For end-to-end building, use /turbo-builder.
turbo-transforms
goldsky-io/goldsky-agent
Write SQL, TypeScript, and dynamic table transforms for Turbo pipelines. Covers: decoding EVM logs with gslogdecode, filtering/casting blockchain data, UNION ALL for combining events, TypeScript/WASM transforms (invoke function), dynamic lookup tables (dynamictablecheck), transform chaining, and Solana decoding. Triggers on: 'decode Transfer events', 'write a SQL transform', 'filter by contract', 'TypeScript transform', 'dynamic table', 'UNION ALL'. For pipeline YAML structure, use /turbo-pipelines. For end-to-end building, use /turbo-builder.
turbo-doctor
goldsky-io/goldsky-agent
Diagnose and fix broken Goldsky Turbo pipelines interactively. Triggers on: pipeline in error state, stuck starting, connection refused, not getting data, duplicate rows, missing fields, slow backfill, or any named pipeline misbehaving. Runs logs/status commands, identifies root cause, and offers fixes. For CLI syntax or error pattern lookup without an active problem, use /turbo-operations instead.
datasets
goldsky-io/goldsky-agent
Use this skill when the user needs to look up or verify Goldsky blockchain dataset names, chain prefixes, dataset types, or versions. Triggers on questions like 'what\'s the dataset name for X?', 'what prefix does Goldsky use for chain Y?', 'what version should I use for Z?', or 'what datasets are available for Solana/Stellar/Arbitrum/etc?'. Also use for chain-specific dataset questions (e.g., polygon vs matic prefix, stellarnet balance datasets, solana token transfer dataset names), and to answer 'is there a dataset for X?' where X is a domain rather than a chain — decoded logs, token transfers and balances, mint/burn events for circulating supply, DEX or prediction-market activity (Polymarket), or the raw blocks, transactions and traces behind wallet history and reconciliation. Do NOT trigger for questions about CLI commands, pipeline setup, or general Goldsky architecture unless the core question is about finding the right dataset name or chain prefix. Wallet Feeds API queries are /
auth-setup
goldsky-io/goldsky-agent
Set up Goldsky CLI authentication and project configuration. Use this skill when the user needs to: install the goldsky CLI (what's the official install command?), run goldsky login (including when the browser opens but 'authentication failed'), run goldsky project list and see 'not logged in' or 'unauthorized', switch between Goldsky projects, check which project they're currently authenticated to, or fix 'unauthorized' errors when running goldsky turbo commands. Also use for 'walk me through setting up goldsky CLI from scratch for the first time', and when they just installed Goldsky and say 'Set it up and help me get started'. If any other Goldsky skill hits an auth error, redirect here first.
turbo-operations
goldsky-io/goldsky-agent
Turbo pipeline operations reference — lifecycle commands (pause, resume, restart, delete), pipeline states, checkpoint behavior, streaming vs job-mode differences, CLI syntax for inspect/logs, TUI shortcuts, and error pattern lookup. Triggers on: 'how do I pause/restart/delete', 'will deleting lose my data', 'what does this error mean', 'inspect TUI shortcuts'. For interactive diagnosis of a broken pipeline, use /turbo-doctor.
Popular data & databases skills
supabase-postgres-best-practices
supabase/agent-skills
Postgres best practices maintained by Supabase, for Postgres running anywhere. Load this skill BEFORE writing or changing anything that lives in a Postgres database: creating or altering tables and columns (including choosing column types), schema design, migrations and declarative schema files, RLS policies and the tests that verify them, indexes, triggers, database functions, queues and scheduled jobs (pgcron, pgmq), vector/semantic search (pgvector), and restoring dumps (pgrestore) or importing data. Also load it when diagnosing slow queries, high CPU, timeouts, EXPLAIN plans, connection exhaustion, locking, bloat, or rows visible to the wrong user or tenant. This is not just a performance guide — schema, migration, security, and SQL authoring tasks need these rules too, even for a one-column change or a single query.
prisma-client-api
prisma/skills
Prisma Client API reference covering model queries, filters, operators, and client methods. Use when writing database queries, using CRUD operations, filtering data, or configuring Prisma Client. Triggers on "prisma query", "findMany", "create", "update", "delete", "$transaction".
prisma-database-setup
prisma/skills
Deprecated compatibility name for prisma-orm-setup. Use only when a user or existing integration explicitly invokes prisma-database-setup; otherwise select prisma-orm-setup.
prisma-cli
prisma/skills
Prisma ORM 7 CLI reference for existing Prisma 7 applications or explicitly selected Prisma 7 workflows. Covers prisma init, generate, migrate, db, dev, studio, and mcp. For setup, connection repair, or Prisma 8, use prisma-orm-setup; not the Prisma Platform CLI.
prisma-postgres
prisma/skills
Deprecated compatibility name for prisma-postgres-setup. Use only when a user or existing integration explicitly invokes prisma-postgres; otherwise select prisma-postgres-setup.
prisma-driver-adapter-implementation
prisma/skills
Required reference for Prisma ORM 7 SQL driver adapter work. Use when implementing or modifying adapters, adding database drivers, or touching SqlDriverAdapter, Transaction, savepoint, result mapping, or DriverAdapterError behavior. Covers current transaction lifecycle, optional savepoint hooks, original database-error preservation, and verification.