<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Data & AI Engineering @ Ponder]]></title><description><![CDATA[Writings on AI Engineering & Data Engineering, from the team at ponder.co]]></description><link>https://newsletter.ponder.co</link><image><url>https://substackcdn.com/image/fetch/$s_!wPlP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7f7fc69-a9cf-4ae0-ab40-7cc3ca379010_213x213.png</url><title>Data &amp; AI Engineering @ Ponder</title><link>https://newsletter.ponder.co</link></image><generator>Substack</generator><lastBuildDate>Mon, 03 Aug 2026 21:13:45 GMT</lastBuildDate><atom:link href="https://newsletter.ponder.co/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ponder - Data & AI]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[contact@ponder.co]]></webMaster><itunes:owner><itunes:email><![CDATA[contact@ponder.co]]></itunes:email><itunes:name><![CDATA[Edan Maor]]></itunes:name></itunes:owner><itunes:author><![CDATA[Edan Maor]]></itunes:author><googleplay:owner><![CDATA[contact@ponder.co]]></googleplay:owner><googleplay:email><![CDATA[contact@ponder.co]]></googleplay:email><googleplay:author><![CDATA[Edan Maor]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[dbt Meets graphify: Lineage Queries Without the Infrastructure ]]></title><description><![CDATA[A pip-installable CLI that reshapes dbt's manifest.json into a graphify knowledge graph]]></description><link>https://newsletter.ponder.co/p/dbt-meets-graphify-lineage-queries</link><guid isPermaLink="false">https://newsletter.ponder.co/p/dbt-meets-graphify-lineage-queries</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Thu, 30 Jul 2026 12:41:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ojir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ojir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ojir!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 424w, https://substackcdn.com/image/fetch/$s_!ojir!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 848w, https://substackcdn.com/image/fetch/$s_!ojir!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 1272w, https://substackcdn.com/image/fetch/$s_!ojir!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ojir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png" width="1456" height="976" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:976,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1817751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ojir!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 424w, https://substackcdn.com/image/fetch/$s_!ojir!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 848w, https://substackcdn.com/image/fetch/$s_!ojir!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 1272w, https://substackcdn.com/image/fetch/$s_!ojir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2aee13f-8609-4bc0-ad75-ee241a091cd3_1856x1244.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>A few weeks ago we wrote about <a href="https://newsletter.ponder.co/p/the-dbt-ai-stack-upgraded">upgrading the dbt AI stack</a> with FalkorDB, vector embeddings, full-text search, and Bedrock reranking. It works well &#8212; semantic queries, concept-based discovery, multi-layer retrieval all in one system. But it also requires a running graph database, an embeddings pipeline, and cloud infrastructure before you get your first answer.</p><p>That&#8217;s the right setup for a production data platform. It&#8217;s too much for most situations.</p><p><a href="https://github.com/Graphify-Labs/graphify">graphify</a> &#8212; built by <a href="https://github.com/safishamsi">Safi</a> &#8212; is a tool we use constantly for the lighter cases. Point it at any folder of code or docs, and it extracts a knowledge graph you can query in plain English: <code>graphify query "what calls this function?"</code>, <code>graphify path "AuthModule" "Database"</code>, <code>graphify explain "SwinTransformer"</code>. It runs locally, needs no API key for code projects, and integrates directly into Claude Code as a skill. On most repos it gives an AI agent a navigable map of the codebase instead of making it read files one at a time. Our Airflow repo is a good example &#8212; it's mostly Python and heavily functional, and graphify's call-graph queries make sense of it in a way that grepping DAG files never quite does.</p><p>dbt projects are the exception. Run graphify on a dbt project and you get a broken graph. The problem is Jinja2: dbt SQL isn&#8217;t standard SQL &#8212; it&#8217;s a template language where dependencies are expressed as <code>{{ ref('stg_orders') }}</code> and <code>{{ source('raw', 'orders') }}</code>. graphify&#8217;s extractor sees those as opaque macro calls, not edges. The lineage it produces is incomplete at best; usually it&#8217;s just a bag of disconnected SQL files with no meaningful relationships between them. dbt&#8217;s layer semantics &#8212; source &#8594; staging &#8594; intermediate &#8594; mart &#8212; don&#8217;t exist in the output at all. The result costs more tokens to query than just grepping the files.</p><p>Ask an agent &#8220;what breaks if I change stg_students?&#8221; and it has to read every <code>.sql</code> file in the project, reason over raw text, and hope it doesn&#8217;t miss an indirect dependency. On a 200-model project, that burns more tokens than it saves.</p><p>The thing is, dbt already computed the answer. Every <code>dbt compile</code> or <code>dbt parse</code> writes the fully-resolved DAG to <code>target/manifest.json</code> &#8212; every node, every edge, every upstream and downstream relationship, fully materialized. It&#8217;s sitting there in your target directory.</p><p>dbt-graphify bridges the two. It reads the manifest and reshapes it into exactly the format graphify expects: flat nodes with materialization type, file location, database, schema, column lists, and full lineage maps &#8212; layer semantics included. No database. No embeddings. No cloud account. Drop it into any dbt project, run one command, and graphify queries work the way they should have from the start.</p><p>The full AI stack is still the right answer when you need semantic search across business concepts. This is for everything else.</p><p>Check the repo: <a href="https://github.com/ponderedw/graphify-dbt">github.com/ponderedw/graphify-dbt</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Getting it running</h1><p>Two tools, one pipeline. dbt-graphify reads the manifest and builds the graph; graphify queries it. </p><p>Install both:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;5600c2e4-7ace-4133-9933-f11d17571d12&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext"># Parse dbt manifests into a knowledge graph
pip install dbt-graphify

# With topology-based community detection (recommended for large projects)
pip install "dbt-graphify[clustering]"

# Query the graph and generate the HTML visualization
pip install graphifyy</code></pre></div><p>Note the package name: it&#8217;s <code>graphifyy</code> (double-y) on PyPI, though the CLI command you actually run is <code>graphify</code>. We&#8217;d recommend <code>uv tool install graphifyy</code> or <code>pipx install graphifyy</code> over plain <code>pip install</code> &#8212; both isolate the package in their own environment, which avoids a <code>ModuleNotFoundError</code> that shows up with plain pip if your shell resolves a different Python than the one graphify was installed into.</p><p><code>pip install graphifyy</code> only gets you the CLI. To make Claude Code (or Codex, Cursor, Gemini CLI, and a dozen others) reach for graphify automatically instead of reading files one at a time, run:</p><pre><code><code>graphify install</code></code></pre><p>This registers graphify as a skill in your AI assistant&#8217;s config &#8212; it nudges the assistant to run <code>graphify query</code> before it starts grepping through raw source. If you want it enforced rather than just suggested, <code>graphify install --project --strict</code> blocks the assistant&#8217;s first raw file read of a session and redirects it to the graph instead, then reverts to a soft nudge for the rest of the session. Platform-specific installs work the same way &#8212; <code>graphify install --platform codex</code>, <code>--platform cursor</code>, <code>--platform gemini</code>, and so on.</p><p>The <code>[clustering]</code> extra installs networkx and unlocks Louvain community detection &#8212; an algorithm that finds tightly-connected subgraphs by looking at the shape of the DAG rather than any labels. On the demo project in the repo, a 45-model educational analytics project, it finds four functional clusters without any configuration: student outcomes and at-risk analytics, activities and resource allocation, scheduling and teaching load, and courses and curriculum &#8212; purely from which models share upstream and downstream neighbors. On a real project with hundreds of models it surfaces domain boundaries that aren't explicit anywhere in the project structure. Without it, dbt-graphify falls back to grouping by layer &#8212; source, staging, intermediate, mart. Fully queryable either way.</p><p>Run dbt-graphify against your manifest:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;44b3ed5e-679e-4223-88c8-3ff5c71fb397&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext"># Auto-detect manifest.json in standard dbt target/ locations
dbt-graphify

# Explicit path (useful in monorepos)
dbt-graphify path/to/target/manifest.json</code></pre></div><p>This writes everything to <code>graphify-out/</code>: a <code>graph.json</code> in NetworkX node-link format, a <code>lineage.json</code> with full ancestor and descendant maps, a <code>GRAPH_REPORT.md</code> summarizing the architecture, and a <code>graph.html</code> interactive D3 visualization. dbt-graphify does no querying &#8212; its only job is producing those files correctly from the manifest.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b76c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b76c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 424w, https://substackcdn.com/image/fetch/$s_!b76c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 848w, https://substackcdn.com/image/fetch/$s_!b76c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 1272w, https://substackcdn.com/image/fetch/$s_!b76c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b76c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png" width="1456" height="991" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:991,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:615686,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b76c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 424w, https://substackcdn.com/image/fetch/$s_!b76c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 848w, https://substackcdn.com/image/fetch/$s_!b76c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 1272w, https://substackcdn.com/image/fetch/$s_!b76c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82ca717-4a15-45cf-b24a-5e802362585c_1746x1188.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>From there, graphify takes over. The repo includes a working demo &#8212; clone it, compile the <code>dbt_project/</code> with <code>dbt compile</code>, run <code>dbt-graphify</code>, and you have a queryable educational analytics graph in under a minute:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9f3b5227-6898-472d-9285-d191ba07957a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">graphify query "which models depend on stg_students?"
graphify query "what breaks if I change stg_enrollments?"
graphify path "stg_courses" "course_success_predictors"
graphify explain "int_department_analytics"</code></pre></div><p>All BFS traversal on the local <code>graph.json</code> &#8212; no LLM calls, no API key, no network. The answers come from the graph structure dbt-graphify produced from the manifest.</p><h3>One more thing: CLAUDE.md</h3><p>Running dbt-graphify also writes a <code>CLAUDE.md</code> at your repo root &#8212; or updates its own section in-place if one already exists. The file contains a single instruction block:</p><pre><code><code>## dbt lineage queries

This project has a graphify knowledge graph at graphify-out/graph.json.

Always use graphify commands to answer questions about models,
dependencies, lineage, or blast radius &#8212; do not grep SQL files.

    graphify explain "&lt;model&gt;"
    graphify path "&lt;source&gt;" "&lt;target&gt;"
    graphify query "&lt;question&gt;"

To rebuild: dbt-graphify path/to/manifest.json</code></code></pre><p>Claude Code reads <code>CLAUDE.md</code> at session start and treats its contents as standing instructions. With this in place, a new session in the repo doesn&#8217;t need a prompt like &#8220;use graphify for lineage questions&#8221; &#8212; it just does. The conversation earlier in this post would have gone straight to <code>graphify explain</code> instead of spending several tool calls figuring out what to reach for.</p><p>The write is scoped: if <code>CLAUDE.md</code> already exists and doesn&#8217;t contain our block, dbt-graphify leaves it alone. If it does contain a block from a previous run or you manually added the following tags: </p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;c9aeaa57-42d8-42c4-8dc4-75e4e0ceef3c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">&lt;!-- dbt-graphify start --&gt;                                                                                                                       
   ...
&lt;!-- dbt-graphify end --&gt; </code></pre></div><p>only the manifest path gets updated. Nothing else in the file is touched.</p><h1><strong>What it&#8217;s actually useful for</strong></h1><p>The most immediate use case is blast-radius analysis. Before changing a staging model, you want to know how many downstream models it feeds and which marts it ultimately lands in. <code>lineage.json</code> has the full ancestor and descendant maps computed via BFS &#8212; read it directly in Python or ask graphify:</p><pre><code><code>graphify query "what breaks if I change stg_enrollments?"</code></code></pre><pre><code><code>Traversal: BFS depth=2 | Start: ['stg_enrollments'] | 11 nodes found
NODE stg_enrollments [community=int_department_analytics]
NODE int_department_analytics [community=int_department_analytics]
NODE int_student_enrollment_history [community=stg_departments]
...
EDGE stg_enrollments --&gt; int_department_analytics
EDGE int_department_analytics --&gt; department_overview
EDGE int_student_enrollment_history --&gt; student_academic_summary</code></code></pre><p>On the demo project that returns the full chain: both intermediate models that read from <code>stg_enrollments</code>, and the three marts that depend on those intermediates. No scanning, no guessing.</p><p>The second case is onboarding. A new engineer joins a dbt project with 150 models and no documentation. <code>GRAPH_REPORT.md</code> gives them the full architecture in one file. <code>graphify explain</code> goes further, showing a single node&#8217;s full context:</p><pre><code><code>graphify explain "int_department_analytics"</code></code></pre><pre><code><code>Node: int_department_analytics
  ID:        model.DbtEducationalDataProject.int_department_analytics
  Source:    models/intermediate/int_department_analytics.sql
  Type:      concept
  Community: stg_enrollments
  Degree:    7

Connections (7):
  &lt;-- stg_departments [] []
  &lt;-- stg_courses [] []
  &lt;-- stg_students [] []
  &lt;-- stg_enrollments [] []
  &lt;-- stg_teachers [] []
  --&gt; department_efficiency_report [] []
  --&gt; teacher_performance_dashboard [] []</code></code></pre><p>The third case is Claude Code integration. Install the graphify skill and lineage questions go through the graph instead of the files:</p><ul><li><p><em>&#8220;What feeds </em><code>teacher_performance_dashboard</code><em>?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dboZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dboZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 424w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 848w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 1272w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dboZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png" width="680" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:680,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26821,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dboZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 424w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 848w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 1272w, https://substackcdn.com/image/fetch/$s_!dboZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08bd84be-89ac-4335-8cbe-d982b0b3686f_680x318.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QP2w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QP2w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 424w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 848w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 1272w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QP2w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png" width="1456" height="553" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:553,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:145463,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QP2w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 424w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 848w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 1272w, https://substackcdn.com/image/fetch/$s_!QP2w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51cc7f6d-5f5c-4994-95e3-84bd8d55c10e_1676x636.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p><em>&#8220;If I rename a column in </em><code>stg_courses</code><em>, what downstream models break?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X_lw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X_lw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 424w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 848w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 1272w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X_lw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png" width="1456" height="915" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:915,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:277862,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!X_lw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 424w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 848w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 1272w, https://substackcdn.com/image/fetch/$s_!X_lw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb958a3-f3a3-409c-9ff4-6b4b3df9d699_1894x1190.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One caveat: column-level lineage isn't in the graph yet &#8212; it's on the roadmap. Ask about a model and graphify answers from the graph; ask about a specific column and it still has to fall back to reading the file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1luv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1luv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 424w, https://substackcdn.com/image/fetch/$s_!1luv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 848w, https://substackcdn.com/image/fetch/$s_!1luv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 1272w, https://substackcdn.com/image/fetch/$s_!1luv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1luv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png" width="1456" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113580,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1luv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 424w, https://substackcdn.com/image/fetch/$s_!1luv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 848w, https://substackcdn.com/image/fetch/$s_!1luv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 1272w, https://substackcdn.com/image/fetch/$s_!1luv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f2d7d3c-dc16-4743-87ab-198a0541dab1_1894x604.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sdLa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sdLa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 424w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 848w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 1272w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sdLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png" width="1456" height="609" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:609,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:234209,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sdLa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 424w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 848w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 1272w, https://substackcdn.com/image/fetch/$s_!sdLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd3ecc01-b611-4163-8387-7bf29f3cf4f4_1894x792.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p><em>&#8220;Which marts depend on </em><code>int_department_analytics</code><em>?&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZN3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZN3C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 424w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 848w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 1272w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZN3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png" width="1014" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1014,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113727,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZN3C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 424w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 848w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 1272w, https://substackcdn.com/image/fetch/$s_!ZN3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca52922-496c-4d66-8710-97df6903d2dc_1014x726.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p><em>&#8220;</em>Trace <code>stg_attendance_records</code> all the way to <code>student_retention_analysis</code>.<em>&#8221;</em></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ma5u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ma5u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 424w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 848w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ma5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png" width="1456" height="1147" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1147,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:387508,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/208211444?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ma5u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 424w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 848w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 1272w, https://substackcdn.com/image/fetch/$s_!ma5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee690d0-064f-41d8-8ca4-f7182bbbec19_1676x1320.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each becomes one traversal instead of Claude reading every model to find the joins. On a large project this typically cuts 70&#8211;90% of the tokens spent on lineage questions.</p><p>The fourth is CI. dbt-graphify has no side effects beyond writing <code>graphify-out/</code>, so it slots cleanly into any pipeline: compile the manifest, run dbt-graphify, commit the output. We added exactly this job to our own dbt CI, triggered on every merge to <code>develop</code>.</p><h1><strong>Under the hood</strong></h1><p>The package is two modules. <code>parser.py</code> reads the manifest; <code>builder.py</code> turns the parsed data into graphify&#8217;s expected format. No LLM calls anywhere &#8212; the whole pipeline is deterministic.</p><p>The parser&#8217;s main job is extracting three things from <code>manifest.json</code>: the node list (models, sources, macros), the edge list (<code>parent_map</code> and <code>child_map</code>, which dbt pre-computes during compilation), and per-node metadata &#8212; materialization from <code>config.materialized</code>, file path from <code>original_file_path</code>, columns from the <code>columns</code> dict, database and schema, and raw SQL from <code>raw_code</code>. Layer classification is a small inference function: <code>stg_</code> prefix &#8594; staging, <code>int_</code> prefix &#8594; intermediate, then fqn path segments as a tiebreaker, then mart as the default. If <code>manifest.json</code> is empty &#8212; dbt wasn&#8217;t compiled, just parsed &#8212; the tool falls back to <code>graph_summary.json</code> and reads the raw <code>.sql</code> files directly, using regex to extract <code>{{ ref() }}</code> and <code>{{ source() }}</code> calls and a best-effort SELECT-clause parser to recover column names.</p><p>The builder produces four outputs. <code>graph.json</code> is NetworkX node-link format &#8212; the exact structure <code>nx.node_link_graph()</code> expects, with all node attributes flat at the top level (graphify reads them via <code>G.nodes[id].get("attr")</code>, so anything nested inside a <code>properties</code> key is invisible to it). <code>lineage.json</code> holds two BFS maps, <code>ancestors</code> and <code>descendants</code>, computed from the adjacency lists the parser built. <code>GRAPH_REPORT.md</code> is a plain-text architecture summary with a per-layer node inventory and a blast-radius table sorted by downstream count. HTML generation is delegated entirely to <code>graphify cluster-only</code> via subprocess &#8212; no D3 code lives in this package.</p><p>Every node carries two different grouping properties that are easy to conflate. Layer is its position in the transformation pipeline &#8212; source, staging, intermediate, mart &#8212; always derived from the node&#8217;s name and fqn. It answers &#8220;where in the pipeline does this model sit?&#8221; Community is which functional domain the node belongs to, and it&#8217;s what the visualization colors by. A staging model and a mart can share the same community color if they serve the same business domain, even though they sit at opposite ends of the pipeline.</p><p>Community detection runs a priority chain: dbt groups first, then tags, then &#8212; if <code>[clustering]</code> is installed &#8212; Louvain modularity on the undirected projection of the DAG. Direction is dropped because Louvain works on undirected graphs, and structural proximity matters more than flow direction for grouping. Each community is named after its highest-degree node; if Louvain isn&#8217;t available in the installed networkx version, it falls back to <code>greedy_modularity_communities</code>. Without <code>[clustering]</code> at all, community falls back to layer &#8212; the two properties collapse to the same value, and the visualization colors by pipeline stage instead of domain.</p><p>The only required dependency is the Python standard library. PyYAML is optional, networkx is optional. The package has no opinion about which dbt adapter you use.</p><h1>Wrapping up</h1><p>dbt-graphify is a small, deterministic bridge: it takes the DAG dbt already computed and reshapes it into something graphify &#8212; and by extension, Claude Code &#8212; can query directly. No graph database, no embeddings, no cloud account, just a manifest and one CLI command. For blast-radius checks, onboarding, and day-to-day lineage questions in an agent session, that&#8217;s enough.</p><p>It&#8217;s not a replacement for the full AI stack &#8212; column-level lineage isn&#8217;t there yet, and semantic search across business concepts still needs embeddings and a real graph database. But most lineage questions aren&#8217;t semantic, they&#8217;re structural, and dbt already has the answer sitting in <code>target/manifest.json</code>. This just stops throwing that away.</p><p>Try it on your own project, or start with the demo in the repo: <a href="https://github.com/ponderedw/graphify-dbt">github.com/ponderedw/graphify-dbt</a>. Issues and PRs welcome.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[dbt Core vs dbt Cloud: You're Being Asked the Wrong Question]]></title><description><![CDATA[We deployed both at Uncommon Schools &#8212; because 'which one' was never the real decision]]></description><link>https://newsletter.ponder.co/p/dbt-core-vs-dbt-cloud-youre-being</link><guid isPermaLink="false">https://newsletter.ponder.co/p/dbt-core-vs-dbt-cloud-youre-being</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 13 Jul 2026 11:49:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cUA2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>LinkedIn is currently full of &#8220;dbt Core vs dbt Cloud&#8221; comparison tables &#8212; control on the left, speed on the right, pick your column based on team maturity. I left a comment on one of them recently and realized halfway through that I was fighting the format. So here&#8217;s the full version.</p><p>At Ponder, we build the Ponder DWE (Data Warehouse for Education) &#8212; data infrastructure that automates, cleans, and standardizes data from across instructional and operational platforms for K-12 schools and networks, shaped by our partnership with leaders in education reform such as Uncommon Schools. dbt sits at the center of that stack, and over the past few years we&#8217;ve run it in both flavors: Core, Cloud, and &#8212; this is the actual point of this article &#8212; both at once, at different layers.</p><p>Our main takeaway: the comparison table itself is the mistake.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cUA2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cUA2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cUA2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg" width="1280" height="850" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:850,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79367,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/205284307?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cUA2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cUA2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945c63cd-f2bb-44a3-bec5-97803be0d243_1280x850.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3><strong>A Quick Introduction: dbt, Core, and Cloud</strong></h3><p>For those outside the bubble: dbt is the de facto standard for the T in ELT. You write SQL models with Jinja templating, dbt compiles them into a dependency graph and runs them against your warehouse in the right order, with tests and documentation attached.</p><p>It comes in two forms. <strong>dbt Core</strong> is the open-source engine &#8212; a CLI you run yourself, wherever and however you want. <strong>dbt Cloud</strong> is the commercial platform around that engine: web IDE, job scheduler, CI, metadata catalog, all managed for you, all billed accordingly.</p><p>Same models run on both. Keep that fact in mind &#8212; it&#8217;s the load-bearing fact of this whole article.</p><h3><strong>The Framing Problem</strong></h3><p>&#8220;Core or Cloud&#8221; assumes dbt is one decision. It isn&#8217;t. It&#8217;s at least five separate decisions &#8212; development environment, execution, CI, orchestration, metadata &#8212; and nothing forces you to answer them all the same way. The vendors&#8217; framing collapses these layers into a single either/or because that&#8217;s how you sell a platform. Your actual job is to decompose them back.</p><p>Here&#8217;s how that decomposition went for us in practice.</p><h3><strong>Development: Cloud Won, for a Mundane Reason</strong></h3><p>We started on Core, like most teams that come up through the engineering side. Then we moved development to Cloud, and the reason was mundane: the IDE. Not the scheduler, not the enterprise security slide &#8212; the IDE. Autocomplete over your actual project, instant compile previews, analysts contributing without a local Python environment fight.</p><p>Whatever your opinion on web IDEs, the onboarding difference is real. In an education data context, where the people who best understand the data are not always the people most comfortable with a terminal, that difference compounds. Pretending otherwise is how &#8220;team maturity&#8221; becomes a euphemism for &#8220;we enjoy gatekeeping.&#8221;</p><p>That said, the Cloud IDE may not be the final word here. We&#8217;ve been standardizing development environments across the stack with Coder &#8212; reproducible, isolated workspaces that spin up in minutes (<a href="https://newsletter.ponder.co/p/coder-airflow-managing-local-development">we wrote about the Airflow version here</a>). A dbt workspace built the same way could give us the onboarding benefits without the platform dependency &#8212; we&#8217;re evaluating exactly that, and will tell you about this decision shortly. Maybe that next solution is what we picked for the Ponder DWE package. Stay tuned.</p><h3><strong>Execution: Split Environments Are Worse Than Either Environment</strong></h3><p>Moving development to Cloud while running production on Core taught us the first lesson quickly: two runtimes, two behaviors, one permanent source of drift. This is the class of bug where a model works in the IDE and fails at 3 AM for reasons neither set of logs will explain.</p><p>So execution moved to Cloud too. Jobs run there now. One runtime, one behavior. Fine.</p><p>But that&#8217;s where the migration stopped &#8212; and the stopping points are the actual content of this article.</p><h3><strong>CI: Stayed on Core, Deliberately</strong></h3><p>Cloud&#8217;s CI is convenient precisely because it&#8217;s opinionated &#8212; and opinionated tools are great right until your workflow disagrees with the opinion. Ours does: selective builds based on what actually changed, custom data quality gates, environment-specific checks before merge.</p><p>A concrete example: we&#8217;ve written before about a setup where dbt handles both ingestion and transformation &#8212; Trino-based ingestion in one project, warehouse transformations in another, wired together as packages, with CI that tests modified models across both using defer state. You can read the full walkthrough here: <a href="https://newsletter.ponder.co/p/trino-dbt-simplifying-elt-with-pure">Trino + dbt: Simplifying ELT with Pure SQL</a>.</p><p>The relevant constraint: dbt can&#8217;t run two adapters in a single project. So CI has to be elastic &#8212; two projects, two profiles, ordered execution, shared state between them. In Core, that&#8217;s a shell script. In Cloud, that shape simply doesn&#8217;t exist. And bending a managed product against its own opinions is the most expensive kind of engineering there is.</p><p>One related warning from the same story: custom Core solutions can surface odd behavior when they meet Cloud, because Cloud implements some things slightly differently. After we integrated that Trino setup, the Cloud IDE started demanding <code>dbt deps</code> on every refresh &#8212; press F5, rerun deps, something strange in how it handles local packages. Fairness requires the next sentence, though: dbt Cloud support actually works. Real humans, real answers &#8212; they helped us through exactly this kind of problem, which is not something we can say about every SaaS vendor in the data stack.</p><h3><strong>Orchestration: Keep It Outside</strong></h3><p>Real pipelines don&#8217;t start and end with dbt. There&#8217;s ingestion upstream, reporting and reverse ETL downstream, sensors, retries that need context about what failed and why. Cloud&#8217;s scheduler knows about dbt jobs; your orchestrator knows about your platform.</p><p>Triggering Cloud jobs from Airflow via API is one operator. Wiring non-dbt dependencies around Cloud&#8217;s scheduler is a distributed system built out of webhooks and hope. We kept orchestration in Airflow and let dbt Cloud be an execution layer, not the brain.</p><h3><strong>Two Footnotes That Never Make the Comparison Tables</strong></h3><p><strong>The catalog.</strong> Column-level lineage out of the box is quietly one of the strongest arguments for Cloud &#8212; the feature nobody asks about during evaluation and everybody uses six months in. When a district asks why a number on a dashboard changed, tracing a column from the report back through every transformation to the source system is not a nice-to-have.</p><p><strong>Networking.</strong> SSH tunnels aren&#8217;t supported for all adapters. We couldn&#8217;t connect a private Trino cluster a few months ago &#8212; maybe it&#8217;s fixed by now, but check your networking story before you commit. &#8220;Enterprise-grade integrations&#8221; and &#8220;can reach your database&#8221; are different claims.</p><h3><strong>The Fine Print: Keep a dbt Core Escape Hatch</strong></h3><p>Even if you go all-in on Cloud, keep a backup image with dbt Core and your run logic. Remember the load-bearing fact &#8212; Core and Cloud run the same code from the same repo, which means a container with dbt Core is a disaster recovery plan that costs you one Dockerfile.</p><p>When dbt Cloud is down, &#8220;fully managed&#8221; means fully waiting. When it&#8217;s down and you have that image, it means running <code>dbt build</code> from a container until it&#8217;s back. The whole option costs nothing. Not having it costs an incident review.</p><h3><strong>Conclusion: It&#8217;s Not Maturity. It&#8217;s Decomposition.</strong></h3><p>So where did we land at Ponder? Development and execution in Cloud. CI in Core. Orchestration outside both, in Airflow. Catalog from Cloud, disaster recovery from Core.</p><p>That&#8217;s not indecision &#8212; that&#8217;s the answer. The maturity question was never &#8220;which tool can your team handle.&#8221; It&#8217;s whether you know which layers of your platform you actually need to own, and have the discipline to rent the rest.</p><p>The comparison tables get one thing right: it&#8217;s not about the tool. They just stop one step too early. It&#8217;s not about maturity either. It&#8217;s about decomposition.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The dbt AI Stack, Upgraded]]></title><description><![CDATA[Graph, Knowledge Graphs, RAG, Reranking, and Full-Text Search, all working together for dbt]]></description><link>https://newsletter.ponder.co/p/the-dbt-ai-stack-upgraded</link><guid isPermaLink="false">https://newsletter.ponder.co/p/the-dbt-ai-stack-upgraded</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 23 Jun 2026 16:03:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9bLk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1><span>Introduction</span></h1><p><span>A few months ago, we published</span><a href="https://newsletter.ponder.co/p/graph-powered-ai-chat-for-dbt"><span> Graph-Powered AI Chat for dbt</span></a><span> &#8212; and the response genuinely surprised us. The idea of treating a dbt project as a knowledge graph, loading it into FalkorDB, and chatting with it in natural language resonated with a lot of people. We ended up talking about it at the FalkorDB community event and at SQLBits 2026 in Newport, and the conversations there only convinced us there was more to explore.</span></p><p><span>So we explored.</span></p><p><span>The original pipeline was already powerful &#8212; you could ask complex dependency questions, traverse the graph recursively, and get intelligent answers about your dbt project&#8217;s structure. But it had a blind spot: it understood </span><em><span>relationships</span></em><span>, not </span><em><span>meaning</span></em><span>. If you asked something like &#8220;find models related to revenue reporting,&#8221; the graph could only help if you happened to traverse the right edges. It couldn&#8217;t understand what a model was </span><em><span>about</span></em><span>.</span></p><p><span>That&#8217;s what this post fixes.</span></p><p><span>All the changes described here are added to the same repository &#8212;</span><a href="https://github.com/ponderedw/dbt-kg"><span> </span></a><strong><a href="https://github.com/ponderedw/dbt-kg"><span>dbt-kg</span></a></strong><span> &#8212; so you can follow along, clone it, and have everything in one place. We&#8217;re enhancing the same pipeline with three upgrades that, together, make the system dramatically more capable:</span></p><ul><li><p><strong><span>Semantic search via embeddings</span></strong><span> &#8212; we&#8217;ll embed dbt node descriptions directly into FalkorDB, so you can now search by meaning, not just by graph structure. Dependency traversal and semantic similarity, working side by side.</span></p></li><li><p><strong><span>Full-text search</span></strong><span> &#8212; fast, exact-match keyword search that complements semantic search in ways that matter in practice. We&#8217;ll show you why you want both.</span></p></li><li><p><strong><span>Reranking</span></strong><span> &#8212; once you have multiple retrieval signals, how do you decide what&#8217;s actually most relevant? We&#8217;ll explain what reranking is, why it matters, and how to wire it in.</span></p></li></ul><p><span>By the end, you&#8217;ll have a retrieval pipeline that can find what you&#8217;re looking for whether you know the exact name, a related concept, or just a vague description. Let&#8217;s build it.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9bLk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9bLk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 424w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 848w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 1272w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9bLk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png" width="1456" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9bLk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 424w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 848w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 1272w, https://substackcdn.com/image/fetch/$s_!9bLk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28a13cc3-c39c-46ec-84b5-e72a4077654b_2048x1015.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1><span>Semantic Search via Embeddings</span></h1><p><span>The original pipeline stored your dbt project as a graph &#8212; nodes for models, sources, seeds, and snapshots, connected by edges representing dependencies, tests, and macro usage. That structure is fantastic for traversal questions: what depends on what, blast radius analysis, lineage chains. But the nodes themselves were just identifiers. They had no sense of </span><em><span>what they meant</span></em><span>.</span></p><p><span>To understand the fix, it helps to understand </span><strong><span>RAG</span></strong><span> &#8212; Retrieval-Augmented Generation. The core idea is simple: instead of asking an LLM to answer from memory alone, you first </span><em><span>retrieve</span></em><span> relevant context from your data, then </span><em><span>augment</span></em><span> the prompt with that context before generating an answer. This is what makes AI systems actually useful on private, domain-specific data &#8212; the LLM doesn&#8217;t need to have seen your dbt project during training; it just needs the right context handed to it at query time. The retrieval step is usually powered by vector similarity: you embed both your documents and the user&#8217;s question into the same vector space, then find the documents whose embeddings are closest to the question.</span></p><p><span>That&#8217;s exactly what we&#8217;ve added here. For each node, we take everything meaningful about it &#8212; its name, resource type, schema, materialization, description, and all its column descriptions &#8212; concatenate it into a single piece of text, embed it, and store that embedding directly as an attribute on the node in FalkorDB. No separate vector store, no extra nodes, no parallel data structure to keep in sync. The embedding lives on the same node as everything else.</span></p><p><span>This happens automatically when you upload your manifest.json and catalog.json &#8212; the upload endpoint calls build_node_embeddings() right after the graph is loaded, so by the time you open the chat, every node is already searchable by meaning.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3VfF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3VfF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 424w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 848w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 1272w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3VfF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png" width="1456" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3VfF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 424w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 848w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 1272w, https://substackcdn.com/image/fetch/$s_!3VfF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51d2cc83-4149-4db4-a6bf-e19c8bdc7e0b_2048x890.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>At query time, the FalkorDBNodeRetriever takes your question, embeds it using the same model, and runs a KNN vector search across all node labels simultaneously. The results are ranked by cosine similarity &#8212; no Cypher required, no need to know any model names upfront.</span></p><p><span>This is the key shift. Questions like </span><em><span>&#8220;which models track early warning signals for students at academic risk?&#8221;</span></em><span> or </span><em><span>&#8220;find me everything related to teacher workload and teaching effectiveness&#8221;</span></em><span> now work &#8212; even if none of the model names contain those words. The graph knows the </span><em><span>structure</span></em><span> of your project; the embeddings know what it&#8217;s </span><em><span>about</span></em><span>. Together, they cover both.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Cq1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Cq1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 424w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 848w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 1272w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Cq1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png" width="1456" height="695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fca7c39c-382b-4965-b300-42be945858f3_1844x880.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7Cq1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 424w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 848w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 1272w, https://substackcdn.com/image/fetch/$s_!7Cq1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca7c39c-382b-4965-b300-42be945858f3_1844x880.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X55v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X55v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 424w, https://substackcdn.com/image/fetch/$s_!X55v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 848w, https://substackcdn.com/image/fetch/$s_!X55v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 1272w, https://substackcdn.com/image/fetch/$s_!X55v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X55v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png" width="1392" height="976" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:976,&quot;width&quot;:1392,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:203970,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/203212610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!X55v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 424w, https://substackcdn.com/image/fetch/$s_!X55v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 848w, https://substackcdn.com/image/fetch/$s_!X55v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 1272w, https://substackcdn.com/image/fetch/$s_!X55v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c31e0bb-4cc8-479b-90a7-f796be819574_1392x976.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>And the two modes compose naturally. You can ask </span><em><span>&#8220;find the model that tracks at-risk students, then show me all the models it depends on&#8221;</span></em><span> &#8212; the agent uses semantic search to locate the right node, then switches to graph traversal to answer the structural follow-up. That combination is where this really shines.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jVnm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jVnm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 424w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 848w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 1272w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jVnm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png" width="1456" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jVnm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 424w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 848w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 1272w, https://substackcdn.com/image/fetch/$s_!jVnm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa311b0f9-5697-44a1-9d7b-3ddc4f27c295_1820x888.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JM3p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JM3p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 424w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 848w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 1272w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JM3p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png" width="1366" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163122,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/203212610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JM3p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 424w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 848w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 1272w, https://substackcdn.com/image/fetch/$s_!JM3p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1d806f-8fc2-424e-a43e-b874ed5961b3_1366x972.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y9hM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y9hM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 424w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 848w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y9hM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png" width="1366" height="1394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1394,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:324626,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/203212610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y9hM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 424w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 848w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!Y9hM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F576c6515-18dc-4228-bc0f-db1b6bf6d985_1366x1394.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><span>One honest caveat, though.</span></strong><span> Traditional RAG pipelines deal with large documents &#8212; think long PDFs, sprawling wiki pages, dense technical docs &#8212; and a standard best practice there is to </span><em><span>chunk</span></em><span> them: split each document into smaller pieces, embed each chunk separately, and retrieve only the most relevant chunks at query time. This gives you fine-grained retrieval and avoids stuffing irrelevant content into the LLM&#8217;s context.</span></p><p><span>In our graph setup, we don&#8217;t have that luxury in the same way. Each node is a single unit &#8212; one model, one embedding. If a node&#8217;s combined text (description + all column descriptions) is very long and covers multiple distinct concepts, you can&#8217;t retrieve just the relevant part of it; you get the whole node or nothing. You </span><em><span>could</span></em><span> split a node&#8217;s content into multiple embeddings stored as additional attributes, but that quickly becomes unintuitive &#8212; you&#8217;d be fighting the grain of the graph model rather than working with it. For most dbt projects, where node descriptions are concise and focused, this isn&#8217;t a problem in practice. But it&#8217;s worth keeping in mind if you&#8217;re working with unusually rich metadata or very wide models with dozens of heavily documented columns.</span></p><p><span>One practical note on embedding providers: the system automatically picks the right model based on your LLM_MODEL_ID prefix &#8212; Titan for Bedrock or Anthropic, text-embedding-3-small for OpenAI &#8212; so no extra configuration needed.</span></p><h1><span>Full-Text Search</span></h1><p><span>Full-text search has a long history in software engineering. Elasticsearch popularized it at scale, and the core algorithm behind most implementations &#8212; BM25 &#8212; has been the de facto standard for keyword relevance ranking for decades. The idea is straightforward: score documents by how often the search terms appear in them, adjusted for document length and how rare those terms are across the entire corpus. It&#8217;s fast, battle-tested, and remarkably effective when you know what you&#8217;re looking for.</span></p><p><span>FalkorDB takes a different approach. Its full-text indexing is powered by</span><a href="https://redis.io/docs/interact/search-and-query/advanced-concepts/query_syntax/"><span> RediSearch</span></a><span> and uses </span><strong><span>TF-IDF</span></strong><span> scoring rather than BM25 &#8212; similar in spirit, but simpler: it rewards nodes where the search term appears frequently relative to the total number of terms, without BM25&#8217;s additional length normalization and term saturation adjustments. For our use case &#8212; searching across concise dbt node descriptions rather than long documents &#8212; this is a perfectly natural fit. The nodes aren&#8217;t essays; the scoring difference between TF-IDF and BM25 rarely matters at this scale.</span></p><p><span>What does matter is the query expressiveness. And RediSearch delivers. When you upload your manifest, build_fulltext_index() creates a full-text index across six properties on every node &#8212; name, description, schema, alias, materialized, and resource_type &#8212; for all four label types: Model, Source, Seed, and Snapshot. The FalkorDBFulltextRetriever then queries that index at runtime, deduplicates results across labels, sorts by TF-IDF score, and returns the top matches.</span></p><p><span>The query syntax is what makes this tool genuinely useful day-to-day:</span></p><ul><li><p><strong><span>Prefix search</span></strong><span> &#8212; enroll* matches &#8220;enrollment&#8221;, &#8220;enrollments&#8221;, &#8220;enrollee&#8221;</span></p></li><li><p><strong><span>Boolean operators</span></strong><span> &#8212; graduation AND NOT exited, teacher AND workload, risk OR warning</span></p></li><li><p><strong><span>Fuzzy matching</span></strong><span> &#8212; handles typos via Levenshtein distance, so performence still finds the right models</span></p></li><li><p><strong><span>Stemming</span></strong><span> &#8212; searching &#8220;running&#8221; finds &#8220;run&#8221; and &#8220;runs&#8221; automatically</span></p></li></ul><p><span>Semantic search is powerful, but it has a blind spot: sometimes you </span><em><span>know exactly</span></em><span> what you&#8217;re looking for. If you need every model that mentions &#8220;GPA&#8221;, or you want to find anything referencing &#8220;attendance&#8221; and &#8220;retention&#8221; together, embedding similarity is overkill &#8212; and can actually hurt you by surfacing loosely related models when what you wanted was a precise match.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_et1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_et1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 424w, https://substackcdn.com/image/fetch/$s_!_et1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 848w, https://substackcdn.com/image/fetch/$s_!_et1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 1272w, https://substackcdn.com/image/fetch/$s_!_et1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_et1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png" width="1456" height="1208" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1208,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_et1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 424w, https://substackcdn.com/image/fetch/$s_!_et1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 848w, https://substackcdn.com/image/fetch/$s_!_et1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 1272w, https://substackcdn.com/image/fetch/$s_!_et1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe223b148-ce75-404c-9f21-58627bc8ac68_1594x1322.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>Full-text search is the right tool for that. The agent knows when to reach for it: use full-text when the question contains specific terms, name fragments, or boolean logic; use semantic search when the question is about a concept or business meaning.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fbVQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fbVQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 424w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 848w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 1272w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fbVQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png" width="1456" height="440" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/512827e8-174c-4308-b23d-5744786c232c_2048x619.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:440,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fbVQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 424w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 848w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 1272w, https://substackcdn.com/image/fetch/$s_!fbVQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F512827e8-174c-4308-b23d-5744786c232c_2048x619.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>The two tools complement each other cleanly &#8212; and as you&#8217;ll see next, there&#8217;s a third signal we layer on top of semantic search to make sure the most relevant results actually rise to the top.</span></p><h1><span>Reranking</span></h1><p><span>Vector similarity search is good, but it has a subtle problem. When you embed a query and find the closest nodes by cosine distance, you&#8217;re measuring how similar two vectors are in a high-dimensional space &#8212; and that&#8217;s a proxy for relevance, not relevance itself. Embedding models are trained to capture general semantic similarity, not to deeply reason about which result actually best answers a specific question. The result is that KNN search often gets the </span><em><span>ballpark</span></em><span> right but the </span><em><span>ordering</span></em><span> wrong. The most relevant node might be ranked 4th or 7th, buried under results that are thematically nearby but not quite what you needed.</span></p><p><span>This is where reranking comes in.</span></p><p><span>A reranker is a separate model that takes the query and a set of candidate documents &#8212; already retrieved by your vector search &#8212; and scores each candidate specifically against the query, paying attention to the full meaning of both. Unlike embedding models, which encode the query and each document independently into vectors and then compare them, rerankers look at the query and a candidate </span><em><span>together</span></em><span> in a single pass. This cross-attention mechanism is much more expensive computationally, which is why you don&#8217;t use it to search across your entire dataset &#8212; you use it to re-score a small shortlist that vector search already pulled out. The typical pattern is: retrieve 20&#8211;50 candidates with KNN, then rerank them and keep the top 5.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AzSY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AzSY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 424w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 848w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 1272w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AzSY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png" width="1456" height="723" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:723,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AzSY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 424w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 848w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 1272w, https://substackcdn.com/image/fetch/$s_!AzSY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10887ba8-5a92-4a4e-810f-e384c484b75b_2048x1017.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>We use </span><strong><span>Amazon Bedrock&#8217;s Cohere Rerank v3.5</span></strong><span> for this. After FalkorDBNodeRetriever retrieves KNN candidates from FalkorDB, the _rerank() function sends them to Cohere&#8217;s reranking model along with the original query, gets back a new relevance ordering, and returns the reranked top results alongside all the original KNN candidates &#8212; so you can see exactly what the reranker chose from and why the ordering changed.</span></p><p><span>To make this tangible, consider a query like </span><em><span>&#8220;which models track students who are falling behind academically?&#8221;</span></em><span> Vector search might return 20 candidates that all vaguely relate to students or academics. But the top KNN result by cosine similarity might be a model about GPA trends in general &#8212; semantically close to &#8220;academic&#8221;, but not really about </span><em><span>falling behind</span></em><span> or </span><em><span>at-risk</span></em><span> detection. The reranker reads the full query and each candidate together and recognizes that a model specifically described as tracking early warning indicators for academic risk is a much better match &#8212; and promotes it accordingly.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DzoA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DzoA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 424w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 848w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DzoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png" width="1436" height="1090" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1090,&quot;width&quot;:1436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DzoA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 424w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 848w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!DzoA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec40f1b7-936b-4fe4-8a98-de151e583b11_1436x1090.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Itli!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Itli!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 424w, https://substackcdn.com/image/fetch/$s_!Itli!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 848w, https://substackcdn.com/image/fetch/$s_!Itli!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!Itli!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Itli!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png" width="1456" height="1358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1358,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Itli!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 424w, https://substackcdn.com/image/fetch/$s_!Itli!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 848w, https://substackcdn.com/image/fetch/$s_!Itli!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!Itli!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ec15a-6195-41d0-a2e7-87d618d4021b_1516x1414.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>In the Streamlit UI, you can actually watch this happen. We surface both layers: the full set of KNN candidates with their cosine similarity scores, and then the reranked top results with their Cohere relevance scores. Comparing the two orderings is often the most instructive part &#8212; you can see precisely where vector similarity and true relevance diverge.</span></p><p><span>One practical note: reranking only applies to semantic search, not to full-text search. Full-text results are already ranked by TF-IDF term frequency, which is a direct signal of keyword relevance rather than a vector approximation &#8212; reranking on top of that would add latency without meaningfully improving precision.</span></p><p><span>To enable it, just add two environment variables to your .env:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;49554757-85b3-440c-96af-b0badeaebba6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">BEDROCK_RERANKER_MODEL_ID=cohere.rerank-v3-5:0
BEDROCK_RERANKER_MODEL_ARN=arn:aws:bedrock:{region}::foundation-model/cohere.rerank-v3-5:0</code></pre></div><p><span>If Bedrock credentials aren&#8217;t configured or the reranker call fails for any reason, the system falls back silently to the original KNN ordering &#8212; so it degrades gracefully rather than breaking your pipeline.</span></p><h1><span>Putting It All Together</span></h1><p><span>Let&#8217;s zoom out and look at what we&#8217;ve built.</span></p><p><span>The original pipeline gave you a graph. You could traverse it, query it with Cypher, and ask complex structural questions about your dbt project that no other tool could answer. That was already powerful &#8212; and judging by the response to the first post, it resonated with a lot of people working on real, complicated dbt projects.</span></p><p><span>This post added three layers on top of that foundation, and each one fills a gap the previous couldn&#8217;t cover:</span></p><p><strong><span>Graph traversal</span></strong><span> answers structural questions &#8212; lineage, blast radius, dependency chains, test coverage. It speaks the language of relationships. Ask it </span><em><span>&#8220;what breaks if I drop stg_students?&#8221;</span></em><span> and it will tell you exactly.</span></p><p><strong><span>Full-text search</span></strong><span> answers keyword questions &#8212; precise, fast, exact-match retrieval across model names, descriptions, schemas, and more. When you know the term you&#8217;re looking for, this is the right tool. Boolean operators, prefix matching, fuzzy tolerance for typos &#8212; it handles the cases where you want precision, not approximation.</span></p><p><strong><span>Semantic search with reranking</span></strong><span> answers meaning questions &#8212; business concepts, vague descriptions, things you can&#8217;t quite name but know when you see them. The embeddings live directly on the graph nodes, so there&#8217;s no separate vector store to maintain. The reranker then ensures the most genuinely relevant results rise to the top, not just the ones that happen to be closest in vector space.</span></p><p><span>Together, these three tools give the LangGraph agent a complete retrieval toolkit. A question about lineage goes to the graph. A question about a specific term goes to full-text. A question about a concept goes to semantic search, with reranking to sharpen the results. And the most interesting questions &#8212; </span><em><span>&#8220;find the model that tracks at-risk students, then show me everything it depends on&#8221;</span></em><span> &#8212; combine all three in a single conversation turn.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fqJ-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fqJ-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 424w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 848w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fqJ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fqJ-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 424w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 848w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 1272w, https://substackcdn.com/image/fetch/$s_!fqJ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ebe03fb-9581-4493-9bd3-2109eb6a1912_1734x1148.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>All of this lives in the same</span><a href="https://github.com/ponderedw/dbt-kg"><span> </span></a><strong><a href="https://github.com/ponderedw/dbt-kg"><span>dbt-kg</span></a></strong><span> repository. Upload your manifest.json and catalog.json, and the pipeline builds the graph, creates the embeddings, and sets up the full-text index automatically. Everything is ready by the time you open the chat.</span></p><p><span>That said, there are two things we haven&#8217;t tackled yet &#8212; and they&#8217;re worth being honest about. The system understands your dbt project&#8217;s </span><em><span>structure</span></em><span> and </span><em><span>metadata</span></em><span> deeply, but it doesn&#8217;t query your </span><em><span>actual data</span></em><span>. You can ask which models track student attendance patterns, but you can&#8217;t yet ask what the numbers look like right now. And while dbt is the transformation layer, many teams also have a semantic layer sitting on top &#8212; tools like dbt Semantic Layer, Cube, or Looker &#8212; that define business metrics, dimensions, and how data should be interpreted by end users. Integrating that layer into the same conversational interface would be the natural next step.</span></p><p><span>So that&#8217;s what we&#8217;re thinking about next. Stay tuned.</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Coder + Airflow: Managing Local Development Like a Pro]]></title><description><![CDATA[How to Give Every Developer an Isolated, Reproducible Airflow Environment That Spins Up in Minutes]]></description><link>https://newsletter.ponder.co/p/coder-airflow-managing-local-development</link><guid isPermaLink="false">https://newsletter.ponder.co/p/coder-airflow-managing-local-development</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Wed, 10 Jun 2026 13:55:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!y_cH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y_cH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y_cH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 424w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 848w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y_cH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png" width="518" height="343.6730769230769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:518,&quot;bytes&quot;:2542169,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/201455620?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y_cH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 424w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 848w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!y_cH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d8602a4-98d4-43b8-a9b5-c3c02e6c4e96_2058x1366.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>If you&#8217;ve ever onboarded a new data engineer onto an Airflow project, you know the drill. Half a day disappears into Python version mismatches, missing system dependencies, conflicting virtual environments, and the classic &#8220;it works on my machine&#8221; shrug. Local Airflow development is painful &#8212; and it doesn&#8217;t have to be.</p><p>This post walks through how we use<a href="https://coder.com"> Coder</a> to give every developer a fully isolated, reproducible Airflow environment that spins up in minutes. We&#8217;ll use the<a href="https://github.com/ponderedw/airflow-mcp-plugins"> airflow-mcp-plugins</a> repo as our example &#8212; a project that adds a conversational AI interface directly into the Airflow UI &#8211; <a href="https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built">https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built</a> .</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div><hr></div><h3>The Problem with Local Airflow</h3><p>Just yesterday I ran into someone who told me they&#8217;d been a Dagster advocate for years &#8212; not because of the technology itself, but because local development just <em>felt</em> easier there. Airflow had a reputation for being painful to run locally, and that reputation stuck even as Airflow improved significantly over time. I love Airflow, and it bothered me that something as fixable as local dev experience was pushing people toward other tools. This post is partly my answer to that.</p><p>Running Airflow locally sounds simple until it isn&#8217;t. The typical setup involves Docker Compose with multiple services &#8212; webserver, scheduler, worker, Redis, Postgres &#8212; all needing to talk to each other, share volumes, and pick up your DAG files. On top of that:</p><ul><li><p>Everyone needs the same Python version and the same packages</p></li><li><p>Port conflicts are common if you&#8217;re running multiple projects</p></li><li><p>When you stop and restart, state can get corrupted</p></li><li><p>New team members spend hours just getting to a working baseline</p></li></ul><p>The usual answer is &#8220;just use Docker Compose directly.&#8221; But that still leaves every developer managing their own environment, their own .env files, their own credentials, and their own debugging when something breaks.</p><p>And then there&#8217;s the invisible problem: standardization drift. If you figure out a better way to set up the local environment &#8212; a smarter Docker Compose config, a new environment variable that everyone needs, a helper script that saves thirty minutes &#8212; how do you roll that out? You send an email. Which probably won&#8217;t be read. Or will be read, bookmarked, and forgotten. Six months later you discover half the team is still running the old setup because there was never a centralized, enforced way to define what &#8220;local development&#8221; actually means.</p><p>This challenge becomes even more apparent when supporting a broader internal development team. At Uncommon Schools, we work with engineers and developers across the data stack &#8212; from Airflow pipelines to dbt transformations and analytics tooling &#8212; with different roles, workflows, and levels of infrastructure familiarity. Before introducing Coder-driven workspaces, keeping everyone&#8217;s local setup aligned with the latest infrastructure changes was a recurring challenge.</p><p>The goal was to move away from onboarding docs, Slack messages, and tribal knowledge toward a development environment that is itself the source of truth: a reproducible workspace definition that every developer can spin up and keep in sync.</p><p>It gets worse when your stack grows beyond a simple Docker Compose. What if some components need to run directly on the laptop &#8212; a local Python process, a dbt command, a custom script that talks to both your local Airflow and a cloud service? Now you&#8217;re coordinating Docker networks, local processes, environment variables, and credentials across multiple tools, and the &#8220;just run this command&#8221; onboarding doc is already three pages long and six months out of date.</p><div><hr></div><h3><strong>The Solution: Coder</strong></h3><p><a href="https://coder.com">Coder</a> is an open-source platform for self-hosted remote development environments. Think of it as a control plane for developer workspaces &#8212; similar in spirit to Dev Containers, but more flexible. Where Dev Containers are tied to a specific editor and a specific container, Coder lets you define full environments that can run not just containers but also VMs or even bare-metal OS instances. You get a browser-based IDE, a terminal, and proxied access to any app running inside the workspace, all through a single URL.</p><p>You define a workspace as code using Terraform, and Coder provisions it on demand &#8212; locally or in the cloud. The key insight is that a &#8220;workspace&#8221; is just a compute resource (a Docker container, a VM, a Kubernetes pod) with a Coder agent running inside it. The agent connects back to the Coder server, which proxies your IDE, your apps, and your terminal outward. Every developer gets their own isolated environment, defined by the same Terraform template, with their own credentials injected at workspace creation time.</p><p>Coder supports<a href="https://coder.com/docs/admin/templates"> a wide range of workspace types</a> &#8212; AWS EC2 instances, Google Cloud VMs, Kubernetes pods, and more. For this tutorial we&#8217;ll use Docker, which is the simplest setup for local development and needs nothing beyond Docker Desktop on your Mac.</p><p>For Airflow development this is a perfect fit. Each workspace gets its own Docker daemon (Docker-in-Docker), its own Postgres, its own Redis, and its own Airflow stack &#8212; all isolated inside a single container that Coder manages. Want to change the default environment for the whole team? Update the Terraform template. Everyone&#8217;s next workspace picks it up automatically &#8212; no email required.</p><div><hr></div><h3><strong>Running Coder Locally on Mac</strong></h3><p>First, install Coder:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;df7b2c12-4293-42c6-88bb-e174dd4f5311&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">curl -L https://coder.com/install.sh | sh</code></pre></div><p>Then start the server. You need to pass both an access URL and a wildcard access URL &#8212; the wildcard is what allows Coder to proxy your Airflow UI through a subdomain:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;95b074e2-f120-45d5-a54c-8e054c5435e1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">coder server --access-url http://localhost:3000 --wildcard-access-url &#8220;*.localhost:3000&#8221;</code></pre></div><p>If you&#8217;re using our repository, we&#8217;ve wrapped this in a <strong>just</strong> command:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;30a440a7-0394-47ce-be46-81c00b8ad64d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">just start_coder</code></pre></div><p>Once it starts, open <strong>http://localhost:3000</strong> in your browser. You&#8217;ll be prompted to create an admin account on the first run.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rcu2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rcu2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 424w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 848w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rcu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png" width="366" height="570.8175182481751" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1282,&quot;width&quot;:822,&quot;resizeWidth&quot;:366,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rcu2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 424w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 848w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!Rcu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed18cfc-4016-499b-bc09-b4e3cbd5fb12_822x1282.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3><strong>Creating Your First Workspace</strong></h3><p>After logging in:</p><p>Go to <strong>Templates</strong> and create a new template &#8212; paste in the coder_template.tf from the repository, then click on <strong>Build </strong>and <strong>Publish</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RB7-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RB7-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 424w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 848w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 1272w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RB7-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png" width="1456" height="294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:294,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RB7-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 424w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 848w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 1272w, https://substackcdn.com/image/fetch/$s_!RB7-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46d307c9-b972-47fa-8067-2d736fe0a768_2048x414.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x7NZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x7NZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 424w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 848w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 1272w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x7NZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png" width="736" height="604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:736,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!x7NZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 424w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 848w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 1272w, https://substackcdn.com/image/fetch/$s_!x7NZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff41756e3-4761-4bc8-88e0-391ded560f8f_736x604.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p_uN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p_uN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 424w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 848w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 1272w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p_uN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png" width="1456" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p_uN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 424w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 848w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 1272w, https://substackcdn.com/image/fetch/$s_!p_uN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc3e65d7-38b6-4315-a244-a36ae296a7ac_2048x1192.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J-1d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J-1d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 424w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 848w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 1272w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J-1d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png" width="1456" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J-1d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 424w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 848w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 1272w, https://substackcdn.com/image/fetch/$s_!J-1d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4c60152-7919-4fad-b430-6b1dbc41b0ef_2048x845.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Click <strong>Create Workspace</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j2nn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j2nn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 424w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 848w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 1272w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j2nn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png" width="1456" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j2nn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 424w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 848w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 1272w, https://substackcdn.com/image/fetch/$s_!j2nn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9081b6a3-65b9-4a2a-8c48-ceaa788b72b3_2048x528.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Fill in the parameters &#8212; your Git name, your Anthropic/OpenAI/AWS API key depending on which LLM backend you want to use</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Vs-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Vs-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 424w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 848w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Vs-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png" width="1456" height="1162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1162,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2Vs-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 424w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 848w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!2Vs-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5c01f7-1d61-45f6-9f22-8fd379883eb9_1524x1216.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hit <strong>Create</strong> and watch the build logs</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ada1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ada1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 424w, https://substackcdn.com/image/fetch/$s_!ada1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 848w, https://substackcdn.com/image/fetch/$s_!ada1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!ada1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ada1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png" width="1456" height="901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:901,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ada1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 424w, https://substackcdn.com/image/fetch/$s_!ada1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 848w, https://substackcdn.com/image/fetch/$s_!ada1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!ada1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95509dcd-b90e-4380-98f2-e3d4baf84e4f_1966x1216.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first time takes a few minutes because Docker images need to be pulled. On subsequent starts it&#8217;s fast &#8212; the Docker image cache is persisted in a named volume so nothing gets re-downloaded.</p><p>Once the workspace is running you&#8217;ll see two buttons: <strong>code-server</strong> (VS Code in the browser) and <strong>Airflow</strong>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kr_4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kr_4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kr_4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png" width="1456" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!kr_4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!kr_4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17be3e4-52fa-43f8-9d82-f5a53f01c549_2048x1172.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br><br>Click Airflow and you&#8217;ll land directly on the Airflow UI at <strong>http://airflow--yourusername--coder.localhost:3000/</strong>. Log in with <strong>airflow</strong> / <strong>airflow</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2iLs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2iLs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2iLs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png" width="1456" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2iLs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!2iLs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9adf380-8c35-4932-9c8e-493a60a7f9bb_2048x1172.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ff56!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ff56!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!ff56!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!ff56!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!ff56!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ff56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png" width="1456" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ff56!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 424w, https://substackcdn.com/image/fetch/$s_!ff56!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 848w, https://substackcdn.com/image/fetch/$s_!ff56!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 1272w, https://substackcdn.com/image/fetch/$s_!ff56!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89d1ffc-70c3-4d58-88c4-305cb4ca5f12_2048x1172.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3><strong>How Terraform Works in Coder</strong></h3><p>Every Coder workspace is defined by a Terraform template. When you create a workspace, Coder runs terraform apply with your parameters, which provisions the Docker container, volumes, and agent. When you stop the workspace, it runs terraform destroy on the container (but keeps the volumes). When you restart, it re-applies &#8212; same volumes, same data, new container.</p><p>The template we use here does a few things:</p><ul><li><p>Declares <strong>input parameters</strong> (coder_parameter) that become form fields in the UI &#8212; your API keys, your Git name, your LLM model choice</p></li><li><p>Creates <strong>Docker volumes</strong> for /home/coder (your code and env files) and /var/lib/docker (the inner Docker image cache)</p></li><li><p>Spins up a <strong>privileged workspace container</strong> with its own Docker daemon inside (DinD)</p></li><li><p>Runs a <strong>startup script</strong> that installs Docker Engine, clones the repo, writes airflow-plugin.env from your parameters, and launches just airflow</p></li><li><p>Registers a <strong>coder_app</strong> that tells Coder where to proxy the Airflow UI</p></li></ul><p>For private repositories, you add a gitlab_token or github_token parameter and embed it in the clone URL:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;7987bc5f-6a9d-4245-933f-565a21767a78&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">git clone &#8220;https://oauth2:${TOKEN}@gitlab.com/yourorg/yourrepo.git&#8221;</code></pre></div><p>The token gets injected at workspace creation time and never lives anywhere outside the container.</p><h3>Walking Through the Template</h3><p>Let&#8217;s look at what the template actually does, piece by piece.</p><p><strong>Parameters</strong> are declared at the top as coder_parameter blocks. Each one becomes a form field when a developer creates a workspace. Here we collect the Git name, the LLM model ID, and whichever API keys are needed depending on whether you&#8217;re using Anthropic, OpenAI, or Amazon Bedrock. Parameters can have defaults, descriptions, and validation &#8212; they&#8217;re the clean interface between &#8220;what Coder knows&#8221; and &#8220;what the developer provides.&#8221;</p><p><strong>Volumes</strong> come next. We create two named Docker volumes per workspace. home_volume mounts at /home/coder and holds everything the developer touches &#8212; the cloned repo, the generated .env file, any local changes. docker_data_volume mounts at /var/lib/docker inside the workspace container, which is where the inner Docker daemon stores its image cache, container state, and named volumes (including Postgres data). Both volumes survive workspace stops and restarts, so your data is never lost between sessions.</p><p><strong>The workspace container</strong> is a codercom/enterprise-base:ubuntu image running with privileged = true. The privileged flag is what makes Docker-in-Docker possible &#8212; it allows the container to run its own kernel namespaces and mount its own filesystems. The entrypoint creates the repo directory, fixes ownership, and then hands off to the Coder agent init script. Notice the replace() call that rewrites localhost to host.docker.internal &#8212; this ensures the agent can phone home to the Coder server running on your Mac, not try to reach itself.</p><p><strong>The startup script</strong> runs once the agent is up. It installs Docker Engine from the official Docker apt repository (not the system package, which is often outdated), adds the coder user to the docker group, starts the daemon, clones the repo, and then writes airflow-plugin.env by copying the test env file and injecting each parameter value using a delete-then-append pattern:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;7556e620-7153-4537-8a19-eb22a71ffe76&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">sed -i &#8216;/^ANTHROPIC_API_KEY=/d&#8217; airflow-plugin.env
echo &#8220;ANTHROPIC_API_KEY=${data.coder_parameter.anthropic_api_key.value}&#8221; &gt;&gt; airflow-plugin.env</code></pre></div><p>This is more reliable than sed replace because it works regardless of whether the key already exists or is blank in the source file. We also add a blank line after the copy step &#8212; without it, if the source file has no trailing newline, your first appended key gets concatenated onto the last existing line.</p><p>Finally, the script runs exec sg docker &#8220;cd $HOME/$REPO_DIR &amp;&amp; just airflow&#8221;. The sg docker part activates the docker group membership immediately without needing a new login session &#8212; a common gotcha with Docker-in-Docker setups where usermod -aG docker doesn&#8217;t take effect until the next login.</p><p><strong>The coder_app resource</strong> registers the Airflow UI with Coder. With subdomain = true, Coder proxies it through http://airflow--yourusername--coder.localhost:3000/ &#8212; the wildcard DNS entry you configured when starting the server. The URL points to localhost:8088 because the repo&#8217;s docker-compose maps the webserver&#8217;s internal port 8080 to 8088 on the workspace container&#8217;s network.</p><p>One thing worth noting: this setup runs the full Docker daemon inside every workspace container, and each workspace pulls and caches its own images. For a small team of engineers it&#8217;s perfectly fine. For a setup with hundreds of developers, you&#8217;d want to think about shared image registries, resource limits, and a proper Coder deployment on a server rather than everyone&#8217;s laptop. We&#8217;ll cover exactly that in a future post &#8212; different workspace architectures, how to right-size environments for different roles, and how to deploy Coder in production so your whole team can use it without running anything locally at all.</p><div><hr></div><h3><strong>Workspace Architecture</strong></h3><p>Here&#8217;s what&#8217;s actually running when your workspace is up:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;daaf540b-e3e6-4614-b359-0d900393297e&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Mac (host)
&#9492;&#9472;&#9472; Docker Desktop
    &#9492;&#9472;&#9472; coder-yourusername-myworkspace (workspace container, privileged)
        &#9492;&#9472;&#9472; Inner Docker daemon (/var/lib/docker on persistent volume)
            &#9500;&#9472;&#9472; airflow-webserver  &#8594; exposed on workspace's localhost:8088
            &#9500;&#9472;&#9472; airflow-scheduler
            &#9500;&#9472;&#9472; airflow-worker
            &#9500;&#9472;&#9472; postgres           &#8594; state persists across restarts
            &#9492;&#9472;&#9472; redis:7</code></pre></div><p>The workspace container runs with privileged = true, which lets it run its own Docker daemon. All the Airflow containers are siblings inside that inner daemon &#8212; they share a bridge network and can reach each other by service name. From the outside, Coder&#8217;s agent proxies localhost:8088 on the workspace container through the wildcard subdomain to your browser.</p><p>Because /var/lib/docker is a named Docker volume, the inner daemon&#8217;s image cache survives workspace restarts. The first cold start pulls ~1GB of Airflow images. Every restart after that is fast.</p><p>Because /home/coder is also a named volume, your cloned repo, your airflow-plugin.env, and any local changes persist between restarts too.</p><div><hr></div><h3><strong>What&#8217;s Coming Next</strong></h3><p>This is the first post in a series on managing data engineering development environments with Coder. Coming up:</p><ul><li><p><strong>dbt workspaces</strong> &#8212; same pattern, different stack, with dbt docs served as a Coder app</p></li><li><p><strong>AI-assisted development with LiteLLM</strong> &#8212; routing Claude Code through a self-hosted LiteLLM proxy so your API keys stay centralized and usage is tracked per developer</p></li><li><p><strong>Multiple workspace types</strong> &#8212; how to run lightweight workspaces for analysts alongside heavy workspaces for engineers, all from the same Coder deployment</p></li><li><p><strong>Production deployment</strong> &#8212; moving from coder server on your laptop to a proper deployment behind a reverse proxy, with wildcard DNS, persistent Postgres, and workspace autostop policies to keep costs down</p></li></ul><p>The full template is in the repository. If you run into issues, the most common ones are covered in the troubleshooting section of the README.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The End-to-End Semantic Layer]]></title><description><![CDATA[From dbt to Cube, and Back to dbt]]></description><link>https://newsletter.ponder.co/p/the-end-to-end-semantic-layer</link><guid isPermaLink="false">https://newsletter.ponder.co/p/the-end-to-end-semantic-layer</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Wed, 27 May 2026 12:03:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BcOb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BcOb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BcOb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BcOb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1268048,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/199450577?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BcOb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!BcOb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e16a4f1-84e3-4486-bc50-397d9407ee20_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Rebuilding the same semantic layer over and over across different BI tools has always felt unnecessarily painful. Most dashboards still reach directly into databases, each with their own idea of what a &#8220;metric&#8221; is, so you end up maintaining the same logic in three or four places.</p><p>Late last year, out of frustration, we built<a href="https://www.google.com/search?q=%5Bhttps://github.com/ponderedw/dbt-to-cube%5D(https://github.com/ponderedw/dbt-to-cube)"> dbt-to-cube</a> to see whether dbt, Cube.js, and Superset could be wired together into a single automated flow. It worked: define metrics once in dbt, let a small tool translate them to Cube.js, and push them into your BI tool of choice&#8212;giving you a unified semantic layer across Superset, Tableau, or PowerBI without manual duplication.</p><p>But as we started relying heavily on this code-first workflow at Ponder Labs, a glaring logical gap emerged.</p><p>It&#8217;s great that downstream BI tools can query these unified metrics. But what about using those metrics <em>inside dbt itself</em>? If I wanted to build an aggregated reporting mart or feed a downstream process within my dbt pipeline, I still had to manually rewrite the SUM() or AVG() aggregations in my SQL, breaking the &#8220;define it once&#8221; rule. I wanted the metrics defined for Cube to be queryable natively in my dbt DAG.</p><p>That&#8217;s exactly why I built the next piece of the puzzle:<a href="https://www.google.com/search?q=%5Bhttps://github.com/ponderedw/dbt_simple_metrics%5D(https://github.com/ponderedw/dbt_simple_metrics)"> dbt_simple_metrics</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3><strong>The Solution: Metrics as Code Inside dbt</strong></h3><p>dbt_simple_metrics is a lightweight dbt package that lets you generate aggregated SQL from metric definitions sitting directly inside your model YAML files. Instead of navigating a heavy, standalone semantic layer setup, your columns and metrics live together, and you reuse them across your marts with a single macro call.</p><p>In our simplified format, we keep things incredibly close to the data. You define the dimensions under columns, and your measures under config.meta.metrics. It looks like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;3113ff39-d250-4d57-b250-a51e56499921&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">version: 2
models:
  - name: course_performance_summary
    columns:
      - name: course_name
      - name: academic_year
      - name: total_enrollments
    config:
      meta:
        metrics:
          total_course_enrollments:
            type: sum
            label: &#8220;Total Course Enrollments&#8221;
            sql: ${total_enrollments}</code></pre></div><p>Now, instead of manually writing aggregations in your downstream models, you simply call the macro. The package validates the dimensions and metrics at compile time and generates the proper GROUP BY SQL:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9e19827d-4c76-4625-ae4e-13c7bccc4237&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">{{ config(materialized=&#8217;table&#8217;) }}
{{ dbt_simple_metrics.metrics(
    &#8216;course_performance_summary&#8217;,
    [&#8217;course_name&#8217;, &#8216;academic_year&#8217;],
    [&#8217;total_course_enrollments&#8217;]
) }}</code></pre></div><p>If you misspell a dimension or an unknown metric is requested, you get a clear compile-time error rather than a runtime failure.</p><h3><strong>The Elephant in the Room: MetricFlow</strong></h3><p>If you are immersed in the dbt ecosystem, you are likely wondering: <em>Doesn&#8217;t dbt already have a Semantic Layer with MetricFlow?</em></p><p>It does. In fact, if you look at the semantic_models.yml file in the dbt_simple_metrics repository, you&#8217;ll see we actually included the MetricFlow definitions. We added them specifically so you can still see your metrics natively in dbt docs and the dbt Cloud catalog.</p><p>However, that file is an example of the <em>legacy</em> MetricFlow format. And honestly, it highlights exactly why we built our package. The old spec forces you to define a top-level semantic_models block entirely separate from your actual data models, with verbose, disconnected metrics configurations that look like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;d3dde70f-b863-41ec-bbfc-ddaf3b587263&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml"># The Legacy MetricFlow Format
metrics:
  - name: total_semester_headcount
    type: simple
    type_params:
      measure: total_unique_students
  - name: deans_list_rate
    type: ratio
    type_params:
      numerator: total_deans_list
      denominator: total_semester_headcount</code></pre></div><p>It works for populating a catalog, but it feels detached from the code-first, model-centric workflow developers actually want.</p><h3><strong>Ahead of the Curve: Preparing for MetricFlow v2.0</strong></h3><p>Here is the good news: dbt Labs recognizes this friction.</p><p>With the upcoming release of dbt 1.12, they are stabilizing<a href="https://docs.getdbt.com/docs/build/latest-metrics-spec?version=2.0"> MetricFlow spec version 2.0</a>. If you look at the differences, dbt is completely overhauling their approach to look... exactly like what we are already doing. They are abandoning the disconnected top-level wrappers and moving to embed semantic annotations (like semantic_model and simple metrics) directly under the models: block.</p><p>By adopting dbt_simple_metrics today, you aren&#8217;t fighting against the dbt ecosystem; you are skating to where the puck is going. You get the clean, embedded syntax that dbt is moving toward, with the immediate benefit of native dbt querying and automated syncing to Cube.js today.</p><p>And naturally, once dbt 1.12 becomes stable, we will be updating the package to ensure full, seamless compatibility with the final v2.0 spec.</p><h3><strong>Quickstart &amp; Installation</strong></h3><p>To start using it in your dbt project and close the loop on your semantic layer, add the git repository and the specific revision to your packages.yml:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;yaml&quot;,&quot;nodeId&quot;:&quot;265151b7-bf20-43af-93e5-a6cf3056abeb&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-yaml">packages:
  - git: &#8220;https://github.com/ponderedw/dbt_simple_metrics.git&#8221;
    revision: v1.0.3</code></pre></div><p>Run dbt deps, and you&#8217;re ready to start calling the macro in your marts.</p><p>At Ponder Labs, we are constantly pushing the boundaries of what code-first orchestration can do, and eliminating redundant metric definitions has been a massive win for our data engineering workflows.</p><p>Give the package a try, and let me know what you think on GitHub&#8212;PRs, feedback, and feature requests are always welcome!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hive Data Ingestion, Simplified]]></title><description><![CDATA[From raw S3 files to analytics-ready tables with Trino, dbt, and AWS Glue Catalog]]></description><link>https://newsletter.ponder.co/p/hive-data-ingestion-simplified</link><guid isPermaLink="false">https://newsletter.ponder.co/p/hive-data-ingestion-simplified</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 12 May 2026 12:32:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TtFp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TtFp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TtFp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TtFp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png" width="408" height="272.0934065934066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:408,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TtFp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!TtFp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F428cac19-5666-4863-a040-162957ec2d5f_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>Introduction</strong></h1><p>Data ingestion is rarely glamorous &#8212; but getting it right is everything. In a<a href="https://newsletter.ponder.co/p/trino-dbt-simplifying-elt-with-pure"> previous post</a>, we explored batch data ingestion using Trino and dbt with a relational database as the source. But real-world data pipelines are messier: files land in S3 buckets from various sources, in various formats, and you need a reliable, manageable way to bring them into your Data Lake.</p><p>The natural question is: why not just create an external schema and table directly? You absolutely can &#8212; and in many cases, you should. But there are scenarios where that approach introduces more friction than it solves:</p><ul><li><p>Managing permissions between database users, IAM roles, and S3 buckets can become a tangled, error-prone mess</p></li><li><p>Each warehouse (Redshift, BigQuery, Snowflake) handles external tables differently, making your pipeline harder to standardize</p></li><li><p>Ingestion logic scattered across SQL scripts and cloud consoles is difficult to version, test, and maintain</p></li><li><p>Onboarding new data sources requires touching infrastructure, not just code</p></li></ul><p>We&#8217;re also familiar with the<a href="https://github.com/dbt-labs/dbt-external-tables"> dbt-redshift external tables package</a>, and while it&#8217;s a clever solution, it introduces a fundamental design concern: <strong>dbt shouldn&#8217;t be responsible for managing sources.</strong> Sources are meant to be stable, pre-existing references that dbt reads from &#8212; not objects that dbt creates or controls. When dbt starts owning source definitions, the line between infrastructure and transformation blurs, making pipelines harder to reason about, debug, and hand off to other teams. Models should run and transform; sources should simply exist.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1><strong>Why Hive?</strong></h1><p>Apache Hive has been around since 2008, originally developed at Facebook to bring SQL-like querying to Hadoop&#8217;s distributed file system. At its core, Hive introduced a revolutionary idea: separate the <strong>metadata</strong> (where the data lives, how it&#8217;s structured, what format it&#8217;s in) from the <strong>data itself</strong>. This metadata layer &#8212; the Hive Metastore &#8212; became the backbone of the Hadoop ecosystem and eventually the de facto standard for Data Lake table management, adopted by virtually every major distributed query engine, including Spark, Presto, and later Trino.</p><p>Over time, more modern table formats emerged to address Hive&#8217;s limitations. <strong>Apache Iceberg</strong>, for example, was designed to handle the pain points that Hive struggled with at scale: full ACID transactions, reliable schema evolution, time travel, and efficient handling of billions of files. Iceberg is undeniably powerful &#8212; and if you&#8217;re building a large-scale, write-heavy lakehouse with complex update and delete patterns, it&#8217;s likely the better choice.</p><p>But here&#8217;s the thing: <strong>Hive&#8217;s simplicity is a feature, not a bug.</strong> Iceberg&#8217;s richness comes with real operational overhead &#8212; more configuration, more moving parts, and a steeper learning curve. When your goal is straightforward S3 file ingestion without complex upserts or time travel requirements, Iceberg can feel like bringing a sledgehammer to crack a nut. Hive&#8217;s loss in the feature war is our gain in the simplicity game.</p><p>This is where Hive shines. By leveraging Hive Metastore alongside AWS Glue Catalog as the metadata layer, we can define, manage, and transform S3 data in a consistent, code-first way &#8212; entirely within dbt. No console gymnastics, no permission rabbit holes. Sources remain untouched and independently managed, while dbt focuses on what it does best: running transformations.</p><p>That said, Hive isn&#8217;t a silver bullet:</p><ul><li><p>It adds an extra layer to your stack, which means more components to monitor and maintain</p></li><li><p>Query performance on very large, unpartitioned datasets can lag behind native warehouse solutions</p></li><li><p>It works best when you&#8217;re already operating within the AWS ecosystem &#8212; outside of it, the setup overhead may not be worth it</p></li><li><p>Schema evolution (adding/changing columns) requires careful handling to avoid breaking downstream models</p></li></ul><p>If you&#8217;re already working in AWS and want to manage your ingestion logic cleanly in dbt, Hive is a natural, battle-tested fit. Let&#8217;s walk through how we set it all up.</p><h1><strong>Hive-Trino Setup</strong></h1><p>With the &#8220;why&#8221; out of the way, let&#8217;s get our hands dirty. The setup boils down to two things: telling Trino how to talk to Hive via AWS Glue, and giving the right IAM permissions to make it all work.</p><p><strong>1. Adding the Hive Catalog to Trino</strong></p><p>Trino uses catalog configuration files to connect to different data sources. To wire up Hive with AWS Glue as the metastore, add the following catalog:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;b6744bac-767b-41ff-929c-20c86bc45fe1&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">s3_source_files_hive: |
    connector.name=hive
    hive.metastore=glue
    hive.metastore.glue.aws-access-key=${aws_access_key_hive}
    hive.metastore.glue.aws-secret-key=${aws_secret_key_hive}
    hive.metastore.glue.region=us-east-1
    fs.native-s3.enabled=true
    s3.aws-access-key=${aws_access_key_hive}
    s3.aws-secret-key=${aws_secret_key_hive}
    s3.region=us-east-1
    s3.path-style-access=true</code></pre></div><p>    A few things worth noting here:</p><ul><li><p>hive.metastore=glue is the key line &#8212; it tells Trino to use AWS Glue Catalog instead of a self-hosted Hive Metastore, which saves you from spinning up and maintaining yet another service</p></li><li><p>fs.native-s3.enabled=true enables Trino&#8217;s native S3 filesystem, which is more performant and reliable than the legacy Hadoop-based S3 driver</p></li><li><p>Credentials are injected via environment variables, keeping secrets out of your config files &#8212; make sure these are properly set in your Trino deployment</p></li></ul><p><strong>2. IAM Policy</strong></p><p>The catalog configuration alone isn&#8217;t enough &#8212; the IAM user referenced by those credentials needs the right permissions to both read/write from S3 and interact with the Glue Catalog. Attach the following policy:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f9485ee5-b649-49db-b697-6e86ab874efe&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">{
    &#8220;Version&#8221;: &#8220;2012-10-17&#8221;,
    &#8220;Statement&#8221;: [
        {
            &#8220;Sid&#8221;: &#8220;S3DataReadWrite&#8221;,
            &#8220;Effect&#8221;: &#8220;Allow&#8221;,
            &#8220;Action&#8221;: [
                &#8220;s3:GetBucketLocation&#8221;,
                &#8220;s3:ListBucket&#8221;,
                &#8220;s3:GetObject&#8221;,
                &#8220;s3:PutObject&#8221;,
                &#8220;s3:DeleteObject&#8221;
            ],
            &#8220;Resource&#8221;: [
                &#8220;arn:aws:s3:::source-files-hive&#8221;,
                &#8220;arn:aws:s3:::source-files-hive/*&#8221;
            ]
        },
        {
            &#8220;Sid&#8221;: &#8220;GlueMetadataReadWrite&#8221;,
            &#8220;Effect&#8221;: &#8220;Allow&#8221;,
            &#8220;Action&#8221;: [
                &#8220;glue:GetDatabase&#8221;,
                &#8220;glue:GetDatabases&#8221;,
                &#8220;glue:CreateDatabase&#8221;,
                &#8220;glue:GetTable&#8221;,
                &#8220;glue:GetTables&#8221;,
                &#8220;glue:CreateTable&#8221;,
                &#8220;glue:UpdateTable&#8221;,
                &#8220;glue:DeleteTable&#8221;,
                &#8220;glue:GetPartition&#8221;,
                &#8220;glue:GetPartitions&#8221;,
                &#8220;glue:CreatePartition&#8221;,
                &#8220;glue:BatchCreatePartition&#8221;,
                &#8220;glue:DeletePartition&#8221;,
                &#8220;glue:BatchDeletePartition&#8221;
            ],
            &#8220;Resource&#8221;: [
                &#8220;arn:aws:glue:us-east-1:&lt;account_id&gt;:catalog&#8221;,
                &#8220;arn:aws:glue:us-east-1:&lt;account_id&gt;:database/s3_source_files_hive&#8221;,
                &#8220;arn:aws:glue:us-east-1:&lt;account_id&gt;:table/s3_source_files_hive/*&#8221;
            ]
        }
    ]
}</code></pre></div><p>    The policy is split into two clear responsibilities:</p><ul><li><p><strong>S3DataReadWrite</strong> &#8212; grants access to the source-files-hive bucket, which is where your raw source files will be initially dropped. Trino needs read access to query them and write access to manage any intermediate outputs</p></li><li><p><strong>GlueMetadataReadWrite</strong> &#8212; grants Trino the ability to interact with Glue Catalog: reading and creating databases, managing tables, and handling partitions. Notice the resources are intentionally scoped to the s3_source_files_hive database only &#8212; following the principle of least privilege, we don&#8217;t hand out catalog-wide permissions</p></li></ul><blockquote><p>&#128161; <strong>Tip:</strong> Replace &lt;account_id&gt; with your actual AWS account ID before applying the policy. If you&#8217;re managing this via Terraform or CloudFormation, this is a good candidate for a variable substitution.</p></blockquote><p>With the catalog registered and IAM permissions in place, Trino can now discover and query any Hive tables registered in your Glue Catalog. Next, let&#8217;s look at how dbt fits into the picture.</p><h1><strong>dbt Integration</strong></h1><p>Now that Trino can talk to Glue and read from S3, we need to bridge the last gap: making dbt aware of our Hive tables and using them as sources for transformations. The elegant part of this approach is that we don&#8217;t register tables manually &#8212; we create them <strong>dynamically</strong> using a dbt macro, triggered as a pre_hook before the model runs.</p><p><strong>1. The Macro</strong></p><p>Add the following macro to your dbt Trino project:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;24559205-2b56-453f-8d11-10b2effc9372&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">{% macro create_external_hive_table(model_name, schema_definition, s3_location) %}
    {% set target_relation = &#8220;s3_source_files_hive.s3_source_files_hive.&#8221; ~ model_name %}
    {% set sql %}
        DROP TABLE IF EXISTS {{ target_relation }};
        CREATE TABLE {{ target_relation }} (
            {{ schema_definition }}
        )
        WITH (
            external_location = &#8216;{{ s3_location }}&#8217;,
            format = &#8216;CSV&#8217;,
            skip_header_line_count = 1
        )
    {% endset %}
    {% if execute %}
        {% do run_query(sql) %}
        {{ log(&#8221;Created Hive Table: &#8220; ~ target_relation, info=True) }}
    {% endif %}
    {{ return(&#8221;SELECT 1&#8221;) }}
{% endmacro %}</code></pre></div><p>    Let&#8217;s break down what&#8217;s happening here:</p><ul><li><p><strong>target_relation</strong> &#8212; builds the fully qualified table name in the format catalog.database.table, pointing directly at our s3_source_files_hive catalog and database</p></li><li><p><strong>DROP TABLE IF EXISTS</strong> &#8212; ensures idempotency. Every time the model runs, the Hive table is recreated fresh. This is intentional: if the S3 files or schema change, the table definition stays in sync</p></li><li><p><strong>CREATE TABLE ... WITH (...)</strong> &#8212; this is a Hive external table definition. The key properties are:</p><ul><li><p>external_location &#8212; the S3 path where the raw files live. Hive doesn&#8217;t move or copy the data, it simply points to it</p></li><li><p>format = &#8216;CSV&#8217; &#8212; tells Hive how to parse the files. This can be swapped for ORC, PARQUET, JSON, etc. depending on your source files</p></li><li><p>skip_header_line_count = 1 &#8212; skips the first row of the CSV, assuming it contains column headers</p></li></ul></li><li><p><strong>{% if execute %}</strong> &#8212; a dbt guard that prevents the macro from running during the parsing/compilation phase, only firing during actual execution</p></li><li><p><strong>run_query(sql)</strong> &#8212; executes the DDL statement against Trino</p></li><li><p><strong>return(&#8221;SELECT 1&#8221;)</strong> &#8212; macros used in pre_hook must return a valid SQL string. Returning SELECT 1 is a clean no-op that satisfies this requirement without side effects</p></li></ul><p><strong>2. The Model</strong></p><p>With the macro in place, here&#8217;s how a dbt model using it looks:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;8c0e6beb-d67f-4f05-bf74-f76c82e192d2&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">{%- set hive_table = &#8220;table_name&#8221; -%}
{{
    config(
        alias=hive_table,
        pre_hook=create_external_hive_table(
            model_name=hive_table,
            schema_definition=&#8221;
                column1 VARCHAR,
                column2 VARCHAR,
                column3 VARCHAR,
                column4 VARCHAR&#8221;,
            s3_location=&#8221;s3://source-files-hive/table_folder/&#8221;
        )
    )
}}
select
    *,
    current_date as ingested_at
from
    s3_source_files_hive.s3_source_files_hive.{{ hive_table }}</code></pre></div><p>Here&#8217;s the flow this model follows when dbt runs it:</p><ol><li><p><strong>pre_hook fires</strong> &#8212; before anything else, create_external_hive_table is called, dropping and recreating the Hive external table in Glue Catalog, pointed at the S3 location</p></li><li><p><strong>The model runs</strong> &#8212; dbt executes the SELECT statement, reading directly from the freshly registered Hive table, which transparently reads the CSV files from S3</p></li><li><p><strong>current_date as ingested_at</strong> &#8212; a small but important addition: we stamp every ingested row with the current date, giving us a simple audit trail of when the data was loaded</p></li></ol><blockquote><p>&#128161; <strong>Tip:</strong> Notice that the model name is defined once as a variable (hive_table) and reused in both the config block and the FROM clause. This keeps things DRY &#8212; if you rename the table, you change it in one place only.</p></blockquote><p>This pattern keeps the separation of concerns intact: the macro handles infrastructure (table registration), and the model handles transformation. dbt does what dbt is supposed to do &#8212; and nothing more.</p><h1>A Real-World Example: School Network Data Ingestion</h1><p>To make this concrete, consider a large school network &#8211; say, 50+ schools across a district &#8211; already operating within AWS. Their data team is responsible for centralizing student, staff, and assessment data from a patchwork of source systems: a Student Information System, an HR platform, and several third-party assessment providers.</p><p>None of these systems share a common integration standard. What they do all share: a scheduled CSV export, dropped into S3.</p><p>Here&#8217;s what that might look like in practice:</p><p>s3://source-files-hive/</p><p>&#9500;&#9472;&#9472; students/</p><p>&#9500;&#9472;&#9472; staff/</p><p>&#9492;&#9472;&#9472; assessments/</p><p>Each folder receives nightly file drops from the respective source system. The data team defines one dbt model per source, each invoking the same create_external_hive_table macro:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;b29fb00a-839d-4a08-a8fa-12f59b01c822&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">sql{%- set hive_table = &#8220;students&#8221; -%}
{{
    config(
        alias=hive_table,
        pre_hook=create_external_hive_table(
            model_name=hive_table,
            schema_definition=&#8221;
                student_id VARCHAR,
                first_name VARCHAR,
                last_name VARCHAR,
                date_of_birth VARCHAR,
                enrollment_status VARCHAR,
                school_id VARCHAR&#8221;,
            s3_location=&#8221;s3://source-files-hive/students/&#8221;
        )
    )
}}
select
    *,
    current_date as ingested_at
from
    s3_source_files_hive.s3_source_files_hive.{{ hive_table }}</code></pre></div><p></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9bc287c0-8fa3-408a-bd72-6e51316738d6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">sql{%- set hive_table = &#8220;staff&#8221; -%}
{{
    config(
        alias=hive_table,
        pre_hook=create_external_hive_table(
            model_name=hive_table,
            schema_definition=&#8221;
                staff_id VARCHAR,
                full_name VARCHAR,
                role VARCHAR,
                department VARCHAR,
                school_id VARCHAR,
                employment_status VARCHAR&#8221;,
            s3_location=&#8221;s3://source-files-hive/staff/&#8221;
        )
    )
}}
select
    *,
    current_date as ingested_at
from
    s3_source_files_hive.s3_source_files_hive.{{ hive_table }}</code></pre></div><p></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;80e08378-0da5-40e1-b575-ae31e5bc4a59&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">sql{%- set hive_table = &#8220;assessments&#8221; -%}
{{
    config(
        alias=hive_table,
        pre_hook=create_external_hive_table(
            model_name=hive_table,
            schema_definition=&#8221;
                assessment_id VARCHAR,
                student_id VARCHAR,
                subject VARCHAR,
                score VARCHAR,
                max_score VARCHAR,
                assessment_date VARCHAR,
                school_id VARCHAR&#8221;,
            s3_location=&#8221;s3://source-files-hive/assessments/&#8221;
        )
    )
}}
select
    *,
    current_date as ingested_at
from
    s3_source_files_hive.s3_source_files_hive.{{ hive_table }}</code></pre></div><p>The result: three clean, independently managed source tables, registered automatically on each dbt run, with zero manual intervention. The data team can onboard a new source system &#8211; say, a library platform or a special education tracking tool &#8211; by adding a single model file and an S3 folder. No console access required, no infrastructure tickets, no cross-team dependency on a cloud engineer to wire up permissions.</p><p>Downstream, dbt models join students, staff, and assessments to produce analytics-ready datasets: attendance summaries, assessment score trends by school, staff-to-student ratios. The ingestion layer stays untouched &#8211; it simply exists, and the transformation layer builds on top of it.</p><h1><strong>Summary</strong></h1><p>Data ingestion doesn&#8217;t have to be complicated. In this post, we walked through a clean, practical approach to bringing raw S3 files into a queryable Data Lake &#8212; without overengineering the pipeline or blurring the lines between infrastructure and transformation.</p><p>Here&#8217;s what we covered:</p><ul><li><p><strong>Why Hive over alternatives</strong> &#8212; Hive&#8217;s maturity and simplicity make it a natural fit for straightforward S3 ingestion. Where Iceberg wins on features, Hive wins on pragmatism. When you don&#8217;t need ACID transactions or time travel, there&#8217;s no reason to pay the complexity tax</p></li><li><p><strong>Why not external tables or dbt-redshift packages</strong> &#8212; external tables introduce permission headaches and lack standardization across warehouses. The dbt external tables package, while clever, violates a core dbt principle: sources should exist independently, not be managed by the transformation layer</p></li><li><p><strong>Trino + AWS Glue Catalog</strong> &#8212; by configuring a Hive catalog in Trino and pointing it at Glue, we get a fully managed, serverless metastore without spinning up any additional infrastructure. A tightly scoped IAM policy keeps things secure and follows the principle of least privilege</p></li><li><p><strong>Dynamic table creation with dbt macros</strong> &#8212; instead of manually registering Hive tables, a single reusable macro handles the DDL as a pre_hook, keeping table definitions in sync with your S3 files on every run</p></li><li><p><strong>Clean separation of concerns</strong> &#8212; the macro owns infrastructure, the model owns transformation. dbt stays in its lane, and your pipeline stays maintainable</p></li></ul><p>The result is a lightweight, reproducible, and version-controlled ingestion pipeline that lives entirely in your dbt project &#8212; no console gymnastics, no permission rabbit holes, no overengineering.</p><p>If you&#8217;re already running Trino on AWS and want a simple on-ramp for S3 file ingestion, this stack is hard to beat. As always, the best pipeline is the one your team can actually understand, maintain, and extend &#8212; and this one fits that bill.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[PowerSchool to Lakehouse: Student Data at Uncommon Schools]]></title><description><![CDATA[How Trino enables low-latency ingestion of student records at scale]]></description><link>https://newsletter.ponder.co/p/powerschool-to-lakehouse-student</link><guid isPermaLink="false">https://newsletter.ponder.co/p/powerschool-to-lakehouse-student</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Wed, 06 May 2026 10:04:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MnUo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p style="text-align: center;"></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MnUo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MnUo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MnUo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png" width="492" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:492,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MnUo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 424w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 848w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 1272w, https://substackcdn.com/image/fetch/$s_!MnUo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9725f7f5-709f-46e2-954a-05f7336fc8e6_2048x2048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>Like many Charter Management Organizations (CMOs) across the U.S., Uncommon Schools relies on PowerSchool as its Student Information System (SIS) -- the system of record for student enrollment, demographics, attendance, grades, and scheduling. While PowerSchool is critical for day-to-day school operations, it wasn&#8217;t designed for fast, large-scale analytics use cases.</p><p>Under the hood, PowerSchool stores its data in an Oracle database, which makes extracting large tables -- like Students -- surprisingly slow when using conventional approaches.</p><p>In this post, I&#8217;ll walk through how we reduced ingestion time for the Students table from nearly 50 minutes to under a minute. We achieved this by migrating from a custom Python-based pipeline to Trino, enabling significantly faster data access and simpler ingestion logic. Along the way, I&#8217;ll share a few practical techniques to speed up data extraction -- not just in Oracle, but in any database system that supports procedural logic.</p><p>This work builds on ideas we explored in our earlier post, <a href="https://newsletter.ponder.co/p/trino-dbt-simplifying-elt-with-pure">Trino + dbt: Simplifying ELT with Pure SQL</a>, where we showed how combining Trino and dbt can simplify ingestion, improve reliability, and unify ingestion with transformation workflows. Here, we take that foundation further -- focusing on performance, real-world constraints, and how to make ingestion not just simpler, but dramatically faster.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/p/powerschool-to-lakehouse-student?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/p/powerschool-to-lakehouse-student?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://newsletter.ponder.co/p/powerschool-to-lakehouse-student?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h1>The Original Pipeline: Where We Started</h1><p>Our initial approach was built around a containerized extraction layer. We created a custom Docker image based on an Oracle Instant Client setup, which allowed us to connect directly to the PowerSchool Oracle database and run extraction queries. This image included Python, SQL*Plus, and a set of internal scripts used to execute parameterized queries and export data.</p><p>We orchestrated everything with Airflow, where each table ingestion was defined as a separate task in a DAG. Each task would spin up a container (via ECS/EKS) using our custom operator, ensuring that extraction workloads didn&#8217;t run on Airflow workers themselves but instead executed in isolated pods. This design gave us scalability and parallelism&#8212;but also introduced operational complexity.</p><p>To control what data gets extracted, we relied on SQL templates. Each table had its own query template, dynamically parameterized (e.g., by PowerSchool instance), and executed inside the container. For example, the Students table template included not only direct column selections, but also calls to Oracle PL/SQL functions like <strong>ps_customfields.getStudentsCF</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nNVI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nNVI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 424w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 848w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nNVI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png" width="1456" height="1039" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1039,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nNVI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 424w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 848w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!nNVI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41061c50-2668-4509-82bf-e8fbb8ba146e_1564x1116.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These functions are part of PowerSchool&#8217;s internal logic layer and allow access to data that isn&#8217;t physically stored in the base tables. While this gave us flexibility and completeness, it also came at a significant performance cost&#8212;each function call is effectively an additional computation executed per row.</p><p>Over time, several issues with this approach became clear:</p><ul><li><p><strong>Lack of lineage and validation</strong>: Changes to SQL templates were difficult to track and validate against downstream models. A simple column removal could silently break transformations later in the pipeline.</p></li><li><p><strong>Operational overhead</strong>: Each table required its own Airflow task and container. With ~30 tables, this meant dozens of parallel pods, making logs harder to read and increasing pressure on orchestration infrastructure.</p></li><li><p><strong>Performance bottlenecks</strong>: The biggest issue&#8212;queries were slow. Very slow. Extracting the Students table for a single instance could take up to <strong>50&#8211;60 minutes</strong>, largely due to heavy use of PL/SQL functions and row-by-row processing.</p></li></ul><p>In short, while the pipeline worked, it wasn&#8217;t scalable, transparent, or fast enough for our needs.</p><h1>The New Approach: Fast Ingestion with Trino</h1><p>To address the limitations of our original pipeline, we leaned into the approach we described in our previous post, Trino + dbt: Simplifying ELT with Pure SQL. The core idea is simple but powerful: move ingestion logic into SQL, unify it with transformation workflows in dbt, and let Trino handle execution across systems.</p><p>This shift solved several problems at once.</p><p>First, <strong>unpredictable production issues</strong> became much easier to manage. By bringing ingestion into dbt, we gained lineage, dependency tracking, and the ability to validate changes before they reach production. Instead of discovering issues at runtime, we can now catch them during development or CI &#8211; exactly the gap we highlighted in our earlier work.</p><p>Second, we eliminated the overhead of &#8220;millions of tasks and pods.&#8221; Instead of running one Airflow task per table (and spawning dozens of containers), we now have a <strong>single Airflow task</strong> that triggers a dbt run. Within that run, dbt executes multiple models concurrently using threads &#8211; all inside a single pod. This dramatically simplifies orchestration, improves observability, and reduces load on both Airflow and our container infrastructure.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZgcS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZgcS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 424w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 848w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZgcS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png" width="406" height="192" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:192,&quot;width&quot;:406,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZgcS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 424w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 848w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 1272w, https://substackcdn.com/image/fetch/$s_!ZgcS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab340e8b-1bf2-4cec-a13e-fb76ad6ecdca_406x192.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>But the biggest win came from <strong>query performance</strong>.</p><p>In the new approach, the ingestion logic is written as a dbt model that uses Trino&#8217;s system.query to push down execution directly to Oracle. Instead of relying heavily on row-by-row PL/SQL function calls, we restructured the query to:</p><p><strong>Replace expensive function calls where possible with joins</strong> (e.g., leveraging <strong>studentcorefields</strong>, <strong>vwstudentcorefieldsuc</strong>, and other tables instead of repeatedly calling <strong>ps_customfields.getStudentsCF</strong>)<br></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e2Lc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e2Lc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 424w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 848w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 1272w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e2Lc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png" width="1456" height="199" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:199,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e2Lc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 424w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 848w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 1272w, https://substackcdn.com/image/fetch/$s_!e2Lc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2124c4a-2cdb-4e43-87fa-28c056fd08ee_1696x232.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The result is a much more efficient execution plan: fewer function calls, better use of joins, and improved parallelism across databases.</p><p>Combined with Trino&#8217;s ability to execute queries concurrently and dbt&#8217;s threaded execution model, this reduced the ingestion time for the Students table from nearly an hour to <strong>under a minute</strong>.</p><p>Just as importantly, the pipeline is now <strong>simpler, more maintainable, and fully transparent</strong>. Instead of spreading logic across Docker images, Airflow tasks, and SQL templates, everything lives in version-controlled dbt models&#8212;fully integrated with the rest of the data platform.</p><p>To tie everything together operationally, we also introduced a lightweight custom Airflow operator that runs dbt + Trino workloads inside a single Kubernetes pod:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D6xu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D6xu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 424w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 848w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D6xu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png" width="1386" height="1228" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1228,&quot;width&quot;:1386,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D6xu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 424w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 848w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!D6xu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e50bab-7338-4524-9695-3c5ead6f331b_1386x1228.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Summary</h1><p>Uncommon Schools&#8217; data team cut ingestion time for PowerSchool student records from nearly an hour to under a minute by replacing a custom Python/Docker pipeline with Trino and dbt. The original setup relied on containerized Oracle extractions, row-by-row PL/SQL function calls, and one Airflow task per table &#8212; functional, but slow, hard to maintain, and operationally expensive. The new approach moves ingestion logic into dbt models, uses Trino to push queries directly down to Oracle, and replaces costly function calls with efficient joins. The result is a faster, simpler, and fully version-controlled pipeline where lineage, validation, and transformation all live in one place.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Airflow Schedule Insights: Now Ready for Airflow 3]]></title><description><![CDATA[Example Educational DAGs, Asset Trees, and Full Visibility into Complex Dependencies]]></description><link>https://newsletter.ponder.co/p/airflow-schedule-insights-now-ready</link><guid isPermaLink="false">https://newsletter.ponder.co/p/airflow-schedule-insights-now-ready</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 09 Mar 2026 16:31:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C_Up!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C_Up!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C_Up!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 424w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 848w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 1272w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C_Up!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png" width="1456" height="603" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:603,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!C_Up!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 424w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 848w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 1272w, https://substackcdn.com/image/fetch/$s_!C_Up!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f980f22-7a0b-40d0-8596-1a55bffcb104_1600x663.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When we first introduced <a href="https://newsletter.ponder.co/p/airflow-schedule-insights-how-dr">Airflow Schedule Insights</a>, we told the story of <strong>Dr. Movie</strong>, a cinema chain struggling with a &#8220;scheduling black box.&#8221; They had DAGs that silently refused to run, resource bottlenecks from over-parallelization, and zero visibility into when their next asset-based trigger would actually fire.</p><p>That story helped explain the problem.</p><p>But with <strong>Airflow 3</strong>, we decided to evolve the example environment.</p><p>Instead of fictional cinema DAGs, we now ship <strong>example educational DAGs</strong> that mimic real academic data platform dependency patterns. These DAGs are not production pipelines &#8212; they simply replicate common educational orchestration structures and asset relationships so users can test complex scheduling scenarios in a realistic setting.</p><p>In other words:<br>They copy educational DAG dependency patterns &#8212; not institutional data.</p><p>This makes the demo environment more relatable for universities and training organizations, while remaining lightweight and safe to use as a sandbox.</p><p>And alongside that shift, Schedule Insights v0.2.0 is officially out &#8212; fully migrated, dependency-light, and optimized for Airflow 3.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;dc6f4d8a-ae93-4559-896f-904728f63264&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pip install airflow-schedule-insights</code></pre></div><p>&#128073; GitHub:<a href="https://github.com/ponderedw/airflow-schedule-insights"> https://github.com/ponderedw/airflow-schedule-insights</a><br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zzs4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zzs4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zzs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2968187,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/190402449?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zzs4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!Zzs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4dda100-46d6-43ab-9ce8-06a6316fd41e_800x400.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h1><strong>What Changed in v0.2.0 (Airflow 3 Migration)</strong></h1><p>Under the hood, 22 files changed. If you&#8217;re a plugin developer, these are the silent Airflow 3 metadata changes you need to understand.</p><h2><strong>1&#65039;&#8419; The Great Renaming: Datasets &#8594; Assets</strong></h2><p>Airflow 3 formalized the shift from &#8220;datasets&#8221; to &#8220;assets.&#8221;</p><p>Old:</p><p><strong>task_outlet_dataset_reference</strong></p><p>New:</p><p><strong>task_outlet_asset_reference</strong></p><p>If your plugin queries the metadata DB directly, this rename will break you.</p><div><hr></div><h2><strong>2&#65039;&#8419; Logic Flip: is_active &#8594; is_stale</strong></h2><p>Airflow 2:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;d6dbc973-1112-4f1b-9bbd-b13bce014c37&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">DagModel.is_active == True</code></pre></div><p>Airflow 3:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;bb07eae2-237c-48f4-8ed4-6f160556bd1d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">DagModel.is_stale.is_(False)</code></pre></div><p>The column is gone. The logic is inverted. If you don&#8217;t update this filter, your visibility logic silently fails.</p><div><hr></div><h2><strong>3&#65039;&#8419; Asset Dependencies Are Trees, Not Lists</strong></h2><p>Airflow 3 introduces conditional asset expression9s with nested AND / OR logic.</p><p>Example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;5189e613-55b7-4055-826f-8a98286491e9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">(Asset_A AND (Asset_B OR Asset_C))</code></pre></div><p>This is no longer a flat dependency list.</p><p>We implemented a recursive evaluator that parses the new asset_expression JSON structure so Schedule Insights can still predict:</p><ul><li><p>When a DAG will run</p></li><li><p>What it&#8217;s waiting on</p></li><li><p>Which branch of logic is currently blocking execution</p></li></ul><p>Without this, &#8220;next run&#8221; predictions are simply wrong.</p><div><hr></div><h2><strong>4&#65039;&#8419; Better Performance, Fewer Dependencies</strong></h2><p>We removed pandas and numpy.</p><p>Run duration medians are now computed directly in SQL using percentile_cont via SQLAlchemy.</p><p>Result:</p><ul><li><p>Faster installs</p></li><li><p>Lower memory usage</p></li><li><p>Cleaner dependency graph</p></li></ul><div><hr></div><h1><strong>Example Educational DAGs (Dependency Patterns Only)</strong></h1><p>For Airflow 3, the repository now includes an <strong>Academic Data Platform example DAG suite</strong>.</p><p>These DAGs simulate patterns such as:</p><ul><li><p>Ingestion &#8594; normalization &#8594; transformation &#8594; consolidation</p></li><li><p>Dataset/asset-triggered execution</p></li><li><p>Hybrid cron + asset scheduling</p></li><li><p>Conditional AND/OR asset logic</p></li><li><p>Reporting layers dependent on multiple upstream assets</p></li></ul><p>They exist purely to demonstrate:</p><ul><li><p>Complex asset expressions</p></li><li><p>Multi-layered DAG orchestration</p></li><li><p>Real-world dependency graphs</p></li></ul><p>No real institutional integrations.<br>No sensitive data.<br>Just realistic dependency topology.</p><p>This makes Schedule Insights far more meaningful to demonstrate than the original cinema example, especially when working with Airflow 3&#8217;s asset trees.</p><div><hr></div><h1><strong>Core Features (Now Tested on Complex Asset Graphs)</strong></h1><h2><strong>&#128736; The Next Run Table &#8212; No More Silent Failures</strong></h2><p>Asset-driven DAGs often &#8220;don&#8217;t run&#8221; for subtle reasons:</p><ul><li><p>Paused DAGs</p></li><li><p>Waiting on asset expressions</p></li><li><p>Hybrid cron + dataset logic</p></li><li><p>Unmet upstream conditions</p></li></ul><p>The <strong>Next Run table</strong> explains exactly why:</p><ul><li><p>&#8220;This DAG is paused and will not run.&#8221;</p></li><li><p>&#8220;No schedule or dependencies found.&#8221;</p></li><li><p>&#8220;Waiting for upstream Asset/DAG triggers.&#8221;</p></li></ul><div><hr></div><h2><strong>&#128202; The Schedule Impact Simulator</strong></h2><p>Want to change:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;03b5cf7d-a138-42a4-abe4-ef8f1dbc61c5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">*/25 &#8594; */5</code></pre></div><p>Before committing?</p><p>Simulate it.</p><p>The UI highlights impacted future runs in purple and shows how the change propagates through downstream asset dependencies.</p><p>This is especially useful in complex multi-layer DAG graphs.</p><div><hr></div><h2><strong>&#128338; Timezone-Aware Gantt Charts</strong></h2><p>The plugin detects your local timezone and renders:</p><ul><li><p>Historical runs</p></li><li><p>Predicted runs</p></li><li><p>Gantt charts</p></li></ul><p>No more UTC mental math.</p><div><hr></div><h2><strong>&#128268; Programmatic Insights via API</strong></h2><p>We exposed the scheduling engine via FastAPI endpoints:</p><ul><li><p>get_future_runs_json</p></li><li><p>get_next_future_run_json</p></li></ul><p>Your internal tooling can now query predicted Airflow behavior programmatically.</p><div><hr></div><h1><strong>Visualizing Structure with airflow-dag-dependencies</strong></h1><p>To complement Schedule Insights, you can use our companion plugin:</p><p><strong>airflow-dag-dependencies</strong></p><p>Schedule Insights tells you <strong>when</strong> a DAG will run.<br>airflow-dag-dependencies shows you <strong>how everything connects</strong>.</p><p>Together they provide:</p><ul><li><p>Structural visibility (dependency graph)</p></li><li><p>Temporal visibility (future execution prediction)</p></li></ul><p>Especially powerful with Airflow 3&#8217;s conditional asset trees.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tlEN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tlEN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 424w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 848w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 1272w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tlEN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png" width="1456" height="621" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:621,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tlEN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 424w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 848w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 1272w, https://substackcdn.com/image/fetch/$s_!tlEN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59943446-1ad3-4f08-b5dc-bb581168d5a0_1600x682.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h1><strong>Why This Matters at Scale</strong></h1><p>As more teams contribute DAGs to a shared Airflow environment &#8212; as is the case at Uncommon Schools, where multiple teams orchestrate data across a large network of schools &#8212; scheduling complexity compounds quickly. Each team adds their own timing requirements, and as run durations drift, overlap and resource contention become increasingly hard to spot from any single vantage point. Schedule Insights gives you a cross-team view &#8212; so you can see potential collisions before they become incidents. And when a DAG pile-up does occur, the historical run data lets you work backward and reconstruct what likely triggered the cascade.</p><h1><strong>Try It Today</strong></h1><p>Spin it up locally:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;293699bf-aeb7-4254-bbb2-8d6d3655c551&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">git clone https://github.com/ponderedw/airflow-schedule-insights
cd airflow-schedule-insights
docker compose -f local_airflow_3/docker-compose.yml up</code></pre></div><p>Then navigate to:</p><p>Browse &#8594; Schedule Insights</p><p>You&#8217;ll see the plugin running against realistic educational dependency patterns &#8212; not fictional cinema workflows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MHj9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MHj9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 424w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 848w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 1272w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MHj9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png" width="1456" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MHj9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 424w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 848w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 1272w, https://substackcdn.com/image/fetch/$s_!MHj9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F651c8c8b-6691-49e6-b842-a026fd03fd75_1600x523.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>Airflow 3 made orchestration more powerful.<br>Schedule Insights makes it understandable.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[From AI Conversations to BI Charts]]></title><description><![CDATA[Visualizing semantic-layer analytics with Cube and AI]]></description><link>https://newsletter.ponder.co/p/from-ai-conversations-to-bi-charts</link><guid isPermaLink="false">https://newsletter.ponder.co/p/from-ai-conversations-to-bi-charts</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 17 Feb 2026 13:37:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Q0fi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q0fi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0fi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q0fi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Q0fi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0fi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a45d29-0c80-4f02-b002-77c776af7e0e_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>In our <a href="https://newsletter.ponder.co/p/from-semantic-layers-to-conversations">previous post</a>, we explored how to bridge the gap between complex data structures and end-users by grounding natural-language queries in a Cube-governed semantic layer. By using RAG, we enabled anyone&#8212;from teachers to board members&#8212;to query data without needing to touch SQL, GraphQL, or REST APIs.</p><p>But while answering a question with text is a great start, data is often best understood visually. Even for those who <em>can</em> write code, the goal is often the same: getting to the insight as quickly as possible. We asked ourselves: Can we move beyond simple text responses and visualize this data directly within the chat interface?</p><p>The answer is a resounding <strong>yes</strong>.</p><p>In this post, we&#8217;re introducing a new capability that turns conversational insights into immediate, actionable BI charts. We&#8217;ve implemented this by leveraging <strong>Streamlit&#8217;s</strong> native charting capabilities combined with custom logic for <strong>parsing the AI&#8217;s response</strong>.</p><p>Of course, we aren&#8217;t alone in this pursuit&#8212;the entire industry is racing toward &#8220;conversational BI.&#8221; This is simply our take on the problem. Our hope is that this specific implementation provides a blueprint or some inspiration for bringing similar capabilities to your own organization. If you have a different approach or wider experience in this space, we&#8217;d love for you to share your thoughts in the comments.</p><p>You can find the updated code in the same repository here:</p><p>&#128073; <strong>GitHub:</strong><a href="https://github.com/ponderedw/dbt-to-cube"> https://github.com/ponderedw/dbt-to-cube</a></p><p>Let&#8217;s dive into how we move from a simple chat response to a fully rendered chart.</p><p>One quick note before we dive in: all of the examples and visualizations in this post use synthetic sample data generated as part of the demo environment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!alDy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!alDy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!alDy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!alDy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!alDy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!alDy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2895850,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/188257117?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!alDy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!alDy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!alDy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!alDy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F660c731d-1f03-4885-a109-21dfce6b9cd8_800x400.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Quickstart</h1><p>Ready to see it in action? You can get the entire environment running in just a few steps.</p><ol><li><p><strong>Clone the repository:</strong> git clone https://github.com/ponderedw/dbt-to-cube</p></li><li><p><strong>Configure your environment:</strong> Create your .private.env file from the .private.env.template as explained<a href="https://newsletter.ponder.co/p/from-semantic-layers-to-conversations"> here</a>. This ensures your LLM provider and credentials are ready to go.</p></li><li><p><strong>Launch the stack:</strong> Simply run just all. This automated workflow handles the heavy lifting: spinning up the database, generating mock data, running dbt models, and ingesting metrics into both Cube and Superset. (You can read more about the underlying architecture<a href="https://newsletter.ponder.co/p/dbt-cubejs-superset-automating-semantic"> here</a>).</p></li><li><p><strong>Access the UI:</strong> Head over to http://localhost:8501/, enter your STREAMLIT_PASSWORD, and you&#8217;re ready to chat with your data.</p></li></ol><div><hr></div><h3><strong>From Questions to Visuals</strong></h3><p>Start by getting familiar with the metadata the RAG layer has indexed:</p><blockquote><p>&#8220;Hey. What measures and dimensions do we have?&#8221;</p></blockquote><p>Once the AI confirms the available metrics, it&#8217;s time to move beyond text. Let&#8217;s ask for a specific visualization:</p><blockquote><p>&#8220;Can you visualize the total number of course enrollments by difficulty level using a pie chart?&#8221;<br></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GY1B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GY1B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 424w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 848w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 1272w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GY1B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png" width="1456" height="780" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:780,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GY1B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 424w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 848w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 1272w, https://substackcdn.com/image/fetch/$s_!GY1B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bd06f8-7b21-47a9-a933-d4e11568c5a1_1600x857.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The result?</strong> A fully rendered BI graph in just 11 seconds.</p><p>Let&#8217;s try a different metric and a more dynamic chart type:</p><blockquote><p>&#8220;Return the number of students with excellent performance across academic years and visualize it using a line chart.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SxsN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SxsN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 424w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 848w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 1272w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SxsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png" width="1456" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SxsN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 424w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 848w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 1272w, https://substackcdn.com/image/fetch/$s_!SxsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86ce202-cad3-4991-98ab-1eec5a05fbf2_1600x796.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In seconds, you receive an amazing, interactive line chart&#8212;mapping complex trends without you ever touching a visualization library.</p><h3><strong>More to Explore</strong></h3><p>The system is flexible enough to handle various chart types and comparison logic:</p><ul><li><p><strong>Area Charts:</strong> <em>&#8220;Can you create an area chart showing the number of students with excellent performance compared to the total number of enrolled students across semesters?&#8221;<br></em></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VJs4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VJs4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VJs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f789f284-73b0-4927-b270-62fd513fb658_1600x921.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VJs4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!VJs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff789f284-73b0-4927-b270-62fd513fb658_1600x921.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Scatter Charts:</strong> <em>&#8220;Can you visualize the relationship between course difficulty level and average course GPA using a scatter chart?&#8221;<br></em></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IrF8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IrF8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IrF8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IrF8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 424w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 848w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 1272w, https://substackcdn.com/image/fetch/$s_!IrF8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd90100-c340-4c7f-9059-5bdea8970ce3_1600x921.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>How does it work?</h1><p>To enable these visualizations, we didn&#8217;t need to reinvent the wheel. We kept the same agent-based architecture and Streamlit frontend but introduced two key modifications to the workflow:</p><h3><strong>1. Enhancing the Prompt (The &#8220;Brain&#8221;)</strong></h3><p>We updated our LangChain prompt to give the agent &#8220;visual awareness.&#8221; It now understands how to structure its output so the frontend knows when a chart is requested.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xxqD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xxqD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 424w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 848w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 1272w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xxqD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png" width="1456" height="531" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:531,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xxqD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 424w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 848w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 1272w, https://substackcdn.com/image/fetch/$s_!xxqD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa83b544a-f03a-460d-84e9-53277a5290f1_1600x583.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Where to look:</strong> You can find the specific instructions we added in cube-to-rag/app/server/chat.py.</p></li></ul><h3><strong>2. Intelligent Response Parsing (The &#8220;Bridge&#8221;)</strong></h3><p>Once the AI generates a response, the Streamlit application needs to know whether to display a paragraph of text or render a dynamic chart. We updated the handling logic to parse the AI&#8217;s response and trigger the appropriate Streamlit chart component.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rjs7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rjs7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 424w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 848w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 1272w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rjs7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png" width="1456" height="737" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6850129e-a363-42f5-bd39-226f356ac898_1600x810.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:737,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rjs7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 424w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 848w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 1272w, https://substackcdn.com/image/fetch/$s_!rjs7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6850129e-a363-42f5-bd39-226f356ac898_1600x810.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Where to look:</strong> The updated logic is located in streamlit/Main.py.</p></li></ul><p>By separating the &#8220;intent&#8221; (in the prompt) from the &#8220;rendering&#8221; (in Streamlit), we maintain a clean separation of concerns while delivering a seamless user experience.</p><h1>Conclusion</h1><p>This experiment marks a significant step in making data truly accessible. By moving from simple text-based answers to <strong>dynamic BI visualizations</strong>, we&#8217;ve closed the loop between asking a question and gaining a visual insight.</p><p>The beauty of this approach lies in its <strong>governance</strong>. Because the AI is still grounded in the Cube semantic layer, the charts aren&#8217;t just &#8220;hallucinated&#8221; guesses&#8212;they are visual representations of verified business logic. Whether it&#8217;s a school administrator tracking student performance or a developer looking for a quick metric check, the interface provides a &#8220;hands-free&#8221; BI experience that stays accurate at scale.</p><h3><strong>What&#8217;s Next?</strong></h3><p>While this prototype demonstrates the power of combining RAG with Streamlit, there is still much to explore:</p><ul><li><p><strong>Embedded BI Dashboards:</strong> Moving beyond single charts to embed fully functional, pre-built dashboards (like those from <strong>Apache Superset</strong>) directly into the chat when a high-level overview is requested.</p></li><li><p><strong>Advanced Interactivity:</strong> Allowing users to drill down into chart elements through further conversation or &#8220;chatting with the legend.&#8221;</p></li><li><p><strong>Complex Multi-Step Reasoning:</strong> Improving how the agent handles requests that require joining multiple cubes or complex pre-aggregations.</p></li></ul><p>We believe that the future of BI isn&#8217;t just a static dashboard; it&#8217;s a conversation that adapts to the user&#8217;s needs in real-time. We hope this project helps you kickstart your own journey into conversational analytics.</p><div><hr></div><p><strong>Join the Conversation</strong></p><p>We&#8217;d love to hear your thoughts!</p><ul><li><p>Did this setup work for your data?</p></li><li><p>Do you prefer a different library for parsing AI-generated charts?</p></li><li><p>What&#8217;s the biggest challenge you&#8217;ve faced with Text-to-Chart workflows?</p></li></ul><p>Drop a comment below, or better yet, open an issue or PR on the<a href="https://github.com/ponderedw/dbt-to-cube"> GitHub repository</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[From Semantic Layers to Conversations]]></title><description><![CDATA[Turning Cube.js analytics into a natural-language interface with RAG]]></description><link>https://newsletter.ponder.co/p/from-semantic-layers-to-conversations</link><guid isPermaLink="false">https://newsletter.ponder.co/p/from-semantic-layers-to-conversations</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 26 Jan 2026 13:18:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pVRS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pVRS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pVRS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pVRS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png" width="456" height="304.1043956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:456,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pVRS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!pVRS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b56c99e-1ac1-4909-b810-feecbcf19b49_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>In one of our previous posts, we showed how <strong>dbt, Cube, and Superset</strong> can work together to automate and standardize the semantic layer. The response from the community was overwhelmingly positive but it also raised a recurring question: <strong>why introduce Cube between dbt and Superset instead of connecting BI tools directly to the database?</strong></p><p>The answer is consistency at scale. A <strong>single, shared semantic layer</strong> ensures that metrics, dimensions, and business logic are defined once and reused everywhere &#8211; across BI tools, APIs, and downstream applications &#8211; rather than being reimplemented in each consumer.</p><p>This naturally led us to a bigger idea. If Cube already exposes a governed semantic layer through SQL, REST, and GraphQL, why force natural-language analytics back into brittle English-to-SQL translations? What if users could <strong>converse directly with the semantic layer</strong> instead?</p><p>In this post, we explore how to turn Cube analytics into a natural-language interface using <strong>RAG</strong>. We use RAG to store and retrieve Cube metrics and dimensions, allowing each user query to be grounded in the correct semantic context before any query is generated or executed. This keeps conversations aligned with predefined business logic while remaining flexible and intuitive for users.</p><p>Let&#8217;s walk through how it works.</p><p>&#128073; GitHub:<a href="https://github.com/ponderedw/dbt-to-cube"> https://github.com/ponderedw/dbt-to-cube</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ARDz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ARDz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ARDz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3669402,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/185835669?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ARDz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!ARDz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155720af-e2a4-485b-9d8b-9ac80aa8bcc8_800x400.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>Quickstart</h1><ol><li><p>Clone the repository:<br>&#128073;<a href="https://github.com/ponderedw/dbt-to-cube"> https://github.com/ponderedw/dbt-to-cube</a></p></li><li><p>Copy .private.env.template to .private.env and configure the required secrets for your LLM provider.</p></li><li><p><code>just all</code></p></li></ol><p>Once everything is up and running:</p><ul><li><p>Open:</p></li></ul><pre><code>http://localhost:8000/</code></pre><ul><li><p> and navigate to the cube_schemas collection.<br>You&#8217;ll see a set of vectors representing Cube metadata &#8211; dimensions, measures, and cubes.<br>These embeddings are generated using the <strong>cube-to-rag</strong> library (<a href="https://pypi.org/project/cube-to-rag/">https://pypi.org/project/cube-to-rag/</a>), which we use to extract and embed Cube schema metadata into the vector store.<br></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DOGD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DOGD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 424w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 848w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 1272w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DOGD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png" width="1456" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DOGD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 424w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 848w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 1272w, https://substackcdn.com/image/fetch/$s_!DOGD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc98c4e8-7f7b-4dfe-a35d-7e7c8cdc51d6_1600x620.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Next, open<a href="http://localhost:8501/"> </a></p></li></ul><pre><code>http://localhost:8501/</code></pre><ul><li><p>If you&#8217;ve set <strong>STREAMLIT_PASSWORD</strong> in <strong>.private.env</strong>, use it to log in.<br></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f7xm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f7xm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 424w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 848w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 1272w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f7xm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png" width="1456" height="606" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f7xm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 424w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 848w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 1272w, https://substackcdn.com/image/fetch/$s_!f7xm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a7100eb-8ff8-4a10-b84f-c508b1183ce6_1600x666.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You&#8217;re all set, start asking questions and explore your Cube analytics through natural language.</p><h1>Talking to Your Data</h1><p>Let&#8217;s start simple:<br> <strong>&#8220;What metrics and dimensions do we have?&#8221;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xbG9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xbG9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 424w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 848w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 1272w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xbG9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png" width="1456" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea38c754-e3ef-4396-9623-650b201951fd_1600x793.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xbG9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 424w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 848w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 1272w, https://substackcdn.com/image/fetch/$s_!xbG9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea38c754-e3ef-4396-9623-650b201951fd_1600x793.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Great. Now let&#8217;s explore the data itself:<br> <strong>&#8220;Show all available course names.&#8221;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oROr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oROr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 424w, https://substackcdn.com/image/fetch/$s_!oROr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 848w, https://substackcdn.com/image/fetch/$s_!oROr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!oROr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oROr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png" width="1214" height="1370" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1370,&quot;width&quot;:1214,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oROr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 424w, https://substackcdn.com/image/fetch/$s_!oROr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 848w, https://substackcdn.com/image/fetch/$s_!oROr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!oROr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdabd874b-872d-4926-8a6c-bd842d334738_1214x1370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fp8m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fp8m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 424w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 848w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 1272w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fp8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png" width="1456" height="502" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:502,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fp8m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 424w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 848w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 1272w, https://substackcdn.com/image/fetch/$s_!fp8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95da36ae-51d3-481a-a444-a73be09a11f5_1600x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nice. Let&#8217;s narrow it down:<br> <strong>&#8220;What metrics are available for Linear Algebra?&#8221;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8vnl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8vnl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 424w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 848w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 1272w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8vnl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png" width="1456" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8vnl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 424w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 848w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 1272w, https://substackcdn.com/image/fetch/$s_!8vnl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbb0f496-16de-4a35-a9f0-cbae787bf856_1600x571.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now for a concrete business question:<br> <strong>&#8220;How many enrollments do we have across all courses?&#8221;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wlxp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wlxp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 424w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 848w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 1272w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wlxp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png" width="1456" height="747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:747,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wlxp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 424w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 848w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 1272w, https://substackcdn.com/image/fetch/$s_!Wlxp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d5a1fe6-28d7-4229-ab4a-266be7994f40_1600x821.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And finally, let&#8217;s push it a bit further with a more complex query involving filters and breakdowns:<br> <strong>&#8220;What is the student engagement score for the </strong><em><strong>Data Structures and Algorithms</strong></em><strong> course, broken down by semester?&#8221;</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zsIT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zsIT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 424w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 848w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 1272w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zsIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png" width="1456" height="707" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:707,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zsIT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 424w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 848w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 1272w, https://substackcdn.com/image/fetch/$s_!zsIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5abb228a-fce2-4ed2-b8d3-04256048ff15_1600x777.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And just like that, everything works. Metrics stay consistent, dimensions are respected, and the conversation maps cleanly to the semantic layer</p><h1>Conclusion</h1><p>This experiment shows one possible direction for moving from static semantic layers to truly conversational analytics. By grounding natural-language queries in Cube&#8217;s governed semantic layer using RAG, we avoid many of the pitfalls of naive text-to-SQL approaches: inconsistent metrics, broken joins, and logic that drifts away from business definitions. Instead, users can explore data conversationally while staying aligned with a single source of truth.</p><p>That said, this is not <em>the</em> solution &#8211; it&#8217;s <em>our</em> attempt at solving a real and growing problem. There are open questions around performance, UX, evaluation, security, and how this approach compares to alternatives such as agent-driven query planning, stricter semantic parsers, or hybrid BI experiences. We&#8217;re certain there are improvements to be made, edge cases we haven&#8217;t covered, and ideas we haven&#8217;t considered.</p><p>We&#8217;d love to hear what others think about this: What works? What doesn&#8217;t? What would you do differently? If you&#8217;re experimenting with similar approaches &#8211; or taking a completely different path &#8211; your feedback, suggestions, and alternatives are more than welcome.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[RAG Isn’t Enough: Structuring Documents Instead of Just Retrieving Them]]></title><description><![CDATA[An open-source approach to turning PDFs and DOCX files into structured datasets with LLMs]]></description><link>https://newsletter.ponder.co/p/rag-isnt-enough-structuring-documents</link><guid isPermaLink="false">https://newsletter.ponder.co/p/rag-isnt-enough-structuring-documents</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 06 Jan 2026 12:36:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z-bj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z-bj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z-bj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 424w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 848w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 1272w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z-bj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png" width="1456" height="746" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:746,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:422736,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/183658708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z-bj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 424w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 848w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 1272w, https://substackcdn.com/image/fetch/$s_!Z-bj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52326c9d-fafa-43d5-89b8-7d59557c0cb0_1800x922.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>Most teams have been there. You start storing company documentation as Word files or PDFs because it&#8217;s quick, familiar, and temporary. A proof of concept, a contract, a report &#8211; throw it into a folder and move on. But over time, that &#8220;temporary&#8221; storage often becomes a critical production knowledge base.</p><p>At that point, problems emerge: documents are hard to search, relationships are implicit, extracting structured data is manual, and automation becomes painful.</p><p>A common approach today is &#8220;just put everything into RAG.&#8221; While retrieval helps with search, it doesn&#8217;t solve the core issue: the information itself is still unstructured. If the content were normalized into a machine-friendly format (like JSON with well-defined schemas), working with it would be faster, more reliable, and would open new workflows &#8211; analytics, validation, integrations, and automation.</p><p>That gap is what inspired this experiment. I wanted a way to turn business documents into structured, queryable data using LLMs. The result is <strong>StructuDoc</strong>, an open-source proof of concept that combines document parsing, image understanding, schema discovery, and prompt tracking into a single pipeline. It can move PDFs and DOCX files into structured datasets, identify common schemas, and store everything in S3.</p><p>This post introduces <strong>StructuDoc</strong>, explains how it works, and shares the reasoning behind its design. It&#8217;s offered in a spirit of sharing rather than as a commercial product &#8211; we&#8217;d love your feedback, alternative approaches you&#8217;ve tried, or contributions to the project.</p><ul><li><p>GitHub:<a href="https://github.com/ponderedw/StructuDoc"> https://github.com/ponderedw/StructuDoc</a></p></li><li><p>Docker Hub:<a href="https://hub.docker.com/repository/docker/pondered/structudoc/general"> https://hub.docker.com/repository/docker/pondered/structudoc/general</a></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qLyB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qLyB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qLyB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4377839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/183658708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qLyB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!qLyB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3e35641-38d8-467a-842c-07a8edeeedc9_800x400.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Quickstart with StructuDoc</h1><p>StructuDoc makes it easy to turn PDFs and DOCX files into structured JSON, discover common schemas, and even analyze images using AI. Here&#8217;s how to get started in minutes:</p><h3><strong>1. Clone the repository</strong></h3><pre><code>git clone https://github.com/ponderedw/StructuDoc.git
cd StructuDoc</code></pre><h3><strong>2. Set up environment variables</strong></h3><p>Copy the example file:</p><pre><code>cp .env.example .env</code></pre><p>Edit <strong>.env</strong> to configure your local storage (MinIO) or S3, and optionally your LLM provider keys:</p><pre><code>ENV=local
SOURCE_BUCKET=minio/source-bucket
MINIO_HOST=http://localhost:9000
MINIO_SECURE=false
AWS_ACCESS_KEY_ID=admin
AWS_SECRET_ACCESS_KEY=password
LLM_MODEL=Bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0</code></pre><h3><strong>3. Start the application (this file can be executed independently of the repository)</strong></h3><pre><code>docker compose up -f docker-compose-prod.yml</code></pre><ul><li><p><strong>Streamlit UI</strong>:</p></li></ul><pre><code> http://localhost:8501</code></pre><ul><li><p><strong>FastAPI backend</strong>:</p></li></ul><pre><code> http://localhost:8080</code></pre><ul><li><p><strong>MinIO console (</strong>login: admin/password<strong>)</strong>:</p></li></ul><pre><code> http://localhost:9001</code></pre><h3><strong>4. Upload and process documents</strong></h3><ol><li><p>Go to <strong>Upload Source Files</strong> in the UI.</p></li><li><p>Upload DOCX or PDF files.</p></li><li><p>StructuDoc will automatically:</p><ul><li><p>Convert PDFs to Markdown</p></li><li><p>Extract images</p></li><li><p>Store all files in structured folders</p></li></ul></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qInx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qInx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 424w, https://substackcdn.com/image/fetch/$s_!qInx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 848w, https://substackcdn.com/image/fetch/$s_!qInx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 1272w, https://substackcdn.com/image/fetch/$s_!qInx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qInx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png" width="1456" height="734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qInx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 424w, https://substackcdn.com/image/fetch/$s_!qInx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 848w, https://substackcdn.com/image/fetch/$s_!qInx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 1272w, https://substackcdn.com/image/fetch/$s_!qInx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fb40b96-ae1f-43e9-840f-56edec236aca_1600x807.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>5. Parse and analyze with AI</strong></h3><ul><li><p>Navigate to <strong>Parse Files With LLM</strong>:</p></li></ul><blockquote><p></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c4ez!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c4ez!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 424w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 848w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 1272w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c4ez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png" width="438" height="334.2631578947368" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:608,&quot;resizeWidth&quot;:438,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c4ez!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 424w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 848w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 1272w, https://substackcdn.com/image/fetch/$s_!c4ez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F059aaca4-6e70-4569-8f3a-acedb6ef6fa6_608x464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Analyze images with AI prompts</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TUfZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TUfZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 424w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 848w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 1272w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TUfZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png" width="805" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:464,&quot;width&quot;:805,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TUfZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 424w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 848w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 1272w, https://substackcdn.com/image/fetch/$s_!TUfZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff04c0767-e1e7-404f-b17c-20145c7f3d99_805x464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KzGx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KzGx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 424w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 848w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 1272w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KzGx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png" width="805" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:805,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KzGx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 424w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 848w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 1272w, https://substackcdn.com/image/fetch/$s_!KzGx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1efef841-8553-49d6-964d-e3b4c468b2f8_805x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>And remember to save those descriptions to your s3 bucket: </p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c-Cq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c-Cq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 424w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 848w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 1272w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c-Cq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png" width="269" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:269,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c-Cq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 424w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 848w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 1272w, https://substackcdn.com/image/fetch/$s_!c-Cq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9be46195-b0be-42ec-a036-b72c30460ca3_269x451.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Discover common schemas across multiple documents</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R9nD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R9nD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 424w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 848w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 1272w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R9nD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png" width="828" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:828,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R9nD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 424w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 848w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 1272w, https://substackcdn.com/image/fetch/$s_!R9nD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d25269d-4399-47d6-8163-0d4aa63a21ac_828x794.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Parse your documents to JSON</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JAuw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JAuw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 424w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 848w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 1272w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JAuw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png" width="828" height="465" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:465,&quot;width&quot;:828,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JAuw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 424w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 848w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 1272w, https://substackcdn.com/image/fetch/$s_!JAuw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a4fa8d1-0e3a-48dc-afd6-737e9a0af71a_828x465.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q7Po!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q7Po!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 424w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 848w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q7Po!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png" width="828" height="1143" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1143,&quot;width&quot;:828,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q7Po!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 424w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 848w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7Po!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faee0a8e9-7a11-45ef-a4c4-f718437f74b7_828x1143.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now you have structured, queryable data from your documents &#8211; ready for testing, analysis, or building pipelines!</p><h1>Conclusion</h1><p>StructuDoc is an open-source experiment for turning PDFs and DOCX files into structured, queryable data. Instead of relying solely on RAG for search, it lets you extract JSON, discover common schemas, and analyze images with AI. This isn&#8217;t a fully polished product &#8211; it&#8217;s a proof of concept born from real challenges we&#8217;ve faced, shared in the hope it might help others or spark new ideas. We&#8217;d love to hear your feedback, learn about alternative approaches you&#8217;ve tried, or see contributions that improve StructuDoc.</p><p><strong>GitHub:</strong><a href="https://github.com/ponderedw/StructuDoc"> https://github.com/ponderedw/StructuDoc<br></a><strong>Docker Hub:</strong><a href="https://hub.docker.com/repository/docker/pondered/structudoc/general"> https://hub.docker.com/repository/docker/pondered/structudoc/general</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Incremental CI for dbt: Stop Rebuilding Everything From Scratch]]></title><description><![CDATA[Test your dbt models against real production data for more accurate CI results]]></description><link>https://newsletter.ponder.co/p/incremental-ci-for-dbt-stop-rebuilding</link><guid isPermaLink="false">https://newsletter.ponder.co/p/incremental-ci-for-dbt-stop-rebuilding</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 08 Dec 2025 13:23:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ab1bb9ea-6eeb-4d71-a741-7d86b8b13b1f_1282x834.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y2y0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y2y0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 424w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 848w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y2y0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png" width="1282" height="834" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:834,&quot;width&quot;:1282,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163853,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/181037971?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y2y0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 424w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 848w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2y0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c887f3-3f42-44f6-a09a-c3d236072e05_1282x834.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>dbt has become the backbone of modern analytics engineering, and one of its best features is CI: the ability to compare a developer branch with main, rebuild only the changed models in a temporary schema, and use production data from unchanged models. It&#8217;s an amazing way to catch issues before they hit production.</p><p>But what about <strong>incremental models</strong> and <strong>snapshots</strong>? Metrics like Grade Point Average whose day-by-day variations are captured in a dbt snapshot are then tracked and rendered in various contexts over time. This per-student metric is calculated in one environment (production) each day to ensure a clear source of truth. But for CI&#8230;that&#8217;s where things get tricky.</p><p>Both incremental models and snapshots have different logic for <strong>initial runs</strong> vs. <strong>upsert runs</strong>. In CI, everything is always built from scratch &#8211; so your CI may pass, only for the query to fail the moment it meets existing data or objects in production.</p><p>To solve this for Uncommon Schools, we built a tiny but powerful solution &#8211; and now we&#8217;re sharing it with everyone:<br> &#128230; <strong>dbt-incremental-ci</strong> (<a href="https://pypi.org/project/dbt-incremental-ci/">https://pypi.org/project/dbt-incremental-ci/</a>)</p><h1>Quickstart</h1><p>Get up and running in under 5 minutes.</p><p>dbt-incremental-ci copies your <strong>production incremental models and snapshots</strong> into your CI schema so you can test against <strong>real production data</strong>, not empty tables.</p><div><hr></div><h2><strong>Installation</strong></h2><pre><code>pip install dbt-incremental-ci</code></pre><div><hr></div><h2><strong>Option 1: Using a Local Manifest File</strong></h2><p>Use this approach if your production manifest.json is stored in S3, GCS, or available locally.</p><h3><strong>Step 1: Download your production manifest</strong></h3><pre><code># From S3
aws s3 cp s3://my-dbt-artifacts/prod/manifest.json ./prod_manifest.json

# From GCS

gsutil cp gs://my-dbt-artifacts/prod/manifest.json ./prod_manifest.json</code></pre><h3><strong>Step 2: Copy production tables into your CI schema</strong></h3><pre><code>dbt-incremental-ci \
  --prod-manifest-path ./prod_manifest.json \
  --dbt-project-dir . \
  --database-uri &#8220;postgresql://user:pass@host:5432/db&#8221; \
  --ci-schema &#8220;ci_pr_123&#8221; \
  --threads 4</code></pre><h3><strong>Step 3: Run dbt with the copied production data</strong></h3><pre><code>dbt build --select state:modified+ --defer --state ./prod_manifest.json</code></pre><h3><strong>Step 4: Run your tests</strong></h3><pre><code>dbt test --select state:modified+ --defer --state ./prod_manifest.json</code></pre><p>You&#8217;re now running incremental models and snapshots against actual production state&#8212;not empty CI tables.</p><div><hr></div><h2><strong>Option 2: Using dbt Cloud</strong></h2><p>If you&#8217;re on dbt Cloud, you don&#8217;t need to download the manifest&#8212;the tool fetches it automatically from the API.</p><h3><strong>Step 1: Set your credentials</strong></h3><pre><code>export DBT_CLOUD_API_TOKEN=&#8221;your_token&#8221;
export DBT_CLOUD_ACCOUNT_ID=&#8221;12345&#8221;</code></pre><h3><strong>Step 2: Copy production tables into your CI schema</strong></h3><pre><code>dbt-incremental-ci \
  --dbt-cloud-job-id &#8220;67890&#8221; \
  --dbt-project-dir . \
  --database-uri &#8220;$DATABASE_URI&#8221; \
  --ci-schema &#8220;ci_pr_123&#8221; \
  --threads 4</code></pre><p>The tool will automatically:</p><ul><li><p>Connect to the dbt Cloud API</p></li><li><p>Fetch the latest successful production run</p></li><li><p>Download the manifest</p></li><li><p>Copy the required tables</p></li></ul><h3><strong>Step 3: Run dbt</strong></h3><pre><code>dbt build --select state:modified+ --defer</code></pre><h3><strong>Step 4: Run your tests</strong></h3><pre><code>dbt test --select state:modified+ --defer</code></pre><div><hr></div><h2><strong>What Just Happened?</strong></h2><p>The tool:</p><ol><li><p>Identified changed models using state:modified+</p></li><li><p>Filtered to incremental models and snapshots that already exist in production</p></li><li><p>Copied those production tables (with data!) into your CI schema</p></li><li><p>Preserved custom schemas (e.g., prod_marts &#8594; ci_pr_123_marts)</p></li></ol><p>This ensures your CI pipeline behaves like a real incremental run&#8212;catching bugs that only appear when existing data is present.</p><div><hr></div><h2><strong>Preview Before Running (Dry Run)</strong></h2><p>Want to see what will be copied without actually doing anything?</p><pre><code>dbt-incremental-ci \
  --prod-manifest-path ./prod_manifest.json \
  --dbt-project-dir . \
  --database-uri &#8220;postgresql://user:pass@host:5432/db&#8221; \
  --ci-schema &#8220;ci_pr_123&#8221; \
  --dry-run \
  --verbose</code></pre><p>This prints exactly which tables would be copied and the SQL that would run.</p><h1>Final Thoughts</h1><p>Incremental models and snapshots are some of the most powerful parts of dbt &#8211; but they&#8217;re also uniquely tricky to validate in CI. Full rebuilds simply don&#8217;t reflect how these models behave in production, which means some of the most painful bugs can slip past your pipeline undetected.</p><p>dbt-incremental-ci is <strong>our attempt</strong> to fix that gap. It&#8217;s a lightweight, practical solution that brings real production state into your CI runs so you can test incremental logic the way it actually runs in the real world.</p><p>But this isn&#8217;t the final word &#8211; far from it.<br>This is our first take at solving the problem, and we know the community will have ideas we haven&#8217;t thought of yet. If you have a better approach, want to improve this one, or see opportunities to make it smarter, faster, or more general &#8211; <strong>we&#8217;d love your help.</strong></p><p>&#128073; PyPI:<a href="https://pypi.org/project/dbt-incremental-ci/"> https://pypi.org/project/dbt-incremental-ci/<br></a>&#128073; GitHub: <em><a href="https://github.com/ponderedw/dbt-incremental-ci">https://github.com/ponderedw/dbt-incremental-ci</a> </em>&#8211; issues, discussions, and PRs are all very welcome.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Unifying dbt Lineage and Superset Metadata with AI Chat]]></title><description><![CDATA[A Superset plugin for exploring transformations, sources, and dashboards through a single, natural-language interface.]]></description><link>https://newsletter.ponder.co/p/unifying-dbt-lineage-and-superset</link><guid isPermaLink="false">https://newsletter.ponder.co/p/unifying-dbt-lineage-and-superset</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 02 Dec 2025 14:20:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZdN2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZdN2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZdN2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZdN2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png" width="376" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:376,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZdN2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ZdN2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F005ae7fe-dfd3-43bb-ad41-88a91a45bea7_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>A couple of weeks ago, we shared several blog posts about different ways we&#8217;re making data more accessible and interactive: our Superset MCP (<a href="https://newsletter.ponder.co/p/superset-mcp-organizing-dashboard">link</a>), loading dbt metadata into GraphDB (<a href="https://newsletter.ponder.co/p/graph-powered-ai-chat-for-dbt">link</a>), and an amazing AI-powered UI plugin for Airflow that lets you interact with your workflows directly in the UI (<a href="https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built">link</a>).</p><p>Today, I want to bring all three together and introduce <strong>superset-chat</strong> - a library that helps you manage both your dbt and dashboard metadata right in the Superset UI, powered by AI, Superset MCP, and our Falkor DB plugin. You can check it out on GitHub:<a href="https://github.com/ponderedw/superset-mcp-plugins"> superset-mcp-plugins</a>.</p><p>If you&#8217;ve ever felt a disconnect between BI and transformation logic, this library might resonate. It can answer questions like, <em>&#8220;Which dashboards depend on source X?&#8221;</em> - even when those sources aren&#8217;t referenced directly. While still a POC, superset-chat has already helped us organize educational metadata, and we&#8217;re excited to share it with the community. Maybe you&#8217;ll help improve it or come up with something entirely new!</p><h1>Quickstart</h1><p>You can try <strong>superset-chat</strong> in two ways:</p><h4><strong>1. Use your existing Superset</strong></h4><p>If you already have a Superset deployment, you can integrate the plugin directly:</p><ul><li><p>Install the plugin:</p></li></ul><pre><code>pip install superset-chat</code></pre><ul><li><p>Update your superset_config.py to register the plugin:</p></li></ul><pre><code>FLASK_APP_MUTATOR = lambda app: init_custom_views(app)
def init_custom_views(app):

    from superset_chat.ai_superset_assistant import AISupersetAssistantView

    appbuilder = app.appbuilder
    appbuilder.add_view(
        AISupersetAssistantView,
        &#8220;AI Superset Assistant&#8221;,
        icon=&#8221;fa-robot&#8221;,
        category=&#8221;Custom Tools&#8221;
    )</code></pre><ul><li><p>Make sure you have the following environment variables set for your deployment:</p></li></ul><pre><code>LLM_MODEL_ID=bedrock:anthropic.claude-3-5-sonnet-20240620-v1:0  # Must start with &#8216;bedrock&#8217;, &#8216;anthropic&#8217;, or &#8216;openai&#8217;
# ANTHROPIC_API_KEY=...              # Required if using Anthropic
AWS_ACCESS_KEY_ID=&#8217;...&#8217;             # Required if using Bedrock
AWS_SECRET_ACCESS_KEY=&#8217;...&#8217;         # Required if using Bedrock
SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://postgres:postgres@postgres:5432/postgres
SUPERSET_API_URL=http://localhost:8088
SUPERSET_USERNAME=superset_admin
SUPERSET_PASSWORD=superset
GRAPH_DB=falkordb                     # Optional: enable GraphDB connection
GRAPH_HOST=...                        # Optional: if using a remote GraphDB
GRAPH_USER=...
GRAPH_PASSWORD=...</code></pre><p>Restart Superset, log in, and open <strong>AI Superset Assistant</strong> under <strong>Custom Tools</strong>.</p><h4><strong>2. Run the local deploy</strong></h4><p>If you don&#8217;t have a Superset deployment, you can use our preconfigured local setup:</p><ul><li><p>Clone the repository:</p></li></ul><pre><code>git clone https://github.com/ponderedw/superset-mcp-plugins.git
cd superset-mcp-plugins</code></pre><ul><li><p>Copy the environment template and configure credentials:</p></li></ul><pre><code>cp template.env .env</code></pre><ul><li><p>The minimal .env for local deploy (we use FalkorDB in this tutorial) can be:</p></li></ul><pre><code>LLM_MODEL_ID=bedrock:anthropic.claude-3-5-sonnet-20240620-v1:0
# ANTHROPIC_API_KEY=...
AWS_ACCESS_KEY_ID=&#8217;...&#8217;
AWS_SECRET_ACCESS_KEY=&#8217;...&#8217;
SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://postgres:postgres@postgres:5432/postgres
SUPERSET_API_URL=http://localhost:8088
SUPERSET_USERNAME=superset_admin
SUPERSET_PASSWORD=superset
GRAPH_DB=falkordb</code></pre><ul><li><p>Run Superset with superset-chat:</p></li></ul><pre><code>just run_superset</code></pre><ul><li><p>Navigate to your Superset instance (usually http://localhost:8088) and open <strong>AI Superset Assistant</strong> under <strong>Custom Tools</strong>.</p></li></ul><p>This local deploy is a fully working Superset + superset-chat environment, so you can start experimenting even if you don&#8217;t have your own deployment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q0JX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0JX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 424w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 848w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q0JX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png" width="572" height="248.67857142857142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:572,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q0JX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 424w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 848w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0JX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859d1474-8e4d-4275-8c8a-555fe3095ba4_1600x696.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Using superset-chat: Examples</h1><p>If you&#8217;re using our project, we&#8217;ve included a <strong>dbt project</strong> that was automatically loaded into FalkorDB, along with <strong>Superset charts and dashboards</strong> that were imported into Superset. You can explore all of them in the UI as well as in dbt docs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HVJ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HVJ1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 424w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 848w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 1272w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HVJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png" width="542" height="294.4519230769231" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:791,&quot;width&quot;:1456,&quot;resizeWidth&quot;:542,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HVJ1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 424w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 848w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 1272w, https://substackcdn.com/image/fetch/$s_!HVJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c4c7f2e-87e0-49ff-828b-ec653b705725_1558x846.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cgyZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cgyZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 424w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 848w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 1272w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cgyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png" width="560" height="236.53846153846155" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:615,&quot;width&quot;:1456,&quot;resizeWidth&quot;:560,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cgyZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 424w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 848w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 1272w, https://substackcdn.com/image/fetch/$s_!cgyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11047fb-0790-4b0b-976a-67eb7c18a199_1600x676.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Now, let&#8217;s try out the plugin with a few example queries:</p><ol><li><p><strong>Superset-related question:</strong></p></li></ol><blockquote><p><em>&#8220;Quick question &#8211; what&#8217;s our current count of Superset dashboards and charts?&#8221;</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_xjs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_xjs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_xjs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg" width="636" height="146.08125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:294,&quot;width&quot;:1280,&quot;resizeWidth&quot;:636,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_xjs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_xjs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee38bf05-73a0-4fc1-8d46-ad19c2641835_1280x294.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MW7e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MW7e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MW7e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg" width="640" height="227.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:455,&quot;width&quot;:1280,&quot;resizeWidth&quot;:640,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MW7e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MW7e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cdb653-9f7a-4e66-b866-5e78dc92fef8_1280x455.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>As expected, superset-chat lists all the Superset metadata correctly &#8211; dashboards and charts &#8211; just like in the UI. Cool!</p><ol start="2"><li><p><strong>dbt-related question:<br><br></strong></p></li></ol><blockquote><p><em>&#8220;Hey! Do you know how many dbt models we have in total?&#8221;</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O5Qd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O5Qd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O5Qd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg" width="680" height="164.6875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:310,&quot;width&quot;:1280,&quot;resizeWidth&quot;:680,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O5Qd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 424w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 848w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!O5Qd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fb89c7-39d4-4b2c-8f81-84d9621587f8_1280x310.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rV6G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rV6G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rV6G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg" width="682" height="134.8015625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:253,&quot;width&quot;:1280,&quot;resizeWidth&quot;:682,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rV6G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rV6G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f139dbb-8e49-4f71-823d-6079e8561498_1280x253.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We can check the answer in dbt docs, and it&#8217;s completely correct. Awesome!</p><ol start="3"><li><p><strong>Combined dbt + Superset question:</strong></p></li></ol><blockquote><p><em>&#8220;Could you help me find all the dbt sources (not models) used in the Student Academic Standing chart?&#8221;</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pMoX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pMoX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pMoX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg" width="1280" height="315" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:315,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pMoX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pMoX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe935ecf4-4943-4a89-935a-d03ac4b57b9b_1280x315.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jyIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jyIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jyIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg" width="1280" height="561" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:561,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jyIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jyIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5088e17d-2970-4d74-b1ee-7df1bd9926b2_1280x561.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Amazing! superset-chat traced the chart all the way back to the underlying database tables. This shows how we can connect Superset dashboards directly to dbt metadata seamlessly.</p><h1>Connecting BI and Transformation Metadata with AI</h1><p>Connecting BI and Transformation Metadata with AI<br> With superset-chat, you can finally see your BI layer and your transformation logic in one place, without manually tracing dependencies or opening multiple tools. By unifying dbt lineage and Superset metadata, the plugin allows you to:</p><ul><li><p>Ask natural-language questions spanning both dashboards and data models.</p></li><li><p>Trace dashboards and charts back to the underlying source tables.</p></li><li><p>Verify dbt lineage directly from Superset without leaving the UI.</p></li><li><p>Quickly get insights that previously required multiple queries or digging through documentation.</p></li></ul><p>Even as a POC, superset-chat already shows how AI can bridge the gap between data transformation and business intelligence. It&#8217;s also beginning to influence some of our internal workflows - for example, in our work with <a href="https://uncommonschools.org/">Uncommon Schools</a> we&#8217;re exploring how the assistant can accelerate outage protocols, particularly when on-call responders aren&#8217;t familiar with the specific code paths involved. This kind of scenario highlights the value of unifying metadata and making it accessible through natural language.</p><p>Whether you&#8217;re exploring dashboards, analyzing dbt models, or troubleshooting lineage issues, this tool turns what was once a fragmented process into a single, interactive experience. We&#8217;re excited to share this with the community and invite you to try it, suggest improvements, or build on it for your own workflows. It&#8217;s a step toward truly connected, AI-powered data exploration.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[dbt → Cube.js → Superset: Automating Semantic Layer & BI Sync]]></title><description><![CDATA[A fully automated workflow for generating semantic layers and publishing them to BI platforms.]]></description><link>https://newsletter.ponder.co/p/dbt-cubejs-superset-automating-semantic</link><guid isPermaLink="false">https://newsletter.ponder.co/p/dbt-cubejs-superset-automating-semantic</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 24 Nov 2025 12:55:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h9u_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h9u_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h9u_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h9u_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg" width="278" height="278" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:278,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!h9u_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h9u_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F653999ac-86d1-4329-9c17-1b3dd47c697c_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>Rebuilding the same semantic layer over and over across different BI tools has always felt&#8230; unnecessarily painful. Most dashboards still reach directly into databases, each with their own idea of what a &#8220;metric&#8221; is, so you end up maintaining the same logic in three or four places. Even tools built to solve this &#8211; like <a href="http://cube.js">Cube.js</a> &#8211; don&#8217;t really solve the end-to-end problem of getting consistent metrics into your BI layer.</p><p>Out of curiosity (and a bit of frustration), I started tinkering with a small proof of concept to see whether dbt, Cube.js, and Superset could be wired together into a single automated flow. The result is <strong>dbt-to-cube</strong>:</p><p><a href="https://github.com/ponderedw/dbt-to-cube">https://github.com/ponderedw/dbt-to-cube</a></p><p>It&#8217;s very much a work in progress, but it already connects dbt &#8594; Cube.js &#8594; Superset and keeps metrics in sync without any manual steps. Sharing it here in case others are experimenting with similar setups &#8211; I&#8217;d genuinely love feedback, ideas, or contributions from anyone who gives it a try.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6ajf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6ajf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6ajf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3065299,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.ponder.co/i/179719306?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6ajf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 424w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 848w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!6ajf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff491ae41-021e-4de0-bce0-1971b2f52a13_800x400.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Quickstart</h1><p>See <strong>dbt-cube-sync</strong> in action! This walkthrough demonstrates a full semantic layer pipeline&#8212;from dbt transformations to BI dashboards&#8212;without any manual metric duplication.</p><h3><strong>Already Have dbt, Cube.js, and Superset?</strong></h3><p>If your stack is already deployed, you <strong>don&#8217;t need Docker</strong>. Just install dbt-cube-sync and point it to your existing deployment:</p><pre><code>pip install dbt-cube-sync

# Convert dbt models to Cube.js schemas

dbt-cube-sync dbt-to-cube \

  --manifest /path/to/manifest.json \

  --catalog /path/to/catalog.json \

  --output /path/to/cube/output

# Sync Cube.js schemas to Superset

dbt-cube-sync cube-to-bi superset \

  --cube-files /path/to/cube/output \

  --url http://your-superset:8088 \

  --username admin \

  --password admin \

  --cube-connection-name Cube</code></pre><p>This workflow works with <strong>Superset, Tableau, or PowerBI</strong>, giving you full control over your production-ready semantic layer.</p><div><hr></div><h3><strong>Starting from Scratch? Spin Up Everything Locally</strong></h3><p>If you want a <strong>full demo stack</strong> including sample data, all services run locally in Docker: PostgreSQL, dbt, Cube.js, Superset, and <strong>dbt-cube-sync</strong>.</p><h4><strong>Prerequisites</strong></h4><ul><li><p>Docker &amp; Docker Compose</p></li><li><p>Git</p></li><li><p>~10 minutes</p></li></ul><h4><strong>Step 1: Clone &amp; Start the Stack</strong></h4><pre><code>git clone https://github.com/ponderedw/dbt-to-cube
cd dbt-to-cube
docker-compose up --build</code></pre><p>This will:</p><ol><li><p>Initialize <strong>PostgreSQL</strong> with sample data</p></li><li><p>Run <strong>dbt transformations</strong> on 46 pre-built models</p></li><li><p>Start <strong>Cube.js API</strong> serving your semantic layer</p></li><li><p>Configure <strong>Superset</strong> with admin access and database connection</p></li><li><p>Automatically generate Cube.js schemas from dbt and sync them to Superset</p></li></ol><h4><strong>Step 2: Explore Your Data Stack</strong></h4><p>Once the logs show <strong>&#8220;Pipeline completed successfully!&#8221;</strong>, you can access:</p><ul><li><p><strong>Superset</strong>: http://localhost:8088 &#8212; login: admin/admin</p><ul><li><p>46 datasets auto-created from dbt models</p></li><li><p>Column metadata and metrics like <em>Average GPA</em> and <em>Pass Rate</em></p></li></ul></li></ul><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jc9l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jc9l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 424w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 848w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 1272w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jc9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png" width="1456" height="116" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:116,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jc9l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 424w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 848w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 1272w, https://substackcdn.com/image/fetch/$s_!jc9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc193aaad-3349-41e3-86db-dd597ab690ed_1600x127.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yBob!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yBob!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 424w, https://substackcdn.com/image/fetch/$s_!yBob!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 848w, https://substackcdn.com/image/fetch/$s_!yBob!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 1272w, https://substackcdn.com/image/fetch/$s_!yBob!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yBob!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png" width="1456" height="1078" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1078,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yBob!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 424w, https://substackcdn.com/image/fetch/$s_!yBob!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 848w, https://substackcdn.com/image/fetch/$s_!yBob!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 1272w, https://substackcdn.com/image/fetch/$s_!yBob!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59f12a87-7141-44d6-8e46-eb5800191fd6_1600x1185.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XWPZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XWPZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 424w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 848w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 1272w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XWPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png" width="1456" height="432" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:432,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XWPZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 424w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 848w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 1272w, https://substackcdn.com/image/fetch/$s_!XWPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6224b1d5-5a12-4d63-b700-06b7a68389af_1600x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wDe_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wDe_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 424w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 848w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 1272w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wDe_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png" width="1456" height="541" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:541,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wDe_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 424w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 848w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 1272w, https://substackcdn.com/image/fetch/$s_!wDe_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220749b3-31e9-4e60-a3f3-d7c5ffa2c24a_1600x595.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>dbt Docs</strong>: http://localhost:8080 &#8212; full DAG and column-level documentation</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2h3S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2h3S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 424w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 848w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 1272w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2h3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png" width="458" height="389.42698706099816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:920,&quot;width&quot;:1082,&quot;resizeWidth&quot;:458,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2h3S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 424w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 848w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 1272w, https://substackcdn.com/image/fetch/$s_!2h3S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aa5a294-7e83-4b0c-934e-213f3dfb58eb_1082x920.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Cube.js API</strong>: http://localhost:4000 &#8212; REST and GraphQL endpoints</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l-EF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l-EF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 424w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 848w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 1272w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l-EF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png" width="1456" height="486" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:486,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l-EF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 424w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 848w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 1272w, https://substackcdn.com/image/fetch/$s_!l-EF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc093ef-fc30-4883-ab57-ae48e3e5d24b_1600x534.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4><strong>Step 3: Watch the Pipeline in Action</strong></h4><pre><code>docker-compose logs -f dbt-cube-sync</code></pre><p>The pipeline runs in three automated phases:</p><ol><li><p><strong>dbt Parsing</strong> &#8211; reads manifest.json &amp; catalog.json, finds models, and maps dependencies</p></li><li><p><strong>Cube.js Schema Generation</strong> &#8211; converts dbt models into Cube.js dimensions and measures</p></li><li><p><strong>BI Tool Sync</strong> &#8211; pushes datasets and metrics to your BI tool with proper metadata</p></li></ol><p>Everything happens automatically for all models&#8212;no manual intervention required.</p><div><hr></div><h3><strong>&#9989; What You&#8217;ve Built</strong></h3><p>In minutes, you now have a <strong>unified semantic layer pipeline</strong>:</p><ol><li><p><strong>Single source of truth</strong>: Metrics defined once in dbt</p></li><li><p><strong>Automatic propagation</strong>: dbt &#8594; Cube.js &#8594; BI tools</p></li><li><p><strong>Cross-tool flexibility</strong>: Works with Superset, Tableau, PowerBI</p></li><li><p><strong>Developer-friendly</strong>: Version-controlled, testable, and documented</p></li></ol><p>Replace sample data with your warehouse and dbt models, and you have a <strong>production-ready semantic layer</strong> &#8211; no metric inconsistencies across tools.</p><h1>The Takeaway</h1><p>This little experiment convinced me that an automated semantic layer doesn&#8217;t have to be complicated. Define metrics once in dbt, let a small tool translate them to Cube.js, and push them into your BI tool of choice &#8211; no more re-implementing the same logic across dashboards.</p><p>If you end up trying out <strong>dbt-to-cube</strong>, I&#8217;d be really interested to hear what works, what breaks, or what you&#8217;d want it to support next. It&#8217;s still a POC, but with feedback from others running into the same problems, it could grow into something genuinely useful for the community.</p><p>Always happy to chat if you&#8217;re experimenting with semantic layers or have ideas on making this whole workflow smoother!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Airflow 3 Plugin Development: DAG Dependencies]]></title><description><![CDATA[A step-by-step tutorial for building your first Airflow 3 plugin]]></description><link>https://newsletter.ponder.co/p/airflow-3-plugin-development-dag</link><guid isPermaLink="false">https://newsletter.ponder.co/p/airflow-3-plugin-development-dag</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 17 Nov 2025 13:01:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iZio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iZio!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iZio!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iZio!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iZio!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iZio!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iZio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png" width="344" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:344,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iZio!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iZio!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iZio!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iZio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ae78474-4dd1-4cc5-8adf-1a964b0b999f_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>At Ponder, we&#8217;ve developed several plugins for Airflow 2.* and recently began migrating them to Airflow 3. Among our most valuable tools are<a href="https://pypi.org/project/airflow-schedule-insights/"> Airflow Schedule Insights</a> and<a href="https://pypi.org/project/airflow-chat/"> Airflow Chat</a>.</p><p>During the migration process, we discovered that Airflow 3.1.1 removed the DAG Dependencies tab that was present in Airflow 2.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7zaS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7zaS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 424w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 848w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 1272w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7zaS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png" width="1456" height="242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:242,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7zaS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 424w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 848w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 1272w, https://substackcdn.com/image/fetch/$s_!7zaS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e507d60-dc01-4abd-b336-4f0f56394051_1600x266.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Rather than wait for this feature to return, we saw an opportunity: we could build a plugin to restore this functionality, help the community migrate to Airflow 3 more smoothly, demonstrate how to create plugins for Airflow 3, and even add improvements we found missing in Airflow 2.</p><p>The result is<a href="https://pypi.org/project/airflow-dag-dependencies/"> airflow-dag-dependencies</a>. In this post, we&#8217;ll walk you through how we built it and how it helps us manage our many educational DAGs.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7a7acfa2-59e5-4bde-84f5-8104a6d0db48&quot;,&quot;duration&quot;:null}"></div><h1>Quick Start</h1><p>To use our plugin, simply install <strong>airflow-dag-dependencies</strong> in your Airflow environment. If you don&#8217;t have an environment set up, clone our<a href="https://github.com/ponderedw/airflow-dag-dependencies"> GitHub repository</a> and run docker compose up.</p><p>After a few minutes, once Airflow is running, navigate to <strong>http://localhost:8080/</strong> and log in with username &#8220;airflow&#8221; and password &#8220;airflow&#8221;. You&#8217;ll find a dozen educational DAGs &#8212; <strong>load_class_attendance</strong>, <strong>load_course_evaluations</strong>, and others.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sSPe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sSPe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 424w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 848w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sSPe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sSPe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 424w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 848w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!sSPe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5621b9-dba9-4bce-bf0d-7210c35f53b8_1600x1034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some are triggered by datasets, others by DAGs, and some run on cron schedules. The challenge? Understanding how they all connect.</p><p>This is where our plugin shines. Navigate to the <strong>Browse</strong> menu and click on <strong>DAG Dependencies</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7NcY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7NcY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 424w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 848w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 1272w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7NcY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png" width="396" height="384.84507042253523" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:568,&quot;resizeWidth&quot;:396,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7NcY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 424w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 848w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 1272w, https://substackcdn.com/image/fetch/$s_!7NcY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8435cb-c872-4e60-9990-9f3ae6c7f1c8_568x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You&#8217;ll immediately see all the relationships visualized clearly. Notice how <strong>transform_program_effectiveness</strong> has two dependencies: a cron schedule and a dataset trigger.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b0yp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b0yp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 424w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 848w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 1272w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b0yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png" width="1018" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1018,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b0yp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 424w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 848w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 1272w, https://substackcdn.com/image/fetch/$s_!b0yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F004344c6-c120-4162-9e92-4af633e8d76c_1018x554.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can also spot that <strong>load_curriculum_catalog</strong> and <strong>load_student_enrollment_data</strong> have no dependencies or schedules&#8212;they won&#8217;t run automatically.</p><p>And you&#8217;ll see that <strong>transform_academic_performance</strong> is triggered by <strong>load_course_evaluations</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CiGW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CiGW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 424w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 848w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 1272w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CiGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png" width="500" height="491.4841849148419" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:822,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CiGW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 424w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 848w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 1272w, https://substackcdn.com/image/fetch/$s_!CiGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74f2f33f-7fdb-4a6a-80cd-9cd266176d23_822x808.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Enhanced Filtering</strong></p><p>But we didn&#8217;t stop at recreating Airflow 2&#8217;s functionality&#8212;we added the filtering capabilities we always wished it had. Want to see only the direct downstream dependencies of transform_student_feedback_analysis and all its upstream dependencies? Simply enter +transform_student_feedback_analysis+1 in the search bar. The graph instantly filters to show only the relevant connections.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vxPU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vxPU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 424w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 848w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 1272w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vxPU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png" width="554" height="284.6098901098901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1456,&quot;resizeWidth&quot;:554,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vxPU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 424w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 848w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 1272w, https://substackcdn.com/image/fetch/$s_!vxPU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd09570-edb0-4e89-89f9-cebf1857209f_1600x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The search syntax is intuitive: use <strong>+</strong> before a DAG name to include upstream dependencies, after to include downstream, or both for the full picture. Add a number (like +dag_name+2) to control how many levels deep to traverse. You can also search multiple DAGs at once using commas, or use <strong>@exact_name</strong> for precise matching.</p><p>That&#8217;s the power of airflow-dag-dependencies!</p><h1>Building Your First Airflow 3 Plugin: A Technical Deep Dive</h1><p>Now that we&#8217;ve seen the plugin in action, here is how to build it from scratch. This walkthrough highlights the key differences between Airflow 2 and Airflow 3 plugin development and shows how to create your own plugin.</p><h3><strong>Plugin Structure: Airflow 3 vs Airflow 2</strong></h3><p>One of the most significant changes in Airflow 3 is how plugins are structured and registered.</p><h4><strong>Airflow 2 Plugin Structure</strong></h4><pre><code>from airflow.plugins_manager import AirflowPlugin
from flask import Blueprint

from flask_admin import BaseView

class MyAirflow2Plugin(AirflowPlugin):

    name = &#8220;my_plugin&#8221;

    flask_blueprints = [my_blueprint]  # Flask blueprints

    admin_views = [MyAdminView]        # Flask-Admin views

    menu_links = [my_menu_link]        # Menu items</code></pre><h4><strong>Airflow 3 Plugin Structure</strong></h4><pre><code>from airflow.plugins_manager import AirflowPlugin
class MyAirflow3Plugin(AirflowPlugin):

    name = &#8220;my_plugin&#8221;

    fastapi_apps = [my_fastapi_app]     # FastAPI applications

    external_views = [my_external_view] # External view definitions</code></pre><div><hr></div><h3>Key Changes in Airflow 3</h3><p>&#8226; FastAPI replaces Flask for web applications, improving performance, async support, and automatic API documentation.<br> &#8226; External views replace Flask-Admin views, giving more flexible UI integration.<br> &#8226; Menu items are now part of external views rather than separate menu link definitions.</p><div><hr></div><h3><strong>Anatomy of the DAG Dependencies Plugin</strong></h3><h4><strong>Package Structure</strong></h4><p>airflow_dag_dependencies/</p><p>&#9500;&#9472;&#9472; __init__.py</p><p>&#9492;&#9472;&#9472; plugins/</p><p>    &#9500;&#9472;&#9472; __init__.py</p><p>    &#9492;&#9472;&#9472; dags_dependencies_plugin.py</p><div><hr></div><h3><strong>FastAPI Application</strong></h3><pre><code>from fastapi import FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get(&#8221;/&#8221;, response_class=HTMLResponse)

async def dag_dependencies_graph():

    # Return HTML with embedded D3.js visualization

    return html_content

@app.get(&#8221;/api/dag-dependencies&#8221;)

async def get_dag_dependencies():

    # Return JSON data for DAG relationships

    return {&#8221;nodes&#8221;: nodes, &#8220;links&#8221;: links}</code></pre><div><hr></div><h3><strong>Plugin Registration</strong></h3><p><strong>FastAPI app configuration</strong></p><pre><code>fastapi_app_with_metadata = {
    &#8220;app&#8221;: app,
    &#8220;url_prefix&#8221;: &#8220;/dags_dependencies&#8221;,
    &#8220;name&#8221;: &#8220;DAG Dependencies App&#8221;
}</code></pre><p><strong>External view for menu integration</strong></p><pre><code>dag_dependencies_external_view = {
    &#8220;name&#8221;: &#8220;DAG Dependencies&#8221;,
    &#8220;href&#8221;: &#8220;/dags_dependencies/&#8221;,
    &#8220;destination&#8221;: &#8220;nav&#8221;,
    &#8220;category&#8221;: &#8220;browse&#8221;,
    &#8220;url_route&#8221;: &#8220;dag_dependencies&#8221;
}</code></pre><p><strong>Plugin class</strong></p><pre><code>class DagDependenciesPlugin(AirflowPlugin):
    name = &#8220;dags_dependencies_plugin&#8221;
    fastapi_apps = [fastapi_app_with_metadata]
    external_views = [dag_dependencies_external_view]</code></pre><div><hr></div><h3><strong>Data Access: Using DagBag</strong></h3><p>The plugin accesses Airflow&#8217;s DAG metadata through DagBag.</p><pre><code>from airflow.models import DagBag
async def get_dag_dependencies():

    dagbag = DagBag(include_examples=False)

    nodes = []

    for dag_id, dag in dagbag.dags.items():

        nodes.append({

            &#8220;id&#8221;: dag_id,

            &#8220;type&#8221;: determine_dag_type(dag),

            &#8220;schedule&#8221;: get_schedule_info(dag)

        })

    links = analyze_dag_relationships(dagbag)

    return {&#8221;nodes&#8221;: nodes, &#8220;links&#8221;: links}</code></pre><div><hr></div><h3><strong>Frontend Options: Embedded or External</strong></h3><p>Airflow 3 supports multiple frontend approaches:</p><p>&#8226; Embedded HTML/JS (current plugin)<br>&#8226; Standalone React components (future tutorial)<br>&#8226; Serving static assets for more advanced UIs</p><div><hr></div><h3><strong>Packaging for Distribution</strong></h3><p>Example <strong>pyproject.toml</strong> configuration:</p><pre><code>[tool.poetry]
name = &#8220;airflow-dag-dependencies&#8221;

version = &#8220;0.1.1a1&#8221;

description = &#8220;An Apache Airflow plugin that provides interactive visualization of DAG dependencies&#8221;

authors = [&#8221;Ponder&#8221;]

[tool.poetry.dependencies]

python = &#8220;&gt;=3.12, &lt;3.14&#8221;

apache-airflow = &#8220;^3.1.0&#8221;

[tool.poetry.plugins.&#8221;airflow.plugins&#8221;]

dag-dependencies-plugin = &#8220;airflow_dag_dependencies.plugins.dags_dependencies_plugin:DagDependenciesPlugin&#8221;</code></pre><div><hr></div><h3><strong>What&#8217;s Next?</strong></h3><p>The next tutorial will cover:</p><p>&#8226; Building React components that integrate with Airflow&#8217;s UI<br>&#8226; Handling authentication and permissions</p><p>Airflow 3&#8217;s FastAPI foundation opens the door to more capable, modern, and faster plugin development. More powerful integrations are now possible than ever.</p><h1>Conclusion</h1><p>Airflow 3 marks a real shift in how developers extend the platform. FastAPI, external views, and the new plugin model make it possible to build tools that are faster, more flexible, and much easier to maintain. Rebuilding the DAG Dependencies feature gave us a chance to explore these new capabilities in depth and turn a missing Airflow 2 feature into something more capable than before.</p><p>The <strong>airflow-dag-dependencies</strong> plugin restores a critical part of the Airflow UI, adds filtering and search features that help teams understand complex pipelines, and acts as a practical example of how to build real plugins in Airflow 3. If you are migrating from Airflow 2 or planning to develop your own extensions, this approach will give you a strong foundation.</p><p>There is still more room to grow. React-based UI components, richer interactions with Airflow&#8217;s new frontend APIs, and improved permission handling are all on the way. Airflow 3 opened the door to a modern plugin ecosystem, and this is only the start.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Superset MCP: Organizing Dashboard Metadata]]></title><description><![CDATA[How we use Superset MCP to keep complex dashboards structured, searchable, and easy to manage.]]></description><link>https://newsletter.ponder.co/p/superset-mcp-organizing-dashboard</link><guid isPermaLink="false">https://newsletter.ponder.co/p/superset-mcp-organizing-dashboard</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 10 Nov 2025 13:03:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_Kia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1></h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Kia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Kia!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Kia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png" width="288" height="288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:288,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_Kia!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_Kia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1925c1d9-0d96-40eb-ac5f-1300c797a046_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Introduction</h1><p>At <a href="https://ponder.co/">Ponder</a>, we first introduced <a href="https://newsletter.ponder.co/p/next-level-airflow-mcp">Airflow MCP</a> and <a href="https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built">its plugin</a> to make working with DAGs and pipelines smoother. But along the way, we realized something: managing Superset dashboards and their metadata can be just as challenging&#8212;if not more so.</p><p>Take education as an example. Schools and educational institutions manage dozens&#8212;sometimes hundreds&#8212;of dashboards tracking everything from student performance and attendance to resource allocation and budget utilization. Multiple BI developers work constantly on these dashboards, making frequent updates and refinements so stakeholders can access the most current data to improve education and help pupils succeed. The result? A powerful ecosystem of insights&#8212;but also an overwhelming maze of metadata.</p><p>Questions like &#8220;Who changed the attendance dashboard last week?&#8221;, &#8220;Which table powers our graduation rate metrics?&#8221;, or &#8220;What&#8217;s the data source behind this enrollment forecast?&#8221; can quickly become a time sink. And it&#8217;s not just schools&#8212;any organization with a complex BI environment faces the same challenge.</p><p>That&#8217;s why we built <strong>Superset MCP</strong>&#8212;so you can explore and manage Superset metadata through natural language, directly from your Claude code. No need to wrestle with the UI, no need to dig through layers of metadata. Just type your question, and get clear answers in plain language.</p><p>You can check out the project on <a href="https://github.com/ponderedw/superset-mcp">GitHub</a>, pull the image from <a href="https://hub.docker.com/repository/docker/pondered/superset-mcp/general">Docker Hub</a>, or install it from <a href="https://pypi.org/project/superset-mcp-server/">PyPI</a>.</p><h1>Quickstart</h1><h3><strong>1. Run Superset Locally</strong></h3><p>If you don&#8217;t already have a Superset deployment but still want to try out <strong>Superset MCP</strong>, simply clone our GitHub repository and start it with Docker Compose:</p><pre><code>git clone https://github.com/ponderedw/superset-mcp
cd superset-mcp
docker compose up</code></pre><p>Once it&#8217;s up, open your browser and visit:</p><pre><code>http://localhost:8088/</code></pre><p>Login credentials for the example environment:</p><ul><li><p><strong>Username:</strong> superset_admin</p></li><li><p><strong>Password:</strong> superset<br><br></p></li></ul><div><hr></div><h3><strong>2. Using Superset MCP in Claude Desktop</strong></h3><ol><li><p>Open <strong>Claude Desktop</strong>.</p></li><li><p>Navigate to: <strong>Settings &#8594; Developer &#8594; Edit Config</strong>.</p></li><li><p>Add the following entry to your MCP servers:</p></li></ol><pre><code>{
  &#8220;mcpServers&#8221;: {
    &#8220;superset&#8221;: {
      &#8220;args&#8221;: [
        &#8220;run&#8221;,
        &#8220;-i&#8221;,
        &#8220;--rm&#8221;,
        &#8220;-e&#8221;,
        &#8220;SUPERSET_API_URL&#8221;,
        &#8220;-e&#8221;,
        &#8220;SUPERSET_USERNAME&#8221;,
        &#8220;-e&#8221;,
        &#8220;SUPERSET_PASSWORD&#8221;,
        &#8220;pondered/superset-mcp:latest&#8221;
      ],
      &#8220;command&#8221;: &#8220;docker&#8221;,
      &#8220;env&#8221;: {
        &#8220;SUPERSET_API_URL&#8221;: &#8220;http://host.docker.internal:8088&#8221;,
        &#8220;SUPERSET_USERNAME&#8221;: &#8220;superset_admin&#8221;,
        &#8220;SUPERSET_PASSWORD&#8221;: &#8220;superset&#8221;
      }
    }
  }
}
</code></pre><blockquote><p><strong>Note:</strong> The Superset URL and credentials above match our local example environment.</p></blockquote><ol start="4"><li><p>Restart Claude Code.</p></li></ol><div><hr></div><h3><strong>3. Using Superset MCP with LangChain</strong></h3><p>To integrate with LangChain:</p><ol><li><p>Install our PyPI package:</p></li></ol><pre><code>pip install superset-mcp-server</code></pre><p>&#128230;<a href="https://pypi.org/project/superset-mcp-server/"> PyPI link</a></p><ol start="2"><li><p>Add the following MCP server configuration to your tools:</p></li></ol><pre><code>from langchain_mcp_adapters.client import MultiServerMCPClient
import os

mcps = {
    &#8220;SupersetMCP&#8221;: {
        &#8220;command&#8221;: &#8220;python&#8221;,
        &#8220;args&#8221;: [&#8221;-m&#8221;, &#8220;superset_mcp_server.mcp_server&#8221;],
        &#8220;transport&#8221;: &#8220;stdio&#8221;,
        &#8220;env&#8221;: {
            k: v for k, v in {
                &#8220;SUPERSET_API_URL&#8221;: os.getenv(&#8221;SUPERSET_API_URL&#8221;),
                &#8220;SUPERSET_USERNAME&#8221;: os.getenv(&#8221;SUPERSET_USERNAME&#8221;),
                &#8220;SUPERSET_PASSWORD&#8221;: os.getenv(&#8221;SUPERSET_PASSWORD&#8221;),
            }.items() if v is not None
        }
    }
}

client = MultiServerMCPClient(mcps)
mcp_tools = await client.get_tools()</code></pre><p>Now you&#8217;re ready to simply <strong>ask questions about your Superset instance in natural language</strong>&#8212;and let MCP handle the rest!</p><h1>Talking to Superset MCP</h1><p>Let&#8217;s connect to our example Superset deployment and build a simple dashboard using the data automatically ingested into our Postgres database.</p><p>First, we&#8217;ll add a database connection &#8212; specify <strong>&#8220;postgres&#8221;</strong> as both the host and the database name, and use <strong>&#8220;superset&#8221;</strong> for the login and password.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FJtM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FJtM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 424w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 848w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 1272w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FJtM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png" width="360" height="265.6236786469345" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d45533d6-8ad7-472d-abf3-f644446122bf_946x698.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:698,&quot;width&quot;:946,&quot;resizeWidth&quot;:360,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FJtM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 424w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 848w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 1272w, https://substackcdn.com/image/fetch/$s_!FJtM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd45533d6-8ad7-472d-abf3-f644446122bf_946x698.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once connected, we can create a few simple charts from the database tables and organize them into an <strong>E-commerce Performance Dashboard</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ichW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ichW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 424w, https://substackcdn.com/image/fetch/$s_!ichW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 848w, https://substackcdn.com/image/fetch/$s_!ichW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 1272w, https://substackcdn.com/image/fetch/$s_!ichW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ichW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png" width="190" height="329.82683982683983" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:462,&quot;resizeWidth&quot;:190,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ichW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 424w, https://substackcdn.com/image/fetch/$s_!ichW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 848w, https://substackcdn.com/image/fetch/$s_!ichW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 1272w, https://substackcdn.com/image/fetch/$s_!ichW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F703c9ae9-4fb4-4132-b76b-188de100a10a_462x802.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wi0c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wi0c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 424w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 848w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 1272w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wi0c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png" width="1456" height="632" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:632,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wi0c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 424w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 848w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 1272w, https://substackcdn.com/image/fetch/$s_!wi0c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf93c55d-d2c5-44a2-885e-e59e4b3615af_1600x694.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, don&#8217;t forget to <strong>publish</strong> your dashboard so it&#8217;s ready to use!<br><br></p><p>You can explore all the available tools in Claude Desktop &#8212; and more will be coming soon.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-cRC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-cRC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 424w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 848w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 1272w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-cRC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png" width="326" height="259.1901234567901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:644,&quot;width&quot;:810,&quot;resizeWidth&quot;:326,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-cRC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 424w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 848w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 1272w, https://substackcdn.com/image/fetch/$s_!-cRC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73c25ea3-e699-4c2b-b9be-4bf48534ccf6_810x644.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, let&#8217;s start asking some interesting questions:</p><ul><li><p><strong>How many dashboards and charts do we have?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ibZ3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ibZ3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 424w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 848w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 1272w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ibZ3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png" width="468" height="276.42857142857144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:860,&quot;width&quot;:1456,&quot;resizeWidth&quot;:468,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ibZ3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 424w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 848w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 1272w, https://substackcdn.com/image/fetch/$s_!ibZ3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba11f50f-9ba0-4678-81a9-c57e4d970d3a_1600x945.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N7GM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N7GM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 424w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 848w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N7GM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png" width="512" height="332.3076923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:945,&quot;width&quot;:1456,&quot;resizeWidth&quot;:512,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!N7GM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 424w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 848w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 1272w, https://substackcdn.com/image/fetch/$s_!N7GM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed0f47fd-d1e2-4aa7-b91c-943cacd3a319_1600x1038.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Great! We get the exact number of dashboards and charts in our environment.</p></li><li><p><strong>Who are the most active users?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mbTf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mbTf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 424w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 848w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 1272w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mbTf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png" width="510" height="366.3873626373626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1046,&quot;width&quot;:1456,&quot;resizeWidth&quot;:510,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mbTf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 424w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 848w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 1272w, https://substackcdn.com/image/fetch/$s_!mbTf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9485d2e0-2310-4d23-9b01-f3e2cf5d37b8_1600x1149.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rkiO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rkiO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 424w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 848w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rkiO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png" width="340" height="380.68579426172147" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1429,&quot;resizeWidth&quot;:340,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rkiO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 424w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 848w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!rkiO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc307f670-4122-4d83-a95c-eb42ddb6ffb2_1429x1600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br>Perfect &#8212; not only do we see the top active user, but we also get an <em>Activity Timeline</em>, which makes it much easier to understand what&#8217;s happening in our cluster.</p></li></ul><ul><li><p><strong>What is the source table for Customer-Product Network?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rO2J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rO2J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 424w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 848w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rO2J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png" width="450" height="343.68131868131866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1112,&quot;width&quot;:1456,&quot;resizeWidth&quot;:450,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rO2J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 424w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 848w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!rO2J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b3866b5-24b1-4a9c-88e4-67ce2edc1b5c_1600x1222.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> Excellent &#8212; we now have the precise database object name.</p></li></ul><ul><li><p><strong>When was the </strong><em><strong>Revenue by Country</strong></em><strong> chart last changed, and by whom?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zaif!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zaif!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 424w, https://substackcdn.com/image/fetch/$s_!zaif!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 848w, https://substackcdn.com/image/fetch/$s_!zaif!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 1272w, https://substackcdn.com/image/fetch/$s_!zaif!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zaif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png" width="532" height="431.15384615384613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1180,&quot;width&quot;:1456,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!zaif!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 424w, https://substackcdn.com/image/fetch/$s_!zaif!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 848w, https://substackcdn.com/image/fetch/$s_!zaif!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 1272w, https://substackcdn.com/image/fetch/$s_!zaif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb272e8f-6523-4fcc-aa44-6f2a6ce6e496_1600x1297.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Spot on &#8212; we&#8217;ve got the correct answer here as well.</p></li></ul><p>Pretty cool, right? Keep exploring and help us uncover even more capabilities of Superset MCP!</p><h1>Conclusion &#8212; Managing Metadata the Smart Way</h1><p>Superset MCP turns the often painful task of navigating dashboard metadata into a fast, intuitive conversation. Whether you&#8217;re an educational administrator tracking changes to student performance dashboards, a data analyst identifying which tables feed into critical reports, or a team lead trying to understand who&#8217;s been most active in your BI environment&#8212;you can now skip the clicks, menus, and manual searches. Just ask in plain language, and get precise, actionable answers.</p><p>In education settings where BI teams constantly update dashboards to provide stakeholders with real-time insights for improving outcomes, Superset MCP becomes invaluable. But the benefits extend far beyond schools&#8212;any business with complex dashboard environments, whether in healthcare, finance, retail, or manufacturing, can leverage this natural language interface to cut through the metadata complexity.</p><p>Because it works entirely through natural language, you can easily delegate these tasks to <strong>analysts, project managers, principals, department heads, or any non-technical users</strong>&#8212;empowering more people in your team to get the information they need without relying on developers or admins.</p><p>We&#8217;re excited to see how the community will use Superset MCP&#8212;and we&#8217;d love your feedback. Try it out, share your ideas, and help us shape the next set of capabilities.</p><p>&#128279; <strong>Resources:</strong></p><ul><li><p><a href="https://github.com/hipposys-ltd/superset-mcp">GitHub Repository</a></p></li><li><p><a href="https://hub.docker.com/repository/docker/pondered/superset-mcp/general">Docker Hub Image</a></p></li><li><p><a href="https://pypi.org/project/superset-mcp-server/">PyPI Package</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts and support our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Graph-Powered AI Chat for dbt]]></title><description><![CDATA[Using FalkorDB & Neo4j as a Graph DB]]></description><link>https://newsletter.ponder.co/p/graph-powered-ai-chat-for-dbt</link><guid isPermaLink="false">https://newsletter.ponder.co/p/graph-powered-ai-chat-for-dbt</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Mon, 03 Nov 2025 13:21:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UPUJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UPUJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UPUJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UPUJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png" width="488" height="325.44505494505495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:488,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!UPUJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!UPUJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19e57aca-08e9-4945-a768-23ad7c8f78c8_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Introduction</strong></h2><p>In education data teams, our analytics models often grow organically alongside organizational needs. As school networks expand their data infrastructure&#8212;adding new student information systems, assessment platforms, and operational tools&#8212;their dbt projects can become increasingly complex. What starts as a clean set of staging models quickly evolves into an intricate web of dependencies that becomes difficult to navigate and maintain.</p><p>In previous blog posts&#8212;<a href="https://newsletter.ponder.co/publish/posts/detail/162414803?referrer=%2Fpublish%2Fposts">dbt-to-English</a> and <a href="https://newsletter.ponder.co/p/towards-english-to-sql-that-actually">English-to-SQL</a>&#8212;we demonstrated how LLMs can assist with understanding and generating dbt metadata. However, these tools fall short when it comes to answering complex questions about dbt&#8217;s project-wide structure and dependencies. For instance, what is the most widely reused source across models (recursively)? Or, how many seed datasets are used by models materialized as tables?</p><p>We&#8217;ve seen this challenge firsthand. At one school network, their analytics catalog grew from a handful of models serving basic enrollment reporting to hundreds of interconnected models supporting everything from attendance analytics to intervention tracking to college persistence dashboards. This organic growth led to inadvertent circular dependencies that made it increasingly difficult to refactor models or optimize their orchestration. The team needed a way to visualize and understand these dependencies before they could untangle them.</p><p>That&#8217;s when we had a realization: dbt&#8217;s structure is naturally graph-shaped, making it an excellent fit for graph databases. This inspired us to launch a new project&#8212;<a href="https://github.com/ponderedw/dbt-kg">dbt-kg</a>&#8212;which shows how to upload dbt metadata (from manifest.json and catalog.json) into a graph database and leverage it in an AI-powered chat. While our demo uses <a href="https://www.falkordb.com/">FalkorDB</a>, the project is also compatible with Neo4j&#8212;just update the configuration settings accordingly.</p><h2><strong>Quickstart</strong></h2><p>To get started, clone our GitHub repository:<br><a href="https://github.com/hipposys-ltd/dbt-kg"> https://github.com/ponderedw/dbt-kg</a></p><p>Next, copy the environment template and configure it:</p><pre><code>cp template.env .env</code></pre><p>In your <strong>.env</strong> file, set the <strong>LLM_MODEL_ID</strong> according to the provider you want to use:</p><pre><code>LLM_MODEL_ID=&#8217;bedrock:...&#8217;
LLM_MODEL_ID=&#8217;anthropic:...&#8217;
LLM_MODEL_ID=&#8217;openai:...&#8217;</code></pre><blockquote><p>The prefix (bedrock, anthropic, or openai) determines which LLM provider will be used.<br> Be sure to include the appropriate credentials as well:</p></blockquote><ul><li><p><strong>AWS_SECRET_ACCESS_KEY</strong> for Bedrock</p></li><li><p><strong>ANTHROPIC_API_KEY</strong> for Anthropic</p></li><li><p><strong>OPENAI_API_KEY</strong> for OpenAI</p></li></ul><p>Then, choose your graph database by setting the <strong>GRAPH_DB</strong> variable. This can be either <strong>falkordb</strong> or <strong>neo4j</strong>. For this demo, we&#8217;ll be using <strong>FalkorDB</strong>.</p><p>If your database requires authentication, provide values for <strong>GRAPH_USER</strong> and <strong>GRAPH_PASSWORD</strong>.</p><blockquote><p>&#9888;&#65039; Our default FalkorDB setup does <strong>not</strong> use authentication, so these can remain commented out. If you&#8217;re using our default Neo4j setup, uncomment those variables and set the default credentials accordingly.</p></blockquote><p>Now, run the setup:</p><pre><code>just all</code></pre><p>Once everything is set up, open your browser and go to:</p><pre><code> http://localhost:8501/</code></pre><p>Navigate to the <strong>&#8220;Load DBT Manifest&#8221;</strong> page from the sidebar. You&#8217;ll be prompted to upload your <strong>manifest.json</strong> and <strong>catalog.json</strong> files. If you have your own, upload them; otherwise, use the sample files located in <strong>DbtExampleProject/target</strong> within the repo.</p><p>Upon successful upload, you&#8217;ll see a confirmation message.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M1bs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M1bs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 424w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 848w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 1272w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M1bs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png" width="1456" height="992" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:992,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M1bs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 424w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 848w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 1272w, https://substackcdn.com/image/fetch/$s_!M1bs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b9d97d-6f63-469b-a9dd-18481759d787_1476x1006.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, open your graph database UI at:</p><pre><code> http://localhost:3000/</code></pre><p>Run the following query to view your dbt Knowledge Graph:</p><pre><code>MATCH (a)-[b]-(c)
RETURN a, b, c</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2kvb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2kvb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 424w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 848w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 1272w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2kvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png" width="1456" height="635" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:635,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2kvb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 424w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 848w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 1272w, https://substackcdn.com/image/fetch/$s_!2kvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ae7ddb8-42cd-4c54-9573-f3013653759a_1600x698.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Congratulations! Your <strong>dbt Knowledge Graph</strong> is now up and running. &#127881;</p><h2><strong>Interacting with Your dbt Graph via Chat</strong></h2><p>Let&#8217;s return to</p><pre><code> http://localhost:8501/</code></pre><p>&#8212;this time, we&#8217;ll stay on the <strong>Main</strong> page and begin chatting with our dbt Knowledge Graph.</p><p>We&#8217;ll start by asking a high-level question about source table usage:</p><blockquote><p><strong>Prompt:<br></strong> &#8220;Can you find the source tables that are used by the most models, including indirect dependencies through the entire dependency chain?&#8221;<br></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u7Me!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u7Me!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 424w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 848w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 1272w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u7Me!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png" width="1438" height="204" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:204,&quot;width&quot;:1438,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u7Me!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 424w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 848w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 1272w, https://substackcdn.com/image/fetch/$s_!u7Me!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37ed9b57-4a06-4875-8cb6-79090daba57f_1438x204.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q0ja!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0ja!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 424w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 848w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q0ja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png" width="1394" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/192957dd-451a-4941-adba-fad1f1705660_1394x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q0ja!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 424w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 848w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0ja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F192957dd-451a-4941-adba-fad1f1705660_1394x736.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cdXH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cdXH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 424w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 848w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 1272w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cdXH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png" width="1394" height="434" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:434,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cdXH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 424w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 848w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 1272w, https://substackcdn.com/image/fetch/$s_!cdXH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d59e19d-98e6-4661-b622-9caa2af27c0a_1394x434.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The system correctly identifies both source tables from our example project and ranks them by usage in descending order. Perfect!</p><p>Next, let&#8217;s try something more challenging:</p><blockquote><p><strong>Prompt:<br></strong> &#8220;Please identify the model with the highest number of dependent models, including transitive dependencies. This model must be materialized as a table. Return all the information you have about this table.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s42I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s42I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 424w, https://substackcdn.com/image/fetch/$s_!s42I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 848w, https://substackcdn.com/image/fetch/$s_!s42I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 1272w, https://substackcdn.com/image/fetch/$s_!s42I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s42I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png" width="1394" height="216" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:216,&quot;width&quot;:1394,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s42I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 424w, https://substackcdn.com/image/fetch/$s_!s42I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 848w, https://substackcdn.com/image/fetch/$s_!s42I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 1272w, https://substackcdn.com/image/fetch/$s_!s42I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46b8ec2c-efd7-47e5-bb1d-b7e87e4bf894_1394x216.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This is tricky&#8212;because in our project, there are no models materialized as <strong>table</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SfO7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SfO7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 424w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 848w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 1272w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SfO7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png" width="556" height="362.95552367288377" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1394,&quot;resizeWidth&quot;:556,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SfO7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 424w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 848w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 1272w, https://substackcdn.com/image/fetch/$s_!SfO7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5b49d5-5c54-4218-87cf-cd298c34513f_1394x910.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AgnI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AgnI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 424w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 848w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AgnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png" width="546" height="405.77905308464847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1036,&quot;width&quot;:1394,&quot;resizeWidth&quot;:546,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AgnI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 424w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 848w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!AgnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc101e5-d2b9-49b6-8bf9-e4eef3d9c2a9_1394x1036.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Impressively, the LLM handles this gracefully by identifying the closest match: a view instead, and clearly stating the limitation. That&#8217;s a solid response.</p><p>Let&#8217;s follow up with another prompt to dig deeper:</p><blockquote><p><strong>Prompt:<br></strong> &#8220;Can you also list indirect dependent models for stg_orders?&#8221;<br></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b2kn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b2kn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 424w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 848w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 1272w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b2kn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png" width="424" height="273.2050209205021" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:616,&quot;width&quot;:956,&quot;resizeWidth&quot;:424,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b2kn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 424w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 848w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 1272w, https://substackcdn.com/image/fetch/$s_!b2kn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9cb4ff3-4264-437b-8659-4a277ea76157_956x616.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now we&#8217;re talking. The model returns the full dependency chain. Mission accomplished.</p><div><hr></div><h3><strong>From One Monolithic Job to Smart Job Grouping</strong></h3><p>In many real-world workflows, especially when integrating with orchestrators like <strong>Airflow</strong>, we don&#8217;t want to run the entire dbt graph as a single job. Instead, we aim to break it into smaller, manageable jobs (DAGs) that can trigger downstream non-dbt processes as early as possible. But there&#8217;s a catch: circular dependencies often make this kind of separation complex and error-prone.</p><p>Let&#8217;s ask the LLM to help with that:</p><blockquote><p><strong>Prompt:<br></strong> &#8220;Can you analyze our dbt dependency graph and create a job separation strategy? I need to group models, seeds, and snapshots into separate jobs that eliminate circular dependencies while defining clear inter-job dependencies.&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FSI1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FSI1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 424w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 848w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 1272w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FSI1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png" width="1338" height="1258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1258,&quot;width&quot;:1338,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FSI1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 424w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 848w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 1272w, https://substackcdn.com/image/fetch/$s_!FSI1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc75ab990-a97c-46b4-ac29-23c18c305fd1_1338x1258.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And it delivers! The model intelligently separates our graph into four distinct jobs and describes the cross-job dependencies clearly.</p><h2>Summary</h2><p>By leveraging the graph-shaped nature of dbt projects, the dbt-kg initiative demonstrates how graph databases like FalkorDB and Neo4j can supercharge the way we interact with dbt metadata. With an intuitive setup, seamless integration of LLMs, and a simple web-based interface, users can upload their dbt artifacts and start asking complex, project-wide questions in natural language.</p><p>For education data teams in particular, this approach addresses a common challenge: as schools and networks scale their analytics capabilities, their dbt projects naturally grow more complex. The AI-powered chat not only handles nuanced prompts about source usage, dependencies, and materializations but also assists in advanced tasks like intelligent job grouping to optimize orchestration workflows&#8212;exactly the kind of refactoring that the school network mentioned earlier needed to break apart their circular dependencies and create a more maintainable structure.</p><p>Whether you&#8217;re supporting a single school, a district, or a multi-state network, transforming static metadata into a dynamic, queryable knowledge graph makes data engineering more intelligent, conversational, and manageable. This is especially valuable in education, where data teams often wear multiple hats and need efficient ways to understand and maintain increasingly sophisticated analytics infrastructure.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Data &amp; AI Engineering @ Ponder! Subscribe for free to receive new posts!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Observability for LangChain with Langfuse]]></title><description><![CDATA[How Airflow-Chat Makes It Easy]]></description><link>https://newsletter.ponder.co/p/observability-for-langchain-with</link><guid isPermaLink="false">https://newsletter.ponder.co/p/observability-for-langchain-with</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Tue, 05 Aug 2025 09:50:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DFwK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DFwK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DFwK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DFwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png" width="219" height="328.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:219,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DFwK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!DFwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d66dd8b-caae-43d6-b222-dea5c3138ecb_1024x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Introduction</h2><p>After recently launching our new library, <strong>airflow-chat</strong>&#8212;a plugin that enables seamless LLM chat interactions within your Airflow instance via our <strong><a href="https://newsletter.hipposys.ai/publish/posts/detail/162028958?referrer=%2Fpublish%2Fposts">Airflow MCP</a></strong>&#8212;we quickly turned our attention to an important question: <em>how do we effectively observe and log these conversations?</em></p><p>Imagine a scenario where a user triggers an unintended action due to safe mode being disabled, leading to a production error. How do you trace the issue? Who initiated the command? What was the exact prompt that caused the failure? Or more generally&#8212;how do you evaluate LLM interactions over time?</p><p>To address these questions, we turned to <strong>Langfuse</strong>, an elegant open-source tool purpose-built for developing, monitoring, evaluating, and debugging LLM applications. In this blog post, we&#8217;ll walk you through integrating Langfuse into your LangChain workflow&#8212;and specifically, how we&#8217;ve already done this within the airflow-chat plugin. You can follow along using our repo:<a href="https://github.com/ponderedw/airflow-mcp-plugins"> https://github.com/ponderedw/airflow-mcp-plugins</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Quickstart</h2><p>Let&#8217;s walk through a quick setup to see how Langfuse integrates with the airflow-chat plugin.</p><h3><strong>1. Clone the Repository and Set Up Locally</strong></h3><p>Start by cloning our GitHub repository:</p><pre><code>git clone https://github.com/ponderedw/airflow-mcp-plugins</code></pre><p>Then follow the setup steps outlined in our airflow-chat blog post to get the plugin running in your local environment.</p><blockquote><p><strong>Note:</strong> Running both Airflow and Langfuse locally can be resource-intensive. If your machine starts lagging, consider connecting to pre-deployed instances of Airflow and Langfuse for a smoother experience.</p></blockquote><p>To launch both locally, run:</p><pre><code>just airflow_langfuse</code></pre><p>Once the containers are up, head to</p><pre><code> http://localhost:3000/</code></pre><p> and sign up for a new Langfuse account.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wXD1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wXD1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 424w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 848w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 1272w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wXD1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png" width="276" height="348.12345679012344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1226,&quot;width&quot;:972,&quot;resizeWidth&quot;:276,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wXD1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 424w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 848w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 1272w, https://substackcdn.com/image/fetch/$s_!wXD1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f017785-87c5-4422-a813-f9424cd8cf39_972x1226.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>2. Create an Organization, Project, and API Key</strong></h3><p>After signing up:</p><ul><li><p>Create a new <strong>Organization</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GXb5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GXb5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 424w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 848w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 1272w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GXb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png" width="1456" height="284" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:284,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GXb5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 424w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 848w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 1272w, https://substackcdn.com/image/fetch/$s_!GXb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F815a6747-89ac-4b5a-ad46-7496bb6b1d3b_1600x312.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p>Create a <strong>Project</strong> under that organization</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y-RR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y-RR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 424w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 848w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 1272w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y-RR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png" width="1456" height="323" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:323,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y-RR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 424w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 848w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 1272w, https://substackcdn.com/image/fetch/$s_!y-RR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff87fa7e-7581-44ed-8b01-8c6b1414d2eb_1600x355.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p>Generate an <strong>API key</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3eDF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3eDF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 424w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 848w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 1272w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3eDF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png" width="1456" height="325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:325,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3eDF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 424w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 848w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 1272w, https://substackcdn.com/image/fetch/$s_!3eDF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e22114-f561-45f9-a24c-f1da914c23bf_1600x357.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K3iu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K3iu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 424w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 848w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 1272w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K3iu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png" width="682" height="163.0054945054945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:1456,&quot;resizeWidth&quot;:682,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K3iu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 424w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 848w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 1272w, https://substackcdn.com/image/fetch/$s_!K3iu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f8cb82a-aa6d-4077-9e1a-afa74e544dd4_1600x382.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Copy the credentials and add them to your Airflow environment variables. If you&#8217;re using our GitHub setup, you can simply paste them into the airflow-plugin.env file:</p><pre><code>LANGFUSE_SECRET_KEY=sk-lf-053f1073-789b-4705-8daa-23b825829d3d
LANGFUSE_PUBLIC_KEY=pk-lf-25851900-8b27-45f7-b7a0-617321e988cf
LANGFUSE_HOST=http://host.docker.internal:3000</code></pre><h3><strong>3. Restart and Explore</strong></h3><p>Restart your environment:</p><pre><code>just airflow_langfuse</code></pre><p>Now, navigate to the Airflow UI, interact with the airflow-chat plugin, and ask a few test questions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rFMc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rFMc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 424w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 848w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 1272w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rFMc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png" width="520" height="163.92857142857142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:459,&quot;width&quot;:1456,&quot;resizeWidth&quot;:520,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rFMc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 424w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 848w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 1272w, https://substackcdn.com/image/fetch/$s_!rFMc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff015a034-464b-40b4-b1fa-16e36cc89428_1600x504.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Then head over to the Langfuse dashboard. Open the <strong>"Tracing &#8594; Traces"</strong> tab:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RvD5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RvD5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 424w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 848w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 1272w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RvD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png" width="528" height="451.7586206896552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/619f9203-3787-4435-91d0-584a4de32d84_928x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:928,&quot;resizeWidth&quot;:528,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RvD5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 424w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 848w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 1272w, https://substackcdn.com/image/fetch/$s_!RvD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F619f9203-3787-4435-91d0-584a4de32d84_928x794.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Voil&#224;&#8212;your entire chat session is logged, complete with trace-level details.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AxEF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AxEF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 424w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 848w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 1272w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AxEF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png" width="728" height="78.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:157,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AxEF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 424w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 848w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 1272w, https://substackcdn.com/image/fetch/$s_!AxEF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a83de4d-b71d-48d3-a95d-185787ca4bfa_1600x173.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FBSj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FBSj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 424w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 848w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 1272w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FBSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png" width="1456" height="1055" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1055,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FBSj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 424w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 848w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 1272w, https://substackcdn.com/image/fetch/$s_!FBSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5396f82e-29af-4e5b-b52f-4a1aaac0f5c2_1600x1159.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Just like that, observability is in place!</p><h2>Going Further with Langfuse</h2><p>Langfuse offers much more than just trace logging&#8212;it provides powerful tools to evaluate and improve your LLM application.</p><p><strong>Users<br></strong> Navigate to the <strong>Users</strong> tab to see a list of application users. You&#8217;ll notice a user named "airflow"&#8212;this represents interactions made through the airflow-chat plugin. Click on it to view all associated sessions. This is a great way to monitor how your team is using the plugin over time.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wZRw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wZRw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 424w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 848w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 1272w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wZRw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png" width="556" height="149.94169096209913" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:1372,&quot;resizeWidth&quot;:556,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wZRw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 424w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 848w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 1272w, https://substackcdn.com/image/fetch/$s_!wZRw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ac8d50-69e1-40bb-8338-f8d93a074e64_1372x370.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Cost Tracking<br></strong> Langfuse makes it easy to track costs. In the <strong>Traces</strong> tab, you&#8217;ll see session-level costs, while the <strong>Home</strong> tab gives you an overview of model-level expenses. For deeper insights, head over to the <strong>Dashboards</strong> tab and explore the built-in <strong>Langfuse Cost Dashboard</strong>, or create a custom dashboard with your own cost graphs.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sCXZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sCXZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 424w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 848w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 1272w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sCXZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png" width="494" height="236.4142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:1120,&quot;resizeWidth&quot;:494,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sCXZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 424w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 848w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 1272w, https://substackcdn.com/image/fetch/$s_!sCXZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0ac4e-d597-472a-be65-484024252bc5_1120x536.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ee38!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ee38!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 424w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 848w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 1272w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ee38!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png" width="1456" height="481" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:481,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ee38!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 424w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 848w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 1272w, https://substackcdn.com/image/fetch/$s_!Ee38!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b440aba-375f-47c5-80c3-6a9d3f0407b9_1600x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you suspect that token prices are incorrect, go to <strong>Settings &#8594; Models</strong>, and either &#8220;Add model definition&#8221; or &#8220;Clone&#8221; an existing one to customize pricing.</p><p><strong>Evaluations<br></strong> Langfuse supports two types of evaluations: <strong>Human Annotation</strong> and <strong>LLM-as-a-Judge</strong>.</p><ul><li><p><strong>Human Annotation<br></strong> Go to the <strong>Scores</strong> tab and create a new score. Next, create an <strong>Annotation Queue</strong>, and then add traces to the queue via the <strong>Traces</strong> tab. You can now manually evaluate each session. While this method offers fine-grained control, it can be time-consuming.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jUHy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jUHy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 424w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 848w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 1272w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jUHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png" width="1456" height="325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:325,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jUHy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 424w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 848w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 1272w, https://substackcdn.com/image/fetch/$s_!jUHy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7f7fcd8-fcfb-4888-aeef-80ccacbf0cbe_1600x357.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p4pE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p4pE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 424w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 848w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 1272w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p4pE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png" width="1456" height="278" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:278,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p4pE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 424w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 848w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 1272w, https://substackcdn.com/image/fetch/$s_!p4pE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c337f2-8b7b-4189-94c3-503ba5d891bd_1600x306.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D7ys!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D7ys!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 424w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 848w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 1272w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D7ys!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png" width="1456" height="216" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d604b93-2488-4fac-9229-d79e698808de_1600x237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:216,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!D7ys!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 424w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 848w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 1272w, https://substackcdn.com/image/fetch/$s_!D7ys!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d604b93-2488-4fac-9229-d79e698808de_1600x237.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p><strong>LLM-as-a-Judge<br></strong> To automate evaluations, go to <strong>Settings &#8594; LLM Connection</strong> and add a model connection.<br>Then create a custom evaluator by navigating to <strong>Create Custom Evaluator &#8594; Create New Evaluator</strong>, and set up a <strong>Default Evaluation Model</strong>. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hQQr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hQQr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 424w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 848w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 1272w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hQQr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png" width="1456" height="229" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:229,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hQQr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 424w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 848w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 1272w, https://substackcdn.com/image/fetch/$s_!hQQr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F463f8fe3-0785-488c-9f8b-3d6ba8ee5399_1600x252.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Choose a metric&#8212;such as <strong>Relevance</strong>&#8212;and specify whether you want to evaluate existing traces or only new ones.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!31IG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!31IG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 424w, https://substackcdn.com/image/fetch/$s_!31IG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 848w, https://substackcdn.com/image/fetch/$s_!31IG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 1272w, https://substackcdn.com/image/fetch/$s_!31IG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!31IG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png" width="1456" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!31IG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 424w, https://substackcdn.com/image/fetch/$s_!31IG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 848w, https://substackcdn.com/image/fetch/$s_!31IG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 1272w, https://substackcdn.com/image/fetch/$s_!31IG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94fccd8-94ed-49d4-82de-1ecbdd5f4998_1600x391.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tWg6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tWg6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 424w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 848w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 1272w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tWg6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png" width="1456" height="339" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53af71a5-f496-4344-858c-f820e71c309b_1600x373.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:339,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tWg6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 424w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 848w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 1272w, https://substackcdn.com/image/fetch/$s_!tWg6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53af71a5-f496-4344-858c-f820e71c309b_1600x373.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>For inputs and outputs, map query to input and generation to output.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z3Yv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 424w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 848w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 1272w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png" width="382" height="268.31792975970427" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:760,&quot;width&quot;:1082,&quot;resizeWidth&quot;:382,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 424w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 848w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 1272w, https://substackcdn.com/image/fetch/$s_!Z3Yv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F418b4028-0324-48f0-8b8a-e93c2ad8c461_1082x760.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> Now, go back to Airflow and ask a question. Check the <strong>Evaluation Logs</strong> and you&#8217;ll see a score and comment like:</p></li></ul><blockquote><p><em>&#8220;The generation directly and comprehensively answers the user's query by listing all the DAGs, providing their names, and offering additional context about their purpose and scheduling. The response is focused, informative, and adds significant value to the user's understanding of the available DAGs in the Airflow environment.&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SOjS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SOjS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 424w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 848w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 1272w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SOjS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png" width="1456" height="188" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1818ebe-1f61-453a-809d-370c0053345d_1600x207.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:188,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SOjS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 424w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 848w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 1272w, https://substackcdn.com/image/fetch/$s_!SOjS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1818ebe-1f61-453a-809d-370c0053345d_1600x207.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></blockquote><p>This demonstrates how Langfuse helps you evaluate, measure, and continuously improve your LLM-powered apps.</p><h2>Setting Up Langfuse for Your LangChain Application</h2><p>Integrating Langfuse into your LangChain app is straightforward. The configuration is handled in the <strong>airflow_chat/plugins/app/server/llm.py</strong> file, specifically within the <strong>get_user_chat_config</strong> function:</p><pre><code>def get_user_chat_config(session_id: str, username: str = None) -&gt; dict:
    chat_config = {
        'configurable': {'thread_id': session_id},
        'recursion_limit': 100
    }

    if os.environ.get('LANGFUSE_HOST'):
        langfuse_handler = CallbackHandler(
            user_id=username if username else session_id,
            session_id=str(session_id),
            public_key=os.environ.get('LANGFUSE_PUBLIC_KEY'),
            secret_key=os.environ.get('LANGFUSE_SECRET_KEY'),
            host=os.environ.get('LANGFUSE_HOST')
        )
        chat_config['callbacks'] = [langfuse_handler]

    return chat_config</code></pre><p>This function builds the chat configuration and conditionally attaches the Langfuse callback handler if the environment variables are present.</p><p>The resulting configuration (chat_config) is then passed to the <strong>astream_events</strong> method like this:</p><pre><code>async for event in self._agent.astream_events(
    {"messages": [HumanMessage(content=message)]},
    config=chat_session,
    version='v2',
)
</code></pre><p>The <strong>_agent</strong> object itself is initialized using the <strong>create_react_agent</strong> utility from LangGraph:</p><pre><code>from langgraph.prebuilt import create_react_agent

self._agent = create_react_agent(
    self._llm,
    tools,
    checkpointer=checkpointer,
    prompt=PROMPT_MESSAGE
)
</code></pre><p>All of this logic can be found in the airflow_chat/plugins/app/server/llm.py file. This setup enables seamless event streaming and tracking via Langfuse within your LangChain-based application.</p><h2>Summary</h2><p>By combining the airflow-chat plugin with Langfuse, we&#8217;ve created a robust observability stack for LLM-powered workflows within Airflow. From real-time trace logging and cost tracking to advanced evaluation methods like LLM-as-a-judge, Langfuse brings clarity and control to your AI interactions. Whether you're debugging unexpected prompts, monitoring usage, or analyzing performance, Langfuse helps you iterate with confidence. For a deeper dive into all the features Langfuse offers, visit <strong>https://langfuse.com</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[airflow-chat: Conversational AI Built into Airflow]]></title><description><![CDATA[Talk to your DAGs, inspect tasks, and operate pipelines&#8212;right from the interface.]]></description><link>https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built</link><guid isPermaLink="false">https://newsletter.ponder.co/p/airflow-chat-conversational-ai-built</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Wed, 30 Jul 2025 11:41:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lDvw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lDvw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lDvw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lDvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png" width="428" height="285.43131868131866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:428,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lDvw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!lDvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc5f75c-b13d-4770-b9c1-f048e06b3c14_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Introduction</h2><p>Not long ago, we introduced<a href="https://newsletter.hipposys.ai/p/airflow-mcp"> our MCP for Airflow</a>&#8212;designed to make operating DAGs and workflows as intuitive as chatting with a colleague. But there was a catch: it depended on Claude Desktop, which some organizations are unable or unwilling to adopt due to concerns around sharing data with Anthropic&#8212;or because of other operational, compliance, or policy-related reasons.</p><p>That got us thinking: what if we brought the same conversational interface <em>directly</em> into the Airflow UI?</p><p>That&#8217;s how the <strong>airflow-chat</strong> plugin came to life.</p><p>Under the hood, the plugin still leverages our existing MCP. You can run it fully embedded inside the Airflow webserver, or flexibly configure it in one of two other ways:</p><ul><li><p>As a plugin running inside the Airflow webserver (simplest setup)</p></li><li><p>Using the plugin alongside a separate MCP service</p></li><li><p>Or in a fully decoupled three-process architecture: <strong>Airflow webserver plugin &#8594; FastAPI server &#8594; MCP service</strong></p></li></ul><p>You also have full control over the LLM backend. MCP supports multiple providers, so <strong>you can choose to run it with Amazon Bedrock, Anthropic, or OpenAI</strong>&#8212;whichever best suits your infrastructure and policies.</p><p>This makes it easier than ever to integrate natural language interfaces into your pipelines&#8212;entirely within your stack and control.</p><p>Explore the project here:</p><ul><li><p>PyPI:<a href="https://pypi.org/project/airflow-chat/"> airflow-chat</a></p></li><li><p>GitHub:<a href="https://github.com/hipposys-ltd/airflow-mcp-plugins"> airflow-mcp-plugins</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Quickstart</h2><p>If you don&#8217;t have your own Airflow cluster, feel free to use the one provided in <a href="https://github.com/hipposys-ltd/airflow-mcp-plugins">our GitHub repository</a>.</p><p>Let&#8217;s start with the simplest setup. To integrate our plugin, add the following to your Airflow environment:</p><pre><code>airflow-chat==0.1.0a8</code></pre><blockquote><p><strong>Note:</strong> Version 0.1.0a8 is the latest at the time of writing. Check our<a href="https://pypi.org/project/airflow-chat"> PyPI repository</a> for updates before installing.</p></blockquote><h3><strong>&#128736; Required Environment Variables</strong></h3><p>Add the following environment variables to your cluster configuration:</p><pre><code>LLM_MODEL_ID=anthropic:claude-3-5-haiku-20241022
AIRFLOW_ASSISTENT_AI_CONN=airflow:airflow@http://localhost:8080
ANTHROPIC_API_KEY=your_anthropic_key</code></pre><h4><strong>AIRFLOW_ASSISTENT_AI_CONN Explained</strong></h4><p>This connection string is used by the AI Assistant plugin to communicate with your Airflow instance. It follows this structure:</p><pre><code>AIRFLOW_ASSISTENT_AI_CONN=&lt;username&gt;:&lt;password&gt;@http://localhost:8080</code></pre><ul><li><p>Replace <strong>&lt;username&gt;</strong> and <strong>&lt;password&gt;</strong> with any valid Airflow credentials you want the assistant to use.</p></li><li><p><strong>Do not change localhost:8080</strong>, as this address is required for internal routing within the containerized environment where the plugin operates.</p></li></ul><blockquote><p>&#128257; <strong>Model Flexibility:<br></strong> You can switch <strong>LLM_MODEL_ID</strong> to use models from <strong>Bedrock</strong> or <strong>OpenAI</strong>. Simply change the prefix accordingly:</p></blockquote><ul><li><p>For Bedrock: bedrock:...</p></li><li><p>For OpenAI: openai:...</p></li></ul><p>Be sure to set the correct corresponding API credentials:</p><ul><li><p><strong>Anthropic:</strong> ANTHROPIC_API_KEY</p></li><li><p><strong>Bedrock:</strong> AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY</p></li><li><p><strong>OpenAI:</strong> OPENAI_API_KEY</p></li></ul><h3><strong>&#9881;&#65039; Additional Configuration</strong></h3><p>You can also configure optional Airflow MCP environment variables such as:</p><ul><li><p>AIRFLOW_INSIGHTS_MODE</p></li><li><p>POST_MODE</p></li></ul><p>We explain these options in detail in<a href="https://newsletter.hipposys.ai/p/next-level-airflow-mcp"> this blog post</a>.</p><div><hr></div><h3><strong>&#129514; Running with Our Default Environment</strong></h3><p>If you&#8217;re using our pre-configured environment:</p><pre><code>cp airflow-plugin-test.env airflow-plugin.env</code></pre><p>Then open airflow-plugin.env, fill in all required values, and run:</p><pre><code>just airflow</code></pre><div><hr></div><h3><strong>&#129517; Accessing the Assistant</strong></h3><p>Once your cluster is running, open</p><pre><code> http://localhost:8080</code></pre><p>, then navigate to:</p><pre><code>Tools -&gt; AI Chat Assistant</code></pre><p>You&#8217;ll now see the Airflow Chat Assistant in action! Try asking:</p><blockquote><p><em>"What Airflow DAGs do we have, and which ones are paused?"</em></p></blockquote><p>&#127881; Everything should work beautifully out of the box!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6WIX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6WIX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 424w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 848w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 1272w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6WIX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png" width="1456" height="309" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:309,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6WIX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 424w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 848w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 1272w, https://substackcdn.com/image/fetch/$s_!6WIX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfd4fa9c-ee6a-4ca2-9afd-1a1667dfde52_1600x340.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HVkY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HVkY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 424w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 848w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 1272w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HVkY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png" width="1456" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HVkY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 424w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 848w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 1272w, https://substackcdn.com/image/fetch/$s_!HVkY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1776f29-c45a-42b3-8d3b-5263e952df69_1600x672.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3><strong>&#128272; Access Control</strong></h3><p>Access to the AI plugin is restricted to:</p><ul><li><p><strong>Admins</strong>, or</p></li><li><p>Any user assigned the <strong>AIRFLOW_AI</strong> role.</p></li></ul><h2>Other Deployment Strategies</h2><p>Let&#8217;s take a look at how our <strong>simple deployment</strong> works&#8212;and then walk through how to modify it depending on your needs.</p><h3><strong>&#129513; The Basic Setup</strong></h3><p>Our lightweight <strong>Airflow Chat plugin</strong> runs both the <strong>Langchain modules</strong> and <strong>Airflow MCP</strong> locally inside the <strong>Airflow Webserver</strong>. This setup works out-of-the-box with minimal configuration.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zzU4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zzU4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 424w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 848w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 1272w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zzU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png" width="910" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:910,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zzU4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 424w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 848w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 1272w, https://substackcdn.com/image/fetch/$s_!zzU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1f1316-86b2-4775-902f-a648cb0ee4d0_910x392.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But what if you don&#8217;t want to manage environment variables inside the Airflow instance under the same user? No problem&#8212;you can <strong>split the deployment</strong> and run MCP externally.</p><div><hr></div><h3><strong>&#128640; Option 1: Externalize the MCP Server</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J2Gq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J2Gq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 424w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 848w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 1272w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J2Gq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png" width="832" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:832,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J2Gq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 424w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 848w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 1272w, https://substackcdn.com/image/fetch/$s_!J2Gq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45dde1ce-23a0-4744-9f32-e6745270fe17_832x580.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To run MCP as a separate component:</p><ol><li><p><strong>Remove the embedded MCP server</strong> from your Airflow Webserver setup.</p></li></ol><p><strong>Add these environment variables</strong> to your Airflow instance (you can use airflow-plugin.env in our repo):</p><pre><code>TRANSPORT_TYPE=sse
mcp_host=host.docker.internal:8001
MCP_TOKEN=test_token</code></pre><blockquote><p>&#128204; <em>Note: <strong>mcp_host</strong> must be updated if you're deploying the MCP server on your own infrastructure.</em></p></blockquote><p><strong>Remove the Airflow connection variable</strong>: AIRFLOW_ASSISTENT_AI_CONN</p><ol start="2"><li><p>If you're using our repository, just run:</p></li></ol><pre><code>cp airflow-mcp-test.env airflow-mcp.env</code></pre><p>Then, customize the following variables as needed (no changes required if using the default setup in our repo):</p><pre><code>LLM_MODEL_ID=antropic:claude-3-5-haiku-20241022
AIRFLOW_ASSISTENT_AI_CONN=airflow:airflow@http://airflow-webserver:8080
TOKEN=test_token
TRANSPORT_TYPE=sse</code></pre><blockquote><p>&#9989; <em>Ensure that TOKEN and MCP_TOKEN have the same value to establish a secure connection between Airflow and the remote MCP server.</em></p></blockquote><p>To deploy:</p><ul><li><p>Run just prod if you're using our repo, or</p></li><li><p>Use the Docker image:<a href="https://hub.docker.com/repository/docker/hipposysai/airflow-mcp"> hipposysai/airflow-mcp:latest</a></p></li><li><p>Refer to docker-compose.prod.yml for an example configuration.</p></li></ul><div><hr></div><h3><strong>&#128421;&#65039; Option 2: Use the Plugin as a UI Only (Separate Langchain Logic)</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!skJ7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!skJ7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 424w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 848w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 1272w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!skJ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png" width="832" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:832,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!skJ7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 424w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 848w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 1272w, https://substackcdn.com/image/fetch/$s_!skJ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F348b84d8-e3c6-440f-a801-d192ffbb8ea9_832x580.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you prefer to <strong>fully decouple Langchain logic</strong> from the Airflow Webserver (and just use the plugin as a UI layer), update your airflow-plugin.env as follows:</p><pre><code>INTERNAL_AI_ASSISTANT_SERVER=false
FAST_API_ACCESS_SECRET_TOKEN='ThisIsATempAccessTokenForLocalEnvs.ReplaceInProd'
BACKEND_URL=http://chat_fastapi:8080</code></pre><p>Then, for the FastAPI/Langchain service (using the <strong>hipposysai/airflow-mcp-fastapi</strong> image), define:</p><pre><code>LLM_MODEL_ID=antropic:claude-3-5-haiku-20241022
SECRET_KEY='ThisIsATempSecretForLocalEnvs.ReplaceInProd.'
FAST_API_ACCESS_SECRET_TOKEN='ThisIsATempAccessTokenForLocalEnvs.ReplaceInProd'
TRANSPORT_TYPE=sse
MCP_TOKEN=test_token
mcp_host=mcp_sse_server:8000
POSTGRES_USER='airflow'
POSTGRES_PASSWORD='airflow'
POSTGRES_DB='postgres'</code></pre><p>To apply this config:</p><pre><code>cp langchain-fastapi-test.env langchain-fastapi.env
just prod</code></pre><div><hr></div><h3><strong>&#9878;&#65039; Option 3: Separate Backend but Share MCP</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z73W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z73W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 424w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 848w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 1272w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z73W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png" width="818" height="730" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/380429de-6b06-4537-a52a-826cacc0572f_818x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:730,&quot;width&quot;:818,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z73W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 424w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 848w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 1272w, https://substackcdn.com/image/fetch/$s_!Z73W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F380429de-6b06-4537-a52a-826cacc0572f_818x730.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Want to offload backend logic from your Airflow Webserver <em>without</em> introducing a separate MCP service? You can:</p><ol><li><p><strong>Remove TRANSPORT_TYPE=sse</strong> from langchain-fastapi.env (or whichever file defines your backend).</p></li><li><p><strong>Copy all environment variables</strong> from your MCP service (airflow-mcp.env) to your backend environment.</p></li></ol><p>This option gives you better performance isolation without significantly increasing deployment complexity.</p><h2>Summary</h2><p>The airflow-chat plugin brings a conversational AI interface directly into the Airflow UI, enabling users to inspect DAGs, query task states, and operate pipelines using natural language. Built on top of the existing MCP architecture, it offers flexible deployment options&#8212;from running entirely inside the Airflow Webserver to more decoupled setups involving external MCP and FastAPI services. The plugin supports multiple LLM backends (Anthropic, Bedrock, OpenAI), giving teams full control over model providers and data handling. With minimal configuration, customizable environment files, and built-in access controls, airflow-chat makes AI-powered orchestration both accessible and secure&#8212;right where data pipelines live.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Next-Level Airflow MCP]]></title><description><![CDATA[Add DAG prediction and control to Claude Desktop]]></description><link>https://newsletter.ponder.co/p/next-level-airflow-mcp</link><guid isPermaLink="false">https://newsletter.ponder.co/p/next-level-airflow-mcp</guid><dc:creator><![CDATA[Egor Tarasenko]]></dc:creator><pubDate>Wed, 23 Jul 2025 11:18:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nlCT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nlCT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nlCT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nlCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png" width="353" height="353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:353,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nlCT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!nlCT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda9e389a-64b8-428e-9eae-eabbb435f88d_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Introduction</strong></h2><p>A few weeks ago, we introduced <strong><a href="https://newsletter.hipposys.ai/p/airflow-mcp">Airflow MCP</a></strong><a href="https://newsletter.hipposys.ai/p/airflow-mcp"> from Hipposys</a>. Since then, we've fine-tuned its capabilities to better align with real-world user needs. In this post, we&#8217;ll walk you through three major updates: <strong>Safe Mode</strong> for secure operation, enhanced controls to manage <strong>DAG state</strong>, and a new way to <strong>predict upcoming DAG runs</strong> using our <strong><a href="https://newsletter.hipposys.ai/publish/posts/detail/153249544?referrer=%2Fpublish%2Fposts">Airflow Schedule Insights</a></strong><a href="https://newsletter.hipposys.ai/publish/posts/detail/153249544?referrer=%2Fpublish%2Fposts"> plugin</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Run with Confidence: Safe Mode</strong></h2><p>We realized that many users&#8212;especially those working with production Airflow instances&#8212;need to be certain that MCP won&#8217;t inadvertently alter DAG states. Even if your Airflow user has permission to run, pause, or delete DAGs, you may want to use MCP strictly for <strong>read-only access</strong>. That&#8217;s why <strong>Safe Mode</strong> is now the <strong>default behavior</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zXoK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zXoK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 424w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 848w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 1272w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zXoK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png" width="484" height="492.72072072072075" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:666,&quot;resizeWidth&quot;:484,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zXoK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 424w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 848w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 1272w, https://substackcdn.com/image/fetch/$s_!zXoK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4aa9b14-9da9-46f6-bfb5-8d7a4418dc11_666x678.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In Safe Mode, only informational (GET) functions are available, ensuring you can inspect your Airflow environment without risk. To enable write capabilities (e.g. triggering or modifying DAGs), you can explicitly opt in by setting the POST_MODE environment variable.</p><p>To do this, add the following to your claude_desktop_config.json:</p><pre><code>{
  "mcpServers": {
    "airflow_mcp": {
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "airflow_api_url",
        "-e",
        "airflow_username",
        "-e",
        "airflow_password",
        "-e",
        "POST_MODE",
        "hipposysai/airflow-mcp:latest"
      ],
      "command": "docker",
      "env": {
        "airflow_api_url": "http://host.docker.internal:8088/api/v1",
        "airflow_username": "airflow",
        "airflow_password": "airflow",
        "POST_MODE": "true"
      }
    }
  }
}</code></pre><p>Once enabled, you&#8217;ll have access to all functions&#8212;including state-changing operations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BjeG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BjeG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 424w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 848w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 1272w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BjeG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png" width="500" height="509.009009009009" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:666,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BjeG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 424w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 848w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 1272w, https://substackcdn.com/image/fetch/$s_!BjeG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4102194-d224-4902-a8ec-57e1b4a47cba_666x678.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Until then, rest assured: by default, MCP operates in a safe, read-only mode, so you can explore and monitor without risking production disruptions or unscheduled runs.</p><h2><strong>Pause DAGs Before the Storm</strong></h2><p>We've all been there: an unexpected (or even expected) outage hits, and you need to <strong>urgently pause all Airflow DAGs</strong>. So you go through them one by one&#8230; but wait&#8212;<strong>some DAGs were already paused</strong>. Should you manually note them down just to restore their state afterward? That&#8217;s tedious&#8212;and error-prone.</p><p><strong>Not anymore.</strong></p><p>Thanks to the new <strong>change_dags_pause_status</strong> method, this process is now streamlined and reliable.</p><p>Note: The Airflow cluster I'm working with is deployed from our GitHub repo:<a href="https://github.com/hipposys-ltd/airflow-mcp"> hipposys-ltd/airflow-mcp</a>.</p><p>Right now, here&#8217;s our current state:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YpyV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YpyV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 424w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 848w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YpyV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png" width="266" height="429.8989898989899" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:792,&quot;resizeWidth&quot;:266,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YpyV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 424w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 848w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!YpyV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81304e39-e253-4d3d-891a-9ab7776fb062_792x1280.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let&#8217;s use <strong>MCP</strong> to prepare for the outage.<br> Start with the following prompt:</p><blockquote><p><em>"Hi, please pause all Airflow DAGs, but before doing so, list the DAGs that are currently paused. We&#8217;ll use that list to remember which ones need to be unpaused tomorrow."<br></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1kfh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1kfh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 424w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 848w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 1272w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1kfh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png" width="477" height="227.10998552821997" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:658,&quot;width&quot;:1382,&quot;resizeWidth&quot;:477,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1kfh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 424w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 848w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 1272w, https://substackcdn.com/image/fetch/$s_!1kfh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa04b57b1-0172-4e4f-ad87-20f7c79c527a_1382x658.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Crhh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Crhh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 424w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 848w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 1272w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Crhh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png" width="490" height="360.01908396946567" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1048,&quot;resizeWidth&quot;:490,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Crhh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 424w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 848w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 1272w, https://substackcdn.com/image/fetch/$s_!Crhh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdcf053a-6f6d-4444-b0e2-e44608a60aa7_1048x770.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zDkr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zDkr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 424w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 848w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zDkr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png" width="436" height="421.28270042194094" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1374,&quot;width&quot;:1422,&quot;resizeWidth&quot;:436,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zDkr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 424w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 848w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 1272w, https://substackcdn.com/image/fetch/$s_!zDkr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4cfb787-ba81-4f36-a2e0-b34e209423ae_1422x1374.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XEet!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XEet!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 424w, https://substackcdn.com/image/fetch/$s_!XEet!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 848w, https://substackcdn.com/image/fetch/$s_!XEet!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!XEet!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XEet!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png" width="366" height="721.8646153846154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1282,&quot;width&quot;:650,&quot;resizeWidth&quot;:366,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!XEet!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 424w, https://substackcdn.com/image/fetch/$s_!XEet!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 848w, https://substackcdn.com/image/fetch/$s_!XEet!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 1272w, https://substackcdn.com/image/fetch/$s_!XEet!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F159caf93-1713-4764-8cee-fffdd7e4520a_650x1282.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, <strong>all DAGs have been successfully paused.</strong></p><p>Now comes the tricky part: restoring normal operations without unpausing DAGs that were paused before the outage.</p><p>Run:</p><blockquote><p><em>"Great. Now please unpause the DAGs, but make sure to leave the ones that were already paused as they are."</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uBKd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uBKd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 424w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 848w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 1272w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uBKd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png" width="592" height="104.49450549450549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:257,&quot;width&quot;:1456,&quot;resizeWidth&quot;:592,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uBKd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 424w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 848w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 1272w, https://substackcdn.com/image/fetch/$s_!uBKd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa894e48b-7aa1-4f72-93ea-33cd73ee359a_1528x270.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kqKM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kqKM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 424w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 848w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 1272w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kqKM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png" width="434" height="394.9338959212377" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1294,&quot;width&quot;:1422,&quot;resizeWidth&quot;:434,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kqKM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 424w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 848w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 1272w, https://substackcdn.com/image/fetch/$s_!kqKM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30ba07b3-3815-4c52-a4c0-139654a764d8_1422x1294.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wzvn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wzvn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 424w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 848w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 1272w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wzvn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png" width="242" height="416.7121951219512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1412,&quot;width&quot;:820,&quot;resizeWidth&quot;:242,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Wzvn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 424w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 848w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 1272w, https://substackcdn.com/image/fetch/$s_!Wzvn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cb93144-6bbc-4513-b023-2b8c2cfd65ae_820x1412.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And just like that&#8212;done.<br> <strong>It only took two prompts</strong> to handle a full-cluster pause and restore cycle, cleanly and safely.</p><h2><strong>When Will It Run?</strong></h2><p>Let&#8217;s start with something simple: <strong>finding out when load_ticket_sales will run next</strong>.</p><p>To do that, we&#8217;ll need to update claude_desktop_config.json once again by enabling <strong>Airflow Insights Mode</strong>:</p><pre><code>{
  "mcpServers": {
    "airflow_mcp": {
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "airflow_api_url",
        "-e",
        "airflow_username",
        "-e",
        "airflow_password",
        "-e",
        "POST_MODE",
        "-e",
        "AIRFLOW_INSIGHTS_MODE",
        "hipposysai/airflow-mcp:latest"
      ],
      "command": "docker",
      "env": {
        "airflow_api_url": "http://host.docker.internal:8088/api/v1",
        "airflow_username": "airflow",
        "airflow_password": "airflow",
        "POST_MODE": "true",
        "AIRFLOW_INSIGHTS_MODE": "true"
      }
    }
  }
}</code></pre><blockquote><p>&#9888;&#65039; <strong>Note:</strong> Make sure the<a href="https://newsletter.hipposys.ai/publish/posts/detail/153249544?referrer=%2Fpublish%2Fposts"> Airflow Schedule Insights plugin</a> is installed in your Airflow instance for this to work.</p></blockquote><p>Now, restart <strong>Claude Desktop</strong> and ask:</p><blockquote><p><em>&#8220;When is the next run for load_ticket_sales (in EST)?&#8221;</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gMQ-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gMQ-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 424w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 848w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 1272w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gMQ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png" width="1456" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gMQ-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 424w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 848w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 1272w, https://substackcdn.com/image/fetch/$s_!gMQ-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb8bd59-a01b-4fb7-8d2a-980a9becd198_1486x572.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After a short wait, you&#8217;ll get a detailed answer including the <strong>start time, end time, and expected duration</strong>&#8212;and it&#8217;s accurate. But that&#8217;s easy&#8212;load_ticket_sales is a scheduled DAG.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zTDm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zTDm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 424w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 848w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 1272w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zTDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png" width="536" height="332.8164665523156" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1166,&quot;resizeWidth&quot;:536,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zTDm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 424w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 848w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 1272w, https://substackcdn.com/image/fetch/$s_!zTDm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3a0778-5a1b-440e-9b03-e23aaa5c3ced_1166x724.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let&#8217;s go a step further and try something more dynamic.</p><div><hr></div><h3>Event-Driven DAG Prediction</h3><p>Now let&#8217;s look at an <strong>event-driven DAG</strong> with no fixed schedule: transform_customer_sentiment.</p><p>This DAG is triggered when:</p><ul><li><p><strong>either</strong> transform_sales_aggregator <strong>and</strong> load_customer_feedback complete,</p></li><li><p><strong>or</strong> load_ticket_sales finishes on its own.<br></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-KPf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-KPf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 424w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 848w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 1272w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-KPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png" width="1456" height="242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:242,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-KPf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 424w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 848w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 1272w, https://substackcdn.com/image/fetch/$s_!-KPf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d9c0fa6-a411-476b-8da7-05911cdba65e_1600x266.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b029!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b029!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 424w, https://substackcdn.com/image/fetch/$s_!b029!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 848w, https://substackcdn.com/image/fetch/$s_!b029!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 1272w, https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png" width="1168" height="542" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:542,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b029!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 424w, https://substackcdn.com/image/fetch/$s_!b029!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 848w, https://substackcdn.com/image/fetch/$s_!b029!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 1272w, https://substackcdn.com/image/fetch/$s_!b029!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea6130ae-108e-4bc6-8537-f82f152d6a8e_1168x542.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>According to Claude, the next trigger will come from load_ticket_sales. Let&#8217;s wait and see&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EV7Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EV7Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 424w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 848w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 1272w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EV7Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png" width="1456" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EV7Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 424w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 848w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 1272w, https://substackcdn.com/image/fetch/$s_!EV7Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133747db-fb41-4c5d-97b1-66c2588f0569_1486x764.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JDpk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JDpk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 424w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 848w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 1272w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JDpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png" width="1456" height="151" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:151,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JDpk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 424w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 848w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 1272w, https://substackcdn.com/image/fetch/$s_!JDpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a34bf37-2b35-42f2-adaa-4978fcce6cfb_1600x166.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And yes&#8212;it was triggered <strong>just one second later</strong> than predicted and finished <strong>two seconds later</strong> than expected. Even better, Claude correctly identified that <strong>load_ticket_sales</strong> was the trigger.</p><div><hr></div><h3>Querying Multiple DAGs at Once</h3><p>Now let&#8217;s try asking about several DAGs in one go:</p><blockquote><p><em>&#8220;When are the next runs for load_movie_inventory, load_box_office_reports, and transform_loyalty_program_analysis (in UTC)?&#8221;</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5XAA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5XAA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 424w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 848w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5XAA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png" width="550" height="543.9560439560439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1440,&quot;width&quot;:1456,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5XAA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 424w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 848w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!5XAA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e959e27-30f2-4f97-84e2-b88bd1c716f7_1476x1460.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Claude replies&#8212;<strong>none of them will run</strong>, and that&#8217;s correct!</p><div><hr></div><p>With just a few configuration changes, you can now <strong>monitor and predict future DAG runs directly from Claude Desktop</strong>&#8212;scheduled or event-driven. No guesswork, no surprises.</p><h2><strong>Summary: Next-Level DAG Observability and Control</strong></h2><p>With the latest updates to <strong>Airflow MCP</strong>, Claude Desktop evolves from a smart interface into a <strong>powerful control and observability tool</strong> for Airflow users. You can now operate in <strong>Safe Mode</strong> for peace of mind in production, <strong>pause and restore DAG states safely</strong> during outages, and even <strong>predict when DAGs&#8212;scheduled or event-driven&#8212;will run next</strong>, thanks to the new <strong>Airflow Schedule Insights</strong> integration. Whether you're running a complex pipeline or preparing for maintenance, these upgrades ensure you're always one step ahead&#8212;<strong>with just a couple of prompts</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://newsletter.ponder.co/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hipposys - Data &amp; AI Engineering! Subscribe for free to receive new posts and learn more about our work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>