Erd Studio Setup
liam-machine/erd-studio
Friendly, step-by-step setup for ERD Studio in an existing dbt project, for people who may be new to dbt or data modelling.
Helps choose an incremental strategy, design a reliable unique_key and debug failing dbt incremental models, and says when a plain table is the better choice.
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-models --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/dbt/developing-incremental-models .claude/skills/developing-incremental-models && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .claude/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-modelsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-models --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/dbt/developing-incremental-models .agents/skills/developing-incremental-models && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .agents/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-models --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/dbt/developing-incremental-models .cursor/skills/developing-incremental-models && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .cursor/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/AltimateAI/data-engineering-skills.git --path skills/dbt/developing-incremental-models--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-models --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/dbt/developing-incremental-models .gemini/skills/developing-incremental-models && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .gemini/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-modelsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/dbt/developing-incremental-models .github/skills/developing-incremental-models && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .github/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AltimateAI/data-engineering-skills developing-incremental-models --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AltimateAI/data-engineering-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/dbt/developing-incremental-models .opencode/skills/developing-incremental-models && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "developing-incremental-models" agent skill from https://github.com/AltimateAI/data-engineering-skills/tree/main/skills/dbt/developing-incremental-models into .opencode/skills/developing-incremental-models/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "developing-incremental-models", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
developing-incremental-modelsHelps choose an incremental strategy, design a reliable unique_key and debug failing dbt incremental models, and says when a plain table is the better choice.
The skill's default advice is to keep a model as a `table` unless there is a clear performance reason: under 10 million source rows a full refresh is simpler and fast enough, while larger sources, rows updated in place or append-only logs justify incremental. Before choosing, the agent checks the source size with `dbt show --inline` and answers four questions: is the data append-only, are rows updated, is there a trustworthy timestamp, and what identifies a row.
Strategy choices are `append`, `merge` (named as the safest default), `delete+insert` and `insert_overwrite` for partitioned warehouse tables, with a reminder that adapter support varies. Four rules apply: test with `--full-refresh` first, confirm the unique_key is truly unique in source and target, inspect it for duplicates if a merge keeps failing, and run a full refresh now and then to avoid drift. The description also mentions partition pruning, schema drift and late-arriving data; the excerpt stops after the unique key section.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 705c68b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dbtFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.getdbt.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
dbt Incremental Models loads about 2.3k tokens when it runs. Until then it costs about 133 tokens; SKILL.md has 618 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from AltimateAI/data-engineering-skills at commit 705c68b, republished under its MIT licence (© AltimateAI). 618 words, ~2,294 tokens.
.claude/skills/developing-incremental-models/SKILL.md (or your agent's skills folder).Choose the right strategy. Design the unique_key carefully. Handle edge cases.
| Scenario | Recommendation |
|---|---|
| Source data < 10M rows | Use table (simpler, full refresh is fast) |
| Source data > 10M rows | Consider incremental |
| Source data updated in place | Use incremental with merge strategy |
| Append-only source (logs, events) | Use incremental with append strategy |
| Partitioned warehouse data | Use insert_overwrite if supported |
Default to table unless you have a clear performance reason for incremental.
--full-refresh first before relying on incremental logic# Check source table size
dbt show --inline "select count(*) from {{ source('schema', 'table') }}"If count < 10 million, consider using table instead. Incremental adds complexity.
Before choosing a strategy, answer:
# Check for timestamp column
dbt show --inline "
select
min(updated_at) as earliest,
max(updated_at) as latest,
count(distinct date(updated_at)) as days_of_data
from {{ source('schema', 'table') }}
"| Strategy | Use When | How It Works |
|---|---|---|
append | Data is append-only, no updates | INSERT only, no deduplication |
merge | Data can be updated | MERGE/UPSERT by unique_key |
delete+insert | Data updated in batches | DELETE matching rows, then INSERT |
insert_overwrite | Partitioned tables (BigQuery, Spark) | Replace entire partitions |
Default: merge is safest for most use cases.
Note: Strategy availability varies by adapter. Check the dbt incremental strategy docs for your specific warehouse.
CRITICAL: unique_key must be truly unique in your data.
# Verify uniqueness BEFORE creating model
dbt show --inline "
select {{ unique_key_column }}, count(*)
from {{ source('schema', 'table') }}
group by 1
having count(*) > 1
limit 10
"If duplicates exist:
delete+insert instead of merge{{
config(
materialized='incremental',
incremental_strategy='merge', -- or append, delete+insert
unique_key='id', -- MUST be unique
on_schema_change='append_new_columns' -- handle new columns
)
}}
select
id,
column_a,
column_b,
updated_at
from {{ source('schema', 'table') }}
{% if is_incremental() %}
where updated_at > (select max(updated_at) from {{ this }})
{% endif %}ALWAYS verify with full refresh before trusting incremental logic.
# First run: full refresh to establish baseline
dbt build --select <model_name> --full-refresh
# Verify output
dbt show --select <model_name> --limit 10
dbt show --inline "select count(*) from {{ ref('model_name') }}"# Run incrementally (no --full-refresh)
dbt build --select <model_name>
# Verify row count changed appropriately
dbt show --inline "select count(*) from {{ ref('model_name') }}"Set on_schema_change based on your needs:
| Setting | Behavior |
|---|---|
ignore (default) | New columns in source are ignored |
append_new_columns | New columns added to target |
sync_all_columns | Target schema matches source exactly |
fail | Error if schema changes |
Symptom: "Cannot MERGE with duplicate values"
Cause: Multiple rows with same unique_key in source or target.
Fix:
-- Add deduplication using a CTE (cross-database compatible)
with deduplicated as (
select *,
row_number() over (partition by id order by updated_at desc) as rn
from {{ source('schema', 'table') }}
{% if is_incremental() %}
where updated_at > (select max(updated_at) from {{ this }})
{% endif %}
)
select * from deduplicated where rn = 1Symptom: Incremental runs take as long as full refresh.
Cause: Dynamic date filter prevents partition pruning.
Fix:
{% if is_incremental() %}
-- Use static date instead of subquery for partition pruning
where updated_at >= {{ dbt.dateadd('day', -3, dbt.current_timestamp()) }}
and updated_at > (select max(updated_at) from {{ this }})
{% endif %}Symptom: Some records never appear in incremental model.
Cause: Filtering by max(updated_at) misses late arrivals.
Fix: Use a lookback window with a fixed offset from current date:
{% if is_incremental() %}
-- Lookback 3 days to catch late-arriving data
where updated_at >= {{ dbt.dateadd('day', -3, dbt.current_timestamp()) }}
{% endif %}Alternatively, use a variable for the lookback period:
{% set lookback_days = 3 %}
{% if is_incremental() %}
where updated_at >= {{ dbt.dateadd('day', -lookback_days, dbt.current_timestamp()) }}
{% endif %}Symptom: "Column X not found" after source adds column.
Fix: Set on_schema_change='append_new_columns' in config.
Symptom: Counts diverge between incremental and full refresh.
Fix: Schedule periodic full refresh:
# Weekly full refresh
dbt build --select <model_name> --full-refresh{{ config(materialized='incremental', incremental_strategy='append') }}
select * from {{ source('events', 'raw') }}
{% if is_incremental() %}
where event_timestamp > (select max(event_timestamp) from {{ this }})
{% endif %}{{ config(
materialized='incremental',
incremental_strategy='merge',
unique_key='id'
) }}
select * from {{ source('crm', 'contacts') }}
{% if is_incremental() %}
where updated_at > (select max(updated_at) from {{ this }})
{% endif %}{{ config(
materialized='incremental',
incremental_strategy='delete+insert',
unique_key='id'
) }}
select * from {{ source('orders', 'raw') }}
{% if is_incremental() %}
where order_date >= {{ dbt.dateadd('day', -7, dbt.current_timestamp()) }}
{% endif %}{{ config(
materialized='incremental',
incremental_strategy='insert_overwrite',
partition_by={'field': 'event_date', 'data_type': 'date'}
) }}
select * from {{ source('events', 'raw') }}
{% if is_incremental() %}
where event_date >= {{ dbt.dateadd('day', -3, dbt.current_timestamp()) }}
{% endif %}--full-refresh© AltimateAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/dbt/developing-incremental-models of AltimateAI/data-engineering-skills.
Open the folder on GitHubat commit 705c68b
dbt Incremental Models next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| dbt Incremental Models this skillAltimateAI/data-engineering-skills | 127 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Erd Studio Setupliam-machine/erd-studio | 165 | — | ~8.5k | Automated safety check: Pass | Custom licence | |
| Analytics Engineerborghei/Claude-Skills | 874 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Airflow State Storeastronomer/agents | 450 | — | ~6.1k | Automated safety check: Pass | Apache-2.0 | |
| Modeling Revenue MetricsPostHog/posthog-foss | 721 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Migrating Dbt Project Across PlatformsKilo-Org/kilo-marketplace | 189 | — | ~3.9k | Automated safety check: Pass | Apache-2.0 |
liam-machine/erd-studio
Friendly, step-by-step setup for ERD Studio in an existing dbt project, for people who may be new to dbt or data modelling.
borghei/Claude-Skills
Analytics engineering across data modeling, dbt, transformation, and semantic layers.
astronomer/agents
Persists task and asset state across retries and DAG runs using Airflow 3.3's AIP-103 key/value stores (taskstatestore, assetstatestore) and the crash-safe ResumableJobMixin.
PostHog/posthog-foss
Build reusable revenue models — MRR, ARR, gross revenue, new/expansion/contraction/churn, ARPU, LTV, and per-customer/per-account revenue — on either PostHog data-warehouse views (HogQL) or an…
Kilo-Org/kilo-marketplace
A skill your agent uses when migrating a dbt project from one data platform or data warehouse to another (e.g., Snowflake to Databricks, Databricks to Snowflake) using dbt Fusion's real-time…
PostHog/posthog-foss
Build reusable activation models — an activation-rate metric and a per-user/per-account activated flag — on either PostHog data-warehouse views (HogQL) or an external dbt project.
AltimateAI/data-engineering-skills
Delegates dbt and warehouse tasks such as lineage, migrations and cost attribution to the altimate-code CLI agent and relays its answer back.
AltimateAI/data-engineering-skills
Creates or modifies dbt models in line with a project's own conventions, then runs dbt build and dbt show to check the output instead of stopping at compile.
AltimateAI/data-engineering-skills
Walks through fixing dbt compilation, database and test errors: read the full error, check upstream models, apply a fix, then verify with dbt build and a data preview.
AltimateAI/data-engineering-skills
Writes model and column descriptions in dbt schema.yml files, matching the project's existing documentation style and recording grain, business rules and caveats.
AltimateAI/data-engineering-skills
Ranks the costliest, slowest or heaviest-scanning Snowflake queries from query history and suggests how to optimize them.
AltimateAI/data-engineering-skills
Converts legacy SQL to modular dbt models. An agent skill from AltimateAI/data-engineering-skills.
Works with
Categories
Helps choose an incremental strategy, design a reliable unique_key and debug failing dbt incremental models, and says when a plain table is the better choice. The skill's default advice is to keep a model as a `table` unless there is a clear performance reason: under 10 million source rows a full refresh is simpler and fast enough, while larger sources, rows updated in place or append-only logs justify incremental. Before choosing, the agent checks the source size with `dbt show --inline` and answers four questions: is the data append-only, are rows updated, is there a trustworthy timestamp, and what identifies a row.
dbt Incremental Models fits situations like: creating a new incremental dbt model and picking its strategy and unique_key; debugging merge errors, partition pruning problems or schema drift in an incremental model; handling late-arriving data in an incremental load; deciding whether a large model should be a table or incremental.
Run `npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a claude-code`. Or copy the skill folder (skills/dbt/developing-incremental-models in AltimateAI/data-engineering-skills) into .claude/skills/developing-incremental-models in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a codex`. Or copy the skill folder (skills/dbt/developing-incremental-models in AltimateAI/data-engineering-skills) into .agents/skills/developing-incremental-models in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AltimateAI/data-engineering-skills --skill developing-incremental-models -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/developing-incremental-models, .gemini/skills/developing-incremental-models, .github/skills/developing-incremental-models and .opencode/skills/developing-incremental-models in your project.
Going by SKILL.md and its folder, dbt Incremental Models needs the command-line tools its instructions call (dbt). Our summary lists: A dbt project connected to a warehouse adapter.
SKILL.md names 1 domain. As links in the text: docs.getdbt.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
dbt Incremental Models is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with dbt Incremental Models: Erd Studio Setup (liam-machine/erd-studio, 165 stars), Analytics Engineer (borghei/Claude-Skills, 874 stars), Airflow State Store (astronomer/agents, 450 stars) and Modeling Revenue Metrics (PostHog/posthog-foss, 721 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AltimateAI (a GitHub organization) maintains it in AltimateAI/data-engineering-skills, which has 127 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 1, 2026.
Source: AltimateAI/data-engineering-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.