<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CodingCatDev</title>
    <description>The latest articles on DEV Community by CodingCatDev (codingcatdev).</description>
    <link>https://dev.to/codingcatdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1009%2F2fc50a89-ad8f-44bb-b003-58f17cefd425.png</url>
      <title>DEV Community: CodingCatDev</title>
      <link>https://dev.to/codingcatdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codingcatdev"/>
    <language>en</language>
    <item>
      <title>Sanity Knowledge Bases</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Sat, 17 Oct 2026 06:09:29 +0000</pubDate>
      <link>https://dev.to/codingcatdev/sanity-knowledge-bases-34o6</link>
      <guid>https://dev.to/codingcatdev/sanity-knowledge-bases-34o6</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/sanity-knowledge-bases" rel="noopener noreferrer"&gt;https://codingcat.dev/post/sanity-knowledge-bases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/jm5Vq60qYTk" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Beyond Naive Vector RAG: Building Verified Company Knowledge with Sanity Context and MCP
&lt;/h1&gt;

&lt;p&gt;Your AI agent should not have to settle a company policy dispute in the middle of answering a customer.&lt;/p&gt;

&lt;p&gt;Yet that is exactly what happens when company knowledge is scattered across datasets, documentation websites, and PDFs. A naive vector Retrieval-Augmented Generation (RAG) pipeline retrieves related chunks, but related does not necessarily mean current, authoritative, or consistent. If two chunks disagree, the language model inherits the problem.&lt;/p&gt;

&lt;p&gt;Hardcoding Markdown into a system prompt has a different failure mode. It works nicely for a prototype, then goes stale as soon as your content team publishes an update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity Context Knowledge Bases move reconciliation ahead of the conversation.&lt;/strong&gt; They compile multiple sources into a purpose-driven topic outline and cited Markdown entries, flag conflicting claims for review, and serve the resulting company knowledge through Sanity Context MCP.&lt;/p&gt;

&lt;p&gt;We will break down that architecture, then build a multi-source Knowledge Base for Agent AJ on CodingCat.dev, resolve an actual build issue, and connect it to an existing MCP endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compile datasets, websites, and files into a purpose-driven outline with cited Markdown entries.&lt;/li&gt;
&lt;li&gt;Resolve conflicting claims during builds and preserve decisions as source-anchored standing instructions.&lt;/li&gt;
&lt;li&gt;Connect agents through read-only Context MCP using outline-guided entry retrieval.&lt;/li&gt;
&lt;li&gt;Keep approved knowledge stable while source changes move through a reviewable refresh workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Scattered Context and Static Prompts Fail
&lt;/h2&gt;

&lt;p&gt;Imagine an agent answering a returns question. Your Help Center says customers have 30 days. An older product page says 45 days. Both passages look relevant to a similarity search.&lt;/p&gt;

&lt;p&gt;A basic chunk-and-retrieve system can hand both passages to the model without establishing which source wins. The model must reconcile the contradiction at query time, when you really want it focused on answering the question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2s9nvff1pg9n0bijbn6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2s9nvff1pg9n0bijbn6.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copying a few approved passages into a prompt avoids that immediate ambiguity, but creates a maintenance job. Your prompt becomes another copy of your content, disconnected from the publishing workflow.&lt;/p&gt;

&lt;p&gt;The distinction here is specifically between &lt;strong&gt;naive retrieval and compiled knowledge&lt;/strong&gt;, not a claim that every RAG architecture behaves identically. The useful question is where your system resolves contradictions: during each conversation, or during a reviewable build.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Sanity Context Compiles a Knowledge Base
&lt;/h2&gt;

&lt;p&gt;A Knowledge Base belongs to your Sanity organization and can combine sources from multiple projects and external systems. The &lt;a href="https://www.sanity.io/docs/ai/sanity-context" rel="noopener noreferrer"&gt;Sanity Context overview&lt;/a&gt; explains the broader platform; the central workflow here is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the Knowledge Base's purpose.&lt;/li&gt;
&lt;li&gt;Add the sources that support that purpose.&lt;/li&gt;
&lt;li&gt;Build a unified topic outline and Markdown entries.&lt;/li&gt;
&lt;li&gt;Review conflicting claims and establish standing instructions.&lt;/li&gt;
&lt;li&gt;Connect agents through Context MCP.&lt;/li&gt;
&lt;li&gt;Review source changes as the underlying material evolves.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Start with a Purpose, Not a Pile of Documents
&lt;/h3&gt;

&lt;p&gt;Every Knowledge Base starts with a short purpose statement describing whom it serves and what questions it should answer.&lt;/p&gt;

&lt;p&gt;That purpose does real work. During compilation, it steers the topic hierarchy. Central entries receive a &lt;code&gt;[core]&lt;/code&gt; tag, supporting material can remain untagged, and tangential content receives a &lt;code&gt;[peripheral]&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvow5htxaky55nust9ydp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvow5htxaky55nust9ydp.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The purpose also appears at the top of the agent's &lt;code&gt;initial_context&lt;/code&gt; payload. It helps orient the agent before it chooses which entries to read.&lt;/p&gt;

&lt;p&gt;My first production rule is simple: &lt;strong&gt;write a sharp one-sentence purpose before expanding the source list.&lt;/strong&gt; A focused purpose gives the compiler a clearer job than a vague request to organize everything your company knows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Combine Datasets, Websites, and Files
&lt;/h3&gt;

&lt;p&gt;The Knowledge Base can unify three source categories into one subject-based topic tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sanity datasets:&lt;/strong&gt; Published structured content selected with GROQ, including Portable Text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Websites:&lt;/strong&gt; Crawled documentation and web pages, with crawling that respects &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uploaded files:&lt;/strong&gt; PDFs, office documents, spreadsheets, Markdown, and other supported formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is the output structure. It follows the subject matter, not necessarily your original file names, repository layout, or URL hierarchy.&lt;/p&gt;

&lt;p&gt;Supported uploads include PDFs up to 500 MB, DOCX and PPTX files up to 100 MB, XLSX files up to 50 MB, and HTML, AsciiDoc, and images up to 25 MB. Other supported inputs include Markdown, CSV, JSON, YAML, source code, and ZIP, TAR, and TAR.GZ archives. Check the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-source-types" rel="noopener noreferrer"&gt;source types reference&lt;/a&gt; when planning an ingestion workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use a Complete GROQ Query with a Narrow Projection
&lt;/h3&gt;

&lt;p&gt;For a dataset source, supply a complete GROQ query, not just a filter. The projection determines which fields the compiler receives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "article" &amp;amp;&amp;amp; defined(slug.current)]{
  title,
  summary,
  body
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This selects articles with a slug, but only passes their title, summary, and body into the build. Internal editorial metadata and unrelated configuration fields stay out.&lt;/p&gt;

&lt;p&gt;Dataset sources automatically read &lt;strong&gt;published documents only&lt;/strong&gt; and support up to 5,000 documents per dataset source. Starting narrow keeps the input focused and makes the resulting entries easier to review. The &lt;a href="https://www.sanity.io/docs/groq" rel="noopener noreferrer"&gt;GROQ reference&lt;/a&gt; is useful when refining filters and projections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolve Conflicting Claims Before Runtime
&lt;/h3&gt;

&lt;p&gt;Return to that 30-day versus 45-day policy example. During a Knowledge Base build, conflicting claims raise a reviewable issue rather than simply becoming competing passages in the agent's context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipp869vuky9jgy3hbnca.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipp869vuky9jgy3hbnca.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The build surfaces disagreement before an agent has to answer a policy question.&lt;/p&gt;

&lt;p&gt;In the Context UI, you inspect the claims and their source attributions, then choose the authoritative interpretation. Resolving the issue creates a standing instruction anchored to the sources.&lt;/p&gt;

&lt;p&gt;You can also write custom plain-language instructions, such as trusting the Help Center over marketing pages for return windows. That rule shapes future builds instead of requiring the model to rediscover the same source hierarchy repeatedly.&lt;/p&gt;

&lt;p&gt;The underlying document types distinguish the compiled content from its review and governance records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sanity.context.entry&lt;/code&gt;: A compiled Markdown entry.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sanity.context.issue&lt;/code&gt;: A conflict or structural issue raised for review.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sanity.context.instruction&lt;/code&gt;: A standing rule, written manually or generated through issue resolution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://www.sanity.io/docs/ai/sanity-context-resolve-issues" rel="noopener noreferrer"&gt;issue resolution guide&lt;/a&gt; covers the review workflow in more detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Produce a Compact Outline and Cited Markdown
&lt;/h3&gt;

&lt;p&gt;The build produces two complementary artifacts: a compact, slash-delimited topic outline and full Markdown entries with citations back to the original sources.&lt;/p&gt;

&lt;p&gt;The outline provides orientation. The entries provide the substance. Your agent does not need every full document in its initial context to understand where relevant information lives.&lt;/p&gt;

&lt;p&gt;Calling this “verified company canon” describes a governed workflow, not automatic proof that every source is true. The build exposes disagreements and preserves provenance; your team still decides which claims deserve authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Agents Retrieve Knowledge Through Context MCP
&lt;/h2&gt;

&lt;p&gt;Sanity serves the compiled Knowledge Base through a hosted, read-only Context MCP endpoint. MCP stands for Model Context Protocol, the interface used here to expose context tools to an agent.&lt;/p&gt;

&lt;p&gt;The core outline-first workflow uses two tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "_key": "3758e1cd3fc0",
  "_type": "table",
  "rows": [
    {
      "_key": "db7b8da9e6da",
      "_type": "row",
      "cells": [
        "Tool",
        "Role"
      ]
    },
    {
      "_key": "5df0377bec98",
      "_type": "row",
      "cells": [
        "`initial_context`",
        "Loads the Knowledge Base purpose and compact topic outline."
      ]
    },
    {
      "_key": "dcd9942d2fbf",
      "_type": "row",
      "cells": [
        "`knowledge_base_read`",
        "Fetches full Markdown entries for selected paths, up to 20 entries per call."
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbxgt6tn2u6p7d7yig3jb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbxgt6tn2u6p7d7yig3jb.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a returns question, the agent can inspect the outline, identify a path such as &lt;code&gt;support/returns&lt;/code&gt;, and read that entry directly. It gets the compiled explanation and its citations rather than relying solely on whichever raw chunk ranks highest.&lt;/p&gt;

&lt;p&gt;The tool surface depends on your endpoint's retrieval mode. Use the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-retrieval-modes" rel="noopener noreferrer"&gt;retrieval modes guide&lt;/a&gt; to distinguish Knowledge Base mode from GROQ mode, and the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-mcp-tools" rel="noopener noreferrer"&gt;Context MCP tools reference&lt;/a&gt; for available tools, including &lt;code&gt;knowledge_base_search&lt;/code&gt; where applicable.&lt;/p&gt;

&lt;p&gt;The token-efficiency idea is equally straightforward: keep the lightweight outline in context, then fetch only the entries relevant to the question. This is an architectural approach to reducing unnecessary context, not a measured cost or accuracy benchmark.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read-Only Access and Organization Tokens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Context MCP is strictly read-only.&lt;/strong&gt; Agents authenticate when connecting, using an organization-level API token with Context Viewer permissions.&lt;/p&gt;

&lt;p&gt;That separates reading approved knowledge from editing it. The agent consumes the compiled material; it does not resolve governance issues by rewriting your content through the endpoint.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-security" rel="noopener noreferrer"&gt;content access and security guide&lt;/a&gt; when provisioning the token, and the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-mcp" rel="noopener noreferrer"&gt;Context MCP reference&lt;/a&gt; for connection details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Drift, Refreshes, and Rollback
&lt;/h2&gt;

&lt;p&gt;A Knowledge Base is not a live dataset query on every request. It is a compiled representation of selected sources, so keeping it current requires an explicit maintenance loop.&lt;/p&gt;

&lt;p&gt;For connected datasets and websites, weekly or monthly scheduled refreshes compare source material against the last build and file issues where material changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcu5q02pc54pkayvmip0o.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcu5q02pc54pkayvmip0o.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refreshes surface changes for review rather than silently replacing approved knowledge.&lt;/p&gt;

&lt;p&gt;While changes await review, agents continue reading the previously approved entries. New source material does not silently overwrite the knowledge they rely on.&lt;/p&gt;

&lt;p&gt;My second production rule is to &lt;strong&gt;triage refresh issues and keep version restore in your operational workflow.&lt;/strong&gt; If an updated build introduces an unwanted outline structure, open Entries, select an earlier outline version, and use &lt;strong&gt;Restore this version&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.sanity.io/docs/ai/sanity-context-maintain-knowledge-base" rel="noopener noreferrer"&gt;maintenance guide&lt;/a&gt; covers refreshes, rebuilds, and restoration. The &lt;a href="https://www.sanity.io/docs/ai/sanity-context-patterns" rel="noopener noreferrer"&gt;production patterns guide&lt;/a&gt; provides broader integration guidance, including initial-context handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Naive Vector RAG vs. a Compiled Knowledge Base
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "_key": "a1b2c3d4e5f6",
  "_type": "table",
  "rows": [
    {
      "_key": "row1hdr9a1",
      "_type": "row",
      "cells": [
        "Concern",
        "Naive vector RAG",
        "Sanity Context Knowledge Base"
      ]
    },
    {
      "_key": "row2org9b2",
      "_type": "row",
      "cells": [
        "Organization",
        "Raw documents split into chunks",
        "Purpose-driven topic outline"
      ]
    },
    {
      "_key": "row3con9c3",
      "_type": "row",
      "cells": [
        "Contradictions",
        "Left for the model at query time",
        "Detected during compilation and surfaced for review"
      ]
    },
    {
      "_key": "row4ret9d4",
      "_type": "row",
      "cells": [
        "Retrieval",
        "Similarity-ranked chunks",
        "Outline-guided reads of compiled entries"
      ]
    },
    {
      "_key": "row5pro9e5",
      "_type": "row",
      "cells": [
        "Provenance",
        "Depends on the retrieval implementation",
        "Markdown entries with source citations"
      ]
    },
    {
      "_key": "row6src9f6",
      "_type": "row",
      "cells": [
        "Source changes",
        "Depend on ingestion and index-update behavior",
        "Reviewable change issues before approved updates"
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The biggest shift is not the transport or the file format. It is moving interpretation and conflict resolution into a build process your team can inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a Multi-Source Knowledge Base for Agent AJ
&lt;/h2&gt;

&lt;p&gt;On CodingCat.dev, Agent AJ already connects to a Sanity Context MCP endpoint named &lt;code&gt;agent-aj-mcp&lt;/code&gt;. The existing endpoint uses our &lt;code&gt;production&lt;/code&gt; dataset in Dataset, or GROQ, mode.&lt;/p&gt;

&lt;p&gt;For this implementation, I wanted something a little more fun: developer lore and dad jokes from external repositories and a local Markdown file, without adding that material to our primary CMS content model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Inspect the Existing GROQ-Mode Endpoint
&lt;/h3&gt;

&lt;p&gt;The existing endpoint scopes dataset access with this &lt;code&gt;groqFilter&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_type in ["podcast", "post", "author", "page", "sponsor", "course"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the distinction from a Knowledge Base dataset source. This is an endpoint filter, while the earlier source example was a complete query with a projection.&lt;/p&gt;

&lt;p&gt;Agent AJ can already use the MCP connection and semantic search capabilities to answer site-content questions. Asking for the latest podcast returns a rich card for “GenAI for Engineers, What's Real, What's Not and What's Coming.”&lt;/p&gt;

&lt;p&gt;That is a useful baseline: the application and MCP connection already work. We are changing the endpoint's content source, not rebuilding the chat interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create the Knowledge Base and Define Its Purpose
&lt;/h3&gt;

&lt;p&gt;In Sanity Context, select &lt;strong&gt;+ New knowledge base&lt;/strong&gt; and enter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title:&lt;/strong&gt; AJ Knowledge Jokes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Fun Jokes for codingcat.dev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8w7p8mfklqmkp99lkmn0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8w7p8mfklqmkp99lkmn0.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Create knowledge base&lt;/strong&gt; to open the Add source workflow. If the feature needs enabling for your organization, use &lt;a href="https://www.sanity.io/manage/org/labs" rel="noopener noreferrer"&gt;Sanity Manage Labs&lt;/a&gt;. The &lt;a href="https://www.sanity.io/docs/ai/sanity-context-create-knowledge-base" rel="noopener noreferrer"&gt;creation guide&lt;/a&gt; provides the setup reference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add Two Websites and One Markdown File
&lt;/h3&gt;

&lt;p&gt;Rather than attaching our dataset, we combine three sources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Jeff Dean Facts:&lt;/strong&gt; Add the &lt;a href="https://github.com/LRitzdorf/TheJeffDeanFacts" rel="noopener noreferrer"&gt;Jeff Dean Facts repository&lt;/a&gt; as a Website source. It collects programmer humor built around exaggerated engineering accomplishments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer lore:&lt;/strong&gt; Upload &lt;code&gt;Legendary-Web-Developer-Lore-&amp;amp;-History.md&lt;/code&gt; through the Files source option. I generated this file with Gemini; it includes stories such as the 500-Mile Email Incident, the left-pad npm crisis, and the Morris Worm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dad jokes:&lt;/strong&gt; Add &lt;a href="https://github.com/wesbos/dad-jokes/blob/master/readme.md" rel="noopener noreferrer"&gt;Wes Bos's programming dad jokes&lt;/a&gt; as another Website source.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using the Website option for these GitHub URLs means we are supplying web pages to crawl, not configuring a dedicated repository integration.&lt;/p&gt;

&lt;p&gt;The Sources list now contains &lt;strong&gt;two websites and one file&lt;/strong&gt;. Different origins, different formats, one Knowledge Base.&lt;/p&gt;

&lt;p&gt;Also, keep the input quality in perspective: compiling a generated lore document does not independently authenticate every historical anecdote. Citations and conflict review make the material inspectable, but source selection still matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Build the Entries and Respect the Readiness Guardrail
&lt;/h3&gt;

&lt;p&gt;Select &lt;strong&gt;Build entries&lt;/strong&gt;. Sanity Context processes the source material, plans an outline around the purpose, and compiles the entries.&lt;/p&gt;

&lt;p&gt;I tried switching Agent AJ's endpoint from &lt;strong&gt;Dataset&lt;/strong&gt; to &lt;strong&gt;Knowledge bases&lt;/strong&gt; before that initial build finished. The endpoint correctly reported that the attached Knowledge Base had no entries and needed building before an agent could connect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating a Knowledge Base is not the same as making it ready to serve.&lt;/strong&gt; Wait for the first build to produce entries before expecting the endpoint to use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Review and Resolve a Conflicting Claim
&lt;/h3&gt;

&lt;p&gt;The build surfaced one issue under &lt;strong&gt;Issues&lt;/strong&gt;, scoped to the whole Knowledge Base.&lt;/p&gt;

&lt;p&gt;Two compiled entries disagreed about a vacation-related Jeff Dean fact. One treated the repository as confirming the anecdote as true. Another said that Kenton Varda, associated with the original list, had not confirmed that specific fact.&lt;/p&gt;

&lt;p&gt;The important feature was not the seriousness of the subject. It was the workflow: a contradiction between compiled entries became an explicit issue with competing interpretations to review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6caur7984v7exrc3kz3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6caur7984v7exrc3kz3.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the supported interpretation explicitly so future builds can apply the resulting instruction.&lt;/p&gt;

&lt;p&gt;For this demo, I selected the first interpretation and used &lt;strong&gt;Resolve issue&lt;/strong&gt;. That established the Knowledge Base's chosen interpretation and generated the corresponding standing instruction.&lt;/p&gt;

&lt;p&gt;You do not have to resolve every issue immediately to inspect the compiled entries. For production policies or other consequential content, however, the review deserves more care than a quick choice between joke-related claims.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Inspect the Topic Outline and Markdown Entries
&lt;/h3&gt;

&lt;p&gt;In Entries, the three sources have been organized into five topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coding Culture &amp;amp; Programmer Humor Meta&lt;/li&gt;
&lt;li&gt;GitHub Repo Commits &amp;amp; Contributions&lt;/li&gt;
&lt;li&gt;Real Stories Behind the Jeff Dean Jokes&lt;/li&gt;
&lt;li&gt;Legendary Software Engineering Anecdotes&lt;/li&gt;
&lt;li&gt;Programming &amp;amp; Tech Dad Jokes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq0h138szzhr7whcsnkbb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq0h138szzhr7whcsnkbb.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dad-jokes entry is organized into technical categories such as Git and version control, databases and SQL, object-oriented and functional programming, and general jokes.&lt;/p&gt;

&lt;p&gt;That is a useful result. We did not simply get three raw source dumps. We got a navigable subject structure with synthesized Markdown and citations back to the original material.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Attach the Ready Knowledge Base and Test Agent AJ
&lt;/h3&gt;

&lt;p&gt;Return to &lt;strong&gt;Agent AJ MCP&lt;/strong&gt;, select &lt;strong&gt;Knowledge bases&lt;/strong&gt; as the content source, and attach &lt;strong&gt;AJ Knowledge Jokes&lt;/strong&gt;. Once it displays &lt;strong&gt;Ready&lt;/strong&gt;, select &lt;strong&gt;Save changes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The existing website can now use the updated endpoint without a frontend redeployment.&lt;/p&gt;

&lt;p&gt;For the first test, I asked Agent AJ for a developer or dad joke. It returned the dark-mode joke from the Programming &amp;amp; Tech Dad Jokes collection: programmers prefer dark mode because light attracts bugs.&lt;/p&gt;

&lt;p&gt;I then opened the compiled entry and located the matching joke. For a second test, I supplied the setup about there being 10 types of people in the world. Agent AJ completed it with the binary punchline: those who understand binary and those who do not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1unf7hjdoeoiraphzjc8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1unf7hjdoeoiraphzjc8.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test the live answer, then compare it with the compiled entry rather than stopping at a plausible response.&lt;/p&gt;

&lt;p&gt;These tests demonstrate that the endpoint change works and that the responses match the compiled collection. They are not a substitute for inspecting tool activity in a production integration, especially when an answer could also come from the model's general knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Connect a Coding Agent or Your Own Application
&lt;/h3&gt;

&lt;p&gt;Open the endpoint and select &lt;strong&gt;Connect agent&lt;/strong&gt;. There are two convenient paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set up with AI:&lt;/strong&gt; Copy the generated setup prompt into a coding agent such as Cursor, Claude Code, or Codex. It provides connection instructions the agent can apply to your stack and verify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample code:&lt;/strong&gt; Copy the supplied integration code and wire the MCP client into your application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bhxncme08w9wiqmz2md.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bhxncme08w9wiqmz2md.webp" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recommend starting with the generated prompt if you already use a coding agent. For a custom application, keep the MCP connection and organization token on the server side.&lt;/p&gt;

&lt;p&gt;This TypeScript connection skeleton shows the MCP portion. Replace the organization ID and use your configured endpoint name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/client/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StreamableHTTPClientTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/client/streamableHttp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;codingcat-agent-aj&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StreamableHTTPClientTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.sanity.io/v1/context/organizations/YOUR_ORG_ID/mcp/agent-aj-mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;requestInit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SANITY_CONTEXT_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Next: expose the discovered tools to your model integration,&lt;/span&gt;
&lt;span class="c1"&gt;// execute requested tool calls, and return results to the model.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This establishes the connection and discovers tools; it is not a complete question-answering loop. The endpoint's Sample code is the better starting point for the full integration, including the model client and tool execution.&lt;/p&gt;

&lt;p&gt;Framework-specific guides are available for the &lt;a href="https://www.sanity.io/docs/ai/sanity-context-vercel-ai-sdk" rel="noopener noreferrer"&gt;Vercel AI SDK&lt;/a&gt;, &lt;a href="https://www.sanity.io/docs/ai/sanity-context-openai-agents-sdk" rel="noopener noreferrer"&gt;OpenAI Agents SDK&lt;/a&gt;, and &lt;a href="https://www.sanity.io/docs/ai/sanity-context-langchain" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Inspect the Organization Context Store with &lt;a class="mentioned-user" href="https://dev.to/sanity"&gt;@sanity&lt;/a&gt;/client
&lt;/h2&gt;

&lt;p&gt;Agents consume the Knowledge Base through MCP, but backend services can also inspect its underlying documents. Entries, issues, and instructions live in the &lt;strong&gt;organization Context store&lt;/strong&gt;, not an individual project's dataset.&lt;/p&gt;

&lt;p&gt;Starting with &lt;code&gt;@sanity/client&lt;/code&gt; version 8.4.0, &lt;code&gt;client.context&lt;/code&gt; supports querying and listening to that store. This is useful when a backend or CI/CD process needs visibility into pending Knowledge Base issues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sanity/client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Requires @sanity/client &amp;gt;= 8.4.0 and an organization API token&lt;/span&gt;
&lt;span class="c1"&gt;// with Context Viewer permissions.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-08-25&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;useProjectHostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;useCdn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SANITY_CONTEXT_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;organizationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_ORGANIZATION_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;openIssues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`*[
    _type == "sanity.context.issue" &amp;amp;&amp;amp;
    knowledgeBaseId == $knowledgeBaseId &amp;amp;&amp;amp;
    status == "open"
  ]{
    _id,
    status,
    content
  }[0...50]`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;knowledgeBaseId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kb_YOUR_KNOWLEDGE_BASE_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Open Knowledge Base Issues:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;openIssues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query returns up to 50 open issues for the specified Knowledge Base. It provides programmatic visibility into review work without changing the agent-facing retrieval flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Knowledge Your Agent Can Navigate
&lt;/h2&gt;

&lt;p&gt;The Agent AJ example uses jokes, but the architecture applies to a much more practical problem: giving an agent a coherent account of what your organization has approved.&lt;/p&gt;

&lt;p&gt;Start with a clear purpose. Select high-signal sources. Review contradictory claims. Preserve citations. Then let the agent orient itself with a compact outline and read only the entries it needs.&lt;/p&gt;

&lt;p&gt;That is the real advantage over naive chunk retrieval: &lt;strong&gt;your team handles knowledge governance before the conversation, rather than asking the model to improvise it during the answer.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Your First Sanity Context Knowledge Base
&lt;/h3&gt;

&lt;p&gt;Follow the official guide to compile multi-source knowledge and connect it to your agent through Context MCP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sanity.io/docs/ai/sanity-context-knowledge-bases" rel="noopener noreferrer"&gt;Start Building&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Five Layers of Agentic Context: Why Canon Only Turns When Someone Signs Off</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Sat, 17 Oct 2026 05:19:13 +0000</pubDate>
      <link>https://dev.to/codingcatdev/the-five-layers-of-agentic-context-why-canon-only-turns-when-someone-signs-off-435g</link>
      <guid>https://dev.to/codingcatdev/the-five-layers-of-agentic-context-why-canon-only-turns-when-someone-signs-off-435g</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/the-five-layers-of-agentic-context-why-canon-only-turns-when-someone-signs-off" rel="noopener noreferrer"&gt;https://codingcat.dev/post/the-five-layers-of-agentic-context-why-canon-only-turns-when-someone-signs-off&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every engineering team shipping AI agents into production eventually hits the exact same wall: the model can solve Olympiad-level math in milliseconds, yet it still tells a customer on live chat that your return policy is 90 days when you changed it last week, or approves an $800 refund without manager sign-off.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.sanity.io/blog/five-layers-agentic-context" rel="noopener noreferrer"&gt;The five layers of agentic context&lt;/a&gt;, Sanity co-founder and CEO Magnus Hillestad breaks down why the common advice to "just give the agent context" falls apart at scale. Building on Evan Armstrong's observation that value is shifting from systems of record (which store data) to context layers (which store meaning), Magnus makes a crucial architectural correction: context is not a singular thing.&lt;/p&gt;

&lt;p&gt;Instead of dumping every Slack thread, ticket, database row, and policy doc into a single vector "company brain" (the 2026 equivalent of a 2016 data lake turning into a data swamp), production agents rely on five distinct layers of context: Situation, Records, Memory, Process, and Canon. Each layer turns at its own pace, has its own owner, and fails in its own unique way. And most importantly: Canon only turns when someone signs off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive demo: the Situation to Canon wheel
&lt;/h2&gt;

&lt;p&gt;To bring the mechanical model from the Sanity article to life on CodingCat.dev, I built an interactive HTML and SVG version of the five-wheel apparatus below. Notice the pulsing signal on the right-hand lever: click the handle to start the machine and sign off a Canon revision, or click any of the five layer plates along the linear track to move the read-head carriage and inspect that layer's telemetry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "_key": "b06_html",
  "_type": "htmlBlock",
  "html": "&amp;lt;div id=\"cc-sanity-wheel-root\" style=\"width:100%;max-width:1040px;margin:24px auto;background:#070709;border:1px solid #27272f;border-radius:16px;padding:20px 24px;color:#f8fafc;font-family:Inter,system-ui,sans-serif;box-shadow:0 20px 50px rgba(0,0,0,0.75);\"&amp;gt;\n  &amp;lt;style&amp;gt;\n    #cc-sanity-wheel-root * { box-sizing: border-box; }\n    #cc-sanity-wheel-root .cc-hdr { display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:12px;border-bottom:1px solid #1c1c22;padding-bottom:12px;margin-bottom:12px; }\n    #cc-sanity-wheel-root .cc-pill { display:inline-flex;align-items:center;gap:8px;font-family:'IBM Plex Mono',monospace;font-size:12px;padding:5px 12px;border-radius:999px;background:#121217;border:1px solid #2e2e38;color:#94a3b8; }\n    #cc-sanity-wheel-root .cc-pill.active { border-color:#ff5500;color:#fff;background:rgba(255,85,0,0.14); }\n    #cc-sanity-wheel-root .cc-dot { width:8px;height:8px;border-radius:50%;background:#ff5500;box-shadow:0 0 8px #ff5500; }\n    #cc-sanity-wheel-root .cc-pill.active .cc-dot { background:#c5e86c;box-shadow:0 0 8px #c5e86c; }\n    @keyframes ccRing1 { 0% { r:17px;opacity:0.95;stroke-width:2.5px; } 100% { r:44px;opacity:0;stroke-width:0.5px; } }\n    @keyframes ccRing2 { 0% { r:17px;opacity:0.8;stroke-width:2px; } 100% { r:58px;opacity:0;stroke-width:0.3px; } }\n    @keyframes ccFloat { 0%,100% { transform:translateY(0); } 50% { transform:translateY(-4px); } }\n    #cc-sanity-wheel-root .cc-ring-1 { animation:ccRing1 1.75s cubic-bezier(0.16,1,0.3,1) infinite;pointer-events:none; }\n    #cc-sanity-wheel-root .cc-ring-2 { animation:ccRing2 1.75s cubic-bezier(0.16,1,0.3,1) 0.55s infinite;pointer-events:none; }\n    #cc-sanity-wheel-root .cc-callout { animation:ccFloat 2.2s ease-in-out infinite;cursor:pointer; }\n    #cc-sanity-wheel-root .cc-handle { cursor:pointer; }\n    #cc-sanity-wheel-root .cc-handle:hover .cc-knob-out { stroke:#ff7a33;stroke-width:2.8px; }\n    #cc-sanity-wheel-root .cc-plate { cursor:pointer; }\n    #cc-sanity-wheel-root .cc-deck { margin-top:14px;display:grid;grid-template-columns:1.3fr 1fr;gap:14px; }\n    @media(max-width:780px){ #cc-sanity-wheel-root .cc-deck { grid-template-columns:1fr; } }\n    #cc-sanity-wheel-root .cc-card { background:#141418;border:1px solid #27272f;border-radius:10px;padding:14px 16px; }\n    #cc-sanity-wheel-root .cc-btn { font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;padding:8px 12px;border-radius:7px;border:1px solid #383846;background:#1c1c24;color:#fff;cursor:pointer; }\n    #cc-sanity-wheel-root .cc-btn-pri { background:#ff5500;border-color:#ff7733; }\n    #cc-sanity-wheel-root .cc-bars { display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:10px; }\n    #cc-sanity-wheel-root .cc-col { background:#101015;border:1px solid #22222b;border-radius:6px;padding:6px 4px;text-align:center;cursor:pointer;font-family:'IBM Plex Mono',monospace; }\n    #cc-sanity-wheel-root .cc-col.sel { border-color:#ff5500; }\n  &amp;lt;/style&amp;gt;\n  &amp;lt;div class=\"cc-hdr\"&amp;gt;\n    &amp;lt;div&amp;gt;\n      &amp;lt;div style=\"font-size:20px;font-weight:700;\"&amp;gt;The five layers of agentic context&amp;lt;/div&amp;gt;\n      &amp;lt;div style=\"font-size:14px;color:#94a3b8;margin-top:3px;\"&amp;gt;Each wheel turns at its own pace. &amp;lt;strong style=\"color:#fff;\"&amp;gt;Canon only turns when someone signs off.&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;\n    &amp;lt;/div&amp;gt;\n    &amp;lt;div class=\"cc-pill\" id=\"cc-status-pill\"&amp;gt;&amp;lt;span class=\"cc-dot\"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span id=\"cc-status-txt\"&amp;gt;SIGNAL READY - CLICK HANDLE TO START&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;\n  &amp;lt;/div&amp;gt;\n  &amp;lt;div style=\"background:#040405;border-radius:12px;border:1px solid #19191f;overflow:hidden;\"&amp;gt;\n    &amp;lt;svg id=\"cc-wheel-svg\" viewBox=\"0 0 1024 600\" style=\"width:100%;height:auto;display:block;\"&amp;gt;\n      &amp;lt;defs&amp;gt;\n        &amp;lt;linearGradient id=\"ccDarkDrum\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#222226\"/&amp;gt;&amp;lt;stop offset=\"28%\" stop-color=\"#1b1b1f\"/&amp;gt;&amp;lt;stop offset=\"44%\" stop-color=\"#28282e\"/&amp;gt;&amp;lt;stop offset=\"62%\" stop-color=\"#141417\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#070709\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccDarkFace\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#1b1b1f\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#0b0b0e\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccCanonDrum\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#ff6b1a\"/&amp;gt;&amp;lt;stop offset=\"28%\" stop-color=\"#ff7e38\"/&amp;gt;&amp;lt;stop offset=\"42%\" stop-color=\"#ff9357\"/&amp;gt;&amp;lt;stop offset=\"56%\" stop-color=\"#f54d00\"/&amp;gt;&amp;lt;stop offset=\"84%\" stop-color=\"#c43800\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#8c2500\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccCanonFace\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#e64600\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#992a00\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccBaseTop\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#18181c\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#0c0c0e\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccPillarFront\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#1e1e22\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#0b0b0d\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n        &amp;lt;linearGradient id=\"ccPillarSide\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"&amp;gt;\n          &amp;lt;stop offset=\"0%\" stop-color=\"#151518\"/&amp;gt;&amp;lt;stop offset=\"100%\" stop-color=\"#09090b\"/&amp;gt;\n        &amp;lt;/linearGradient&amp;gt;\n      &amp;lt;/defs&amp;gt;\n      &amp;lt;rect width=\"1024\" height=\"600\" fill=\"#040406\"/&amp;gt;\n      &amp;lt;g id=\"cc-base\"&amp;gt;\n        &amp;lt;path d=\"M 22 332 L 736 584 Q 758 592 776 580 L 994 434 L 994 447 L 776 593 Q 758 603 736 595 L 22 344 Z\" fill=\"#09090b\" stroke=\"#363640\" stroke-width=\"1.1\"/&amp;gt;\n        &amp;lt;path d=\"M 22 304 L 736 556 Q 758 564 776 552 L 994 406 L 994 434 L 776 580 Q 758 592 736 584 L 22 332 Z\" fill=\"#101014\" stroke=\"#454552\" stroke-width=\"1.2\"/&amp;gt;\n        &amp;lt;path d=\"M 22 304 Q 14 298 25 290 L 214 166 Q 228 157 246 163 L 988 392 Q 1002 398 994 406 L 776 552 Q 758 564 736 556 Z\" fill=\"url(#ccBaseTop)\" stroke=\"#4c4c5a\" stroke-width=\"1.3\"/&amp;gt;\n        &amp;lt;polygon points=\"94,296 128,273 778,497 744,520\" fill=\"#0b0b0e\" stroke=\"#3c3c48\" stroke-width=\"1.1\"/&amp;gt;\n        &amp;lt;line x1=\"101\" y1=\"292\" x2=\"751\" y2=\"516\" stroke=\"#5a5a6a\" stroke-width=\"1.4\"/&amp;gt;\n        &amp;lt;line x1=\"108\" y1=\"287\" x2=\"758\" y2=\"511\" stroke=\"#434350\" stroke-width=\"1.1\"/&amp;gt;\n        &amp;lt;line x1=\"115\" y1=\"282\" x2=\"765\" y2=\"506\" stroke=\"#5a5a6a\" stroke-width=\"1.4\"/&amp;gt;\n        &amp;lt;polygon points=\"62,317 94,296 744,520 712,541\" fill=\"#131318\" stroke=\"#33333e\" stroke-width=\"1\"/&amp;gt;\n        &amp;lt;g id=\"cc-ticks\"&amp;gt;&amp;lt;/g&amp;gt;\n        &amp;lt;polygon points=\"74,284 86,288 86,314 74,310\" fill=\"#151519\" stroke=\"#525260\"/&amp;gt;\n        &amp;lt;polygon points=\"86,288 131,257 131,283 86,314\" fill=\"#0f0f13\" stroke=\"#454552\"/&amp;gt;\n        &amp;lt;polygon points=\"74,284 119,253 131,257 86,288\" fill=\"#222228\" stroke=\"#686878\"/&amp;gt;\n        &amp;lt;polygon points=\"728,509 740,513 740,539 728,535\" fill=\"#151519\" stroke=\"#525260\"/&amp;gt;\n        &amp;lt;polygon points=\"740,513 785,482 785,508 740,539\" fill=\"#0f0f13\" stroke=\"#454552\"/&amp;gt;\n        &amp;lt;polygon points=\"728,509 773,478 785,482 740,513\" fill=\"#222228\" stroke=\"#686878\"/&amp;gt;\n      &amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-plates\"&amp;gt;&amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-left-pillar\"&amp;gt;\n        &amp;lt;polygon points=\"164,258 206,272 288,216 246,202\" fill=\"#1b1b20\" stroke=\"#4d4d5a\"/&amp;gt;\n        &amp;lt;polygon points=\"176,94 202,103 202,270 176,261\" fill=\"url(#ccPillarFront)\" stroke=\"#555564\"/&amp;gt;\n        &amp;lt;polygon points=\"202,103 284,44 284,214 202,270\" fill=\"url(#ccPillarSide)\" stroke=\"#454552\"/&amp;gt;\n        &amp;lt;polygon points=\"176,94 258,35 284,44 202,103\" fill=\"#24242b\" stroke=\"#6e6e80\"/&amp;gt;\n      &amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-drums\"&amp;gt;&amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-bridge\"&amp;gt;\n        &amp;lt;polygon points=\"508,26 528,33 528,108 508,101\" fill=\"#141418\" stroke=\"#4c4c5a\"/&amp;gt;\n        &amp;lt;polygon points=\"434,52 514,12 536,19 456,59\" fill=\"#1e1e24\" stroke=\"#5a5a6a\"/&amp;gt;\n        &amp;lt;g id=\"cc-plunger-mem\"&amp;gt;\n          &amp;lt;path d=\"M 498,76 L 512,72 L 524,76 L 524,132 C 524,138 498,138 498,132 Z\" fill=\"#16161b\" stroke=\"#686878\" stroke-width=\"1.2\"/&amp;gt;\n          &amp;lt;path d=\"M 505,135 A 6,4 0 1,1 517,135\" fill=\"none\" stroke=\"#8a8a9e\" stroke-width=\"1.2\"/&amp;gt;\n        &amp;lt;/g&amp;gt;\n        &amp;lt;g id=\"cc-plunger-can\"&amp;gt;\n          &amp;lt;path d=\"M 711,152 L 725,148 L 737,152 L 737,206 C 737,212 711,212 711,206 Z\" fill=\"#16161b\" stroke=\"#9a9aae\" stroke-width=\"1.3\"/&amp;gt;\n          &amp;lt;path d=\"M 718,209 A 6,4 0 1,1 730,209\" fill=\"none\" stroke=\"#ffd4be\" stroke-width=\"1.3\"/&amp;gt;\n        &amp;lt;/g&amp;gt;\n        &amp;lt;polygon points=\"434,52 798,177 798,193 434,68\" fill=\"#17171c\" stroke=\"#5a5a6a\"/&amp;gt;\n        &amp;lt;polygon points=\"434,52 452,42 816,166 798,177\" fill=\"#23232a\" stroke=\"#6e6e80\"/&amp;gt;\n        &amp;lt;line id=\"cc-beam-sig\" x1=\"510\" y1=\"73\" x2=\"724\" y2=\"147\" stroke=\"#ff5500\" stroke-width=\"2.5\" stroke-dasharray=\"8 6\" opacity=\"0\"/&amp;gt;\n        &amp;lt;polygon points=\"594,95 624,105 624,123 594,113\" fill=\"#16161b\" stroke=\"#5d5d6e\"/&amp;gt;\n        &amp;lt;polygon points=\"624,105 646,92 646,110 624,123\" fill=\"#101014\" stroke=\"#4c4c5a\"/&amp;gt;\n        &amp;lt;polygon points=\"594,95 616,82 646,92 624,105\" fill=\"#282832\" stroke=\"#7c7c90\"/&amp;gt;\n        &amp;lt;circle id=\"cc-relay-led\" cx=\"620\" cy=\"94\" r=\"3\" fill=\"#3a3a46\"/&amp;gt;\n      &amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-right-pillar\"&amp;gt;\n        &amp;lt;polygon points=\"722,455 768,471 854,412 808,396\" fill=\"#1d1d22\" stroke=\"#555564\"/&amp;gt;\n        &amp;lt;polygon points=\"734,202 768,214 768,469 734,457\" fill=\"url(#ccPillarFront)\" stroke=\"#5e5e6e\"/&amp;gt;\n        &amp;lt;polygon points=\"768,214 844,162 844,417 768,469\" fill=\"url(#ccPillarSide)\" stroke=\"#50505e\"/&amp;gt;\n        &amp;lt;polygon points=\"734,202 810,150 844,162 768,214\" fill=\"#25252d\" stroke=\"#7a7a8e\"/&amp;gt;\n        &amp;lt;polygon points=\"752,161 798,177 798,193 752,177\" fill=\"#17171c\" stroke=\"#5a5a6a\"/&amp;gt;\n        &amp;lt;polygon points=\"752,161 770,151 816,166 798,177\" fill=\"#23232a\" stroke=\"#6e6e80\"/&amp;gt;\n        &amp;lt;ellipse cx=\"806\" cy=\"322\" rx=\"22\" ry=\"34\" transform=\"rotate(18 806 322)\" fill=\"#111115\" stroke=\"#585868\" stroke-width=\"1.4\"/&amp;gt;\n        &amp;lt;ellipse cx=\"808\" cy=\"323\" rx=\"17\" ry=\"26\" transform=\"rotate(18 808 323)\" fill=\"#0c0c0f\" stroke=\"#454554\"/&amp;gt;\n        &amp;lt;ellipse cx=\"798\" cy=\"388\" rx=\"13\" ry=\"20\" transform=\"rotate(18 798 388)\" fill=\"#121216\" stroke=\"#68687a\"/&amp;gt;\n        &amp;lt;ellipse cx=\"802\" cy=\"390\" rx=\"11\" ry=\"17\" transform=\"rotate(18 802 390)\" fill=\"#19191f\" stroke=\"#7c7c90\"/&amp;gt;\n        &amp;lt;g id=\"cc-handle-btn\" class=\"cc-handle\" role=\"button\" tabindex=\"0\"&amp;gt;\n          &amp;lt;rect x=\"748\" y=\"245\" width=\"110\" height=\"175\" fill=\"transparent\"/&amp;gt;\n          &amp;lt;circle id=\"cc-r1\" class=\"cc-ring-1\" cx=\"817\" cy=\"282\" r=\"18\" fill=\"none\" stroke=\"#ff5500\"/&amp;gt;\n          &amp;lt;circle id=\"cc-r2\" class=\"cc-ring-2\" cx=\"817\" cy=\"282\" r=\"18\" fill=\"none\" stroke=\"#ff7a33\"/&amp;gt;\n          &amp;lt;line id=\"cc-rod-b\" x1=\"798\" y1=\"388\" x2=\"813\" y2=\"294\" stroke=\"#9494a8\" stroke-width=\"7\" stroke-linecap=\"round\"/&amp;gt;\n          &amp;lt;line id=\"cc-rod-c\" x1=\"798\" y1=\"388\" x2=\"813\" y2=\"294\" stroke=\"#18181f\" stroke-width=\"4.2\" stroke-linecap=\"round\"/&amp;gt;\n          &amp;lt;line id=\"cc-rod-f\" x1=\"802\" y1=\"390\" x2=\"817\" y2=\"296\" stroke=\"#d4d4e4\" stroke-width=\"1.5\" stroke-linecap=\"round\"/&amp;gt;\n          &amp;lt;circle id=\"cc-knob\" class=\"cc-knob-out\" cx=\"817\" cy=\"282\" r=\"16\" fill=\"#18181e\" stroke=\"#e2e8f0\" stroke-width=\"2\"/&amp;gt;\n        &amp;lt;/g&amp;gt;\n        &amp;lt;g id=\"cc-callout\" class=\"cc-callout\" role=\"button\"&amp;gt;\n          &amp;lt;path d=\"M 880,235 L 836,268\" fill=\"none\" stroke=\"#ff5500\" stroke-width=\"2\" stroke-dasharray=\"4 3\"/&amp;gt;\n          &amp;lt;polygon points=\"833,271 838,261 844,268\" fill=\"#ff5500\"/&amp;gt;\n          &amp;lt;rect x=\"832\" y=\"192\" width=\"176\" height=\"44\" rx=\"8\" fill=\"#141010\" stroke=\"#ff5500\" stroke-width=\"1.8\"/&amp;gt;\n          &amp;lt;circle cx=\"848\" cy=\"207\" r=\"4\" fill=\"#ff5500\"/&amp;gt;\n          &amp;lt;text x=\"859\" y=\"211\" fill=\"#ff7a33\" font-family=\"monospace\" font-size=\"10\" font-weight=\"700\"&amp;gt;SIGNAL READY&amp;lt;/text&amp;gt;\n          &amp;lt;text id=\"cc-badge-sub\" x=\"844\" y=\"227\" fill=\"#ffffff\" font-family=\"monospace\" font-size=\"10.5\" font-weight=\"600\"&amp;gt;CLICK HANDLE TO START&amp;lt;/text&amp;gt;\n        &amp;lt;/g&amp;gt;\n      &amp;lt;/g&amp;gt;\n      &amp;lt;g id=\"cc-carriage\"&amp;gt;\n        &amp;lt;polygon points=\"586,448 644,410 704,431 646,469\" fill=\"#1c1c22\" stroke=\"#585868\"/&amp;gt;\n        &amp;lt;polygon points=\"586,448 646,469 646,483 586,462\" fill=\"#121216\" stroke=\"#4a4a58\"/&amp;gt;\n        &amp;lt;polygon points=\"646,469 704,431 704,445 646,483\" fill=\"#0d0d10\" stroke=\"#3e3e4a\"/&amp;gt;\n        &amp;lt;ellipse cx=\"645\" cy=\"436\" rx=\"16\" ry=\"10\" fill=\"#1e1e24\" stroke=\"#78788c\"/&amp;gt;\n        &amp;lt;path d=\"M 633,366 L 633,435 C 633,441 657,441 657,435 L 657,366 Z\" fill=\"url(#ccPillarFront)\" stroke=\"#68687a\"/&amp;gt;\n        &amp;lt;polygon points=\"614,324 654,338 654,380 614,366\" fill=\"#16161b\" stroke=\"#5e5e70\"/&amp;gt;\n        &amp;lt;polygon points=\"654,338 678,322 678,364 654,380\" fill=\"#101014\" stroke=\"#4e4e5e\"/&amp;gt;\n        &amp;lt;polygon points=\"614,324 638,308 678,322 654,338\" fill=\"#24242c\" stroke=\"#7c7c90\"/&amp;gt;\n        &amp;lt;circle cx=\"634\" cy=\"348\" r=\"3.2\" fill=\"#ff5500\"/&amp;gt;\n        &amp;lt;ellipse cx=\"664\" cy=\"360\" rx=\"5\" ry=\"12\" fill=\"#22222a\" stroke=\"#7e7e94\"/&amp;gt;\n      &amp;lt;/g&amp;gt;\n    &amp;lt;/svg&amp;gt;\n  &amp;lt;/div&amp;gt;\n  &amp;lt;div class=\"cc-deck\"&amp;gt;\n    &amp;lt;div class=\"cc-card\"&amp;gt;\n      &amp;lt;div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;\"&amp;gt;\n        &amp;lt;span id=\"cc-hud-title\" style=\"font-family:monospace;font-size:12px;font-weight:700;padding:3px 9px;border-radius:4px;background:rgba(255,85,0,0.18);border:1px solid #ff5500;color:#ff945e;\"&amp;gt;LAYER 5 · CANON&amp;lt;/span&amp;gt;\n        &amp;lt;span id=\"cc-hud-cadence\" style=\"font-family:monospace;font-size:12px;color:#94a3b8;\"&amp;gt;Cadence: Human Sign-Off Only&amp;lt;/span&amp;gt;\n      &amp;lt;/div&amp;gt;\n      &amp;lt;div id=\"cc-hud-desc\" style=\"font-size:13.5px;line-height:1.45;color:#e2e8f0;\"&amp;gt;Product facts, policies, documentation, approved claims, positioning, and brand. Authored, reviewed, and signed off by humans before agents repeat it to customers.&amp;lt;/div&amp;gt;\n    &amp;lt;/div&amp;gt;\n    &amp;lt;div class=\"cc-card\"&amp;gt;\n      &amp;lt;div style=\"display:flex;gap:8px;flex-wrap:wrap;\"&amp;gt;\n        &amp;lt;button type=\"button\" class=\"cc-btn cc-btn-pri\" id=\"cc-btn-pull\"&amp;gt;⚡ Click Handle to Start&amp;lt;/button&amp;gt;\n        &amp;lt;button type=\"button\" class=\"cc-btn\" id=\"cc-btn-scan\"&amp;gt;⇄ Scan All 5 Layers&amp;lt;/button&amp;gt;\n        &amp;lt;button type=\"button\" class=\"cc-btn\" id=\"cc-btn-reset\"&amp;gt;⏸ Reset&amp;lt;/button&amp;gt;\n      &amp;lt;/div&amp;gt;\n      &amp;lt;div class=\"cc-bars\" id=\"cc-bars\"&amp;gt;\n        &amp;lt;div class=\"cc-col\" data-idx=\"0\"&amp;gt;&amp;lt;div style=\"font-size:10px;color:#94a3b8;\"&amp;gt;SITUATION&amp;lt;/div&amp;gt;&amp;lt;div id=\"cc-v0\" style=\"font-size:11px;font-weight:700;margin-top:2px;\"&amp;gt;IDLE&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;\n        &amp;lt;div class=\"cc-col\" data-idx=\"1\"&amp;gt;&amp;lt;div style=\"font-size:10px;color:#94a3b8;\"&amp;gt;RECORDS&amp;lt;/div&amp;gt;&amp;lt;div id=\"cc-v1\" style=\"font-size:11px;font-weight:700;margin-top:2px;\"&amp;gt;IDLE&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;\n        &amp;lt;div class=\"cc-col\" data-idx=\"2\"&amp;gt;&amp;lt;div style=\"font-size:10px;color:#94a3b8;\"&amp;gt;MEMORY&amp;lt;/div&amp;gt;&amp;lt;div id=\"cc-v2\" style=\"font-size:11px;font-weight:700;margin-top:2px;\"&amp;gt;IDLE&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;\n        &amp;lt;div class=\"cc-col\" data-idx=\"3\"&amp;gt;&amp;lt;div style=\"font-size:10px;color:#94a3b8;\"&amp;gt;PROCESS&amp;lt;/div&amp;gt;&amp;lt;div id=\"cc-v3\" style=\"font-size:11px;font-weight:700;margin-top:2px;\"&amp;gt;IDLE&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;\n        &amp;lt;div class=\"cc-col sel\" data-idx=\"4\"&amp;gt;&amp;lt;div style=\"font-size:10px;color:#94a3b8;\"&amp;gt;CANON&amp;lt;/div&amp;gt;&amp;lt;div id=\"cc-v4\" style=\"font-size:11px;font-weight:700;color:#ff7a33;margin-top:2px;\"&amp;gt;LOCKED&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;\n      &amp;lt;/div&amp;gt;\n    &amp;lt;/div&amp;gt;\n  &amp;lt;/div&amp;gt;\n  &amp;lt;script&amp;gt;\n  (function(){\n    var NS=\"http://www.w3.org/2000/svg\",SX=107,SY=37,ANG=19.075,RAD=ANG*Math.PI/180,UX=Math.cos(RAD),UY=Math.sin(RAD),VX=Math.sin(RAD),VY=-Math.cos(RAD),RMAJ=96,RMIN=46,WX=62,WY=21.45,CX0=268,CY0=138,RIBS=18;\n    var INFO=[\n      {n:\"SITUATION\",b:\"LAYER 1 · SITUATION\",c:\"Cadence: Ephemeral (Minutes / Hours)\",s:\"FAST\",w:1.85,d:\"Who the agent is talking to, what they have already said, what they are trying to do, and what has happened so far in the live session.\"},\n      {n:\"RECORDS\",b:\"LAYER 2 · RECORDS\",c:\"Cadence: Continuous (System of Record)\",s:\"STEADY\",w:0.82,d:\"Customers, orders, SKUs, transactions, call transcripts, and history. Owned by the transactional systems of record that produce it.\"},\n      {n:\"MEMORY\",b:\"LAYER 3 · MEMORY\",c:\"Cadence: Cross-Session Learning\",s:\"STEPPED\",w:0.35,d:\"Which answers solved a problem, what customers corrected, and what returning users prefer across conversations. Reviewed lessons move into Canon.\"},\n      {n:\"PROCESS\",b:\"LAYER 4 · PROCESS\",c:\"Cadence: Governance &amp;amp; Workflows\",s:\"SLOW\",w:0.12,d:\"Who owns content, who approves a change, what an agent may do on its own, and when a person needs to be in the loop.\"},\n      {n:\"CANON\",b:\"LAYER 5 · CANON\",c:\"Cadence: Human Sign-Off Only\",s:\"SIGN-OFF\",w:0,d:\"Product facts, policies, documentation, approved claims, positioning, and brand. The layer the agent repeats out loud to customers.\"}\n    ];\n    var ticks=document.getElementById(\"cc-ticks\");\n    for(var i=0;i&amp;lt;=40;i++){\n      var t=i/40,x1=72+t*650,y1=319+t*224.8,len=(i%8===0)?10:((i%4===0)?7:4.5);\n      var l=document.createElementNS(NS,\"line\");\n      l.setAttribute(\"x1\",x1);l.setAttribute(\"y1\",y1);l.setAttribute(\"x2\",x1+len*0.78);l.setAttribute(\"y2\",y1-len*0.62);\n      l.setAttribute(\"stroke\",(i%8===0)?\"#88889a\":\"#4a4a58\");ticks.appendChild(l);\n    }\n    var platesG=document.getElementById(\"cc-plates\"),plates=[];\n    INFO.forEach(function(inf,idx){\n      var x0=131+idx*SX,y0=359+idx*SY,w=96,dy=33.2,h=33,g=document.createElementNS(NS,\"g\");\n      g.setAttribute(\"class\",\"cc-plate\");\n      var p=document.createElementNS(NS,\"polygon\");\n      p.setAttribute(\"points\",x0+\",\"+y0+\" \"+(x0+w)+\",\"+(y0+dy)+\" \"+(x0+w)+\",\"+(y0+dy+h)+\" \"+x0+\",\"+(y0+h));\n      p.setAttribute(\"fill\",idx===4?\"#161210\":\"#0e0e12\");p.setAttribute(\"stroke\",idx===4?\"#fff\":\"#454554\");p.setAttribute(\"stroke-width\",idx===4?\"1.6\":\"1.1\");\n      var tx=x0+48,ty=y0+dy*0.5+h*0.58,txt=document.createElementNS(NS,\"text\");\n      txt.setAttribute(\"x\",tx);txt.setAttribute(\"y\",ty);txt.setAttribute(\"text-anchor\",\"middle\");txt.setAttribute(\"fill\",idx===4?\"#fff\":\"#cbd5e1\");\n      txt.setAttribute(\"font-family\",\"monospace\");txt.setAttribute(\"font-size\",\"12\");txt.setAttribute(\"font-weight\",idx===4?\"700\":\"500\");txt.setAttribute(\"letter-spacing\",\"0.08em\");\n      txt.setAttribute(\"transform\",\"translate(\"+tx+\",\"+ty+\") skewY(19.1) translate(\"+(-tx)+\",\"+(-ty)+\")\");\n      txt.textContent=inf.n;g.appendChild(p);g.appendChild(txt);\n      g.addEventListener(\"click\",function(){selectIdx(idx,true);});\n      platesG.appendChild(g);plates.push(p);\n    });\n    function ePt(cx,cy,rmaj,rmin,th){return {x:cx+rmaj*Math.cos(th)*VX-rmin*Math.sin(th)*UX,y:cy+rmaj*Math.cos(th)*VY-rmin*Math.sin(th)*UY};}\n    var drumsG=document.getElementById(\"cc-drums\"),drums=[];\n    INFO.forEach(function(_,idx){\n      var isC=(idx===4),cx1=CX0+idx*SX,cy1=CY0+idx*SY,cx2=cx1+WX,cy2=cy1+WY,g=document.createElementNS(NS,\"g\");\n      g.style.cursor=\"pointer\";g.addEventListener(\"click\",function(){selectIdx(idx,true);});\n      var be=document.createElementNS(NS,\"ellipse\");\n      be.setAttribute(\"cx\",cx1);be.setAttribute(\"cy\",cy1);be.setAttribute(\"rx\",RMIN);be.setAttribute(\"ry\",RMAJ);\n      be.setAttribute(\"transform\",\"rotate(\"+ANG+\" \"+cx1+\" \"+cy1+\")\");be.setAttribute(\"fill\",isC?\"#b83700\":\"#121215\");be.setAttribute(\"stroke\",isC?\"#ff9e66\":\"#78788a\");\n      g.appendChild(be);\n      var t1=ePt(cx1,cy1,RMAJ,RMIN,0),b1=ePt(cx1,cy1,RMAJ,RMIN,Math.PI),t2=ePt(cx2,cy2,RMAJ,RMIN,0),b2=ePt(cx2,cy2,RMAJ,RMIN,Math.PI);\n      var bp=document.createElementNS(NS,\"path\");\n      bp.setAttribute(\"d\",\"M \"+t1.x+\" \"+t1.y+\" A \"+RMIN+\" \"+RMAJ+\" \"+ANG+\" 0 0 \"+b1.x+\" \"+b1.y+\" L \"+b2.x+\" \"+b2.y+\" A \"+RMIN+\" \"+RMAJ+\" \"+ANG+\" 0 1 \"+t2.x+\" \"+t2.y+\" Z\");\n      bp.setAttribute(\"fill\",isC?\"url(#ccCanonDrum)\":\"url(#ccDarkDrum)\");bp.setAttribute(\"stroke\",isC?\"#ff945e\":\"#78788a\");g.appendChild(bp);\n      var rLines=[];\n      for(var r=0;r&amp;lt;RIBS;r++){var rl=document.createElementNS(NS,\"line\");rl.setAttribute(\"stroke\",isC?\"#ffaa77\":\"#626274\");rl.setAttribute(\"stroke-width\",\"1.2\");g.appendChild(rl);rLines.push(rl);}\n      var fe=document.createElementNS(NS,\"ellipse\");\n      fe.setAttribute(\"cx\",cx2);fe.setAttribute(\"cy\",cy2);fe.setAttribute(\"rx\",RMIN);fe.setAttribute(\"ry\",RMAJ);\n      fe.setAttribute(\"transform\",\"rotate(\"+ANG+\" \"+cx2+\" \"+cy2+\")\");fe.setAttribute(\"fill\",isC?\"url(#ccCanonFace)\":\"url(#ccDarkFace)\");fe.setAttribute(\"stroke\",isC?\"#ffa372\":\"#78788a\");\n      g.appendChild(fe);\n      [0.91,0.81,0.72].forEach(function(sc,ri){\n        var re=document.createElementNS(NS,\"ellipse\"),rcx=cx2+(ri===2?6.5:(ri===1?3.2:0)),rcy=cy2+(ri===2?2.2:(ri===1?1.1:0));\n        re.setAttribute(\"cx\",rcx);re.setAttribute(\"cy\",rcy);re.setAttribute(\"rx\",RMIN*sc);re.setAttribute(\"ry\",RMAJ*sc);\n        re.setAttribute(\"transform\",\"rotate(\"+ANG+\" \"+rcx+\" \"+rcy+\")\");re.setAttribute(\"fill\",ri===2?(isC?\"#c93b00\":\"#0b0b0e\"):\"none\");re.setAttribute(\"stroke\",isC?\"#ff8547\":\"#4a4a58\");\n        g.appendChild(re);\n      });\n      drumsG.appendChild(g);drums.push({rLines:rLines,cx1:cx1,cy1:cy1,cx2:cx2,cy2:cy2});\n    });\n    function drawRibs(d,ph){\n      for(var r=0;r&amp;lt;RIBS;r++){\n        var th=(ph+(r*2*Math.PI)/RIBS)%(2*Math.PI);if(th&amp;lt;0)th+=2*Math.PI;\n        var vis=Math.sin(th),ln=d.rLines[r];\n        if(vis&amp;lt;=0.02){ln.setAttribute(\"opacity\",\"0\");}else{\n          var p1=ePt(d.cx1,d.cy1,RMAJ,RMIN,th),p2=ePt(d.cx2,d.cy2,RMAJ,RMIN,th);\n          ln.setAttribute(\"x1\",p1.x.toFixed(1));ln.setAttribute(\"y1\",p1.y.toFixed(1));ln.setAttribute(\"x2\",p2.x.toFixed(1));ln.setAttribute(\"y2\",p2.y.toFixed(1));\n          ln.setAttribute(\"opacity\",Math.min(0.95,0.22+0.73*Math.pow(vis,0.65)).toFixed(2));\n        }\n      }\n    }\n    var running=false,revs=0,phases=[0.15,0.42,0.78,1.12,0.28],canonTarget=phases[4],cPos=4,cTarget=4,queue=[],qTimer=0,hAnim=false,hTime=0,bAnim=false,bTime=0;\n    drums.forEach(function(d,i){drawRibs(d,phases[i]);});\n    function selectIdx(idx,move){\n      var inf=INFO[idx];\n      document.getElementById(\"cc-hud-title\").textContent=inf.b;\n      document.getElementById(\"cc-hud-cadence\").textContent=idx===4?(inf.c+\" (Rev #\"+revs+\")\"):inf.c;\n      document.getElementById(\"cc-hud-desc\").textContent=inf.d;\n      plates.forEach(function(p,i){p.setAttribute(\"stroke\",i===idx?\"#ff5500\":(i===4?\"#fff\":\"#454554\"));});\n      var cols=document.querySelectorAll(\"#cc-bars .cc-col\");\n      cols.forEach(function(c,i){c.classList.toggle(\"sel\",i===idx);});\n      if(move){queue=[];cTarget=idx;}\n    }\n    function pullHandle(){\n      hAnim=true;hTime=0;bAnim=true;bTime=0;\n      var wasIdle=!running;running=true;revs+=1;canonTarget+=(2*Math.PI)/9;\n      queue=wasIdle?[0,1,2,3,4]:[2,4];cTarget=queue.shift();selectIdx(cTarget,false);\n      document.getElementById(\"cc-status-pill\").classList.add(\"active\");\n      document.getElementById(\"cc-status-txt\").textContent=\"ACTIVE · CANON SIGNED OFF (REV #\"+revs+\")\";\n      document.getElementById(\"cc-badge-sub\").textContent=\"CLICK TO SIGN OFF CANON\";\n      document.getElementById(\"cc-btn-pull\").textContent=\"⚡ Pull Handle (Sign Off Canon)\";\n      INFO.forEach(function(inf,i){document.getElementById(\"cc-v\"+i).textContent=i===4?(\"REV #\"+revs):inf.s;});\n    }\n    document.getElementById(\"cc-handle-btn\").addEventListener(\"click\",pullHandle);\n    document.getElementById(\"cc-callout\").addEventListener(\"click\",pullHandle);\n    document.getElementById(\"cc-btn-pull\").addEventListener(\"click\",pullHandle);\n    document.getElementById(\"cc-btn-scan\").addEventListener(\"click\",function(){if(!running){pullHandle();return;}queue=[1,2,3,4];cTarget=0;selectIdx(0,false);});\n    document.getElementById(\"cc-btn-reset\").addEventListener(\"click\",function(){\n      running=false;queue=[];cTarget=4;selectIdx(4,false);\n      document.getElementById(\"cc-status-pill\").classList.remove(\"active\");\n      document.getElementById(\"cc-status-txt\").textContent=\"SIGNAL READY - CLICK HANDLE TO START\";\n      document.getElementById(\"cc-badge-sub\").textContent=\"CLICK HANDLE TO START\";\n      document.getElementById(\"cc-btn-pull\").textContent=\"⚡ Click Handle to Start\";\n      INFO.forEach(function(_,i){document.getElementById(\"cc-v\"+i).textContent=i===4?\"LOCKED\":\"IDLE\";});\n    });\n    document.querySelectorAll(\"#cc-bars .cc-col\").forEach(function(col){\n      col.addEventListener(\"click\",function(){selectIdx(parseInt(col.getAttribute(\"data-idx\"),10),true);});\n    });\n    var last=performance.now();\n    function loop(now){\n      var dt=Math.min(0.05,(now-last)/1000);last=now;\n      if(hAnim){\n        hTime+=dt;var p=hTime/0.68;\n        if(p&amp;gt;=1){hAnim=false;p=0;}else{p=p&amp;lt;0.38?Math.sin((p/0.38)*(Math.PI/2)):Math.cos(((p-0.38)/0.62)*(Math.PI/2));}\n        var kx=817-p*51,ky=282+p*68,rx=813-p*47,ry=294+p*60;\n        document.getElementById(\"cc-rod-b\").setAttribute(\"x2\",rx);document.getElementById(\"cc-rod-b\").setAttribute(\"y2\",ry);\n        document.getElementById(\"cc-rod-c\").setAttribute(\"x2\",rx);document.getElementById(\"cc-rod-c\").setAttribute(\"y2\",ry);\n        document.getElementById(\"cc-rod-f\").setAttribute(\"x2\",rx+4);document.getElementById(\"cc-rod-f\").setAttribute(\"y2\",ry+2);\n        document.getElementById(\"cc-knob\").setAttribute(\"cx\",kx);document.getElementById(\"cc-knob\").setAttribute(\"cy\",ky);\n        document.getElementById(\"cc-r1\").setAttribute(\"cx\",kx);document.getElementById(\"cc-r1\").setAttribute(\"cy\",ky);\n        document.getElementById(\"cc-r2\").setAttribute(\"cx\",kx);document.getElementById(\"cc-r2\").setAttribute(\"cy\",ky);\n      }\n      if(bAnim){\n        bTime+=dt;var bp=bTime/1.1;\n        if(bp&amp;gt;=1){bAnim=false;document.getElementById(\"cc-beam-sig\").setAttribute(\"opacity\",\"0\");document.getElementById(\"cc-relay-led\").setAttribute(\"fill\",\"#3a3a46\");document.getElementById(\"cc-plunger-mem\").setAttribute(\"transform\",\"translate(0,0)\");document.getElementById(\"cc-plunger-can\").setAttribute(\"transform\",\"translate(0,0)\");}\n        else{var py=Math.sin(bp*Math.PI)*4.5;document.getElementById(\"cc-plunger-mem\").setAttribute(\"transform\",\"translate(0,\"+py+\")\");document.getElementById(\"cc-plunger-can\").setAttribute(\"transform\",\"translate(0,\"+py+\")\");document.getElementById(\"cc-beam-sig\").setAttribute(\"opacity\",Math.sin(bp*Math.PI).toFixed(2));document.getElementById(\"cc-relay-led\").setAttribute(\"fill\",\"#ff5500\");}\n      }\n      if(running){\n        for(var i=0;i&amp;lt;4;i++){\n          phases[i]+=INFO[i].w*dt*(i===2?(0.3+1.4*Math.pow(0.5+0.5*Math.sin(now*0.0045),3)):1);\n          drawRibs(drums[i],phases[i]);\n        }\n      }\n      var cd=canonTarget-phases[4];if(Math.abs(cd)&amp;gt;0.0005){phases[4]+=cd*Math.min(1,dt*7.5);drawRibs(drums[4],phases[4]);}\n      var diff=cTarget-cPos;\n      if(Math.abs(diff)&amp;gt;0.008){cPos+=diff*Math.min(1,dt*5.2);}else{cPos=cTarget;if(queue.length&amp;gt;0){qTimer+=dt;if(qTimer&amp;gt;=0.42){qTimer=0;cTarget=queue.shift();selectIdx(cTarget,false);}}}\n      var u=cPos-4;document.getElementById(\"cc-carriage\").setAttribute(\"transform\",\"translate(\"+(u*SX).toFixed(1)+\",\"+(u*SY).toFixed(1)+\")\");\n      requestAnimationFrame(loop);\n    }\n    requestAnimationFrame(loop);\n  })();\n  &amp;lt;/script&amp;gt;\n&amp;lt;/div&amp;gt;"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Breaking down the five layers of agentic context
&lt;/h2&gt;

&lt;p&gt;Why does the wheel metaphor work so well for engineering teams? Because in a real production stack, context does not mutate at a uniform clock speed. Treating live conversational state the same way you treat approved pricing or refund policies guarantees hallucinations and compliance failures. Here is how the five layers compare across velocity, ownership, and failure modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "_key": "b09_table",
  "_type": "table",
  "rows": [
    {
      "_key": "r0",
      "_type": "row",
      "cells": [
        "Context Layer",
        "Wheel Velocity / Lifespan",
        "What It Contains",
        "Primary Owner",
        "Failure Mode When Missing or Ungoverned"
      ]
    },
    {
      "_key": "r1",
      "_type": "row",
      "cells": [
        "1. Situation",
        "Fastest (minutes to hours)",
        "Who the agent is talking to right now, what was already said, and current session state",
        "Runtime / session state",
        "Every turn starts from zero; the agent suggests the exact fix the user already tried"
      ]
    },
    {
      "_key": "r2",
      "_type": "row",
      "cells": [
        "2. Records",
        "Continuous (real-time transactions)",
        "Customers, orders, SKUs, transactions, call transcripts, and account history",
        "Systems of record (CRM, ERP, DB)",
        "The agent cannot verify order facts or personalize responses to the user's actual history"
      ]
    },
    {
      "_key": "r3",
      "_type": "row",
      "cells": [
        "3. Memory",
        "Stepped (cross-conversation learning)",
        "Which answers solved a problem, user corrections, and returning customer preferences",
        "Agent learning loop (needs human review)",
        "Missing memory repeats mistakes; unreviewed memory learns bad habits like handing out unapproved discounts"
      ]
    },
    {
      "_key": "r4",
      "_type": "row",
      "cells": [
        "4. Process",
        "Slow (operational rules and mandate)",
        "Who owns content, approval flows, permissions, and when a human must be in the loop",
        "Operations and engineering governance",
        "The agent acts outside its mandate, such as approving an $800 refund when anything over $600 needs sign-off"
      ]
    },
    {
      "_key": "r5",
      "_type": "row",
      "cells": [
        "5. Canon",
        "Human sign-off only (locked ratchet)",
        "Product facts, policies, documentation, approved claims, positioning, and brand",
        "Content / Context Operations team",
        "The agent confidently repeats outdated or contradictory claims your business does not stand behind"
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why "company brains" turn into data swamps for customer-facing agents
&lt;/h2&gt;

&lt;p&gt;One of the sharpest insights in Magnus's piece is his comparison between today's all-in-one "company brain" vector stores and the data lakes of a decade ago. Internally, pointing an enterprise search bot at Slack, Notion, and Jira works fine because employees have enough institutional awareness to spot an outdated thread from 2024.&lt;/p&gt;

&lt;p&gt;Customer-facing agents do not have that luxury. When your pricing page says $49, an old blog post says $39, and a sales battle card in Google Drive says something else, an agent reading your raw web pages burns extra tokens trying to reconcile contradictions, or worse, quotes the wrong price to a buyer. Moving from unstructured "pages" to a structured content model gives both humans and agents a single source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The overhead bridge: how Memory and Records promote into Canon
&lt;/h2&gt;

&lt;p&gt;Look closely at the top of the mechanical wheel apparatus above: an overhead bridge arm connects the Memory drum (Wheel 3) directly to the orange Canon drum (Wheel 5). That mechanical link represents the most important operational loop in agentic engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;**Signals flow in from Records and Memory: **Sales call transcripts, support tickets, and agent memory surface recurring customer corrections or product changes.&lt;/li&gt;
&lt;li&gt;**Content teams act as Context teams: **Instead of letting unreviewed agent memory drift into production policy, humans review candidate updates, resolve contradictions across sources, and sign off via Sanity Workflows.&lt;/li&gt;
&lt;li&gt;**Compiled Canon ships over MCP: **At Everything *[NYC] 2026, Matt Chamberlain from Braze demonstrated this exact loop by compiling Braze's public documentation into a Sanity Knowledge Base served over an MCP endpoint, watching sales calls for market changes, and routing proposed battle-card updates to humans for sign-off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why precompiled Canon makes fast, cheap models viable in production
&lt;/h2&gt;

&lt;p&gt;If an agent has to grep raw documents and synthesize what your business stands for from scratch on every prompt, you are forced to pay for slow, frontier-class reasoning models on every turn. When Sanity Context precompiles Canon into a structured Knowledge Base exposed over MCP, the map of verified facts and relationships is already drawn. A smaller, faster, cheaper model can answer with low latency, and a lightweight classifier can verify every outgoing response against Canon before the customer ever sees it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the interactive HTML/SVG wheel is built
&lt;/h2&gt;

&lt;p&gt;If you want to embed the Situation-to-Canon wheel in your own docs or architecture decks, the entire component uses zero external dependencies: just inline SVG geometry projected along a 19.075-degree isometric axle and a 60fps requestAnimationFrame loop. Each drum projects 18 radial ribs across the visible front-left half of a tilted ellipse, while the Canon drum remains locked until the handle click handler increments the target phase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Parametric isometric projection for each rotating context drum&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AXIS_ANGLE_DEG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;19.075&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AXIS_ANGLE_DEG&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RAD&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;UY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RAD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RAD&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;VY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RAD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ellipsePoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rMaj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rMin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;rMaj&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;VX&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;rMin&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;UX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;rMaj&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;VY&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;rMin&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;UY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Handle click signal: ratchets Canon forward by one approved step&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onHandleClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;machineRunning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;canonSignOffCount&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;canonTargetPhase&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// +40 deg ratchet step&lt;/span&gt;
  &lt;span class="nf"&gt;triggerOverheadBridgePulse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;          &lt;span class="c1"&gt;// Plungers stamp Memory -&amp;gt; Canon&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The bottom line for AI engineers
&lt;/h2&gt;

&lt;p&gt;Magnus closes the article with a rule of thumb that belongs on every AI engineer's desk: the more autonomy you give an agent, the more of its context needs to be canon. Read the full post on the &lt;a href="https://www.sanity.io/blog/five-layers-agentic-context" rel="noopener noreferrer"&gt;Sanity blog&lt;/a&gt;, try pulling the sign-off handle on the wheel above, and let us know on &lt;a href="https://codingcat.dev/" rel="noopener noreferrer"&gt;CodingCat.dev&lt;/a&gt; how you are governing canonical context in your own agent loops!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Live Coding with the Amplify UI team</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Sun, 11 Oct 2026 06:02:53 +0000</pubDate>
      <link>https://dev.to/codingcatdev/live-coding-with-the-amplify-ui-team-1n0c</link>
      <guid>https://dev.to/codingcatdev/live-coding-with-the-amplify-ui-team-1n0c</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/podcast/cwcc-0-8-amplify-ui" rel="noopener noreferrer"&gt;https://codingcat.dev/podcast/cwcc-0-8-amplify-ui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/weT3YwBZt-k" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Amplify UI: Build UI Fast with Amplify on React
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ui.docs.amplify.aws/" rel="noopener noreferrer"&gt;AWS Amplify UI&lt;/a&gt; is a set of React components that make it easy to build beautiful and responsive user interfaces. The components are built on top of the Amplify framework, which provides a unified way to connect your app to backend services.&lt;/p&gt;

&lt;p&gt;Amplify UI is designed to be easy to use, even for beginners. The components are well-documented and there are plenty of examples to help you get started.&lt;/p&gt;

&lt;p&gt;In this blog post, we'll show you how to use Amplify UI to build a simple todo app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The first step is to install Amplify UI. You can do this with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @aws-amplify/ui

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Amplify UI is installed, you can start using the components in your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Todo List
&lt;/h2&gt;

&lt;p&gt;To create a todo list, we'll use the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AmplifyCard&lt;/code&gt;: This component is used to create a card that displays a todo item.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AmplifyInput&lt;/code&gt;: This component is used to create a text input field.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AmplifyButton&lt;/code&gt;: This component is used to create a button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the code for our todo list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AmplifyCard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AmplifyInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AmplifyButton&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@aws-amplify/ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TodoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodos&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="nf"&gt;setTodos&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AmplifyCard&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Todo&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AmplifyButton&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTodos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="nx"&gt;Delete&lt;/span&gt;
                            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AmplifyButton&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                    &lt;span class="p"&gt;))}&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/AmplifyCard&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AmplifyInput&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter a new todo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addTodo&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TodoList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will create a todo list with a text input field and a button. When you enter a todo item in the text input field and click the button, the item will be added to the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ui.docs.amplify.aws/" rel="noopener noreferrer"&gt;AWS Amplify UI&lt;/a&gt; is a powerful tool that can help you build beautiful and responsive user interfaces. The components are easy to use and well-documented, making them a great choice for beginners and experienced developers alike.&lt;/p&gt;

&lt;p&gt;If you're looking for a way to build user interfaces quickly and easily, then &lt;a href="https://ui.docs.amplify.aws/" rel="noopener noreferrer"&gt;AWS Amplify UI&lt;/a&gt; is a great option.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Dockerless Serverless GPUs: How I Built a Fast, Cheap AI SaaS with RunPod Flash</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Sat, 10 Oct 2026 16:07:26 +0000</pubDate>
      <link>https://dev.to/codingcatdev/dockerless-serverless-gpus-how-i-built-a-fast-cheap-ai-saas-with-runpod-flash-i6f</link>
      <guid>https://dev.to/codingcatdev/dockerless-serverless-gpus-how-i-built-a-fast-cheap-ai-saas-with-runpod-flash-i6f</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/dockerless-serverless-gpus-fast-cheap-ai-saas-with-runpod-flash" rel="noopener noreferrer"&gt;https://codingcat.dev/post/dockerless-serverless-gpus-fast-cheap-ai-saas-with-runpod-flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/7d6iJHEPMZI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Commercial AI image generation APIs like Google Vertex AI charge 3 to 4 cents per generation. Spend $1, and you get roughly 25 images.&lt;/p&gt;

&lt;p&gt;In this walkthrough of &lt;a href="https://flashfun.dev/" rel="noopener noreferrer"&gt;FlashFun.dev&lt;/a&gt;, we look at how to run dedicated serverless GPUs using &lt;a href="https://www.runpod.io/" rel="noopener noreferrer"&gt;RunPod Flash&lt;/a&gt; to drop that cost down to between $0.00033 and $0.002 per image, stretching that exact same $1 to buy between 500 and 3,000 images.&lt;/p&gt;

&lt;h2&gt;
  
  
  The economics: hosted APIs vs. RunPod Flash
&lt;/h2&gt;

&lt;p&gt;When running on &lt;a href="https://www.runpod.io/" rel="noopener noreferrer"&gt;RunPod Serverless&lt;/a&gt;, compute bills strictly per second of execution and scales completely to zero.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target tier: 24 GB VRAM (RTX 4090 / Ada generation)&lt;/li&gt;
&lt;li&gt;Flex rate: ~$1.10/hr, or $0.000306/sec
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "_key": "60ctpi70gigj",
  "_type": "table",
  "rows": [
    {
      "_key": "un2m67x5ybay",
      "_type": "row",
      "cells": [
        "Metric",
        "Hosted APIs (Vertex AI, etc.)",
        "RunPod Flash (warm execution)",
        "RunPod Flash (cold/trailing idle)"
      ]
    },
    {
      "_key": "4i08zo52h4or",
      "_type": "row",
      "cells": [
        "Cost per generation",
        "$0.0300 to $0.0400",
        "$0.00033",
        "$0.00200"
      ]
    },
    {
      "_key": "4tw3uvzq8ron",
      "_type": "row",
      "cells": [
        "Images per $1.00",
        "~25 images",
        "~3,000 images",
        "~500 images"
      ]
    },
    {
      "_key": "i43podmfnj6p",
      "_type": "row",
      "cells": [
        "Execution time",
        "2 to 5 seconds",
        "1.1s total (297ms pure GPU)",
        "1.1s total + 6s trailing idle"
      ]
    },
    {
      "_key": "6pphwi05d696",
      "_type": "row",
      "cells": [
        "Infrastructure overhead",
        "Zero setup",
        "Zero Dockerfiles (pure Python)",
        "Zero Dockerfiles (pure Python)"
      ]
    },
    {
      "_key": "7a71k1tclsqs",
      "_type": "row",
      "cells": [
        "Scale to zero",
        "Automatic",
        "Automatic ($0 when idle)",
        "Automatic ($0 when idle)"
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why "dockerless" matters
&lt;/h2&gt;

&lt;p&gt;Historically, running your own GPU endpoints meant:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crafting multi-stage Dockerfiles.&lt;/li&gt;
&lt;li&gt;Debugging CUDA base images against host driver versions.&lt;/li&gt;
&lt;li&gt;Pinning PyTorch builds to specific cuDNN variants.&lt;/li&gt;
&lt;li&gt;Pushing massive 10GB+ layers to container registries on every dependency tweak.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.runpod.io/" rel="noopener noreferrer"&gt;RunPod Flash&lt;/a&gt; eliminates this entire packaging loop. You define your GPU requirements, scaling floors and ceilings, and pip dependencies directly within Python application code via decorators.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diffusers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AutoPipelineForImage2D&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;runpod_flash&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;

&lt;span class="nd"&gt;@endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTX 4090&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RTX A5000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;min_replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Scale to zero floor ($0 idle cost)
&lt;/span&gt;    &lt;span class="n"&gt;max_replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Ceiling protection against runaway bills
&lt;/span&gt;    &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;torch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diffusers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transformers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accelerate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SDXLGenerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# High-leverage optimization: runs ONCE per container boot
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoPipelineForImage2D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stabilityai/sdxl-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;torch_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fp16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cuda&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Runs per incoming request (~297ms inference)
&lt;/span&gt;        &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_inference_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guidance_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;image_to_base64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local dev workflow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create and sync the virtual environment: &lt;code&gt;uv venv &amp;amp;&amp;amp; uv sync&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Authenticate: &lt;code&gt;flash login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Hot-reload against remote hardware: &lt;code&gt;flash dev&lt;/code&gt; (tunnels local requests directly to a warm GPU worker in the cloud)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full-stack architecture: the FlashFun.dev harness
&lt;/h2&gt;

&lt;p&gt;To benchmark open-weight models under real-world conditions, &lt;a href="https://flashfun.dev/" rel="noopener noreferrer"&gt;FlashFun.dev&lt;/a&gt; runs an unbiased blind A/B arena where two models race each other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint A: SDXL Turbo (2 steps) on a 24 GB GPU&lt;/li&gt;
&lt;li&gt;Endpoint B: Flux.1 Schnell (4 steps) on a 48 GB GPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The client (React/Vite) posts a battle request to a &lt;a href="https://workers.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare Worker&lt;/a&gt; running Hono, which handles Better Auth and a &lt;a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer"&gt;D1&lt;/a&gt; token meter, then fans out dispatches to both RunPod Flash workers and streams previews back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core architecture patterns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Server-side blind voting: model identifiers are completely omitted from the client response (labeled generically as &lt;code&gt;optionA&lt;/code&gt; and &lt;code&gt;optionB&lt;/code&gt;). The real mapping persists in Cloudflare D1 until the user submits their vote, preventing client-side inspection via browser devtools.&lt;/li&gt;
&lt;li&gt;Zero egress storage: generated images write directly to &lt;a href="https://developers.cloudflare.com/r2/" rel="noopener noreferrer"&gt;Cloudflare R2&lt;/a&gt;. With thousands of high-resolution PNGs served to visitors, avoiding traditional cloud egress fees keeps infrastructure margins intact.&lt;/li&gt;
&lt;li&gt;Append-only token ledger in D1: because SQLite does not support standard interactive multi-statement transactions, token deductions are handled via an append-only transaction ledger with atomic checks (&lt;code&gt;WHERE sum(credits) &amp;gt;= 1&lt;/code&gt;), preventing double-spend race conditions.&lt;/li&gt;
&lt;li&gt;Async polling over long HTTP holds: direct synchronous execution endpoints can time out if a worker hits a cold start (over 60 seconds). Submitting jobs asynchronously and polling provides real-time container warm-up indicators in the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Four levers to keep inference under a fraction of a cent
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Maintain a scale-to-zero floor (&lt;code&gt;min_replicas=0&lt;/code&gt;). An idle 24 GB GPU running continuously costs roughly $800/month doing nothing. Scale to zero ensures you pay solely for active user traffic.&lt;/li&gt;
&lt;li&gt;Load models in container &lt;code&gt;__init__&lt;/code&gt;. Pulling weights takes about 15 seconds once per container lifecycle. Initializing models inside request handlers incurs that 15-second penalty on every single image.&lt;/li&gt;
&lt;li&gt;Use distilled, low-step models. SDXL Turbo (2 steps) and Flux.1 Schnell (4 steps) deliver high visual quality at fractions of the compute time required by 30-step standard base checkpoints.&lt;/li&gt;
&lt;li&gt;Optimize transport over compute. In benchmarks, raw GPU computation took 297ms, while total round-trip wall-clock time was 1.1s. Over 70% of wall-clock latency is consumed by queuing, dispatch, and base64 serialization.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Project resources and links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GPU infrastructure: &lt;a href="https://www.runpod.io/" rel="noopener noreferrer"&gt;RunPod Serverless &amp;amp; RunPod Flash&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live application: &lt;a href="https://flashfun.dev/" rel="noopener noreferrer"&gt;FlashFun.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source code: &lt;a href="https://github.com/codercatdev/flash_app" rel="noopener noreferrer"&gt;GitHub repository (codercatdev/flash_app)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cloudflare stack: &lt;a href="https://workers.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare Workers&lt;/a&gt;, &lt;a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer"&gt;Cloudflare D1&lt;/a&gt;, &lt;a href="https://developers.cloudflare.com/r2/" rel="noopener noreferrer"&gt;Cloudflare R2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verification checklist for your deployment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Verify &lt;code&gt;flash login&lt;/code&gt; creates an active token inside &lt;code&gt;~/.runpod/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensure your &lt;code&gt;@endpoint&lt;/code&gt; configuration sets &lt;code&gt;min_replicas=0&lt;/code&gt; before pushing production workloads.&lt;/li&gt;
&lt;li&gt;Confirm R2 API tokens and custom domain bindings are added to your &lt;code&gt;wrangler.jsonc&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Run the repo benchmark script against your active endpoint to establish baseline warm vs. cold latency.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Watch the full build
&lt;/h2&gt;

&lt;p&gt;Watch the full build breakdown on YouTube: &lt;a href="https://youtu.be/7d6iJHEPMZI" rel="noopener noreferrer"&gt;Dockerless Serverless GPUs: How I Built a Fast, Cheap AI SaaS using RunPod Flash!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The video is the visual companion and live demonstration of the architecture, benchmarks, and codebase detailed above.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why We Are Absolutely Obsessed with Sticker Mule’s Holographic Stickers</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Tue, 23 Jun 2026 02:29:08 +0000</pubDate>
      <link>https://dev.to/codingcatdev/why-we-are-absolutely-obsessed-with-sticker-mules-holographic-stickers-3bmb</link>
      <guid>https://dev.to/codingcatdev/why-we-are-absolutely-obsessed-with-sticker-mules-holographic-stickers-3bmb</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/why-we-are-absolutely-obsessed-with-sticker-mule-s-holographic-stickers" rel="noopener noreferrer"&gt;https://codingcat.dev/post/why-we-are-absolutely-obsessed-with-sticker-mule-s-holographic-stickers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been following CodingCat.dev for a while, you might remember when I first talked about how much we love &lt;a href="https://www.stickermule.com/give" rel="noopener noreferrer"&gt;Sticker Mule&lt;/a&gt;. Well, we are back, and this time we have a new obsession: Holographic Stickers.&lt;/p&gt;

&lt;p&gt;Let’s be honest, as developers, our laptops are basically our creative canvases. A blank laptop lid is just a missed opportunity for self-expression! We’ve always loved the thick, durable, and vibrant vinyl stickers we get from Sticker Mule, but their holographic material takes things to a completely different dimension.&lt;/p&gt;

&lt;p&gt;Catching the Light (and the Eyes) The moment we opened our latest batch of CodingCat.dev stickers, we were blown away. The holographic effect isn't just a cheap glittery overlay; it's a premium, iridescent shine that catches the light beautifully from every angle. Whether you're coding in a dark room with just the glow of your monitors or sitting at a sunny coffee shop, these stickers shift colors and look absolutely incredible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0vtej87g6nb74laksrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy0vtej87g6nb74laksrl.png" width="452" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for the Real World Just like their classic die-cut stickers, the holographic ones don't skimp on quality. They are heavily weatherproof, scratch-resistant, and can survive being tossed in a backpack every day. We’ve slapped these on laptops, water bottles, and notebooks, and they hold up brilliantly without peeling or losing that mesmerizing rainbow effect.  &lt;/p&gt;

&lt;p&gt;Check out all of the ones I have been finding in the wild!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpzorjri58nmlhco5yrl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpzorjri58nmlhco5yrl.jpg" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w1lcyn9tajdrdwv3iuo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2w1lcyn9tajdrdwv3iuo.jpg" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Get Your Own! If you have a logo, a fun piece of art, or just a joke you want to turn into a sticker, we can't recommend the holographic option enough. It gives your brand that premium, futuristic feel that is perfect for the tech world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.stickermule.com/give" rel="noopener noreferrer"&gt;Sticker Mule&lt;/a&gt; makes the proofing process incredibly easy, and their turnaround times are lightning-fast.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AJ is Loving Sticker Mule</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Thu, 12 Mar 2026 15:05:26 +0000</pubDate>
      <link>https://dev.to/codingcatdev/aj-is-loving-sticker-mule-4m2b</link>
      <guid>https://dev.to/codingcatdev/aj-is-loving-sticker-mule-4m2b</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/aj-is-loving-sticker-mule" rel="noopener noreferrer"&gt;https://codingcat.dev/post/aj-is-loving-sticker-mule&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codingcat.dev/post/aj-is-loving-sticker-mule" rel="noopener noreferrer"&gt;https://codingcat.dev/post/aj-is-loving-sticker-mule&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have tried several sticker places and the images always come back terrible and the customer service stinks. Then I found Sticker Mule and everything has been like a dream! Check out all of their &lt;a href="https://www.stickermule.com/custom-stickers" rel="noopener noreferrer"&gt;custom stickers&lt;/a&gt;​!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;*&lt;a href="https://www.stickermule.com/unlock?ref_id=3730681701&amp;amp;utm_medium=link&amp;amp;utm_source=invite" rel="noopener noreferrer"&gt;Get $10 in Credit from AJ today!&lt;/a&gt;*Loading image...&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  All the stickers a cat could possible need
&lt;/h2&gt;

&lt;p&gt;AJ may have gotten his paws on the keyboard while I was ordering our first set of stickers, but honestly they are such a great deal I still placed the order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr41427nusq2i21rdy4yr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr41427nusq2i21rdy4yr.jpg" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Studio Wall Logo
&lt;/h2&gt;

&lt;p&gt;I was so impressed by how the stickers turned out that I had to get a logo for the new studio!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6aqia1rd7qt7ne6ords.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6aqia1rd7qt7ne6ords.jpg" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>JAMStackGR</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Thu, 12 Mar 2026 15:03:46 +0000</pubDate>
      <link>https://dev.to/codingcatdev/jamstackgr-a06</link>
      <guid>https://dev.to/codingcatdev/jamstackgr-a06</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/jamstackgr-1-sanity-io-as-a-backend" rel="noopener noreferrer"&gt;https://codingcat.dev/post/jamstackgr-1-sanity-io-as-a-backend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codingcat.dev/post/jamstackgr-1-sanity-io-as-a-backend" rel="noopener noreferrer"&gt;https://codingcat.dev/post/jamstackgr-1-sanity-io-as-a-backend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96sa0dtu1czddrxwdtd5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96sa0dtu1czddrxwdtd5.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JAMStack GR #1
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/1GsitEUyrC0xV4xlpFuRB9QKI5B4hdB5tZ5ldZEbuciU/edit?usp=sharing" rel="noopener noreferrer"&gt;https://docs.google.com/presentation/d/1GsitEUyrC0xV4xlpFuRB9QKI5B4hdB5tZ5ldZEbuciU/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever used Wordpress or Contentful? There is a new Headless CMS that might replace them.&lt;/p&gt;

&lt;p&gt;Distribute a single source of truth to any (all) channel, device or product.&lt;/p&gt;

&lt;p&gt;Sweet Query APIs Prepare data in queries using joins and projections. CDN cache multiple queries in a single request. GraphQL in beta.&lt;/p&gt;

&lt;p&gt;Powerful patching Powerful APIs for patching, exporting, and listening. No locking with real-time syncing.&lt;/p&gt;

&lt;p&gt;Secure &amp;amp; Compliant Fully GDPR Compliant. EU Hosted. Data encrypted at rest and in transit. APIs TLS / SSL only.&lt;/p&gt;

&lt;p&gt;Apps, not ops Sanity is a full-featured content API and editing solution that lets you concentrate on your core business.&lt;/p&gt;

&lt;p&gt;Enterprise comforts Third party login, free-form security rules, transactional writes and millions of documents.&lt;/p&gt;

&lt;p&gt;Scale ready Stop worrying about traffic spikes with asset and API CDNs on every continent – excepting Antarctica.&lt;/p&gt;

&lt;p&gt;Apps, not ops! Sanity is a full-featured content API and editing solution that lets you concentrate on your core business.&lt;/p&gt;

&lt;p&gt;Scale ready. Stop worrying about traffic spikes with asset and API CDNs on every continent – excepting Antarctica.&lt;/p&gt;

&lt;p&gt;Flexible and fast Structured content flows easily across APIs and services, enabling rapid innovation.&lt;/p&gt;

&lt;p&gt;Distribute freely Deep queries with joins on unstructured data. Select and reproject properties. Combine queries into a single cached result on a global CDN.&lt;/p&gt;

&lt;p&gt;Adapt continuously Customize editing environments to fit workflows and quickly iterate on data models.&lt;/p&gt;

&lt;p&gt;Ship fast Sanity is a modern, API-first digital content management system that lets developers work fast using technologies they love&lt;/p&gt;

&lt;p&gt;Customize Sanity is a headless CMS construction kit that you can adapt to create optimal editing experiences.&lt;/p&gt;

&lt;p&gt;Liberate legacy systems Import content in real-time from multiple sources and instantly query across them.&lt;/p&gt;

&lt;p&gt;Create custom editing workflows and experiences Icon for Customize in React.js Customize in React.js Open Source JavaScript editor. Full source code, permissive license.&lt;/p&gt;

&lt;p&gt;Instant UIs for complex data Model your content exactly the way you want with an extensive toolkit.&lt;/p&gt;

&lt;p&gt;Real-time Collaboration Edit structured, highly connected documents collaboratively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@kimbjrkman/how-to-use-inline-images-in-rich-text-with-sanity-io-c42594baa509https://jamstackthemes.dev" rel="noopener noreferrer"&gt;https://medium.com/@kimbjrkman/how-to-use-inline-images-in-rich-text-with-sanity-io-c42594baa509https://jamstackthemes.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Updating AJonP's Brand</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Wed, 04 Mar 2026 21:26:50 +0000</pubDate>
      <link>https://dev.to/codingcatdev/updating-ajonps-brand-2hp8</link>
      <guid>https://dev.to/codingcatdev/updating-ajonps-brand-2hp8</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/updating-ajonps-brand" rel="noopener noreferrer"&gt;https://codingcat.dev/post/updating-ajonps-brand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codingcat.dev/post/updating-ajonps-brand" rel="noopener noreferrer"&gt;https://codingcat.dev/post/updating-ajonps-brand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another evolution in the AJonP brand has come in the form of standardizing on acceptance. Making the most of neutral (non-stereotyped) colors. Taking a nod from Dev.to and updating AJ's tag to include a rainbow, as every mascot should have gender neutrality.&lt;/p&gt;

&lt;h2&gt;
  
  
  First the Technology
&lt;/h2&gt;

&lt;p&gt;If you have not checked out &lt;a href="https://figma.com/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt; yet please do so right meow! It is so powerful when you can take a component and reuse it throughout your site. Checkout how I can change the eyes in all of these different Logos, just by changing the main component.&lt;a href="https://www.youtube.com/embed/IFLQySh-Zb4?autoplay=0&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;modestbranding=1" rel="noopener noreferrer"&gt;https://www.youtube.com/embed/IFLQySh-Zb4?autoplay=0&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;modestbranding=1&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AJ's New Tag
&lt;/h2&gt;

&lt;p&gt;AJ will now be representing more people equally, and that is really important particularly to web development! We want a community that encourages everyone to share and learn together!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29ujlwr3wzoxv14ow6si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29ujlwr3wzoxv14ow6si.png" width="800" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Sanity.io to Builder.io Data Transfer</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Wed, 04 Mar 2026 21:25:41 +0000</pubDate>
      <link>https://dev.to/codingcatdev/sanityio-to-builderio-data-transfer-584i</link>
      <guid>https://dev.to/codingcatdev/sanityio-to-builderio-data-transfer-584i</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/post/sanity-io-to-builder-io-data-transfer" rel="noopener noreferrer"&gt;https://codingcat.dev/post/sanity-io-to-builder-io-data-transfer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz510i931ov9a6nwxnk84.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz510i931ov9a6nwxnk84.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am hoping to make a Sanity.io plugin for builder. In doing so I thought I would write a little conversion tool before hand to figure out all the ins and outs of Builder.io and Sanity.io, so I thought I would share some of my findings. I will keep this tutorial updated as the plugin progresses.&lt;/p&gt;

&lt;p&gt;The repo example has three things that you might find useful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deleting All Data&lt;/li&gt;
&lt;li&gt;Creating all new types&lt;/li&gt;
&lt;li&gt;Adding all new Data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Repo for conversion example&lt;/strong&gt; &lt;a href="https://github.com/CodingCatDev/sanity-to-builder.git" rel="noopener noreferrer"&gt;https://github.com/CodingCatDev/sanity-to-builder.git&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deleting All Data
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/CodingCatDev/sanity-to-builder/blob/84d8b5d436b2d674f916670317cb48de916c8a68/src/index.ts#L175" rel="noopener noreferrer"&gt;https://github.com/CodingCatDev/sanity-to-builder/blob/84d8b5d436b2d674f916670317cb48de916c8a68/src/index.ts#L175&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to delete all the data you need to first find all the models you want to delete&lt;/p&gt;

&lt;h3&gt;
  
  
  Get all Models from Builder (even unpublished)
&lt;/h3&gt;

&lt;p&gt;In sanity you deal with things like &lt;code&gt;draft.&lt;/code&gt; in documents. In Builder these items are just known to be unpublished version. So you need to have &lt;code&gt;includeUnpublished=true&lt;/code&gt; in your API call. I looked for a while in the sdk and have not found this option so far.&lt;/p&gt;

&lt;p&gt;You can handle this by using the fetch command instead of the sdk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CodingCatDev/sanity-to-builder/blob/84d8b5d436b2d674f916670317cb48de916c8a68/src/config.ts#L134" rel="noopener noreferrer"&gt;https://github.com/CodingCatDev/sanity-to-builder/blob/84d8b5d436b2d674f916670317cb48de916c8a68/src/config.ts#L134&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating all new types
&lt;/h2&gt;

&lt;p&gt;First you need to find all the types in your sanity.io database. I find it best to use Groq. So we can find all the types in Sanity and then create those in Builder as new Models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding all new Data
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Long Term goal
&lt;/h2&gt;

&lt;p&gt;The End goal is to build a plugin for syncing your data...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Builder content link&lt;/strong&gt; &lt;a href="https://github.com/BuilderIO/builder/tree/main/plugins/contentful" rel="noopener noreferrer"&gt;https://github.com/BuilderIO/builder/tree/main/plugins/contentful&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Supabase, Next.js and Builder.io</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Wed, 04 Mar 2026 21:17:30 +0000</pubDate>
      <link>https://dev.to/codingcatdev/supabase-nextjs-and-builderio-5cei</link>
      <guid>https://dev.to/codingcatdev/supabase-nextjs-and-builderio-5cei</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/podcast/supabase-next-js-and-builder-io" rel="noopener noreferrer"&gt;https://codingcat.dev/podcast/supabase-next-js-and-builder-io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>podcast</category>
    </item>
    <item>
      <title>The Purrfect Beginning</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Wed, 04 Mar 2026 21:15:57 +0000</pubDate>
      <link>https://dev.to/codingcatdev/the-purrfect-beginning-3jhb</link>
      <guid>https://dev.to/codingcatdev/the-purrfect-beginning-3jhb</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/podcast/0-0-the-purrfect-beginning" rel="noopener noreferrer"&gt;https://codingcat.dev/podcast/0-0-the-purrfect-beginning&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are on a mission to provide you with the latest tools and trends, that take you from a house cat to a fierce LION.&lt;/p&gt;

&lt;p&gt;Even when your code isn’t feline that good, we ensure you’ll get there with the right cat-i-tude.&lt;/p&gt;

&lt;p&gt;Alright.. Let’s get up and GIT moving..&lt;/p&gt;

&lt;p&gt;Right Meow!!!&lt;/p&gt;

&lt;p&gt;Learning how to be a developer is hard, Purrfect.dev will show you how to grow as a developer bit by bit.&lt;/p&gt;

&lt;p&gt;What We Cover&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JAMStack (Javascript, API, MarkUp)&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Gaming (Unity)&lt;/li&gt;
&lt;li&gt;Mobile&lt;/li&gt;
&lt;li&gt;AWS, GCP, Azure&lt;/li&gt;
&lt;li&gt;Serverless&lt;/li&gt;
&lt;li&gt;Agile&lt;/li&gt;
&lt;li&gt;Scrum&lt;/li&gt;
&lt;li&gt;Project and Program Management&lt;/li&gt;
&lt;li&gt;Showing developers the successful path&lt;/li&gt;
&lt;li&gt;Quickest way to get PAID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links&lt;/p&gt;

&lt;p&gt;Send in a voice message: &lt;a href="https://podcasters.spotify.com/pod/show/purrfect-dev/message" rel="noopener noreferrer"&gt;https://podcasters.spotify.com/pod/show/purrfect-dev/message&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>podcast</category>
    </item>
    <item>
      <title>GenAI for Engineers, What's Real, What's Not and What's Coming</title>
      <dc:creator>Alex Patterson</dc:creator>
      <pubDate>Wed, 19 Nov 2025 13:16:50 +0000</pubDate>
      <link>https://dev.to/codingcatdev/genai-for-engineers-whats-real-whats-not-and-whats-coming-j7p</link>
      <guid>https://dev.to/codingcatdev/genai-for-engineers-whats-real-whats-not-and-whats-coming-j7p</guid>
      <description>&lt;p&gt;Original: &lt;a href="https://codingcat.dev/podcast/genai-for-engineers-what-s-real-what-s-not-and-what-s-coming" rel="noopener noreferrer"&gt;https://codingcat.dev/podcast/genai-for-engineers-what-s-real-what-s-not-and-what-s-coming&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/BaJ9ROVc2Lk" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;__&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By the end of this post, you’ll understand:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The new engineering landscape GenAI has created&lt;/li&gt;
&lt;li&gt;Practical best practices for leveraging GenAI in your work&lt;/li&gt;
&lt;li&gt;Mistakes and misconceptions you absolutely want to avoid&lt;/li&gt;
&lt;li&gt;Inspiring tools and frameworks that are already changing the game&lt;/li&gt;
&lt;li&gt;What’s on the horizon, both thrilling and a little overwhelming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: Why GenAI Has Every Engineer Talking
&lt;/h2&gt;

&lt;p&gt;You know the feeling—everyone’s suddenly talking about automation, agents, and how AI is about to revolutionize everything. You read about companies “eliminating jobs” thanks to GenAI, and you’re wondering… Is this really happening? Is this a threat, or is it a huge opportunity?&lt;/p&gt;

&lt;p&gt;If you’ve ever sat with those questions, you’re in good company! On our latest episode, I spoke with Balki, a seasoned CTO, about how GenAI is reshaping engineering roles, what’s actually working in startups right now, and how you can avoid the typical pitfalls to come out ahead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this blog post matters:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“First time founders focus on product. Successful founders focus on distribution.” — Balki&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means it’s not just about building with AI—it’s about making it useful, scalable, and profitable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Balki: Everyday Startup Battles, AI Style
&lt;/h2&gt;

&lt;p&gt;Before we jump into the nitty-gritty, let’s meet our expert guest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balki's Career: From BigCorp to Fractional CTO
&lt;/h3&gt;

&lt;p&gt;Balki spent his first decade as an engineer at &lt;a href="https://www.fiserv.com" rel="noopener noreferrer"&gt;Fiserv&lt;/a&gt;—deep in the online banking trenches, working primarily on Microsoft’s tech stack. Eventually, he pivoted to leading his own startup, taking the leap from “comfortable” to “complete accountability.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; The happiness came less from money and more from ownership and learning, even when the risks were high.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“There's nobody else to complain about. I’m accountable for everything.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How the Leap Happened (and What You Can Learn)
&lt;/h3&gt;

&lt;p&gt;Far from a sudden “drop everything and start a company,” Balki’s transition was informed by education (an EMBA program) and practical testing. The final pivot occurred in an entrepreneurship course—where building a product from scratch “felt like coming home.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Big jumps are rarely one moment. Often, it’s a series of small pivots, each featuring late-night emails, experimental coding, and a few “blind confidence” moments.&lt;/p&gt;

&lt;h2&gt;
  
  
  CTO Roles: Full-Time, Fractional, and What That Means for Startups
&lt;/h2&gt;

&lt;p&gt;Ever wondered what the difference is between a full-time CTO and a fractional CTO? Balki’s journey is a fascinating example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Full-Time CTO vs. Fractional CTO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full-Time CTO:&lt;/strong&gt; Committed to one company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fractional CTO:&lt;/strong&gt; Provides strategic, high-impact guidance to several startups at once—usually part-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fractional CTOs thrive by:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bringing deep expertise from multiple sectors&lt;/li&gt;
&lt;li&gt;Targeting high-leverage activities (think: 20 hours a month laser-focused on the biggest problems)&lt;/li&gt;
&lt;li&gt;Accelerating product clarity and distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Big insight:&lt;/strong&gt; Every minute counts. When you’re dropping in for a few hours a week, priorities become crystal clear!&lt;/p&gt;

&lt;h2&gt;
  
  
  GenAI for Engineers: From “Just Another Tool” To Business Superpower
&lt;/h2&gt;

&lt;p&gt;GenAI isn’t new—but the &lt;em&gt;way&lt;/em&gt; it’s used by engineering teams is evolving fast. Balki says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The market is flooded with proof-of-concept tools targeting non-engineers. In my world, there’s a big chasm between building a prototype, getting traction, and scaling.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can hack together a quick POC with &lt;a href="https://www.lovelace.ai/" rel="noopener noreferrer"&gt;Lovelace&lt;/a&gt; or &lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; in minutes. But scaling that prototype—making it reliable, distributable, and profitable—is a different sport.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Scaling Is So Hard (and Where GenAI Can Help)
&lt;/h3&gt;

&lt;p&gt;Most startups stall, even after they get initial traction. Balki specializes in bridging this “chasm”—helping teams go from “scrappy” to “scalable.”&lt;/p&gt;

&lt;h2&gt;
  
  
  “Engineering Excellence”: Balki’s Five Pillars + GenAI
&lt;/h2&gt;

&lt;p&gt;Let’s get super practical. Any successful engineering team needs &lt;em&gt;engineering excellence&lt;/em&gt;. Before GenAI, Balki set out four pillars. With GenAI, a fifth was added. Here’s the breakdown:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Four Classic Pillars
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automated Testing&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Validates code. Makes sure your software can withstand real-world scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pipelines&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Enables drama-free code deployments.&lt;/li&gt;
&lt;li&gt;Example: &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Let’s engineers be the &lt;em&gt;first&lt;/em&gt; to know when something breaks (not your customers).&lt;/li&gt;
&lt;li&gt;Example: &lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular Architecture&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Flexible, scalable code organization—critical for rapid evolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Fifth Pillar: GenAI Fluency
&lt;/h3&gt;

&lt;p&gt;Today, &lt;em&gt;GenAI fluency&lt;/em&gt; is just as critical. In fact, Balki breaks this down further into three sub-pillars (detailed below).&lt;/p&gt;

&lt;h4&gt;
  
  
  Why GenAI Matters
&lt;/h4&gt;

&lt;p&gt;Thanks to GenAI, startups can rapidly accelerate improvement in these pillars—without blowing the budget or risking bankruptcy. You can stay agile and address technical debt much faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  GenAI and Job Roles: Are We Really Automating Ourselves Out?
&lt;/h2&gt;

&lt;p&gt;The media loves to declare “X jobs eliminated by GenAI!”—but is this really the story?&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s Actually Changing in Engineering
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Specialization is risky.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Engineers who only focus on one niche (e.g., frontend specialist, TypeScript expert) are seeing those tasks rapidly commoditized.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“For 20 years it was similar—good engineers could rest on their laurels. Now that’s been commoditized. Founder mindset is what matters.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Full-stack skills&lt;/strong&gt; are becoming standard. The ability to build, deploy, test, and validate end-to-end is the new norm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what tasks are ripe for GenAI automation today?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Balki notes: pure specialization may soon be obsolete, and “mundane tasks” (like repetitive API wrappers, boilerplate code, out-of-date documentation) are prime targets for automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Example: API Wrappers &amp;amp; SDKs
&lt;/h3&gt;

&lt;p&gt;Many engineers are scrambling to build “MCP servers”—wrappers around APIs and OpenAI SDKs. With the release of the &lt;a href="https://developers.openai.com/apps-sdk/" rel="noopener noreferrer"&gt;OpenAI App SDK&lt;/a&gt;, a new “walled garden” effect is emerging. Is this healthy? Are we risking another App Store scenario?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s still hard to say if this is a passing trend or a lasting shift.&lt;/strong&gt; For B2B SaaS, the immediate risk may be low, but keeping up AI fluency is more important than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering AI Fluency: Climbing the Three GenAI Sub-Pillars
&lt;/h2&gt;

&lt;p&gt;What does “AI fluency” really mean for engineering teams? Balki’s framework divides it into three practical levels:&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 1: Leveraging AI Tools for Engineer Productivity
&lt;/h3&gt;

&lt;p&gt;This is all about using AI tools—like &lt;a href="https://www.cursor.so/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, &lt;a href="https://www.claude.com/product/claude-code" rel="noopener noreferrer"&gt;Claud Code&lt;/a&gt;, &lt;a href="https://coderabbit.ai" rel="noopener noreferrer"&gt;Code Rabbit&lt;/a&gt;, and &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;—to supercharge your coding workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cursor and Cloud Code excel for different personalities—Cursor for leaders, Cloud Code for craftspeople. Setting team-wide Cursor rules keeps best practices consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 2: Using AI Tools to Boost Engineering Excellence
&lt;/h3&gt;

&lt;p&gt;Apply AI directly to accelerate the four classic pillars.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testing &amp;amp; Coverage&lt;/strong&gt; (e.g., auto-generating tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Pipelines&lt;/strong&gt; (e.g., AI-powered CI/CD suggestions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity &amp;amp; Code Review&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://coderabbit.ai" rel="noopener noreferrer"&gt;Code Rabbit&lt;/a&gt;: Cuts review time on pull requests, boosting speed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.axle.ai/" rel="noopener noreferrer"&gt;Axel AI&lt;/a&gt;: Embeds in legacy code to help modernize architecture.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://antithesis.com" rel="noopener noreferrer"&gt;Antithesis&lt;/a&gt;: Runs containers to catch edge-case bugs in staging.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Anything that can accelerate engineering excellence lights up my eyes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Level 3: Incorporating AI Directly Into Product Features
&lt;/h3&gt;

&lt;p&gt;This is the “cool stuff”—voice agents, automated support, and smarter applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But beware:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Before over-engineering with tools like &lt;a href="https://www.langchain.com/" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt; and fancy agents, start simple. OpenAI API calls often get the job done. As you get closer to product market fit, start worrying about &lt;em&gt;human evals&lt;/em&gt;, prompt tuning, and security concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro move:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Start with &lt;em&gt;human-in-the-loop&lt;/em&gt;. Fully automated AI features rarely work perfectly from Day 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Distributed Teams: How GenAI Changes Remote Collaboration
&lt;/h2&gt;

&lt;p&gt;If your team is spread around the world—Eastern Europe, Latin America, Hong Kong—you know communication and documentation aren’t easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GenAI is a game-changer for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Communication:&lt;/strong&gt; Coaching team members to use GenAI for clear, culturally-appropriate communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; Auto-generating code and onboarding docs that are actually useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“With proper documentation and plan, new engineers can be effective in two weeks—if not one.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Challenge your team:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No more 90-day onboarding. With GenAI-assisted docs, you can cut that down to 1-2 weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Case: devIQ—Bridging Technical and Non-Technical Teams
&lt;/h2&gt;

&lt;p&gt;Balki’s tool, &lt;a href="https://www.deviq.io/" rel="noopener noreferrer"&gt;devIQ&lt;/a&gt; (try it for free!), was born from a common startup pain: the disconnect between technical and non-technical staff.&lt;/p&gt;

&lt;h3&gt;
  
  
  How devIQ Helps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assesses engineering teams:&lt;/strong&gt; Across Balki’s five pillars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translates complexity:&lt;/strong&gt; Makes technical progress educational for CEOs and business leads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gives grades and actionable steps:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;“Your grade is C in automated testing, B in GenAI fluency.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offers prescriptive paths:&lt;/strong&gt; Specific ideas to improve grades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use-case:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When Balki drops into an engagement, devIQ helps quickly pinpoint engineering gaps and opens authentic conversation between product and engineering.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you methodically invest in the right pillars, your org will be 95th percentile or better—no matter your product.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Practical Tips for Staying Current in GenAI Engineering
&lt;/h2&gt;

&lt;p&gt;Let’s face it—AI moves &lt;em&gt;insanely&lt;/em&gt; fast. It’s easy to feel lost, overwhelmed, or permanently behind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balki’s Learning Strategy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus 80% on problems inside your organization.&lt;/strong&gt;
Go out and find solutions that fit your actual engineering needs (e.g., legacy code modernization, engineering excellence pillars).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spend 20% dabbling in shiny new things.&lt;/strong&gt;
Keeps your creative juices flowing and occasionally unlocks breakthrough opportunities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Discipline matters.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Without intentional focus, you’ll spend all your time chasing distractions.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Will AI Replace Us?”: The Real Question to Ask Before Adding GenAI
&lt;/h2&gt;

&lt;p&gt;This is the million-dollar question—and it’s not theoretical. Before shoving AI into your product, be honest:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is this something the customers want, and does it make their lives better by using GenAI inside the tool?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don’t waste time making your prompts perfect or optimizing the next toolchain before confirming user demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro advice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insert a &lt;em&gt;human eval&lt;/em&gt; into early prototypes.&lt;/li&gt;
&lt;li&gt;Gradually replace manual involvement as the product matures.&lt;/li&gt;
&lt;li&gt;Automation isn’t instant—chip away bit by bit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future: Next-Level Tools and “The Stone Age to Modern Age” Shift
&lt;/h2&gt;

&lt;p&gt;AI moves at a ridiculous pace. Here’s what’s coming—and why you should care.&lt;/p&gt;

&lt;h3&gt;
  
  
  For New Engineers
&lt;/h3&gt;

&lt;p&gt;Starting today is easier than ever—you’re entering the AI-native world. But those legacy problems will catch up eventually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Team Resilience: Don’t Go It Alone
&lt;/h2&gt;

&lt;p&gt;Here’s a simple tip: get out of your shell. Connect with peer groups, ask for feedback, and share what you’re planning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“When I see a new tool, I don’t jump in right away. I bring it to my cohorts for feedback, and I shave off weeks and hundreds of hours of research.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get richer, higher quality feedback by collaborating—AI or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary: Key Takeaways for GenAI Engineers
&lt;/h2&gt;

&lt;p&gt;Let’s wrap it all up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GenAI &lt;strong&gt;has transformed engineering&lt;/strong&gt;—rapid POCs, scalable products, and changed job roles.&lt;/li&gt;
&lt;li&gt;“Engineering excellence” depends on five pillars, with GenAI fluency now essential.&lt;/li&gt;
&lt;li&gt;Don’t specialize too narrowly—full-stack, founder mindset is becoming the norm.&lt;/li&gt;
&lt;li&gt;Use AI for &lt;em&gt;real&lt;/em&gt; productivity: code review, documentation, collaboration, and direct product features.&lt;/li&gt;
&lt;li&gt;Start simple—and always validate with customer demands before ramping up automation.&lt;/li&gt;
&lt;li&gt;Leverage frameworks like devIQ to bridge business/engineering gaps and accelerate progress.&lt;/li&gt;
&lt;li&gt;Stay disciplined in your learning, and seek feedback from peers to keep your engineering sharp.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>podcast</category>
    </item>
  </channel>
</rss>
