<?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[CodeCut Newsletter]]></title><description><![CDATA[CodeCut is a newsletter for busy developers, data professionals, and AI engineers, delivering short, under-two-minute tips on data science, AI, and modern tools, three times per week.]]></description><link>https://newsletter.codecut.ai</link><image><url>https://newsletter.codecut.ai/img/substack.png</url><title>CodeCut Newsletter</title><link>https://newsletter.codecut.ai</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Apr 2026 14:11:16 GMT</lastBuildDate><atom:link href="https://newsletter.codecut.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[CodeCut Newsletter]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[codecut@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[codecut@substack.com]]></itunes:email><itunes:name><![CDATA[CodeCut]]></itunes:name></itunes:owner><itunes:author><![CDATA[CodeCut]]></itunes:author><googleplay:owner><![CDATA[codecut@substack.com]]></googleplay:owner><googleplay:email><![CDATA[codecut@substack.com]]></googleplay:email><googleplay:author><![CDATA[CodeCut]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Browser-Use: Automate Any Browser Task with Plain English]]></title><description><![CDATA[Plus give your AI memory with mem0]]></description><link>https://newsletter.codecut.ai/p/browser-use-automate-any-browser</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/browser-use-automate-any-browser</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 02 Apr 2026 16:03:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_eVj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>mem0: Give Your AI Memory Without Building a Vector DB</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QFvQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QFvQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 424w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 848w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 1272w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QFvQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png" width="683" height="766" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:766,&quot;width&quot;:683,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: mem0: Give Your AI Memory Without Building a Vector DB&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="Code example: mem0: Give Your AI Memory Without Building a Vector DB" title="Code example: mem0: Give Your AI Memory Without Building a Vector DB" srcset="https://substackcdn.com/image/fetch/$s_!QFvQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 424w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 848w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.png 1272w, https://substackcdn.com/image/fetch/$s_!QFvQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f85a8e5-7dc1-42a9-8ae4-3e426044d3c4_683x766.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 role="img" 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><title></title><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>Problem</h4><p>When you build an AI app using the OpenAI or Anthropic API, every conversation starts from scratch with no built-in memory between sessions.</p><p>Adding memory yourself with a vector database like ChromaDB requires writing custom extraction, deduplication, and scoping logic on top of the storage layer.</p><h4>Solution</h4><p><a href="https://github.com/mem0ai/mem0">mem0</a> handles all of that in a single function call. Just pass in conversations and retrieve relevant memories when needed.</p><p>Key features:</p><ul><li><p>Automatic fact extraction from raw conversations via <code>memory.add()</code></p></li><li><p>Cross-session retrieval with <code>memory.search()</code> in any future conversation</p></li><li><p>Automatic conflict resolution when user preferences change over time</p></li></ul><blockquote><p>&#129514; <a href="https://bit.ly/4bXNGKA">Run code</a></p></blockquote><div><hr></div><h3>Browser-Use: Automate Any Browser Task with Plain English</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_eVj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_eVj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 424w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 848w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 1272w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_eVj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png" width="649" height="577" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:577,&quot;width&quot;:649,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Browser-Use: Automate Any Browser Task with Plain English&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="Code example: Browser-Use: Automate Any Browser Task with Plain English" title="Code example: Browser-Use: Automate Any Browser Task with Plain English" srcset="https://substackcdn.com/image/fetch/$s_!_eVj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 424w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 848w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.png 1272w, https://substackcdn.com/image/fetch/$s_!_eVj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ba87dd9-4fee-4dc0-81f8-347fd50f5759_649x577.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 role="img" 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><title></title><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>Problem</h4><p>Most data collection tasks go beyond simple extraction. You need to log in, apply filters, navigate pagination, and then gather results.</p><p>Selenium can handle navigation, but it requires maintaining CSS selectors that can easily break when a site changes.</p><h4>Solution</h4><p><a href="https://github.com/browser-use/browser-use">Browser Use</a> simplifies the entire process. Describe what you want, and it navigates, clicks, types, and extracts automatically.</p><p>Key features:</p><ul><li><p>Natural language task descriptions</p></li><li><p>Works with GPT-4, Claude, Gemini, and local models via Ollama</p></li><li><p>Structured output with Pydantic models</p></li></ul><blockquote></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/run-github-actions-locally-act/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_run-github-actions-locally-act">How to Test GitHub Actions Locally with act</a></strong></p><p>Debugging GitHub Actions is painfully slow. Every YAML change requires a commit, a push, and a 2-5 minute wait just to find out you missed a colon.</p><p>This article introduces act, a CLI tool that runs GitHub Actions workflows locally in Docker containers.</p><p>You&#8217;ll set up an ML testing pipeline and learn to pass secrets, run specific jobs, and validate workflows in seconds.</p><blockquote><p>&#128214; <a href="https://codecut.ai/run-github-actions-locally-act/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_run-github-actions-locally-act">View Full Article</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/open-webui/open-webui">open-webui</a></strong> <em>[LLM]</em> - A self-hosted AI platform with built-in RAG, model builder, and support for Ollama and OpenAI-compatible APIs</p><p><strong><a href="https://github.com/infiniflow/ragflow">ragflow</a></strong> <em>[RAG]</em> - An open-source RAG engine with deep document understanding for unstructured data in any format</p><p><strong><a href="https://github.com/vllm-project/vllm">vllm</a></strong> <em>[MLOps]</em> - A high-throughput, memory-efficient inference and serving engine for LLMs with multi-GPU support</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[latexify_py: Turn Python Functions into LaTeX with One Decorator]]></title><description><![CDATA[Plus run GitHub Actions locally with act]]></description><link>https://newsletter.codecut.ai/p/latexify_py-turn-python-functions</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/latexify_py-turn-python-functions</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 31 Mar 2026 16:02:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9tlA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#129309; COLLABORATION</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5JhP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5JhP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 424w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 848w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 1272w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5JhP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png" width="1200" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Give Your AI Agent Live Web Access with Bright Data MCP&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="Give Your AI Agent Live Web Access with Bright Data MCP" title="Give Your AI Agent Live Web Access with Bright Data MCP" srcset="https://substackcdn.com/image/fetch/$s_!5JhP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 424w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 848w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.png 1272w, https://substackcdn.com/image/fetch/$s_!5JhP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F945becaa-0533-4c48-9f65-aac2a773d4bc_1200x833.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 role="img" 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><title></title><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>Give Your AI Agent Live Web Access with Bright Data MCP</h3><p>With basic search APIs, agents often miss critical context from sources like social platforms, forums, news, and answer engines. That leads to incomplete or outdated responses.</p><p>Bright Data&#8217;s MCP server unifies all web data access into one interface your AI agent can use directly.</p><p>With Bright Data MCP, your AI agent can access:</p><ul><li><p>Search engines (Google, Bing, more)</p></li><li><p>Social media (Twitter/X, Reddit, Instagram, TikTok)</p></li><li><p>Web archives (historical web data, years deep)</p></li><li><p>Answer engines (ChatGPT, Perplexity, Gemini)</p></li></ul><p>All through one connection.</p><blockquote><p>&#128279; <a href="https://brightdata.com/ai/mcp-server?utm_source=brand&amp;utm_medium=newsletter&amp;utm_campaign=khuyen-tran">Try Bright Data MCP</a></p></blockquote><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>latexify_py: Turn Python Functions into LaTeX with One Decorator</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9tlA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9tlA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 424w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 848w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9tlA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png" width="1200" height="1202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1202,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: latexify_py: Turn Python Functions into LaTeX with One Decorator&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="Code example: latexify_py: Turn Python Functions into LaTeX with One Decorator" title="Code example: latexify_py: Turn Python Functions into LaTeX with One Decorator" srcset="https://substackcdn.com/image/fetch/$s_!9tlA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 424w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 848w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.png 1272w, https://substackcdn.com/image/fetch/$s_!9tlA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7eb77d1-4347-4147-93dc-d6c8d4c08c68_1200x1202.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 role="img" 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><title></title><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>Problem</h4><p>Non-programmers cannot easily read Python logic. However, manually converting it to LaTeX is slow and quickly becomes outdated as the code changes.</p><h4>Solution</h4><p><a href="https://github.com/google/latexify_py">latexify_py</a> solves this with a single decorator, generating LaTeX directly from your function so the math stays readable and always in sync with the code.</p><p>Key capabilities:</p><ul><li><p>Three decorators for different outputs: expressions, full equations, or pseudocode</p></li><li><p>Displays rendered LaTeX directly in Jupyter cells</p></li><li><p>Functions still work normally when called</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/python-code-to-latex-jupyter-notebooks/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_python-code-to-latex-jupyter-notebooks">View Full Article</a> | &#129514; <a href="https://bit.ly/4bW2ycE">Run code</a></p></blockquote><div><hr></div><h3>act: Run GitHub Actions Locally with Docker</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-DtQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-DtQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 424w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 848w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 1272w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-DtQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png" width="636" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:636,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: act: Run GitHub Actions Locally with Docker&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="Code example: act: Run GitHub Actions Locally with Docker" title="Code example: act: Run GitHub Actions Locally with Docker" srcset="https://substackcdn.com/image/fetch/$s_!-DtQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 424w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 848w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.png 1272w, https://substackcdn.com/image/fetch/$s_!-DtQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6070dcf3-2ac4-4669-bcbd-7ad7e9377183_636x601.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 role="img" 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><title></title><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>Problem</h4><p>GitHub Actions has no local execution mode. You can&#8217;t test a step, inspect an environment variable, or reproduce a runner-specific failure on your own machine.</p><p>Each change requires a commit and a wait for the cloud runner. A small mistake like a missing secret means starting the loop again.</p><h4>Solution</h4><p>With <a href="https://github.com/nektos/act">act</a>, you can execute workflows locally using Docker. Failures surface immediately, making it easier to iterate and commit only when the workflow passes.</p><blockquote><p>&#128214; <a href="https://codecut.ai/run-github-actions-locally-act/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_run-github-actions-locally-act">View Full Article</a></p></blockquote><blockquote></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/mangiucugna/json_repair">json_repair</a></strong> <em>[LLM]</em> - A Python module to repair invalid JSON, especially from LLM outputs, with schema validation support</p><p><strong><a href="https://github.com/tobgu/pyrsistent">pyrsistent</a></strong> <em>[Python Utilities]</em> - Persistent, immutable, and functional data structures for Python</p><p><strong><a href="https://github.com/j178/prek">prek</a></strong> <em>[Code Quality]</em> - A faster, Rust-based reimagining of pre-commit with monorepo support and parallel hook execution</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Chronos: Forecast Any Time Series Without Training a Model]]></title><description><![CDATA[Plus an AI agent built for data engineers]]></description><link>https://newsletter.codecut.ai/p/chronos-forecast-any-time-series</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/chronos-forecast-any-time-series</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 26 Mar 2026 16:01:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p-4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#129309; COLLABORATION</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p-4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p-4t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 424w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 848w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 1272w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p-4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png" width="1200" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c767c018-0495-49e2-a529-3c24dead4729_1200x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Bright Data MCP server for AI agent web access&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="Bright Data MCP server for AI agent web access" title="Bright Data MCP server for AI agent web access" srcset="https://substackcdn.com/image/fetch/$s_!p-4t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 424w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 848w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.png 1272w, https://substackcdn.com/image/fetch/$s_!p-4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc767c018-0495-49e2-a529-3c24dead4729_1200x833.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 role="img" 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><title></title><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>Give Your AI Agent Live Web Access with Bright Data MCP</h3><p>With basic search APIs, agents often miss critical context from sources like social platforms, forums, news, and answer engines. That leads to incomplete or outdated responses.</p><p>Bright Data&#8217;s MCP server unifies all web data access into one interface your AI agent can use directly.</p><p>With Bright Data MCP, your AI agent can access:</p><ul><li><p>Search engines (Google, Bing, more)</p></li><li><p>Social media (Twitter/X, Reddit, Instagram, TikTok)</p></li><li><p>Web archives (historical web data, years deep)</p></li><li><p>Answer engines (ChatGPT, Perplexity, Gemini)</p></li></ul><p>All through one connection.</p><blockquote><p>&#128279; <a href="https://brightdata.com/ai/mcp-server?utm_source=brand&amp;utm_medium=newsletter&amp;utm_campaign=khuyen-tran">Try Bright Data MCP</a></p></blockquote><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Chronos: Forecast Any Time Series Without Training a Model</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jrMR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jrMR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 424w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 848w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 1272w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jrMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png" width="738" height="610" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:738,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Chronos: Forecast Any Time Series Without Training a Model&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="Code example: Chronos: Forecast Any Time Series Without Training a Model" title="Code example: Chronos: Forecast Any Time Series Without Training a Model" srcset="https://substackcdn.com/image/fetch/$s_!jrMR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 424w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 848w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.png 1272w, https://substackcdn.com/image/fetch/$s_!jrMR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95118ec4-552b-4e05-9fb8-68bcf9f1fdd5_738x610.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 role="img" 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><title></title><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>Problem</h4><p>Traditional forecasting requires domain-specific data, feature engineering, and multiple rounds of model tuning.</p><h4>Solution</h4><p><a href="https://github.com/amazon-science/chronos-forecasting">Chronos</a> is a family of pretrained time series forecasting models from Amazon Science that deliver zero-shot predictions out of the box.</p><p>Simply load a pretrained model and generate forecasts on any time series data, with no fine-tuning required.</p><p>If zero-shot accuracy isn&#8217;t enough, you can fine-tune on your data with AutoGluon in a few lines.</p><blockquote><p>&#129514; <a href="https://bit.ly/4uOPAFW">Run code</a></p></blockquote><div><hr></div><h3>altimate-code: The Missing AI Layer for Data Engineering Teams</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xuDI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xuDI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 424w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 848w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 1272w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xuDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png" width="1200" height="695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: altimate-code: The Missing AI Layer for Data Engineering Teams&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="Code example: altimate-code: The Missing AI Layer for Data Engineering Teams" title="Code example: altimate-code: The Missing AI Layer for Data Engineering Teams" srcset="https://substackcdn.com/image/fetch/$s_!xuDI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 424w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 848w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.png 1272w, https://substackcdn.com/image/fetch/$s_!xuDI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F722c0d44-1db7-480b-96cf-ce2ad690252c_1200x695.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 role="img" 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><title></title><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>Problem</h4><p>General AI tools can write SQL and catch obvious mistakes. But they cannot systematically detect anti-patterns, trace lineage, or keep warehouse costs under control.</p><p>That gap can lead to inefficient queries, broken dependencies, and hidden compliance risks building up over time.</p><h4>Solution</h4><p>I recently tried <a href="https://github.com/AltimateAI/altimate-code">altimate-code</a>, an open-source agent with 100+ tools purpose-built for data engineers, and built a demo repo to test it.</p><p>From a single prompt, it generated a full dbt project with staging, intermediate, and mart layers, added automated tests, and built an interactive dashboard.</p><p>What makes it different:</p><ul><li><p>100+ tools that analyze SQL through structural parsing, not text guessing</p></li><li><p>Works across your stack including Snowflake, BigQuery, Databricks, DuckDB, and more</p></li><li><p>Model-agnostic. Compatible with OpenAI, Anthropic, Gemini, Ollama, and others</p></li></ul><blockquote><p>&#129514; <a href="https://github.com/khuyentran1401/altimate-code-demo">Demo repo</a></p></blockquote><blockquote></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/google-research/timesfm">timesfm</a></strong> <em>[Machine Learning]</em> - Pretrained time series foundation model by Google Research for zero-shot forecasting</p><p><strong><a href="https://github.com/unit8co/darts">darts</a></strong> <em>[Machine Learning]</em> - A Python library for user-friendly forecasting and anomaly detection on time series</p><p><strong><a href="https://github.com/uber/orbit">orbit</a></strong> <em>[Machine Learning]</em> - A Python package for Bayesian time series forecasting with probabilistic models under the hood</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Polars scan_csv: Merge CSVs with Different Schemas in One Call]]></title><description><![CDATA[Plus build Python packages with UV]]></description><link>https://newsletter.codecut.ai/p/polars-scan_csv-merge-csvs-with-different</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/polars-scan_csv-merge-csvs-with-different</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 24 Mar 2026 16:02:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K9u1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Polars scan_csv: Merge CSVs with Different Schemas in One Call</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9u1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9u1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 424w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 848w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 1272w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9u1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png" width="599" height="682" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:599,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Polars scan_csv: Merge CSVs with Different Schemas in One Call&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="Code example: Polars scan_csv: Merge CSVs with Different Schemas in One Call" title="Code example: Polars scan_csv: Merge CSVs with Different Schemas in One Call" srcset="https://substackcdn.com/image/fetch/$s_!K9u1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 424w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 848w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.png 1272w, https://substackcdn.com/image/fetch/$s_!K9u1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce3f50a8-cb28-415a-bb2c-fbadf9dddae1_599x682.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 role="img" 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><title></title><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>Problem</h4><p>Polars&#8217; <code>scan_csv</code> lets you load multiple CSV files lazily, reading data only when needed.</p><p>But before v1.39.0, every file had to share the same columns, or you&#8217;d get a SchemaError.</p><h4>Solution</h4><p><a href="https://github.com/pola-rs/polars">Polars</a> v1.39.0 introduces <code>missing_columns="insert"</code> in <code>scan_csv</code>, allowing you to combine multiple files in one call while null-filling any missing columns.</p><blockquote><p>&#128214; <a href="https://codecut.ai/pandas-vs-polars-vs-duckdb-comparison/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_pandas-vs-polars-vs-duckdb-comparison">View Full Article</a> | &#129514; <a href="https://bit.ly/4do1Vej">Run code</a></p></blockquote><div><hr></div><h3>Build Professional Python Packages with UV --package</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_rNa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_rNa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 424w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 848w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 1272w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_rNa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png" width="615" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26fb6170-412c-4861-831f-37885f43c6b9_615x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:615,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Build Professional Python Packages with UV --package&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="Code example: Build Professional Python Packages with UV --package" title="Code example: Build Professional Python Packages with UV --package" srcset="https://substackcdn.com/image/fetch/$s_!_rNa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 424w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 848w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.png 1272w, https://substackcdn.com/image/fetch/$s_!_rNa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26fb6170-412c-4861-831f-37885f43c6b9_615x566.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 role="img" 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><title></title><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>Problem</h4><p>Python packages turn your code into reusable modules you can share across projects.</p><p>But building them requires complex setup with setuptools, managing build systems, and understanding distribution mechanics.</p><h4>Solution</h4><p><a href="https://github.com/astral-sh/uv">UV</a>, a fast Python package installer and resolver, reduces the entire process to 2 simple commands:</p><ul><li><p>uv init --package sets up your package structure instantly</p></li><li><p>uv build and uv publish to create and distribute to PyPI</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Dive deeper in Production Ready Data Science</a></p></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/uv-pixi-comparison/">uv vs pixi: Which Python Environment Manager Should You Use for Data Science?</a></strong></p><p>uv installs Python packages from PyPI, but it doesn&#8217;t support compiled C/C++ libraries.</p><p>The typical workaround is to install system libraries separately using an OS package manager, then manually align versions with your Python dependencies. Since these system dependencies aren&#8217;t captured in project files, reproducing the environment across machines can be unreliable.</p><p>pixi solves this by managing both Python packages from PyPI and compiled system libraries from conda-forge in a single tool.</p><p>Quick comparison:</p><ul><li><p>uv: fast, reliable lockfiles, Python-only</p></li><li><p>conda: system libraries supported, but slower and no lockfiles</p></li><li><p>pixi: fast, unified, with system libraries, lockfiles, and a built-in task runner</p></li></ul><p>In this article, I compare uv and pixi on a real ML project so you can see how they perform in practice.</p><blockquote><p>&#128214; <a href="https://codecut.ai/uv-pixi-comparison/">View Full Article</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/iterative/datachain">datachain</a></strong> <em>[Data Processing]</em> - Process and curate unstructured data from cloud storages using local ML models and Python</p><p><strong><a href="https://github.com/HumanSignal/label-studio">label-studio</a></strong> <em>[Data Processing]</em> - Open source data labeling and annotation tool with standardized output format for ML workflows</p><p><strong><a href="https://github.com/jqnatividad/qsv">qsv</a></strong> <em>[Command Line]</em> - Blazingly fast CSV command-line toolkit for slicing, dicing, and analyzing tabular data</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Handle Messy Data with RapidFuzz Fuzzy Matching]]></title><description><![CDATA[Plus efficient LLM inference with vLLM]]></description><link>https://newsletter.codecut.ai/p/handle-messy-data-with-rapidfuzz</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/handle-messy-data-with-rapidfuzz</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 19 Mar 2026 16:01:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HYsr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>vLLM: Serve More LLM Users on the Same GPU</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HYsr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HYsr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 424w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 848w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 1272w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HYsr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png" width="643" height="745" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:745,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: vLLM: Serve More LLM Users on the Same GPU&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="Code example: vLLM: Serve More LLM Users on the Same GPU" title="Code example: vLLM: Serve More LLM Users on the Same GPU" srcset="https://substackcdn.com/image/fetch/$s_!HYsr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 424w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 848w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.png 1272w, https://substackcdn.com/image/fetch/$s_!HYsr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa2f3d40-5a6f-448e-9a85-05b637fa87b4_643x745.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 role="img" 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><title></title><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>Problem</h4><p>Most frameworks reserve GPU memory for the longest possible response, even when the actual output is short.</p><p>With multiple concurrent users, this quickly fills the GPU with reserved memory that is mostly never used.</p><h4>Solution</h4><p><a href="https://github.com/vllm-project/vllm">vLLM</a>&#8217;s PagedAttention allocates memory in small blocks as the response grows, instead of reserving everything up front.</p><p>This keeps memory usage efficient and allows the GPU to serve more requests.</p><blockquote></blockquote><div><hr></div><h3>Handle Messy Data with RapidFuzz Fuzzy Matching</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vPqB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vPqB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 424w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 848w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vPqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png" width="1200" height="1076" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1076,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Handle Messy Data with RapidFuzz Fuzzy Matching&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="Code example: Handle Messy Data with RapidFuzz Fuzzy Matching" title="Code example: Handle Messy Data with RapidFuzz Fuzzy Matching" srcset="https://substackcdn.com/image/fetch/$s_!vPqB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 424w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 848w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!vPqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F124de7c7-237f-432d-a588-23c86cf9584e_1200x1076.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 role="img" 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><title></title><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>Problem</h4><p>Traditional regex approaches require hours of preprocessing but still break with common data variations like missing spaces, typos, or inconsistent formatting.</p><h4>Solution</h4><p><a href="https://github.com/maxbachmann/RapidFuzz">RapidFuzz</a> eliminates data cleaning overhead with intelligent fuzzy matching.</p><p>Key benefits:</p><ul><li><p>Automatic handling of typos, spacing, and case variations</p></li><li><p>Production-ready C++ performance for large datasets</p></li><li><p>Full spectrum of fuzzy algorithms in one library</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/text-similarity-fuzzy-matching-guide/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_text-similarity-fuzzy-matching-guide">View Full Article</a> | &#129514; <a href="https://bit.ly/42DoVj5">Run code</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/QData/TextAttack">TextAttack</a></strong> <em>[NLP]</em> - Python framework for adversarial attacks, data augmentation, and model training in NLP</p><p><strong><a href="https://github.com/stanfordnlp/stanza">stanza</a></strong> <em>[NLP]</em> - Stanford NLP Python library for tokenization, sentence segmentation, NER, and parsing of 60+ languages</p><p><strong><a href="https://github.com/fastino-ai/GLiNER2">GLiNER2</a></strong> <em>[NLP]</em> - Unified schema-based framework for entity extraction, text classification, and relation extraction in one pass</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Scrapling: Adaptive Web Scraping in Python]]></title><description><![CDATA[Plus one Python API for 25+ database backends]]></description><link>https://newsletter.codecut.ai/p/scrapling-adaptive-web-scraping-in</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/scrapling-adaptive-web-scraping-in</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 17 Mar 2026 16:01:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MY1c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Scrapling: Adaptive Web Scraping in Python</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MY1c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MY1c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 424w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 848w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 1272w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MY1c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png" width="643" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Scrapling: Adaptive Web Scraping in Python&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="Code example: Scrapling: Adaptive Web Scraping in Python" title="Code example: Scrapling: Adaptive Web Scraping in Python" srcset="https://substackcdn.com/image/fetch/$s_!MY1c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 424w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 848w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.png 1272w, https://substackcdn.com/image/fetch/$s_!MY1c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa7589a-c1c7-487e-9600-35fc92db6709_643x724.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 role="img" 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><title></title><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>Problem</h4><p>Traditional scraping with BeautifulSoup uses hardcoded CSS selectors to find elements on a page.</p><p>If the site updates its layout, those selectors no longer match and the scraper ends up returning empty data.</p><h4>Solution</h4><p>Instead of relying only on selectors, <a href="https://github.com/D4Vinci/Scrapling">Scrapling</a> records how elements appear during the initial scrape.</p><p>If the site is redesigned later, it can use that stored structure to find the same elements again.</p><blockquote></blockquote><div><hr></div><h3>Ibis: One Python API for 25+ Database Backends</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OTcB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OTcB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 424w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 848w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 1272w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OTcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png" width="658" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:658,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Ibis: One Python API for 25+ Database Backends&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="Code example: Ibis: One Python API for 25+ Database Backends" title="Code example: Ibis: One Python API for 25+ Database Backends" srcset="https://substackcdn.com/image/fetch/$s_!OTcB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 424w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 848w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.png 1272w, https://substackcdn.com/image/fetch/$s_!OTcB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ed375ed-af30-4140-9e2e-bfbdb1ea48c2_658x724.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 role="img" 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><title></title><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>Problem</h4><p>Many data workflows begin with pandas for quick experimentation, while production pipelines might run on databases like PostgreSQL or BigQuery.</p><p>Moving from prototype to production usually means rewriting the same transformation logic in SQL. That translation takes time and can easily introduce errors.</p><h4>Solution</h4><p><a href="https://github.com/ibis-project/ibis">Ibis</a> solves this by letting you define transformations once in Python and compiling them into native SQL for 25+ backends automatically.</p><blockquote><p>&#128214; <a href="https://codecut.ai/ibis-vs-narwhals-vs-fugue-dataframe-portability/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_ibis-vs-narwhals-vs-fugue-dataframe-portability">View Full Article</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/shiyu-coder/Kronos">Kronos</a></strong> <em>[Machine Learning]</em> - A decoder-only foundation model pre-trained on K-line sequences for financial market forecasting</p><p><strong><a href="https://github.com/prefix-dev/pixi">pixi</a></strong> <em>[Environment Management]</em> - Fast, cross-platform package manager built on the Conda ecosystem, written in Rust</p><p><strong><a href="https://github.com/opendatalab/MinerU">MinerU</a></strong> <em>[OCR/PDF Processing]</em> - One-stop tool for converting PDFs, webpages, and e-books into machine-readable markdown and JSON</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_tool-selector">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=article_production-ready-data-science">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Marker: Smart PDF Extraction with Hybrid LLM Mode]]></title><description><![CDATA[Plus Qdrant&#8217;s Rust-powered vector search]]></description><link>https://newsletter.codecut.ai/p/marker-smart-pdf-extraction-with</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/marker-smart-pdf-extraction-with</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 12 Mar 2026 16:02:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W22O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Marker: Smart PDF Extraction with Hybrid LLM Mode</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W22O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W22O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 424w, https://substackcdn.com/image/fetch/$s_!W22O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 848w, https://substackcdn.com/image/fetch/$s_!W22O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 1272w, https://substackcdn.com/image/fetch/$s_!W22O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W22O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png" width="617" height="661" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:661,&quot;width&quot;:617,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Marker: Smart PDF Extraction with Hybrid LLM Mode&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="Code example: Marker: Smart PDF Extraction with Hybrid LLM Mode" title="Code example: Marker: Smart PDF Extraction with Hybrid LLM Mode" srcset="https://substackcdn.com/image/fetch/$s_!W22O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 424w, https://substackcdn.com/image/fetch/$s_!W22O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 848w, https://substackcdn.com/image/fetch/$s_!W22O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.png 1272w, https://substackcdn.com/image/fetch/$s_!W22O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff57b1d9b-6632-4aaf-8b3b-c3a9509b3e8e_617x661.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 role="img" 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><title></title><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>Problem</h4><p>Standard OCR pipelines often miss inline math, split tables across pages, and lose the relationships between form fields.</p><p>Sending the full document to an LLM can improve accuracy, but it&#8217;s slow and expensive at scale.</p><h4>Solution</h4><p><a href="https://github.com/datalab-to/marker">Marker</a>&#8216;s hybrid mode takes a more targeted approach:</p><ul><li><p>Its deep learning pipeline handles the bulk of conversion</p></li><li><p>Then an LLM steps in only for the hard parts: table merging, LaTeX formatting, and form extraction</p></li></ul><p>Marker supports OpenAI, Gemini, Claude, Ollama, and Azure out of the box.</p><blockquote><p>&#128214; <a href="https://codecut.ai/docling-vs-marker-vs-llamaparse/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a></p></blockquote><div><hr></div><h3>Qdrant: Fast Vector Search in Rust with a Python API</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N9qG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N9qG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 424w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 848w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 1272w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N9qG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png" width="600" height="703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1df626d-09a2-45e0-ba21-954520978bbc_600x703.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:703,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Qdrant: Fast Vector Search in Rust with a Python API&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="Code example: Qdrant: Fast Vector Search in Rust with a Python API" title="Code example: Qdrant: Fast Vector Search in Rust with a Python API" srcset="https://substackcdn.com/image/fetch/$s_!N9qG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 424w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 848w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.png 1272w, https://substackcdn.com/image/fetch/$s_!N9qG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1df626d-09a2-45e0-ba21-954520978bbc_600x703.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 role="img" 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><title></title><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>Problem</h4><p>Building a semantic search typically starts with storing vectors in Python lists and computing cosine similarity manually.</p><p>But brute-force comparison scales linearly with your dataset, making every query slower as your data grows.</p><h4>Solution</h4><p><a href="https://github.com/qdrant/qdrant">Qdrant</a> is a vector search engine built in Rust that indexes your vectors for fast retrieval.</p><p>Key features:</p><ul><li><p>In-memory mode for local prototyping with no server setup</p></li><li><p>Seamlessly scale to millions of vectors in production with the same Python API</p></li><li><p>Built-in support for cosine, dot product, and Euclidean distance</p></li><li><p>Sub-second query times even for millions of vectors</p></li></ul><blockquote><p>&#129514; <a href="https://bit.ly/4cCI76w">Run code</a></p></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/docling-vs-marker-vs-llamaparse/">PDF Table Extraction: Docling vs Marker vs LlamaParse Compared</a></strong></p><p>Extracting tables from PDFs can be surprisingly difficult. A table that looks neatly structured in a PDF is actually saved as text placed at specific coordinates on the page. This makes it difficult to preserve the original layout when extracting the table.</p><p>This article will introduce three Python tools that attempt to solve this problem: Docling, Marker, and LlamaParse.</p><blockquote><p>&#128214; <a href="https://codecut.ai/docling-vs-marker-vs-llamaparse/">View Full Article</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/langgenius/dify">Dify</a></strong> <em>[LLM]</em> - Open-source LLM app development platform with AI workflow, RAG pipeline, and agent capabilities</p><p><strong><a href="https://github.com/VectifyAI/PageIndex">PageIndex</a></strong> <em>[RAG]</em> - Document index for vectorless, reasoning-based RAG</p><p><strong><a href="https://github.com/antvis/mcp-server-chart">MCP Server Chart</a></strong> <em>[Data Visualization]</em> - A visualization MCP server for generating 25+ visual charts using AntV</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[pandas 3.0: 5-10x Faster String Operations with PyArrow]]></title><description><![CDATA[Plus build readable regex with Pregex]]></description><link>https://newsletter.codecut.ai/p/pandas-30-5-10x-faster-string-operations</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/pandas-30-5-10x-faster-string-operations</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 10 Mar 2026 16:02:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XP2l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>pandas 3.0: 5-10x Faster String Operations with PyArrow</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XP2l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XP2l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 424w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 848w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 1272w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XP2l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png" width="712" height="622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:622,&quot;width&quot;:712,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: pandas 3.0: 5-10x Faster String Operations with PyArrow&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="Code example: pandas 3.0: 5-10x Faster String Operations with PyArrow" title="Code example: pandas 3.0: 5-10x Faster String Operations with PyArrow" srcset="https://substackcdn.com/image/fetch/$s_!XP2l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 424w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 848w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.png 1272w, https://substackcdn.com/image/fetch/$s_!XP2l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4605745b-836b-46ef-b1fb-4b2656b43ff3_712x622.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 role="img" 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><title></title><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>Problem</h4><p>Traditionally, pandas stores strings as <code>object</code> dtype, where each string is a separate Python object scattered across memory.</p><p>This makes string operations slow and the <code>dtype</code> ambiguous, since both pure string columns and mixed-type columns show up as <code>object</code>.</p><h4>Solution</h4><p>pandas 3.0 introduces a dedicated <code>str</code> dtype backed by PyArrow, which stores strings in contiguous memory blocks instead of individual Python objects.</p><p>Key benefits:</p><ul><li><p>5-10x faster string operations because data is stored contiguously</p></li><li><p>50% lower memory by eliminating Python object overhead</p></li><li><p>Clear distinction between string and mixed-type columns</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/pandas-3-whats-new/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4ugIpGh">Run code</a></p></blockquote><div><hr></div><h3>Build Self-Documenting Regex with Pregex</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8iDc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8iDc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 424w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 848w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 1272w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8iDc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png" width="736" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:736,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Build Self-Documenting Regex with Pregex&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="Code example: Build Self-Documenting Regex with Pregex" title="Code example: Build Self-Documenting Regex with Pregex" srcset="https://substackcdn.com/image/fetch/$s_!8iDc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 424w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 848w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.png 1272w, https://substackcdn.com/image/fetch/$s_!8iDc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6476f0d9-cb5d-4ca4-b814-d9ab913fbce4_736x764.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 role="img" 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><title></title><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>Problem</h4><p>Regex patterns like [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} are difficult to read and intimidating.</p><p>Team members without regex expertise might struggle to understand and modify these validation patterns.</p><h4>Solution</h4><p>Team members without regex expertise might struggle to understand and modify these validation patterns.</p><p><a href="https://github.com/manoss96/pregex">Pregex</a> transforms regex into readable Python code using descriptive components.</p><p>Key benefits:</p><ul><li><p>Code that explains its intent without comments</p></li><li><p>Easy modification without regex expertise</p></li><li><p>Composable patterns for complex validation</p></li><li><p>Export to regex format when needed</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/regex-pregex-pyparsing-text-pattern-matching-guide/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4hdQjKM">Run code</a></p></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/docling-vs-marker-vs-llamaparse/">PDF Table Extraction: Docling vs Marker vs LlamaParse Compared</a></strong></p><p>PDF files do not store tables as structured data. Instead, they position text at specific coordinates on the page. Table extraction tools must reconstruct the structure by determining which values belong in which rows and columns.</p><p>The problem becomes even harder when tables include multi-level headers, merged cells, or complex layouts.</p><p>To explore this problem, I experimented with three tools designed for PDF table extraction: LlamaParse, Marker, and Docling. </p><p>This article shows the results of those experiments.</p><blockquote><p>&#128214; <a href="https://codecut.ai/docling-vs-marker-vs-llamaparse/">View Full Article</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/lancedb/lance">Lance</a></strong> <em>[Data Processing]</em> - Modern columnar data format for ML with 100x faster random access than Parquet</p><p><strong><a href="https://github.com/mathesar-foundation/mathesar">Mathesar</a></strong> <em>[Dashboard]</em> - Spreadsheet-like interface for PostgreSQL that lets anyone view, edit, and query data</p><p><strong><a href="https://github.com/dotenvx/dotenvx">dotenvx</a></strong> <em>[DevOps]</em> - A better dotenv with encryption, multiple environments, and cross-platform support</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[act: Run GitHub Actions Locally with Docker]]></title><description><![CDATA[Plus multi-site scraping with ScrapeGraphAI]]></description><link>https://newsletter.codecut.ai/p/act-run-github-actions-locally-with</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/act-run-github-actions-locally-with</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 05 Mar 2026 17:02:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-wFG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>act: Run GitHub Actions Locally with Docker</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-wFG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-wFG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 424w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 848w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 1272w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-wFG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png" width="636" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:636,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: act: Run GitHub Actions Locally with Docker&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="Code example: act: Run GitHub Actions Locally with Docker" title="Code example: act: Run GitHub Actions Locally with Docker" srcset="https://substackcdn.com/image/fetch/$s_!-wFG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 424w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 848w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.png 1272w, https://substackcdn.com/image/fetch/$s_!-wFG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d50e984-ef68-4e7e-a4ee-e21c510ba8af_636x601.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 role="img" 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><title></title><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>Problem</h4><p>GitHub Actions has no local execution mode. You can&#8217;t test a step, inspect an environment variable, or reproduce a runner-specific failure on your own machine.</p><p>Each change requires a commit and a wait for the cloud runner. A small mistake like a missing secret means starting the loop again.</p><h4>Solution</h4><p>With <a href="https://github.com/nektos/act">act</a>, you can execute workflows locally using Docker. Failures surface immediately, making it easier to iterate and commit only when the workflow passes.</p><blockquote></blockquote><div><hr></div><h3>ScrapeGraphAI: Research Multiple Sites with One Prompt</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RcbL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RcbL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 424w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 848w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 1272w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RcbL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png" width="676" height="661" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:661,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: ScrapeGraphAI: Research Multiple Sites with One Prompt&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="Code example: ScrapeGraphAI: Research Multiple Sites with One Prompt" title="Code example: ScrapeGraphAI: Research Multiple Sites with One Prompt" srcset="https://substackcdn.com/image/fetch/$s_!RcbL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 424w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 848w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.png 1272w, https://substackcdn.com/image/fetch/$s_!RcbL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2695a5ae-acba-4ace-a10e-2ff2567a2c18_676x661.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 role="img" 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><title></title><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>Problem</h4><p>With BeautifulSoup, every site needs its own selectors, and you need to manually combine the results into a unified format.</p><p>When any site redesigns its layout, those selectors break and you are back to fixing code.</p><h4>Solution</h4><p><a href="https://github.com/ScrapeGraphAI/Scrapegraph-ai">ScrapeGraphAI</a>&#8216;s SearchGraph fixes this by replacing selectors with a natural language prompt.</p><p>Here&#8217;s what it handles:</p><ul><li><p>Automatic web search for relevant pages</p></li><li><p>AI-powered scraping that adapts to any layout</p></li><li><p>Structured output with source URLs for verification</p></li><li><p>Works with any LLM provider (OpenAI, Ollama, etc.)</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/scrapegraphai-web-scraping-natural-language/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a></p></blockquote><div><hr></div><h2>&#127891; Latest Interactive Course</h2><p><strong><a href="https://codecut.ai/courses/courses-python-data-containers/">Python Data Modeling with Dataclasses and Pydantic</a></strong></p><p>Choosing between dict, NamedTuple, dataclass, and Pydantic comes down to how much safety you need. In this free interactive course, you&#8217;ll learn when to use each:</p><ul><li><p><strong>Dictionary:</strong> Flexible, but no built-in field checks. Typos and missing keys only show up at runtime.</p></li><li><p><strong>NamedTuple:</strong> Immutable with fixed fields, helping catch mistakes early.</p></li><li><p><strong>dataclass:</strong> Mutable data containers with defaults and optional validation logic.</p></li><li><p><strong>Pydantic:</strong> Strong type validation, automatic coercion, and detailed error reporting.</p></li></ul><p>All exercises run directly in your browser. No installation required.</p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/vercel-labs/agent-browser">agent-browser</a></strong> <em>[Agents]</em> - Headless browser automation CLI for AI agents, built on Playwright</p><p><strong><a href="https://github.com/ludo-technologies/pyscn">pyscn</a></strong> <em>[Code Quality]</em> - Intelligent Python code quality analyzer with dead code detection and complexity analysis</p><p><strong><a href="https://github.com/asottile/pyupgrade">pyupgrade</a></strong> <em>[Code Quality]</em> - Automatically upgrade Python syntax to newer versions of the language</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[SQLFluff: Auto-Fix Messy SQL with One Command]]></title><description><![CDATA[Plus evaluate LLM apps with PydanticAI]]></description><link>https://newsletter.codecut.ai/p/sqlfluff-auto-fix-messy-sql-with</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/sqlfluff-auto-fix-messy-sql-with</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 03 Mar 2026 17:01:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5jUK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Evaluate LLM Apps in One Line with PydanticAI</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5jUK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5jUK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 424w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 848w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 1272w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5jUK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png" width="651" height="766" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:766,&quot;width&quot;:651,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Evaluate LLM Apps in One Line with PydanticAI&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="Code example: Evaluate LLM Apps in One Line with PydanticAI" title="Code example: Evaluate LLM Apps in One Line with PydanticAI" srcset="https://substackcdn.com/image/fetch/$s_!5jUK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 424w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 848w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.png 1272w, https://substackcdn.com/image/fetch/$s_!5jUK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e26483c-b924-4c9d-b787-065052ea30f3_651x766.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 role="img" 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><title></title><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>Problem</h4><p>Testing LLM apps means validating multiple factors at once: is the answer correct, properly structured, fast enough, and natural sounding?</p><p>Rewriting this logic for every project is inefficient and error-prone.</p><h4>Solution</h4><p><a href="https://github.com/pydantic/pydantic-ai">pydantic-ai</a> includes pydantic-evals, which provides these capabilities out of the box. Simply choose the evaluators you need and add them to your evaluation suite.</p><p>Built-in evaluators:</p><ul><li><p>Deterministic: validate that outputs are correct, properly typed, and fast enough</p></li><li><p>LLM-as-judge: have another LLM grade qualities like helpfulness or tone</p></li><li><p>Report-level: generate classification metrics across all cases automatically</p></li></ul><blockquote><p>&#129514; <a href="https://bit.ly/4cNDIgY">Run code</a></p></blockquote><div><hr></div><h3>SQLFluff: Auto-Fix Messy SQL with One Command</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5p7j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5p7j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 424w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 848w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 1272w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5p7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png" width="677" height="655" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:655,&quot;width&quot;:677,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: SQLFluff: Auto-Fix Messy SQL with One Command&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="Code example: SQLFluff: Auto-Fix Messy SQL with One Command" title="Code example: SQLFluff: Auto-Fix Messy SQL with One Command" srcset="https://substackcdn.com/image/fetch/$s_!5p7j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 424w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 848w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.png 1272w, https://substackcdn.com/image/fetch/$s_!5p7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c9f062c-d58f-4cb5-bcac-76692dd8b707_677x655.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 role="img" 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><title></title><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>Problem</h4><p>Consistent SQL style matters. It improves readability, speeds up code reviews, and makes bugs easier to identify.</p><p>Manual reviews can catch formatting issues, but they&#8217;re time-consuming and often inconsistent.</p><h4>Solution</h4><p><a href="https://github.com/sqlfluff/sqlfluff">SQLFluff</a> solves this with automated linting and formatting across 30+ SQL dialects. It identifies violations, applies consistent standards, and auto-corrects many problems.</p><p>SQLFluff also supports the following templates:</p><ul><li><p>Jinja</p></li><li><p>SQL placeholders (e.g. SQLAlchemy parameters)</p></li><li><p>Python format strings</p></li><li><p>dbt (requires plugin)</p></li></ul><blockquote><p>&#129514; <a href="https://bit.ly/4aUX9BN">Run code</a></p></blockquote><div><hr></div><h2>&#127891; Latest Interactive Course</h2><p><strong><a href="https://codecut.ai/courses/courses-python-data-containers/">Python Data Modeling with Dataclasses and Pydantic</a></strong></p><p>Choosing between dict, NamedTuple, dataclass, and Pydantic comes down to how much safety you need. In this free interactive course, you&#8217;ll learn when to use each:</p><ul><li><p><strong>Dictionary:</strong> Flexible, but no built-in field checks. Typos and missing keys only show up at runtime.</p></li><li><p><strong>NamedTuple:</strong> Immutable with fixed fields, helping catch mistakes early.</p></li><li><p><strong>dataclass:</strong> Mutable data containers with defaults and optional validation logic.</p></li><li><p><strong>Pydantic:</strong> Strong type validation, automatic coercion, and detailed error reporting.</p></li></ul><p>All exercises run directly in your browser. No installation required.</p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/github/spec-kit">spec-kit</a></strong> <em>[Dev Tools]</em> - Toolkit for Spec-Driven Development that helps define specs, generate plans and tasks, and implement code with AI coding tools</p><p><strong><a href="https://github.com/astral-sh/ty">ty</a></strong> <em>[Code Quality]</em> - Extremely fast Python type checker and language server written in Rust, by the creators of uv and Ruff</p><p><strong><a href="https://github.com/nbQA-dev/nbQA">nbQA</a></strong> <em>[Code Quality]</em> - Run ruff, isort, pyupgrade, mypy, pylint, flake8, and more on Jupyter Notebooks</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Docling: Turn DOCX Reviewer Feedback into Structured Data]]></title><description><![CDATA[Plus Narwhals: one function, any DataFrame type]]></description><link>https://newsletter.codecut.ai/p/docling-turn-docx-reviewer-feedback</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/docling-turn-docx-reviewer-feedback</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 26 Feb 2026 17:01:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2avy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Narwhals: One Decorator for pandas, Polars, and DuckDB</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2avy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2avy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 424w, https://substackcdn.com/image/fetch/$s_!2avy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 848w, https://substackcdn.com/image/fetch/$s_!2avy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 1272w, https://substackcdn.com/image/fetch/$s_!2avy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2avy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png" width="592" height="598" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:598,&quot;width&quot;:592,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Narwhals: One Decorator for pandas, Polars, and DuckDB&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="Code example: Narwhals: One Decorator for pandas, Polars, and DuckDB" title="Code example: Narwhals: One Decorator for pandas, Polars, and DuckDB" srcset="https://substackcdn.com/image/fetch/$s_!2avy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 424w, https://substackcdn.com/image/fetch/$s_!2avy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 848w, https://substackcdn.com/image/fetch/$s_!2avy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.png 1272w, https://substackcdn.com/image/fetch/$s_!2avy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5febfb70-c8c3-4215-81e4-18103eaddbe3_592x598.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 role="img" 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><title></title><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>Problem</h4><p>Writing a DataFrame function that supports multiple libraries usually means maintaining separate versions of the same logic for each one.</p><p>If changes are needed, they need to be applied to every version.</p><h4>Solution</h4><p>With <a href="https://github.com/narwhals-dev/narwhals">Narwhals</a>&#8216; <code>@narwhalify</code> decorator, you write the logic once using a unified API.</p><p>The function then works with whatever DataFrame type is passed in and returns the same type, reducing friction when switching tools.</p><p>How is this different from Ibis? Ibis is built for data scientists switching between SQL backends. Narwhals is built for library authors who need their code to work with any DataFrame type.</p><blockquote><p>&#128214; <a href="https://codecut.ai/ibis-vs-narwhals-vs-fugue-dataframe-portability/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4aIVTlb">Run code</a></p></blockquote><div><hr></div><h3>Docling: Turn DOCX Reviewer Feedback into Structured Data</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hCHm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hCHm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 424w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 848w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 1272w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hCHm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png" width="609" height="493" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:493,&quot;width&quot;:609,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Docling: Turn DOCX Reviewer Feedback into Structured Data&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="Code example: Docling: Turn DOCX Reviewer Feedback into Structured Data" title="Code example: Docling: Turn DOCX Reviewer Feedback into Structured Data" srcset="https://substackcdn.com/image/fetch/$s_!hCHm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 424w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 848w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.png 1272w, https://substackcdn.com/image/fetch/$s_!hCHm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F940fc007-260e-4151-9db7-6a8ffd17e03f_609x493.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 role="img" 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><title></title><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>Problem</h4><p>Pulling comments from Word files turns informal feedback into data you can analyze, manage, and act on in code.</p><p>Traditionally, this requires parsing raw XML and manually mapping each comment back to its referenced text.</p><h4>Solution</h4><p><a href="https://github.com/DS4SD/docling">Docling</a> v2.71.0 simplifies this process. Converted documents now attach a <code>comments</code> field to every text item, making reviewer annotations accessible without manual XML handling.</p><p>This opens up workflows that were previously too tedious to automate:</p><ul><li><p>Flag unresolved comments before merging document versions</p></li><li><p>Build dashboards tracking reviewer feedback across teams</p></li><li><p>Feed comment data into LLMs for sentiment analysis or summarization</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/docling-pdf-rag-document-processing/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a></p></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/ibis-vs-narwhals-vs-fugue-dataframe-portability/">Portable DataFrames in Python: When to Use Ibis, Narwhals, or Fugue</a></strong> - Write your DataFrame logic once and run it on any backend. Compare Ibis, Narwhals, and Fugue to find the right portability strategy for your Python workflow.</p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/bhaskatripathi/pdfGPT">pdfGPT</a></strong> <em>[LLM]</em> - Chat with the contents of your PDF files using GPT capabilities and semantic search with sentence embeddings</p><p><strong><a href="https://github.com/microsoft/SandDance">SandDance</a></strong> <em>[Data Viz]</em> - Microsoft Research data visualization tool that maps every data row to a visual mark for interactive exploration</p><p><strong><a href="https://github.com/adbar/trafilatura">trafilatura</a></strong> <em>[Web Scraping]</em> - Python package and CLI for web crawling, scraping, and text extraction with output as CSV, JSON, HTML, or XML</p><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Quarkdown: Build LaTeX-Quality Docs with Just Markdown]]></title><description><![CDATA[Plus query any database backend with Ibis]]></description><link>https://newsletter.codecut.ai/p/quarkdown-build-latex-quality-docs</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/quarkdown-build-latex-quality-docs</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 24 Feb 2026 17:01:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lVCh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Quarkdown: Build LaTeX-Quality Docs with Just Markdown</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lVCh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lVCh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 424w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 848w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 1272w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lVCh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png" width="1200" height="679" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:679,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Quarkdown: Build LaTeX-Quality Docs with Just Markdown&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="Code example: Quarkdown: Build LaTeX-Quality Docs with Just Markdown" title="Code example: Quarkdown: Build LaTeX-Quality Docs with Just Markdown" srcset="https://substackcdn.com/image/fetch/$s_!lVCh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 424w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 848w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.png 1272w, https://substackcdn.com/image/fetch/$s_!lVCh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb807a27-86a5-4d0e-a291-3291eca5ea35_1200x679.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 role="img" 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><title></title><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>Problem</h4><p>LaTeX produces beautiful academic papers, but its verbose syntax and nested environments make even simple layouts painful to write.</p><h4>Solution</h4><p><a href="https://github.com/iamgio/quarkdown">Quarkdown</a> generates the same professional page output using clean Markdown syntax you already know.</p><p>Key features:</p><ul><li><p>Write once, export as paged documents, presentation slides, or websites</p></li><li><p>Define reusable functions with conditionals and loops inside your documents</p></li><li><p>Embed Mermaid diagrams and charts without external tools</p></li><li><p>Live preview in VS Code as you type</p></li></ul><blockquote></blockquote><div><hr></div><h3>Ibis: One Python API for 22+ Database Backends</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uur8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uur8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 424w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 848w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 1272w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uur8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png" width="676" height="661" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:661,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Ibis: One Python API for 22+ Database Backends&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="Code example: Ibis: One Python API for 22+ Database Backends" title="Code example: Ibis: One Python API for 22+ Database Backends" srcset="https://substackcdn.com/image/fetch/$s_!Uur8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 424w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 848w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.png 1272w, https://substackcdn.com/image/fetch/$s_!Uur8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F982c8140-b6ee-49e4-86e6-fe798c14c421_676x661.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 role="img" 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><title></title><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>Problem</h4><p>Running queries across multiple databases often means rewriting the same logic for each backend&#8217;s SQL dialect. A query that works in DuckDB may require syntax changes for PostgreSQL, and another rewrite for BigQuery.</p><h4>Solution</h4><p><a href="https://github.com/ibis-project/ibis">Ibis</a> removes that friction by compiling Python expressions into each backend&#8217;s native SQL. Swap the connection, and the same code runs across 22+ databases.</p><p>Key features:</p><ul><li><p>Write once, run on DuckDB, PostgreSQL, BigQuery, Snowflake, and 18+ more</p></li><li><p>Lazy execution that builds and optimizes the query plan before sending it to the database</p></li><li><p>Intuitive chaining syntax similar to Polars</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/ibis-vs-narwhals-vs-fugue-dataframe-portability/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">View Full Article</a></p></blockquote><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/ibis-vs-narwhals-vs-fugue-dataframe-portability/">Portable DataFrames in Python: When to Use Ibis, Narwhals, or Fugue</a></strong> - Write your DataFrame logic once and run it on any backend. Compare Ibis, Narwhals, and Fugue to find the right portability strategy for your Python workflow.</p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/getzep/graphiti">graphiti</a></strong> <em>[LLM]</em> - Build real-time, temporally-aware knowledge graphs for AI agents with automatic entity and relationship extraction</p><p><strong><a href="https://github.com/apache/doris">doris</a></strong> <em>[SQL]</em> - High-performance MPP analytics database with MySQL compatibility that handles real-time ingestion and sub-second queries at scale</p><p><strong><a href="https://github.com/deepseek-ai/smallpond">smallpond</a></strong> <em>[Data Processing]</em> - Lightweight distributed data processing framework by DeepSeek that scales DuckDB to PB-scale datasets using Ray</p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p><div><hr></div></li></ul><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item><item><title><![CDATA[Python 3.14: Type-Safe String Interpolation with t-strings]]></title><description><![CDATA[Plus zero-config logging with Loguru]]></description><link>https://newsletter.codecut.ai/p/python-314-type-safe-string-interpolation</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/python-314-type-safe-string-interpolation</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 19 Feb 2026 17:01:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ngej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Loguru: From Print Statements to Production Logging in One Line</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ngej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ngej!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 424w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 848w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ngej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png" width="806" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:806,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Loguru: From Print Statements to Production Logging in One Line&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="Code example: Loguru: From Print Statements to Production Logging in One Line" title="Code example: Loguru: From Print Statements to Production Logging in One Line" srcset="https://substackcdn.com/image/fetch/$s_!Ngej!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 424w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 848w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.png 1272w, https://substackcdn.com/image/fetch/$s_!Ngej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed9227a-f9ce-4d04-8423-018aa544e66f_806x559.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 role="img" 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><title></title><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>Problem</h4><p>Data scientists often rely on print statements to monitor data processing pipelines during development.</p><p>But print provides no timestamps or severity levels.</p><p>Python&#8217;s built-in logging fixes that, but demands boilerplate: handlers, formatters, and log-level configuration just to get started.</p><h4>Solution</h4><p><a href="https://github.com/Delgan/loguru">Loguru</a> replaces both with a single import: one line gives you structured, colored logging with no setup required.</p><p>Key features:</p><ul><li><p>Modern <code>{}</code> formatting that matches Python f-string syntax</p></li><li><p>One-line file logging with automatic rotation and retention</p></li><li><p>Readable tracebacks that show variable values at each stack level</p></li><li><p>Custom sinks to route logs to Slack, email, or databases</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/simplify-your-python-logging-with-loguru/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/46eJCDN">Run code</a></p></blockquote><div><hr></div><h3>Python 3.14: Type-Safe String Interpolation with t-strings</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I28B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I28B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 424w, https://substackcdn.com/image/fetch/$s_!I28B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 848w, https://substackcdn.com/image/fetch/$s_!I28B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 1272w, https://substackcdn.com/image/fetch/$s_!I28B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I28B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png" width="723" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:723,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Python 3.14: Type-Safe String Interpolation with t-strings&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="Code example: Python 3.14: Type-Safe String Interpolation with t-strings" title="Code example: Python 3.14: Type-Safe String Interpolation with t-strings" srcset="https://substackcdn.com/image/fetch/$s_!I28B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 424w, https://substackcdn.com/image/fetch/$s_!I28B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 848w, https://substackcdn.com/image/fetch/$s_!I28B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.png 1272w, https://substackcdn.com/image/fetch/$s_!I28B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303f810f-0f9f-4a69-a8c4-28292f0f6946_723x722.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 role="img" 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><title></title><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>Problem</h4><p>Building SQL queries with f-strings directly embeds user input into the query string, allowing attackers to inject malicious SQL commands.</p><p>Parameterized queries are secure but require you to maintain query templates and value lists separately.</p><h4>Solution</h4><p>Python 3.14 introduces template string literals (t-strings). Instead of returning strings, they return Template objects that safely expose interpolated values.</p><p>This lets you validate and sanitize interpolated values before building the final query.</p><blockquote><p>&#129514; <a href="https://bit.ly/48t9YE2">Run code</a></p></blockquote><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/lepture/mistune">mistune</a></strong> <em>[Python Utilities]</em> - Fast Python Markdown parser with custom renderers and plugins that converts Markdown to HTML with minimal overhead</p><p><strong><a href="https://github.com/pyparsing/pyparsing">pyparsing</a></strong> <em>[Python Utilities]</em> - Python library for creating readable PEG parsers that handles whitespace, quoted strings, and comments without regex complexity</p><p><strong><a href="https://github.com/AnswerDotAI/fastlite">fastlite</a></strong> <em>[SQL]</em> - Lightweight SQLite wrapper by Jeremy Howard that adds Pythonic syntax, dataclass support, and diagram visualization for interactive use</p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[MLflow: Track Every LLM API Call with 1 Line of Code]]></title><description><![CDATA[Plus remove image backgrounds with Rembg]]></description><link>https://newsletter.codecut.ai/p/mlflow-track-every-llm-api-call-with</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/mlflow-track-every-llm-api-call-with</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 17 Feb 2026 17:02:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3ztJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>MLflow: Track Every LLM API Call with 1 Line of Code</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3ztJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ztJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 424w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 848w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 1272w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ztJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png" width="643" height="577" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:577,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: MLflow: Track Every LLM API Call with 1 Line of Code&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="Code example: MLflow: Track Every LLM API Call with 1 Line of Code" title="Code example: MLflow: Track Every LLM API Call with 1 Line of Code" srcset="https://substackcdn.com/image/fetch/$s_!3ztJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 424w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 848w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.png 1272w, https://substackcdn.com/image/fetch/$s_!3ztJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f174a08-0829-4315-ac2d-c47981b4ecd9_643x577.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 role="img" 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><title></title><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>Problem</h4><p>Most teams building LLM apps don&#8217;t set up tracking because they see API calls as simple request-response operations.</p><p>But every API call costs money, and without token-level visibility, you can&#8217;t tell where your budget is going until it&#8217;s already spent.</p><h4>Solution</h4><p><a href="https://github.com/mlflow/mlflow">MLflow</a>&#8216;s autolog traces every OpenAI API call with just one line of code, so you always know what was sent, what came back, and how many tokens it used.</p><p>Key capabilities:</p><ul><li><p>Track token usage per call to identify which requests consume the most</p></li><li><p>View full prompt and response content for every call</p></li><li><p>Measure latency per call to find which requests are slowing down your app</p></li><li><p>Works with OpenAI, Anthropic, LangChain, LlamaIndex, and DSPy</p></li></ul><blockquote></blockquote><div><hr></div><h3>Rembg: Remove Image Backgrounds in 2 Lines of Python</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MJ3F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MJ3F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 424w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 848w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 1272w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MJ3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png" width="559" height="530" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:530,&quot;width&quot;:559,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Rembg: Remove Image Backgrounds in 2 Lines of Python&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="Code example: Rembg: Remove Image Backgrounds in 2 Lines of Python" title="Code example: Rembg: Remove Image Backgrounds in 2 Lines of Python" srcset="https://substackcdn.com/image/fetch/$s_!MJ3F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 424w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 848w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.png 1272w, https://substackcdn.com/image/fetch/$s_!MJ3F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82f606db-1f7d-47d0-9620-5a3c6395c595_559x530.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 role="img" 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><title></title><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>Problem</h4><p>Removing backgrounds from images typically requires Photoshop, online tools, or AI assistants like ChatGPT.</p><p>But these options come with subscription costs, upload limits, or privacy concerns with your images on external servers.</p><h4>Solution</h4><p><a href="https://github.com/danielgatis/rembg">Rembg</a> uses AI models to remove backgrounds locally with just 2 lines of Python.</p><p>It&#8217;s also open source and compatible with common Python imaging libraries.</p><blockquote><p>&#129514; <a href="https://bit.ly/48lIIWc">Run code</a></p></blockquote><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/travisvn/awesome-claude-skills">awesome-claude-skills</a></strong> <em>[AI Tools]</em> - Curated list of Claude Skills, resources, and tools for customizing Claude AI workflows with community-contributed templates and integrations</p><p><strong><a href="https://github.com/alibaba/zvec">zvec</a></strong> <em>[Vector Database]</em> - In-process vector database built on Alibaba&#8217;s Proxima engine that searches billions of vectors in milliseconds with zero server setup</p><p><strong><a href="https://github.com/langflow-ai/langflow">langflow</a></strong> <em>[AI Agents]</em> - Visual platform for building and deploying AI-powered agents and workflows with drag-and-drop interface, multi-agent orchestration, and MCP server support</p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Granite Vision: Convert Chart Images to CSV with Transformers]]></title><description><![CDATA[Plus control OpenAI data retention with PydanticAI]]></description><link>https://newsletter.codecut.ai/p/granite-vision-convert-chart-images</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/granite-vision-convert-chart-images</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Thu, 12 Feb 2026 17:02:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gJ1i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Granite Vision: Convert Chart Images to CSV with Transformers</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gJ1i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gJ1i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 424w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 848w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 1272w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gJ1i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png" width="668" height="745" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:745,&quot;width&quot;:668,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Convert Chart Images to CSV with IBM Granite Vision&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="Code example: Convert Chart Images to CSV with IBM Granite Vision" title="Code example: Convert Chart Images to CSV with IBM Granite Vision" srcset="https://substackcdn.com/image/fetch/$s_!gJ1i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 424w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 848w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.png 1272w, https://substackcdn.com/image/fetch/$s_!gJ1i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbb428b-4cde-45b5-ae2e-ca2a771dbb0e_668x745.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 role="img" 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><title></title><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>Problem</h4><p>Chart data often contains valuable insights, but extracting numbers from these charts manually is time-consuming and tedious.</p><h4>Solution</h4><p>IBM&#8217;s <a href="https://github.com/ibm-granite/granite-vision-models">Granite Vision</a> 3.3 2B converts chart images directly into structured CSV data using Hugging Face Transformers.</p><p>Here&#8217;s how to extract structured data from any chart image in three steps.</p><h5>1. Load the Model</h5><p>Load the chart-to-CSV model from HuggingFace using the transformers library.</p><pre><code><code>from transformers import AutoProcessor, AutoModelForVision2Seq
from huggingface_hub import hf_hub_download
from PIL import Image
import torch

model_path = "ibm-granite/granite-vision-3.3-2b-chart2csv-preview"
device = "cuda" if torch.cuda.is_available() else "cpu"

processor = AutoProcessor.from_pretrained(model_path)
model = AutoModelForVision2Seq.from_pretrained(model_path).to(device)</code></code></pre><h5>2. Prepare Your Chart</h5><p>Define the chart image and task instruction in a conversation format.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nZT4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nZT4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nZT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg" width="923" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:923,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75820,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://newsletter.codecut.ai/i/187607965?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.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_!nZT4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nZT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F025c9b04-91b9-4f03-a6b2-fa9a8b8ff00a_923x492.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 role="img" 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><title></title><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><pre><code><code># Load a chart image
img_path = hf_hub_download(
    repo_id=model_path, filename="example.jpg"
)
img = Image.open(img_path)

# Use the chart-to-CSV prompt
conversation = [
    {"role": "user", "content": [
        {"type": "image", "url": img_path},
        {"type": "text", "text": "Parse the chart in the image to CSV format."}
    ]}
]</code></code></pre><h5>3. Generate CSV Output</h5><p>Apply the chat template, generate tokens, and decode back to CSV text.</p><pre><code><code>inputs = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=True,
    return_dict=True,
    return_tensors="pt"
).to(device)

output = model.generate(**inputs, max_new_tokens=500)
csv_output = processor.decode(output[0], skip_special_tokens=True)
print(csv_output)</code></code></pre><p><strong>Output:</strong></p><pre><code><code>State,2017,2018
NJ,4.6,4.1
CT,4.7,4.1
DE,4.5,3.8
NY,4.7,4.1
PA,4.9,4.3</code></code></pre><blockquote></blockquote><div><hr></div><h3>PydanticAI: Control OpenAI Data Retention with openai_store</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eKQf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eKQf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 424w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 848w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 1272w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eKQf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png" width="609" height="535" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:535,&quot;width&quot;:609,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: PydanticAI: Control OpenAI Data Retention with openai_store&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="Code example: PydanticAI: Control OpenAI Data Retention with openai_store" title="Code example: PydanticAI: Control OpenAI Data Retention with openai_store" srcset="https://substackcdn.com/image/fetch/$s_!eKQf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 424w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 848w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.png 1272w, https://substackcdn.com/image/fetch/$s_!eKQf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ad32c78-f836-4515-af7d-e0f58b9ea562_609x535.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 role="img" 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><title></title><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>Problem</h4><p>By default, OpenAI may retain your API request data for internal review and model improvement. For healthcare, finance, and legal applications, this default creates compliance risks you can&#8217;t afford.</p><h4>Solution</h4><p><a href="https://github.com/pydantic/pydantic-ai">PydanticAI</a> v1.52.0 introduces the <code>openai_store</code> setting to explicitly disable data retention in one line.</p><blockquote><p>&#128214; <a href="https://codecut.ai/enforce-structured-outputs-from-llms-with-pydanticai/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">View Full Article</a></p></blockquote><div><hr></div><h3>&#128172; Rate Your Experience</h3><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/wesm/msgvault">msgvault</a></strong> <em>[Data Management]</em> - Archive a lifetime of email and chat locally with full Gmail backup, search, DuckDB-powered analytics, an interactive TUI, and an MCP server for querying messages with AI</p><p><strong><a href="https://github.com/pydantic/monty">monty</a></strong> <em>[Developer Tools]</em> - Minimal, secure Python interpreter written in Rust designed for use by AI agents, providing sandboxed code execution with safety guarantees</p><p><strong><a href="https://github.com/baserow/baserow">baserow</a></strong> <em>[No-Code Platform]</em> - Open-source no-code platform for building databases, applications, automations, and AI agents with enterprise-grade security and self-hosted deployment options</p><div><hr></div><h3>&#128269; Explore More on CodeCut</h3><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=thursday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Write Readable Conditions with Polars + Extract Text with Docling]]></title><description><![CDATA[Plus convert PDFs to text with Docling]]></description><link>https://newsletter.codecut.ai/p/write-readable-multi-condition-logic</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/write-readable-multi-condition-logic</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Tue, 10 Feb 2026 17:02:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7_My!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Write Readable Multi-Condition Logic with Polars when-then-otherwise</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7_My!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7_My!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 424w, https://substackcdn.com/image/fetch/$s_!7_My!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 848w, https://substackcdn.com/image/fetch/$s_!7_My!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 1272w, https://substackcdn.com/image/fetch/$s_!7_My!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7_My!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png" width="725" height="637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:637,&quot;width&quot;:725,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Write Readable Multi-Condition Logic with Polars when-then-otherwise&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="Code example: Write Readable Multi-Condition Logic with Polars when-then-otherwise" title="Code example: Write Readable Multi-Condition Logic with Polars when-then-otherwise" srcset="https://substackcdn.com/image/fetch/$s_!7_My!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 424w, https://substackcdn.com/image/fetch/$s_!7_My!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 848w, https://substackcdn.com/image/fetch/$s_!7_My!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.png 1272w, https://substackcdn.com/image/fetch/$s_!7_My!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F298b11e7-5aa9-4b9a-999d-832f3a4bdda3_725x637.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 role="img" 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><title></title><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>Problem</h4><p>pandas requires np.where() for simple conditions which breaks method chaining and becomes nested and hard to read for multiple conditions.</p><p>The apply() alternative is slow and also breaks the DataFrame workflow.</p><h4>Solution</h4><p><a href="https://github.com/pola-rs/polars">Polars</a> provides when().then().otherwise() chains that integrate naturally with method chaining.</p><p>With pandas, nested np.where() calls stack up for each additional condition, creating deeply nested expressions. Polars replaces this with readable chains where each condition appears sequentially.</p><p>Key benefits:</p><ul><li><p>Natural flow with method chaining</p></li><li><p>Each condition stands on its own line</p></li><li><p>No nested function calls</p></li><li><p>Maintains data transformation workflow</p></li></ul><p>The pattern scales cleanly from two conditions to ten without sacrificing readability.</p><blockquote><p>&#128214; <a href="https://codecut.ai/pandas-vs-polars-vs-duckdb-comparison/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4qKPn3H">Run code</a></p></blockquote><div><hr></div><h3>Extract Text from Any Document Format with Docling</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F3Ev!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F3Ev!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 424w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 848w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 1272w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F3Ev!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png" width="643" height="493" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:493,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Extract Text from Any Document Format with Docling&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="Code example: Extract Text from Any Document Format with Docling" title="Code example: Extract Text from Any Document Format with Docling" srcset="https://substackcdn.com/image/fetch/$s_!F3Ev!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 424w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 848w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.png 1272w, https://substackcdn.com/image/fetch/$s_!F3Ev!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f19bfe5-f752-4389-ab64-5040e6757698_643x493.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 role="img" 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><title></title><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>Problem</h4><p>Have you ever needed to pull text from PDFs, Word files, slide decks, or images for a project? Writing a different parser for each format is slow and error-prone.</p><h4>Solution</h4><p><a href="https://github.com/docling-project/docling">Docling</a>&#8216;s DocumentConverter takes care of that by detecting the file type and applying the right parsing method for PDF, DOCX, PPTX, HTML, and images.</p><p>Other features of Docling:</p><ul><li><p>AI-powered image descriptions for searchable diagrams</p></li><li><p>Export to pandas DataFrames, JSON, or Markdown</p></li><li><p>Structure-preserving output optimized for RAG pipelines</p></li><li><p>Built-in chunking strategies for vector databases</p></li><li><p>Parallel processing handles large document batches efficiently</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/docling-pdf-rag-document-processing/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4og3sow">Run code</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/EleutherAI/lm-evaluation-harness">lm-evaluation-harness</a></strong> <em>[Machine Learning]</em> - Unified framework for testing and evaluating generative language models across a wide range of benchmarks and tasks with support for local models and custom metrics</p><p><strong><a href="https://github.com/pymc-devs/pymc">PyMC</a></strong> <em>[Probabilistic Programming]</em> - Probabilistic programming library for Python that allows users to build Bayesian models with a simple Python API and fit them using state-of-the-art methods</p><p><strong><a href="https://github.com/iamgio/quarkdown">Quarkdown</a></strong> <em>[Documentation]</em> - Modern Markdown typesetting system with powerful extensions for creating books, articles, and presentations. Supports function calls, custom functions, and outputs HTML, PDF, and slides</p><div><hr></div><h2>Before You Go</h2><h4>&#128269; Explore More on CodeCut</h4><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=tuesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul><h4>&#128172; Rate Your Experience</h4><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item><item><title><![CDATA[Narwhals: One Function for pandas, Polars, and DuckDB]]></title><description><![CDATA[Plus uv pin for seamless Python upgrades]]></description><link>https://newsletter.codecut.ai/p/narwhals-one-function-for-pandas</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/narwhals-one-function-for-pandas</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Fri, 06 Feb 2026 17:03:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Bn1p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Narwhals: One Function for pandas, Polars, and DuckDB</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bn1p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bn1p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 424w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 848w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 1272w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bn1p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png" width="706" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:706,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Narwhals: One Function for pandas, Polars, and DuckDB&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="Code example: Narwhals: One Function for pandas, Polars, and DuckDB" title="Code example: Narwhals: One Function for pandas, Polars, and DuckDB" srcset="https://substackcdn.com/image/fetch/$s_!Bn1p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 424w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 848w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.png 1272w, https://substackcdn.com/image/fetch/$s_!Bn1p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45ab555-ccf1-4144-aa36-8e43a1e62aae_706x563.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 role="img" 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><title></title><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>Problem</h4><p>Teams today use multiple DataFrame libraries side by side. Each backend has its own syntax, so your utility functions end up full of if/elif chains checking types.</p><p>This makes even small logic changes expensive, since every backend implementation must be updated.</p><h4>Solution</h4><p>Narwhals removes this complexity by providing a unified DataFrame API.</p><p>How it works:</p><ul><li><p>Wrap any DataFrame with <code>nw.from_native()</code> (pandas, Polars, DuckDB, PySpark, PyArrow)</p></li><li><p>Write transformations once using Polars-style operations</p></li><li><p>Convert back to the original type with <code>nw.to_native()</code></p></li><li><p>Zero extra dependencies. Each backend keeps its native performance</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/unified-dataframe-functions-pandas-polars-pyspark/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4awJamN">Run code</a> | &#11088; <a href="https://github.com/narwhals-dev/narwhals">View GitHub</a></p></blockquote><div><hr></div><h3>uv: Switch Python Versions Without Rebuilding Environments</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hbB7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hbB7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 424w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 848w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 1272w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hbB7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png" width="1298" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1298,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: uv: Switch Python Versions Without Rebuilding Environments&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="Code example: uv: Switch Python Versions Without Rebuilding Environments" title="Code example: uv: Switch Python Versions Without Rebuilding Environments" srcset="https://substackcdn.com/image/fetch/$s_!hbB7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 424w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 848w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.png 1272w, https://substackcdn.com/image/fetch/$s_!hbB7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F253c913c-0d3c-426a-8de6-6a9c90e06639_1298x838.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 role="img" 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><title></title><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>Problem</h4><p>Switching Python versions typically requires recreating virtual environments and reinstalling all dependencies from scratch.</p><p>This workflow wastes time and can introduce version conflicts when dependencies need to be resolved again.</p><h4>Solution</h4><p>UV allows seamless Python version upgrades with uv python pin while preserving existing dependencies.</p><p>The process is simple:</p><ul><li><p>Pin the version with uv python pin 3.x</p></li><li><p>Sync dependencies with uv sync</p></li><li><p>All cached packages are preserved automatically</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/why-uv-might-all-you-need/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">View Full Article</a> | &#11088; <a href="https://github.com/astral-sh/uv">View GitHub</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/airbytehq/airbyte">Airbyte</a></strong> <em>[Data Engineering]</em> - Data integration platform with 600+ connectors for ETL/ELT pipelines from APIs, databases, and files to warehouses and lakes</p><p><strong><a href="https://github.com/nektos/act">act</a></strong> <em>[DevOps]</em> - Run GitHub Actions locally for fast feedback without commit/push cycles, using Docker containers</p><p><strong><a href="https://github.com/agno-agi/dash">Dash</a></strong> <em>[AI Agents]</em> - Self-learning text-to-SQL agent that grounds answers in six layers of context and improves automatically from failures</p><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/structured-llm-outputs-tools-comparison/">5 Python Tools for Structured LLM Outputs: A Practical Comparison</a></strong> - Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.</p><div><hr></div><h2>Before You Go</h2><h4>&#128269; Explore More on CodeCut</h4><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul><h4>&#128172; Rate Your Experience</h4><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item><item><title><![CDATA[Build AI Agent Memory with Graphiti Knowledge Graphs]]></title><description><![CDATA[Plus stream million-row CSVs with Polars]]></description><link>https://newsletter.codecut.ai/p/build-ai-agent-memory-with-graphiti</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/build-ai-agent-memory-with-graphiti</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Wed, 04 Feb 2026 17:02:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eRSC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Build AI Agent Memory with Graphiti Knowledge Graphs</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eRSC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eRSC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 424w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 848w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 1272w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eRSC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png" width="659" height="703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:703,&quot;width&quot;:659,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Build AI Agent Memory with Graphiti Knowledge Graphs&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="Code example: Build AI Agent Memory with Graphiti Knowledge Graphs" title="Code example: Build AI Agent Memory with Graphiti Knowledge Graphs" srcset="https://substackcdn.com/image/fetch/$s_!eRSC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 424w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 848w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.png 1272w, https://substackcdn.com/image/fetch/$s_!eRSC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec928498-5c82-478c-83eb-9ef58b0d1b9a_659x703.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 role="img" 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><title></title><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>Problem</h4><p>Traditional RAG pipelines rely on batch processing and static document summaries. When data changes, you re-embed, re-index, and wait.</p><p>That delay means your agent is always working with stale information, unable to track how facts evolve over time.</p><h4>Solution</h4><p>Graphiti is an open-source Python framework that builds knowledge graphs with real-time, incremental updates. This lets you add new information at any time without reprocessing your entire dataset.</p><p>Key features:</p><ul><li><p>Track when facts happened and when they were recorded, so you always know what&#8217;s current</p></li><li><p>Search by meaning, keywords, or relationships in one query</p></li><li><p>Get the most relevant results for a specific person, company, or entity</p></li><li><p>Works with Neo4j, FalkorDB, and Kuzu as the graph backend</p></li></ul><blockquote><p>&#11088; <a href="https://github.com/getzep/graphiti">View GitHub</a></p></blockquote><div><hr></div><h3>Polars sink_csv: Stream Million-Row Exports Without Memory Spikes</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pdff!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pdff!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 424w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 848w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 1272w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pdff!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png" width="734" height="580" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:734,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Polars sink_csv: Stream Million-Row Exports Without Memory Spikes&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="Code example: Polars sink_csv: Stream Million-Row Exports Without Memory Spikes" title="Code example: Polars sink_csv: Stream Million-Row Exports Without Memory Spikes" srcset="https://substackcdn.com/image/fetch/$s_!Pdff!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 424w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 848w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.png 1272w, https://substackcdn.com/image/fetch/$s_!Pdff!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed947c55-0400-4a5c-ae78-4cf2caa5d595_734x580.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 role="img" 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><title></title><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>Problem</h4><p>Writing large DataFrames to CSV is memory-intensive because the entire dataset is serialized in memory before being written to disk.</p><h4>Solution</h4><p>Polars&#8217; streaming CSV sink avoids this by writing data in chunks rather than all at once.</p><p>Key benefits:</p><ul><li><p>Eliminate out-of-memory errors on large exports</p></li><li><p>Write multi-million row DataFrames with minimal RAM</p></li><li><p>Support for cloud storage destinations (S3, GCS, Azure)</p></li></ul><p>Switch from write_csv to sink_csv on a lazy frame to enable streaming.</p><blockquote><p>&#128214; <a href="https://codecut.ai/pandas-vs-polars-vs-duckdb-comparison/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=wednesday_campaign">View Full Article</a> | &#11088; <a href="https://github.com/pola-rs/polars">View GitHub</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/FlowiseAI/Flowise">Flowise</a></strong> <em>[AI Agents]</em> - Low-code platform for building AI agents and workflows visually with drag-and-drop components</p><p><strong><a href="https://github.com/cleanlab/cleanlab">cleanlab</a></strong> <em>[Machine Learning]</em> - Data-centric AI package that automatically detects data quality issues, label errors, and outliers in ML datasets</p><p><strong><a href="https://github.com/OpenBB-finance/OpenBB">OpenBB</a></strong> <em>[Finance]</em> - Open-source financial data platform for analysts, quants, and AI agents with dozens of data integrations</p><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/structured-llm-outputs-tools-comparison/">5 Python Tools for Structured LLM Outputs: A Practical Comparison</a></strong> - Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.</p><div><hr></div><h2>Before You Go</h2><h4>&#128269; Explore More on CodeCut</h4><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=wednesday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=wednesday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul><h4>&#128172; Rate Your Experience</h4><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item><item><title><![CDATA[MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic]]></title><description><![CDATA[Plus version prompts like Git commits]]></description><link>https://newsletter.codecut.ai/p/mlflow-built-in-scorers-for-llm-evaluation</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/mlflow-built-in-scorers-for-llm-evaluation</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Mon, 02 Feb 2026 17:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Uxqw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uxqw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uxqw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 424w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 848w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 1272w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uxqw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png" width="550" height="745" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cc50632-814a-461e-a6db-384f56288ec1_550x745.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:745,&quot;width&quot;:550,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic&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="Code example: MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic" title="Code example: MLflow: Built-in Scorers for LLM Evaluation Without Custom Logic" srcset="https://substackcdn.com/image/fetch/$s_!Uxqw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 424w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 848w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.png 1272w, https://substackcdn.com/image/fetch/$s_!Uxqw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cc50632-814a-461e-a6db-384f56288ec1_550x745.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 role="img" 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><title></title><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>Problem</h4><p>Evaluating LLM outputs for correctness, relevance, and guideline adherence requires writing custom evaluation logic for each criterion.</p><p>This creates repetitive boilerplate code and slows down your iteration cycle.</p><h4>Solution</h4><p>MLflow provides pre-built scorers for common evaluation patterns like correctness and guideline adherence.</p><p>Key benefits:</p><ul><li><p>Pre-built scorers for correctness, relevance, and safety checks</p></li><li><p>Simple decorator syntax for custom metrics</p></li><li><p>Automatic tracking of scores, rationales, and metadata in MLflow</p></li><li><p>Combine multiple scorers in a single evaluation run</p></li></ul><p>Integrate with existing MLflow workflows without additional setup.</p><blockquote><p>&#129514; <a href="https://bit.ly/4t9YsVN">Run code</a> | &#11088; <a href="https://github.com/mlflow/mlflow">View GitHub</a></p></blockquote><div><hr></div><h2>&#128260; Worth Revisiting</h2><h3>Swap AI Prompts Instantly with MLflow Prompt Registry</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J2q2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J2q2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 424w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 848w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 1272w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J2q2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png" width="634" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:634,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Swap AI Prompts Instantly with MLflow Prompt Registry&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="Code example: Swap AI Prompts Instantly with MLflow Prompt Registry" title="Code example: Swap AI Prompts Instantly with MLflow Prompt Registry" srcset="https://substackcdn.com/image/fetch/$s_!J2q2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 424w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 848w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.png 1272w, https://substackcdn.com/image/fetch/$s_!J2q2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73e5d5-3d8e-462b-abdb-f1f46a49b0a5_634x787.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 role="img" 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><title></title><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>Problem</h4><p>Finding the right prompt often takes experimentation: tweaking wording, adjusting tone, testing different instructions.</p><p>But with prompts hardcoded in your codebase, each test requires a code change and redeployment.</p><h4>Solution</h4><p>MLflow Prompt Registry solves this with aliases. Your code references an alias like &#8220;production&#8221; instead of a version number, so you can swap versions without changing it.</p><p>Here&#8217;s how it works:</p><ul><li><p>Every prompt edit creates a new immutable version with a commit message</p></li><li><p>Register prompts once, then assign aliases to specific versions</p></li><li><p>Deploy to different environments by creating aliases like &#8220;staging&#8221; and &#8220;production&#8221;</p></li><li><p>Track full version history with metadata and tags for each prompt</p></li></ul><blockquote><p>&#11088; <a href="https://github.com/mlflow/mlflow">View GitHub</a></p></blockquote><div><hr></div><h2>&#128226; ANNOUNCEMENTS</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Iz8q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Iz8q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 424w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 848w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 1272w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Iz8q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png" width="1456" height="949" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:949,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Introducing CodeCut Premium&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="Introducing CodeCut Premium" title="Introducing CodeCut Premium" srcset="https://substackcdn.com/image/fetch/$s_!Iz8q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 424w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 848w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.png 1272w, https://substackcdn.com/image/fetch/$s_!Iz8q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80788b4d-cf28-41fe-bcc2-09c1cbc768a6_1600x1043.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 role="img" 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><title></title><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>Introducing CodeCut Premium</h3><p>I put a lot of effort into making every CodeCut blog clear, practical, and example-driven. Still, there&#8217;s a gap between reading code and actually writing it yourself.</p><p>CodeCut Premium bridges that gap with interactive courses that let you:</p><ul><li><p>Execute code directly in your browser</p></li><li><p>Skip installation and environment setup</p></li><li><p>Test your understanding with built-in quizzes</p></li><li><p>Learn faster than sitting through long video courses</p></li></ul><p>I plan to add new courses regularly, with a focus on quality and depth. The catalog is still growing, and Founding Members get early access plus exclusive perks as it expands.</p><p>Founding Members receive lifetime $12/month pricing, full access to all courses, and early influence on future content.</p><p>Founding pricing ends March 31, 2026.</p><blockquote><p>&#128279; <a href="https://codecut.ai/codecut-premium/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=monday_campaign">Learn More</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/quantopian/zipline">zipline</a></strong> <em>[Finance]</em> - Pythonic algorithmic trading library with event-driven backtesting for building and testing trading strategies</p><p><strong><a href="https://github.com/outlines-dev/outlines">outlines</a></strong> <em>[LLM]</em> - Structured text generation library that constrains LLM outputs to follow specific schemas, formats, and data types</p><p><strong><a href="https://github.com/getsentry/responses">responses</a></strong> <em>[Testing]</em> - Utility library for mocking out the Python Requests library in tests with simple decorators and context managers</p><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/structured-llm-outputs-tools-comparison/">5 Python Tools for Structured LLM Outputs: A Practical Comparison</a></strong> - Compare 5 Python tools for structured LLM outputs. Learn when to use Instructor, PydanticAI, LangChain, Outlines, or Guidance for JSON extraction.</p><div><hr></div><h2>Before You Go</h2><h4>&#128269; Explore More on CodeCut</h4><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=monday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=monday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul><h4>&#128172; Rate Your Experience</h4><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item><item><title><![CDATA[Build Structured LLM Outputs with Guidance Constraints]]></title><description><![CDATA[Plus the end of SettingWithCopyWarning in pandas 3.0]]></description><link>https://newsletter.codecut.ai/p/build-structured-llm-outputs-with</link><guid isPermaLink="false">https://newsletter.codecut.ai/p/build-structured-llm-outputs-with</guid><dc:creator><![CDATA[CodeCut]]></dc:creator><pubDate>Fri, 30 Jan 2026 17:02:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/64cc93a1-04be-4d90-9575-740c04feecd7_634x640.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Grab your coffee. Here are this week&#8217;s highlights.</p><div><hr></div><h2>&#129309; COLLABORATION</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8fcQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8fcQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 424w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 848w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 1272w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8fcQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;What Data Engineers Really Think About Airflow (5.8K Surveyed)&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="What Data Engineers Really Think About Airflow (5.8K Surveyed)" title="What Data Engineers Really Think About Airflow (5.8K Surveyed)" srcset="https://substackcdn.com/image/fetch/$s_!8fcQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 424w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 848w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.png 1272w, https://substackcdn.com/image/fetch/$s_!8fcQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cef2f63-2891-42c7-bcd0-752fac41bf8f_1600x840.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 role="img" 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><title></title><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>What Data Engineers Really Think About Airflow (5.8K Surveyed)</h3><p>Astronomer analyzed 5.8k+ responses from data engineers on how they are navigating Airflow today and the findings might surprise you.</p><p>You&#8217;ll learn:</p><ul><li><p>How early adopters are using Airflow 3 features in production</p></li><li><p>Which teams are bringing AI into production and what&#8217;s holding others back</p></li><li><p>94% believe that Airflow is beneficial to their career</p></li></ul><blockquote><p>&#128279; <a href="https://www.astronomer.io/airflow/state-of-airflow/?utm_campaign=2025q4-ebook-tf-state-of-airflow-2026&amp;utm_medium=paidmedia&amp;utm_source=codecut">Download the State of Airflow 2026 Report</a></p></blockquote><div><hr></div><h2>&#128197; Today&#8217;s Picks</h2><h3>Build Structured LLM Outputs with Guidance Constraints</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UE1e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UE1e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 424w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 848w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 1272w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UE1e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png" width="634" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:634,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: Build Structured LLM Outputs with Guidance Constraints&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="Code example: Build Structured LLM Outputs with Guidance Constraints" title="Code example: Build Structured LLM Outputs with Guidance Constraints" srcset="https://substackcdn.com/image/fetch/$s_!UE1e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 424w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 848w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.png 1272w, https://substackcdn.com/image/fetch/$s_!UE1e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc490c456-96a4-42ba-9124-c19fe1d1338c_634x640.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 role="img" 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><title></title><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>Problem</h4><p>Tools like Instructor and PydanticAI validate outputs after generation. If validation fails, they send the error back to the LLM and retry.</p><p>Each retry means paying for tokens that didn&#8217;t produce usable output.</p><h4>Solution</h4><p>Guidance works differently. It constrains tokens during generation, so invalid outputs can&#8217;t be produced in the first place.</p><p>Key capabilities:</p><ul><li><p>Constrained outputs via regex patterns and selection functions</p></li><li><p>Python control flow (if/else, loops) during generation</p></li><li><p>JSON generation with Pydantic schema validation</p></li></ul><blockquote><p>&#128214; <a href="https://codecut.ai/structured-llm-outputs-tools-comparison/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4rmZU5J">Run code</a> | &#11088; <a href="https://github.com/guidance-ai/guidance">View GitHub</a></p></blockquote><div><hr></div><h3>pandas 3.0: The End of SettingWithCopyWarning</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TXjO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TXjO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 424w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 848w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 1272w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TXjO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png" width="679" height="621" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:621,&quot;width&quot;:679,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Code example: pandas 3.0: The End of SettingWithCopyWarning&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="Code example: pandas 3.0: The End of SettingWithCopyWarning" title="Code example: pandas 3.0: The End of SettingWithCopyWarning" srcset="https://substackcdn.com/image/fetch/$s_!TXjO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 424w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 848w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.png 1272w, https://substackcdn.com/image/fetch/$s_!TXjO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba478576-8af5-4c9d-b8d2-5472db2dd09b_679x621.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 role="img" 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><title></title><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>Problem</h4><p>When you filter a DataFrame and modify the result, you expect the original to stay unchanged.</p><p>But sometimes pandas modified your original data anyway, triggering the <code>SettingWithCopyWarning</code>.</p><h4>Solution</h4><p>pandas 3.0 fixes this. Filtering now always creates a separate copy, so modifying the result never affects your original data.</p><p>Upgrade to pandas 3.0 with &#8220;pip install -U pandas&#8221;.</p><blockquote><p>&#128214; <a href="https://codecut.ai/pandas-3-whats-new/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">View Full Article</a> | &#129514; <a href="https://bit.ly/4bYrIc0">Run code</a> | &#11088; <a href="https://github.com/pandas-dev/pandas">View GitHub</a></p></blockquote><div><hr></div><h2>&#9749;&#65039; Weekly Finds</h2><p><strong><a href="https://github.com/emirozer/fake2db">fake2db</a></strong> <em>[Data]</em> - Create custom test databases populated with fake data across SQLite, MySQL, PostgreSQL, MongoDB, Redis, and CouchDB</p><p><strong><a href="https://github.com/PythonOT/POT">POT</a></strong> <em>[ML]</em> - Python Optimal Transport library providing solvers for optimization problems in signal processing, image processing, and machine learning</p><p><strong><a href="https://github.com/Kanaries/graphic-walker">graphic-walker</a></strong> <em>[Data Viz]</em> - Open-source Tableau alternative for data scientists to analyze data and visualize patterns with drag-and-drop operations</p><div><hr></div><h2>&#128218; Latest Deep Dives</h2><p><strong><a href="https://codecut.ai/scrapegraphai-web-scraping-natural-language/">From CSS Selectors to Natural Language: Web Scraping with ScrapeGraphAI</a></strong> - Web scraping without selector maintenance. ScrapeGraphAI uses LLMs to extract data from any site using plain English prompts and Pydantic schemas.</p><div><hr></div><h2>Before You Go</h2><h4>&#128269; Explore More on CodeCut</h4><ul><li><p><a href="https://codecut.ai/tool-selector/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">Tool Selector</a> - Discover 70+ Python tools for AI and data science</p></li><li><p><a href="https://codecut.ai/production-ready-data-science/?utm_source=Substack&amp;utm_medium=email&amp;utm_campaign=friday_campaign">Production Ready Data Science</a> - A practical book for taking projects from prototype to production</p></li></ul><h4>&#128172; Rate Your Experience</h4><p>How would you rate your newsletter experience? <a href="https://r7yuob192zv.typeform.com/to/VODwGYMW">Share your feedback &#8594;</a></p>]]></content:encoded></item></channel></rss>