421 Macros You Never Wrote
when does that program run, and what does it know at the time?
Every dbt build header since Chapter 2 has printed the same odd trailing number — 421 macros — first printed against your own project in Chapter 2 as Found 3 models, 4 data tests, 0 sources, 421 macros, unchanged ever since even as the model count climbed. Three models, and 421 macros? You never opened a macros/ folder.
Predict how many of the 421 you actually wrote, then sweep the project tree and watch which files render through Jinja at all — including two you’d never guess.
Found 3 models, 4 data tests, 0 sources, 421 macrosJinja is the layer between the file you write and the SQL dbt sends to the warehouse — a program that runs once per render and produces text. Everything else in this chapter is really one question: when does that program run, and what does it know at the time?
Every YAML file in this project has quietly run through the same templating engine as a .sql model since Chapter 2 — config precedence, source declarations, even dbt_project.yml itself. Not knowing that means not knowing why target.name works inside a YAML file, or why {{ config() }} vanishes from compiled SQL. This chapter is where all of it gets named.
- Jinja
- The templating language dbt renders every .sql and most .yml files through — not Python, a fixed context of names dbt hands the renderer.
- Macro
- A named, reusable block of Jinja — dbt’s equivalent of a function — defined with {% macro %} and called with {{ }}.
- Global project
- dbt-core’s own bundled macros (the built-in materializations, generate_schema_name, and more) — the largest single source of the 421.
Assuming "421 macros" means the project is secretly enormous. It means the opposite — dbt-core’s global project and the Snowflake adapter package ship hundreds of macros before a single model is written. Reading project size off that number is a category error every new hire makes once.
After dbt parse, read target/manifest.json for the real list — jq '.macros | keys | length' target/manifest.json — faster than guessing where 421 comes from.
Treat macros/ as a folder you own, and everything else in the count as infrastructure you inherited.
Notice the count creep by exactly one the day your project ships its first macro — a small, checkable signal that something changed.
dbt-core’s global project, the Snowflake adapter package, and any installed package all contribute — in that rough order of volume — but there is no published breakdown of exactly how many come from where. Name the three sources; don’t invent a count for each.
421 is infrastructure, not your code — and by the end of this chapter, one of them will be.
