<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://www.yellowduck.be/pretty-atom-feed-v3.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="https://www.yellowduck.be" rel="alternate"/>
  <link href="https://www.yellowduck.be/posts/feed" rel="self"/>
  <author>
    <name>Pieter Claerhout</name>
    <email>pieter@yellowduck.be</email>
  </author>
  <id>https://www.yellowduck.be/posts/feed</id>
  <title>🐥 YellowDuck.be</title>
  <updated>2026-09-29T13:00:00Z</updated>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/feature-flags-without-a-saas-how-onrotation-gates-features" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;OnRotation is streamlining feature deployment without traditional SaaS solutions. By leveraging &lt;code&gt;Elixir&lt;/code&gt; and &lt;code&gt;Phoenix&lt;/code&gt;, the team implemented a customized feature flag system using a simple table and a function, rather than integrating a more complex library like &lt;code&gt;FunWithFlags&lt;/code&gt;. With a small user base and known testers, the solution simplifies control by allowing specific features to be turned on or off for individuals without requiring a full redeployment of the app. Each flag consists of a unique name, description, and a list of allowed emails, making it both straightforward and manageable. The author emphasizes that this approach fits naturally into the context and architecture of the app, showcasing how a small team can effectively meet their needs without overcomplicating the system.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://nickstalter.com/onrotation-feature-flags&quot;&gt;Continue reading on &lt;strong&gt;nickstalter.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/phoenix&quot;&gt;#phoenix&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-29T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/feature-flags-without-a-saas-how-onrotation-gates-features</id>
    <title>🔗 Feature flags without a SaaS: How OnRotation gates features</title>
    <updated>2026-09-29T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/do-we-still-need-build-tools" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;How necessary are build tools for frontend development in 2026? The article raises crucial questions about their relevance, particularly for CSS and JavaScript. It examines the effectiveness of tools like Autoprefixer, esbuild, and Lightning CSS for managing vendor prefixes and syntax lowering. While some CSS features have become standardized, tools still provide value in combining files and minifying code. The discussion extends to JavaScript, where module bundlers like Webpack and esbuild are highlighted for their performance advantages, despite potential downsides in caching. With HTTP/2 and HTTP/3 changing the landscape, the necessity of bundlers is increasingly debatable. Ultimately, the article argues that build tools still play an essential role, although there are viable no-build alternatives for smaller projects or specific cases.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://olliewilliams.xyz/blog/no-build/&quot;&gt;Continue reading on &lt;strong&gt;olliewilliams.xyz&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/javascript&quot;&gt;#javascript&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/frontend&quot;&gt;#frontend&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/css&quot;&gt;#css&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-29T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/do-we-still-need-build-tools</id>
    <title>🔗 Do we still need build tools?</title>
    <updated>2026-09-29T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/postgresql-for-everything" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Contrary to popular belief, the answer to everything is not 42—it’s PostgreSQL. This article by Dr. Raphael A. Bauer outlines the power and versatility of PostgreSQL, showcasing its use throughout his two-decade career starting in 2003. He highlights its strengths such as being rock-solid, easy to install and scale, and simplifying IT setups by effectively replacing multiple systems. PostgreSQL&apos;s features allow it to function not only as a traditional database but also as a full-text search engine, document storage, and much more. Dr. Bauer discusses various plugins like TimescaleDB and pgvector that extend PostgreSQL’s capabilities, making it suitable for high volume web analytics, AI workflows, and even non-persistent caching. By examining these advantages, he advocates for considering PostgreSQL before looking for other technologies to address new requirements or challenges.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.raphaelbauer.com/posts/postgresql-everything/#postgresql-replaces-solr-and-elastic-full-text-search&quot;&gt;Continue reading on &lt;strong&gt;www.raphaelbauer.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/postgresql&quot;&gt;#postgresql&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-28T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/postgresql-for-everything</id>
    <title>🔗 PostgreSQL for everything</title>
    <updated>2026-09-28T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/bun-1-4-rust-rewrite-is-not-looking-good" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Bun, initially a promising project, has faced turmoil during its transition to a Rust-based architecture. Over the past three months, communication has deteriorated into vague promises about version 1.4, with repeated delays frustrating users. Citing over 5,000 open pull requests and heavy reliance on AI, the article highlights concerns about the coding practices adopted during this rewrite. Jarred&apos;s initial capabilities drew admiration, but scrutiny has grown as the codebase has shown signs of instability. The expectation that AI could seamlessly upgrade Bun&apos;s architecture may be misplaced, raising important questions about the future of AI in software development. As users await the next stable release, the sentiment is clear: perception can shift quickly, and trust can erode even faster.&lt;/p&gt;
&lt;p&gt;Based on interviews, many believe that the decision to abandon Zig may have been more about promoting AI capabilities than meeting user needs. With no release in sight, the once-solid foundation of Bun feels precarious.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://tipiirai.com/writing/bun-rust-rewrite-worries&quot;&gt;Continue reading on &lt;strong&gt;tipiirai.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/rust&quot;&gt;#rust&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-28T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/bun-1-4-rust-rewrite-is-not-looking-good</id>
    <title>🔗 Bun 1.4 Rust rewrite is not looking good</title>
    <updated>2026-09-28T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/how-ai-text-watermarking-works-a-visual-guide" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;A watermark in plain text may seem impossible, as text lacks pixels and metadata. However, Google has implemented text watermarking from Gemini, starting in 2024, with new Claude models marking text invisibly and resiliently as of August 2026. These marks reside in the choices between words, not within the characters themselves.&lt;/p&gt;
&lt;p&gt;The process involves small word choices made by a model that rolls weighted dice among acceptable options. Each choice can secretly lean toward certain words using a key, which makes counting colored choices easier for detection. The text can still read normally, but marked sections show an imbalance when re-evaluated with the correct key. Even editing alters the marks, as they depend on unbroken runs of original text.&lt;/p&gt;
&lt;p&gt;Detection remains private and needs the provider’s key, contrasting with unreliable AI style detectors. This method can indicate whether a text has been processed without confirming authorship. Overall, it highlights the ongoing battle in maintaining and detecting AI-generated information.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://declaude.org/watermarking/&quot;&gt;Continue reading on &lt;strong&gt;declaude.org&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-28T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/how-ai-text-watermarking-works-a-visual-guide</id>
    <title>🔗 How AI text watermarking works: a visual guide</title>
    <updated>2026-09-28T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/id-design-and-primary-keys-pt-1" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Is your database design stunted by traditional approaches? Alexey Makhotkin delves into a refreshing take on primary keys and ID design. He highlights the importance of aligning primary key selection with business requirements rather than sticking to conventional database norms. Through engaging examples, he introduces the concept of external IDs and anchor IDs, demonstrating how they relate to database entities. Makhotkin also emphasizes the significance of immutable anchor IDs for unique identification, plus the nuances of using external IDs effectively, even those from outside systems. By analyzing a minimal content management scenario, he shows the logical modeling with integer primary keys and uniqueness constraints, setting a strong foundation for understanding primary keys in database design. Part two promises to further explore the complexities of composite primary keys, making this a must-read for database enthusiasts.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://anchorsandlinks.com/posts/primary-keys/&quot;&gt;Continue reading on &lt;strong&gt;anchorsandlinks.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;</content>
    <published>2026-09-27T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/id-design-and-primary-keys-pt-1</id>
    <title>🔗 ID design and primary keys, pt. 1</title>
    <updated>2026-09-27T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/elixirs-genstage-demand-a-visual-explainer" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;GenStage is a powerful Elixir abstraction that manages data processing through a simple yet effective concept: demand. As articulated by Andrea Leopardi, the article delves into how GenStage enables efficient data flow between producers and consumers while tackling a common issue in concurrent systems—the problem of unbounded queues. The discussion begins with a real-world example involving message consumption from a queue, illustrating how demand controls the rate at which producers send data. By employing a simple demand structure, consumers can regulate their intake and prevent overwhelming the system. The examination highlights how demand helps manage resources and explores important parameters like &lt;code&gt;max_demand&lt;/code&gt; and &lt;code&gt;min_demand&lt;/code&gt;, which dictate the rhythm of event processing. With clear explanations and practical examples, the piece offers vital insights for those looking to harness the full potential of GenStage in their applications.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://andrealeopardi.com/posts/genstage-demand-visualized/&quot;&gt;Continue reading on &lt;strong&gt;andrealeopardi.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-27T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/elixirs-genstage-demand-a-visual-explainer</id>
    <title>🔗 Elixir&apos;s GenStage demand (a visual explainer)</title>
    <updated>2026-09-27T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/the-elixir-hiring-paradox-notes-from-elixirconf-eu-2026" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Three common hiring mistakes plague companies looking for Elixir engineers. Arjun Gillard shared insights from his lightning talk at ElixirConf EU 2026 in Málaga, emphasizing that successful hiring requires a clear definition of success in the first 90 days. He noted that recruiters often fail to recognize that volume of applicants doesn&apos;t equal quality, and that evaluating candidates based solely on years of experience in Elixir technologies like Phoenix and LiveView misses the more crucial aspect: an applicant&apos;s reasoning skills. With Elixir&apos;s talent pool being tight-knit and relatively small in Europe, word travels fast when companies implement poor hiring processes. Gillard&apos;s observations highlight the importance of thoughtful, community-driven recruitment strategies that engage with candidates&apos; conceptual understanding rather than their memorized skills in the stack.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://agtalent.co.uk/the-elixir-hiring-paradox-notes-from-elixirconf-eu-2026/&quot;&gt;Continue reading on &lt;strong&gt;agtalent.co.uk&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/announcement&quot;&gt;#announcement&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-27T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/the-elixir-hiring-paradox-notes-from-elixirconf-eu-2026</id>
    <title>🔗 The Elixir hiring paradox: notes from ElixirConf EU 2026</title>
    <updated>2026-09-27T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/japan-tried-to-build-an-operating-system-for-the-entire-world-then-the-us-government-intervened" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;There&apos;s an alternate history of computing where Windows wasn&apos;t the dominant OS. This article reveals how Japan&apos;s TRON project aimed to replace traditional file systems with a hypermedia document model, but U.S. government intervention labeled it a trade barrier in 1989. Designed by Ken Sakamura at the University of Tokyo in 1984, TRON included sub-architectures like BTRON for personal computing and ITRON for embedded systems. Despite the ambitious goal of integrating Japan&apos;s digital infrastructure, BTRON was ultimately sidelined. Its design features, like a unique document-centric interface and a character encoding system capable of supporting over a million characters, were years ahead of their time. ITRON, however, succeeded in becoming widely used in embedded systems, marking a significant yet often overlooked chapter in technology history and highlighting the impact of global market dynamics on innovation.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.xda-developers.com/japan-tried-build-operating-system-entire-world-us-government-intervened/&quot;&gt;Continue reading on &lt;strong&gt;www.xda-developers.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-26T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/japan-tried-to-build-an-operating-system-for-the-entire-world-then-the-us-government-intervened</id>
    <title>🔗 Japan tried to build an operating system for the entire world, then the US government intervened</title>
    <updated>2026-09-26T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/a-struct-is-just-a-map-with-rules" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Elixir&apos;s structs are more than just advanced maps; they enforce rules that prevent typographical errors. When modeling data, like a user profile, using a map can lead to subtle bugs if a key is misspelled — Elixir won&apos;t catch it. Bruce Tate points out that structs enable you to define specific keys within a module, allowing the compiler to enforce structure and prevent mistakes. Each struct contains an extra &lt;code&gt;__struct__&lt;/code&gt; key that links it to the module&apos;s definitions, ensuring the correct framework is maintained. By contrasting maps and structs, Tate emphasizes that maps are useful for dynamic and flexible data, while structs are designed for fixed data types. This nuanced distinction helps developers make informed choices when structuring Elixir applications, aligning with best practices seen within Elixir&apos;s own modules. Using structs can significantly improve code reliability and clarity.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://grox.io/blog/46-a-struct-is-just-a-map-with-rules/&quot;&gt;Continue reading on &lt;strong&gt;grox.io&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-26T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/a-struct-is-just-a-map-with-rules</id>
    <title>🔗 A struct is just a map with rules</title>
    <updated>2026-09-26T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/the-reality-of-being-a-cto" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What does being a CTO really entail? James Stanier reveals that the role is often misunderstood. It ranges from a hands-on founder writing code to a board-level executive. The unique challenges include balancing technology with business outcomes and navigating high-stakes conversations beyond engineering. Stanier emphasizes that a successful CTO must bridge the gap between technical prowess and executive responsibility. He shares insights on managing time between team collaboration and conversations with other functional leaders, which is crucial for operating effectively. The evolving nature of AI introduces additional complexities, as it shifts hiring practices and expectations. Ultimately, being a CTO requires strong financial acumen and the ability to prioritize organizational strategy over just technical excellence.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://leaddev.com/leadership/the-reality-of-being-a-cto&quot;&gt;Continue reading on &lt;strong&gt;leaddev.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-26T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/the-reality-of-being-a-cto</id>
    <title>🔗 The reality of being a CTO</title>
    <updated>2026-09-26T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/full-text-search-at-contentful-just-got-faster-why-its-important-and-how-we-did-it" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Full-text search in Contentful just got faster — we improved the median response time by 35%. This is the story of how we did it and why it&apos;s important.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.contentful.com/blog/contentful-faster-full-text-search/&quot;&gt;Continue reading on &lt;strong&gt;www.contentful.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-25T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/full-text-search-at-contentful-just-got-faster-why-its-important-and-how-we-did-it</id>
    <title>🔗 Full-text search at Contentful just got faster: Why it’s important and how we did it</title>
    <updated>2026-09-25T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/re-linking-patchwork-with-sashiko" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;On July 14, 2026, Linus Torvalds expressed strong opinions about the role of AI in the Linux kernel development process. He countered the notion of an anti-AI stance within the community, making it clear that AI tools, including LLMs, can enhance the work of maintainers rather than hinder it. Torvalds emphasized that dismissing AI outright fails to recognize its utility and that the kernel community prioritizes technological merit above all. He noted that while AI isn&apos;t flawless, its capabilities have reached a level where it is undeniably beneficial to the project. He urged contributors to embrace these tools and focus on how they can assist rather than complicate development workflows. Torvalds remains committed to a technology-driven approach for the kernel, rejecting any viewpoints based purely on ideological objections.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/&quot;&gt;Continue reading on &lt;strong&gt;lore.kernel.org&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/linux&quot;&gt;#linux&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-25T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/re-linking-patchwork-with-sashiko</id>
    <title>🔗 Re: Linking Patchwork with Sashiko?</title>
    <updated>2026-09-25T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/go-1-27-release-notes" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Go 1.27 has arrived with significant toolchain, runtime, and library updates. It introduces support for generic methods, allowing methods to declare their own type parameters, promoting better data type encapsulation. The &lt;code&gt;math/rand/v2&lt;/code&gt; module now has a generic method signature. Additionally, the release enhances package tools like response file parsing for smoother builds, while deprecating support for &lt;code&gt;bzr&lt;/code&gt; version control. In terms of testing and documentation, &lt;code&gt;go test&lt;/code&gt; now performs a standard library version check by default, and &lt;code&gt;go doc&lt;/code&gt; introduces new syntax for package documentation. It also brings improvements to memory allocation processes and introduces new profiling options, specifically for identifying leaked goroutines. Notably, the addition of new libraries, including &lt;code&gt;encoding/json/v2&lt;/code&gt; and &lt;code&gt;crypto/mldsa&lt;/code&gt;, further enriches the Go ecosystem with modernized functionalities. With Go 1.27, programmers can expect an overall improved experience while maintaining compatibility with previous versions.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://go.dev/doc/go1.27&quot;&gt;Continue reading on &lt;strong&gt;go.dev&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/golang&quot;&gt;#golang&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/announcement&quot;&gt;#announcement&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-25T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/go-1-27-release-notes</id>
    <title>🔗 Go 1.27 release notes</title>
    <updated>2026-09-25T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/how-instacart-built-a-modern-search-infrastructure-on-postgres" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;In a previous blog post &lt;a href=&quot;https://tech.instacart.com/optimizing-search-relevance-at-instacart-using-hybrid-retrieval-88cb579b959c&quot;&gt;“Improving search at Instacart using hybrid recall”&lt;/a&gt;, we shared our progress on adaptively combining traditional full text search with embedding-based retrieval. Embarking on this journey required rethinking our search infrastructure to support hybrid recall while ensuring scalability and reliability. In this blog post, we will dive deeper into the architecture and engineering efforts that made this possible and lessons learned along the way.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://tech.instacart.com/how-instacart-built-a-modern-search-infrastructure-on-postgres-c528fa601d54&quot;&gt;Continue reading on &lt;strong&gt;tech.instacart.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/postgresql&quot;&gt;#postgresql&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-24T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/how-instacart-built-a-modern-search-infrastructure-on-postgres</id>
    <title>🔗 How Instacart built a modern search infrastructure on PostgreSQL</title>
    <updated>2026-09-24T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-5-supervisor-from-scratch" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;In the latest installment of his series, the article breaks down how to create a supervisor from scratch in Elixir, emphasizing the concepts of process links and exit signals. The author illustrates the implementation of a manual supervisor managing two worker processes, highlighting its ability to restart failed workers without affecting healthy ones. The restart policy is simplified to focus only on abnormal exits, mimicking some of the mechanisms provided by OTP without using its built-in features. Through concrete examples, the piece clarifies how to track child processes and respond appropriately to crashes while maintaining the system&apos;s resilience. This hands-on approach aids in understanding distributed systems, making the complexities of supervision more approachable for Elixir developers.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/pckrishnadas88/building-distributed-systems-in-elixir-part-5-supervisor-from-scratch-32mh&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-24T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-5-supervisor-from-scratch</id>
    <title>🔗 Building distributed systems in Elixir: Part 5 — Supervisor from scratch</title>
    <updated>2026-09-24T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-4-process-linking" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;In this article, Krishnadaspc dives into the concept of process linking in Elixir, exploring how failure relationships affect processes. He explains that when a parent process and a worker process are linked, if one fails, the other can be impacted, which helps maintain system integrity. The piece showcases examples using &lt;code&gt;spawn_link/1&lt;/code&gt; and &lt;code&gt;Process.flag(:trap_exit, true)&lt;/code&gt; to illustrate how to create and manage linked processes. It elaborates on how abnormal exits propagate exit signals and how they differ from normal exits. Readers learn the importance of managing these relationships for building resilient distributed systems.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/pckrishnadas88/building-distributed-systems-in-elixir-part-4-process-linking-okb&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-24T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-4-process-linking</id>
    <title>🔗 Building distributed systems in Elixir: Part 4 — Process linking</title>
    <updated>2026-09-24T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-3-process-monitoring" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What happens when a process dies in a distributed Elixir application? Instead of polling to check if a worker is alive, Elixir provides an elegant solution through process monitoring. This article guides readers through building a process monitoring system using the &lt;code&gt;Process.monitor/1&lt;/code&gt; function. It highlights how to receive notifications about process terminations without relying on supervisors or GenServers. Through practical examples, it demonstrates how to handle both normal exits and crashes effectively, ensuring that processes can monitor each other’s lifecycles seamlessly. By leveraging Elixir’s message-passing model, the author emphasizes that failure detection can be integrated into the communication flow of distributed systems, laying the groundwork for more resilient application architectures.&lt;/p&gt;
&lt;p&gt;For real applications with multiple workers, it also outlines how to manage and track multiple processes using maps to correlate monitor references with worker identifiers. Ultimately, this part of the series sets the stage for exploring process links in the next installment.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/pckrishnadas88/building-distributed-systems-in-elixir-part-3-process-monitoring-5b5p&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-23T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-3-process-monitoring</id>
    <title>🔗 Building distributed systems in Elixir: Part 3 — Process monitoring</title>
    <updated>2026-09-23T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-1-building-a-stateful-process-in-elixir-without-genserver" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What if a counter could be a process instead of just a variable? This article introduces the concept of building stateful processes in Elixir without using &lt;code&gt;GenServer&lt;/code&gt;, focusing on the underlying message-passing model. The author, Krishnadas, details the creation of a simple counter process using only basic constructs like &lt;code&gt;spawn&lt;/code&gt;, &lt;code&gt;send&lt;/code&gt;, and &lt;code&gt;receive&lt;/code&gt;. The piece illustrates how multiple clients can interact with the counter while maintaining the integrity of its state. By allowing processes to own their state and communicate solely through messages, Elixir embraces a design that minimizes synchronization issues commonly seen in multithreaded environments. This foundational understanding prepares readers for the more complex topics of OTP and distributed messaging to be discussed in future articles.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/pckrishnadas88/building-a-stateful-process-in-elixir-without-genserver-58eb&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/pattern&quot;&gt;#pattern&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-23T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/building-distributed-systems-in-elixir-part-1-building-a-stateful-process-in-elixir-without-genserver</id>
    <title>🔗 Building distributed systems in Elixir: Part 1 - Building a stateful process in Elixir without GenServer</title>
    <updated>2026-09-23T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/your-application-is-already-an-mcp-server" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Today marks the release of &lt;code&gt;tempest/mcp&lt;/code&gt;, a new package designed for integrating AI clients with Tempest applications via the Model Context Protocol (MCP). This tool allows support agents to interact seamlessly with tasks like updating tickets and checking application states without needing to build separate applications. With &lt;code&gt;tempest/mcp&lt;/code&gt;, key functionalities are embedded within an application’s existing architecture, transforming classes into servers and simplifying backend intricacies related to dependencies and validations. The article describes a real-world use case: creating an AI-powered support desk using SQLite that facilitates various ticket operations. By leveraging Tempest&apos;s validation and dependency management, the package ensures that all interactions are smooth and consistent, paving the way for real-time integration of AI functionalities in applications. It&apos;s an exciting step towards enhancing how applications can leverage AI in operational workflows, even while still in its experimental phase.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://tempestphp.com/blog/tempest-mcp&quot;&gt;Continue reading on &lt;strong&gt;tempestphp.com&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/elixir&quot;&gt;#elixir&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-23T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/your-application-is-already-an-mcp-server</id>
    <title>🔗 Your application is already an MCP server</title>
    <updated>2026-09-23T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/your-ci-should-be-disposable" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Your CI should only schedule builds, not install dependencies. It promotes a disposable approach, allowing local runs with a simple command. The article highlights using tools like Docker, Nix, or Makefiles to keep the process streamlined. With a well-defined workflow like &lt;code&gt;steps: name: Do the thing run: nix build .#&lt;/code&gt;, developers can maintain control over their builds. This method ensures delivery continuity, even when services like GitHub Actions encounter issues, urging engineers to think about alternatives.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://oppi.li/posts/disposable_ci/&quot;&gt;Continue reading on &lt;strong&gt;oppi.li&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/tools&quot;&gt;#tools&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/docker&quot;&gt;#docker&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-22T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/your-ci-should-be-disposable</id>
    <title>🔗 Your CI should be disposable</title>
    <updated>2026-09-22T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/ten-books-that-shaped-how-i-think" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;What foundational texts have fundamentally influenced an engineer&apos;s mindset? This article highlights ten impactful books, each shaping a crucial aspect of thinking in engineering and beyond. From John Ousterhout&apos;s &lt;em&gt;A Philosophy of Software Design&lt;/em&gt;, which emphasizes hiding complexity through deep modules, to Joseph Weizenbaum&apos;s &lt;em&gt;Computer Power and Human Reason&lt;/em&gt;, which critiques reliance on technology, these selections serve as a guide for bridging theory and practice. Readers will find valuable insights into systems thinking, design principles, and the communications challenges of software development. The author&apos;s personal connection to these texts makes them compelling reading for anyone looking to refine their approach to engineering and design.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.birkey.co/2026-05-18-ten-books-that-shaped-how-i-think.html&quot;&gt;Continue reading on &lt;strong&gt;www.birkey.co&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-22T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/ten-books-that-shaped-how-i-think</id>
    <title>🔗 Ten books that shaped how I think</title>
    <updated>2026-09-22T13:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/the-case-for-tri-state-dark-mode-toggles" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Adding a dark mode toggle often leads many developers to implement a simple binary switch. However, the article argues that this approach is flawed for user experience. A tri-state control—allowing options for system, light, and dark modes—provides clearer intent and avoids confusion. The author references a experience where he challenged existing conventions by polling users, which overwhelmingly favored the tri-state option. The drawbacks of two-state controls are highlighted, particularly when a user&apos;s OS automatically switches themes. By offering clarity over brevity, tri-state controls not only help users express their preferences more explicitly but also reduce unexpected changes in the interface. This article encourages developers to rethink how they approach dark mode toggles, emphasizing predictability and user intent.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.bram.us/2026/08/18/the-case-for-tri-state-dark-mode-toggles/&quot;&gt;Continue reading on &lt;strong&gt;www.bram.us&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/frontend&quot;&gt;#frontend&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/css&quot;&gt;#css&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-22T08:00:00Z</published>
    <id>https://www.yellowduck.be/posts/the-case-for-tri-state-dark-mode-toggles</id>
    <title>🔗 The case for tri-state dark mode toggles</title>
    <updated>2026-09-22T08:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/1-million-db-updates-3-days-200-lines-of-go-a-legacy-rescue-story" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;A legacy PHP application faced daily failures, causing delays in marketing campaigns. Instead of a complete rewrite, the team opted for a minimal intervention using Go and RabbitMQ. By decoupling the request lifecycle, they managed to process user updates asynchronously without overwhelming the database. The solution, implemented in just 200 lines of Go, led to zero failures over 18 months, demonstrating the power of simplicity and idempotency in rescue scenarios. This article details the challenges faced, the design choices made, and the significant outcomes achieved. It&apos;s a practical case study that underscores the need for adaptive, low-risk solutions in legacy systems.&lt;/p&gt;
&lt;pre class=&quot;lumis&quot;&gt;&lt;code class=&quot;language-go&quot; translate=&quot;no&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;1&quot;&gt;package main
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;2&quot;&gt;
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;3&quot;&gt;import (
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;4&quot;&gt; &quot;database/sql&quot;
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;5&quot;&gt; &quot;time&quot;
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;6&quot;&gt;)
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;7&quot;&gt;
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;8&quot;&gt;func processBatch(messages []StatusMessage) error {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;9&quot;&gt; // 1. Fixed batch size of 50,000 messages.
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;10&quot;&gt; batch := messages[:50000]
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;11&quot;&gt; // 2. Begin an atomic transaction. (ALL or NOTHING)
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;12&quot;&gt; tx, err := db.Begin()
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;13&quot;&gt; if err != nil {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;14&quot;&gt; return err
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;15&quot;&gt; }
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;16&quot;&gt; defer tx.Rollback()
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;17&quot;&gt; // 3. Process updates within the transaction.
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;18&quot;&gt; for _, msg := range batch {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;19&quot;&gt; _, err := tx.Exec(
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;20&quot;&gt; ` UPDATE users SET status = &amp;#39;processed&amp;#39; WHERE id = $1 AND status = &amp;#39;pending&amp;#39; `,
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;21&quot;&gt; msg.UserID)
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;22&quot;&gt; if err != nil {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;23&quot;&gt; return err
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;24&quot;&gt; }
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;25&quot;&gt; }
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;26&quot;&gt; // 4. Commit the batch atomically.
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;27&quot;&gt; if err := tx.Commit(); err != nil {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;28&quot;&gt; return err
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;29&quot;&gt; }
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;30&quot;&gt; // 5. Acknowledge messages to RabbitMQ ONLY after commit.
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;31&quot;&gt; for _, msg := range batch {
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;32&quot;&gt; msg.Ack()
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;33&quot;&gt; }
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;34&quot;&gt; // 6. Static Backpressure: Sleep for 2 seconds.
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;35&quot;&gt; time.Sleep(2 * time.Second)
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;36&quot;&gt; return nil
&lt;/div&gt;&lt;div class=&quot;l-line&quot; data-line=&quot;37&quot;&gt;}&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://dev.to/pckrishnadas88/async-processing-for-dashboard-clicks-batch-updates-in-go-6p8&quot;&gt;Continue reading on &lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/golang&quot;&gt;#golang&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/database&quot;&gt;#database&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/devops&quot;&gt;#devops&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-21T17:00:00Z</published>
    <id>https://www.yellowduck.be/posts/1-million-db-updates-3-days-200-lines-of-go-a-legacy-rescue-story</id>
    <title>🔗 1 million DB updates, 3 days, 200 lines of Go: A legacy rescue story</title>
    <updated>2026-09-21T17:00:00Z</updated>
  </entry>
  <entry>
    <author>
      <name>Pieter Claerhout</name>
      <email>pieter@yellowduck.be</email>
    </author>
    <link href="https://www.yellowduck.be/posts/the-agent-needs-identity-the-model-does-not" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;A support agent may need a customer&apos;s email address to perform a lookup, but importantly, the model does not require that information. This article delves into the challenges of maintaining this distinction throughout an agent&apos;s operations, especially as it starts calling tools. With a practical demonstration using a support agent built with Phoenix LiveView, OpenAI, and other tools, it explores how personal information can inadvertently escape through various application states and tool arguments. The author outlines strategies to protect identity relationships while allowing necessary data access for operations. By designing these safeguards, agents can operate effectively without exposing sensitive customer information to models. This ensures a balance between functionality and privacy, showcasing a modern architectural approach to identity management in applications.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://hfiguera.github.io/obscura/blog/the-agent-needs-identity-the-model-does-not/&quot;&gt;Continue reading on &lt;strong&gt;hfiguera.github.io&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;https://www.yellowduck.be/tags/reading-list&quot;&gt;#reading-list&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/development&quot;&gt;#development&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/best-practice&quot;&gt;#best-practice&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/ai&quot;&gt;#ai&lt;/a&gt; &lt;a href=&quot;https://www.yellowduck.be/tags/phoenix&quot;&gt;#phoenix&lt;/a&gt;&lt;/p&gt;</content>
    <published>2026-09-21T13:00:00Z</published>
    <id>https://www.yellowduck.be/posts/the-agent-needs-identity-the-model-does-not</id>
    <title>🔗 The agent needs identity. The model does not.</title>
    <updated>2026-09-21T13:00:00Z</updated>
  </entry>
</feed>