<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~files/atom-premium.xsl"?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedpress="https://feed.press/xmlns" xmlns:media="http://search.yahoo.com/mrss/" xmlns:podcast="https://podcastindex.org/namespace/1.0">
  <feedpress:locale>en</feedpress:locale>
  <feedpress:newsletterId>telerik-blogs</feedpress:newsletterId>
  <link rel="hub" href="https://feedpress.superfeedr.com/"/>
  <logo>https://static.feedpress.com/logo/telerik-blogs-5aafd3c47efc3.jpg</logo>
  <title type="text">Telerik Blogs</title>
  <subtitle type="text">The official blog of Progress Telerik - expert articles and tutorials for developers.</subtitle>
  <id>uuid:92800846-b6be-431d-ac51-1ce7e058fe3c;id=527</id>
  <updated>2026-05-29T14:34:45Z</updated>
  <link rel="alternate" href="https://www.telerik.com/"/>
  <link rel="self" type="application/atom+xml" href="https://feeds.telerik.com/blogs"/>
  <entry>
    <id>urn:uuid:5c3a107b-0444-4d8f-a104-97f53edd0760</id>
    <title type="text">How a 6-Person Team Shipped an AI-First Platform with KendoReact</title>
    <summary type="text">For teams building AI-driven applications with complex workflows, treating the UI layer as infrastructure can dramatically reduce friction as the product evolves. For Icanpreneur, KendoReact became that foundation.</summary>
    <published>2026-05-28T14:47:38Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Kathryn Grayson Nanz </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/how-a-6-person-team-shipped-an-ai-first-platform-with-kendoreact"/>
    <content type="text"><![CDATA[<p>Wiring up an LLM endpoint takes an afternoon; the harder engineering problem is building a UI layer that can absorb the inherent unpredictability of AI without introducing layout thrashing, inconsistent interaction patterns or sprawl that a small team can't maintain. </p><p>That's the problem Icanpreneur solved with KendoReact. </p><blockquote>&ldquo;The hard part with AI is not just calling a model &ndash; it&rsquo;s designing complex, trustworthy workflows around it. That&rsquo;s where KendoReact helped a lot.&rdquo; </blockquote><p><a href="https://www.icanpreneur.com/">Icanpreneur&rsquo;s platform</a> orchestrates guided, AI-assisted workflows that blend business logic, structured data and real-time feedback into a familiar, approachable experience. Users move through Lean Canvas modeling, validation flows and strategic planning steps with AI augmenting their thinking along the way. They&rsquo;re now used not only by early-stage founders but also by accelerators, innovation hubs and product teams inside organizations such as Founder Institute, Campus X, Science Park Graz, ABLE Activator, Sofia Tech Park, Visa Innovation Program Europe and Telerik Academy&rsquo;s Upskill Product Management program. </p><p>Raw AI output can be unpredictable. Without a stable, consistent UI foundation, that translates into friction and mistrust. The consistency, predictability and performance of <a href="https://www.telerik.com/kendo-react-ui">KendoReact</a> in the UI layer turned the output of Icanpreneur&rsquo;s AI assistant, IVA, into something usable and trustworthy. For Icanpreneur&rsquo;s six-person team, KendoReact was the infrastructure that made AI usable at scale. </p><h2>Icanpreneur&rsquo;s Architecture </h2><p>At a high level, Icanpreneur&rsquo;s platform is structured as a layered system that separates UI composition and user interaction, server / API management and LLM orchestration.</p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/screenshot-2026-05-28-at-9-44-37-am.png?sfvrsn=127900_2" height="844" style="max-width:100%;height:auto;" title="Screenshot 2026-05-28 at 9.44.37 AM" width="1016" alt="A graphic depiction of the frontend architecture " sf-size="411556" /><p>KendoReact is the core of the Icanpreneur UI layer, allowing them to guide users through complex multi-pane screens, support long-running workflows with consistent UI patterns and handle advanced multi-step journeys without overwhelm. Every major module (Lean Canvas, conversational interview console, go-to-market editor, persona builder) is composed from the same KendoReact primitive set, themed consistently and governed by the same layout contracts. That decision paid compounding dividends as the product scaled. </p><p>In an AI-first platform, it can be tempting to start thinking about the UI as set dressing; just a thin layer over the APIs to make things &ldquo;look pretty&rdquo; for the users. However, AI interaction patterns are still very new and unfamiliar to many users. A UI that naturally folds AI into the user experience can be a real differentiator in the competitive market. </p><blockquote>&ldquo;Founders in partner programs started telling us that the interview, insights and go-to-market flow &lsquo;feels like one tool &ndash; simple and intuitive, not five stitched together.'&rdquo; </blockquote><p>AI technology is impressive but UI engineers are still the ones who translate that potential into true value for the user. In Icanpreneur&rsquo;s case, they needed stable layout primitives, reliable form controls and high-performance data visualization components &ndash; all of which had to present AI output reliably (while responses were streaming, partial or evolving) without triggering unnecessary re-renders or layout shifts. KendoReact provided that and more, empowering the team to focus their effort on user experience, business logic and AI orchestration. </p><h3>Composability as a Force Multiplier </h3><p>One of the most important architectural decisions was treating KendoReact not as a collection of finished widgets or mere building blocks to be combined but as true UI infrastructure. KendoReact powers everything from research dashboards and conversational interview consoles to mini-CRMs and multi-step go-to-market editors.</p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/screenshot-2026-05-28-at-9-45-10-am.png?sfvrsn=1b568e58_2" height="802" style="max-width:100%;height:auto;" title="Screenshot 2026-05-28 at 9.45.10 AM" width="1370" alt="A screenshot of the Icanpreneur interface, built with KendoReact components" sf-size="418054" /><p>Foundation pieces were combined to create higher-order workflows that guide users through their interactions with IVA. Rather than building custom UI for each flow, the team defined composable patterns built on KendoReact primitives. For example, the multi-step validation flow reused the same layout + navigation structure, AI feedback panels reused consistent container and typography patterns and interview summaries reused standardized layout and card structures. Because the Icanpreneur team didn&rsquo;t need to design complex new interaction patterns for each additional feature, they were able to implement quickly and iterate fast &ndash; smoothly layering their AI workflows on top of KendoReact&rsquo;s component system. </p><h3>Consistent UX for Novel AI Workflows </h3><p>For Icanpreneur users, this meant that they never had to open a page and feel unsure of where to go or what to do next &ndash; even though the AI-powered technology may be new, it leveraged familiar and consistent patterns to guide them through the experience. </p><blockquote>&ldquo;Because all the AI-driven experiences reuse the same KendoReact components as the rest of the app, they behave in a predictable way. Users don&rsquo;t have to &lsquo;learn' a new interface just because AI is involved &ndash; it feels like one coherent workspace.&rdquo; </blockquote><h3>Design-to-Code Fidelity </h3><p>With KendoReact, Icanpreneur designers and engineers worked from the same component language, which meant no translation layer between design and implementation, no pixel-chasing and no divergence between what's mocked and what ships. Designers also created a custom design system using the <a href="https://www.telerik.com/figma-kits">Kendo UI Figma Kits</a> and the <a href="https://www.telerik.com/design-system/docs/">Progress Design System Kit</a>, which greatly reduced the time needed to create mockups and new pages. </p><blockquote>&ldquo;Using the Kendo UI Figma Kits and a custom Kendo theme, we aligned design and development from day one. Most new features now start as a quick sketch in our KendoReact-based design system and turn into a working screen in days instead of weeks.&rdquo; </blockquote><h3>Increased Development Speed </h3><p>AI-assisted workflows evolve quickly: new steps get added, feedback formats change and validation criteria expand. Because KendoReact components are extensible and <a href="https://www.telerik.com/kendo-react-ui/components/styling">themeable</a>, the Icanpreneur team could meet these challenges while still preserving UX consistency. As workflows grew, the UI layer remained adaptable; less time debugging or re-writing UI logic meant faster revision cycles and more shipped features. </p><blockquote>&ldquo;New workflow-style features (such as a new research flow or AI-assisted editor) now typically go from idea to shipped version in days instead of weeks, because we mostly compose existing KendoReact patterns instead of building UI from scratch.&rdquo; </blockquote><h2>The UX of AI </h2><p>Some of the biggest challenges in AI-first applications are handling uncertainty (usually in the form of partial / still evolving responses) and guiding users through new workflows. The Icanpreneur team leveraged KendoReact&rsquo;s design tools to create UX patterns that integrate AI feedback into existing, structured UI flows, so users are never left wondering &ldquo;what now?&rdquo;.</p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/screenshot-2026-05-28-at-9-46-59-am.png?sfvrsn=e6e4d053_2" height="836" style="max-width:100%;height:auto;" title="Screenshot 2026-05-28 at 9.46.59 AM" width="1370" alt="A screenshot of the Icanpreneur interface, built with KendoReact components" sf-size="477986" /><p>One of the most unique features of Icanpreneur is their Synthetic Customer Interview feature, which allows their AI assistant, IVA, to answer questions as though it was a potential customer in their target market. Not all teams have easy access to customers to run interviews with, so this allows founders to &ldquo;stress-test&rdquo; their hypotheses quickly across multiple scenarios. That output helps them refine their questions and assumptions before talking to real people. Afterwards, IVA reviews all the data (across both real and synthetic customer interviews) to summarize, highlight patterns and extract quotes and evidence that can be leveraged in personas and further market research. </p><blockquote>&ldquo;When we designed IVA, the conversational interview console and the research workspace, we could prototype and ship quickly because we already had chat-style layouts built from existing KendoReact <a href="https://www.telerik.com/kendo-react-ui/components/layout">Layout</a> and <a href="https://www.telerik.com/kendo-react-ui/components/form">Form</a> components, multi-step flows for things like research setup and go-to-market editors and reusable <a href="https://www.telerik.com/kendo-react-ui/components/layout/expansionpanel">Panels</a>, <a href="https://www.telerik.com/kendo-react-ui/components/layout/drawer">Drawers</a>, <a href="https://www.telerik.com/kendo-react-ui/components/dialogs/dialog">Dialogs</a> and <a href="https://www.telerik.com/kendo-react-ui/components/grid">Data Grids</a> for displaying AI outputs, suggestions and insights aggregation&rdquo; </blockquote><p>Using KendoReact meant that not only could they leverage these familiar user patterns &ndash; but also that common AI concerns (such as slow, partial or unexpected responses) could be handled with UI structures and error responses that users already knew how to interact with. </p><h2>Performance and Scalability </h2><p>Icanpreneur workflows are complex, multi-stage journeys. Moving from idea to hypothesis, validating with AI or human-led interviews, identifying patterns and extracting valuable feedback, generating personas and finally creating landing pages or pitch decks &ndash; any one of these alone would be demanding but all together they offer a true development challenge. Each step builds upon the previous and the context must be preserved as the user moves between them. Without careful performance engineering, rendering and re-rendering these views would quickly degrade the user experience. </p><p>AI workflows can introduce frequent state updates as responses stream in or evolve - for example, when IVA synthesizes interview insights or drafts positioning. In poorly structured UIs, this can lead to layout thrashing or lag. However, these updates render inside structured, well-optimized KendoReact components, so the Icanpreneur UI remains stable.</p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/screenshot-2026-05-28-at-9-47-32-am.png?sfvrsn=c831f8dc_2" height="818" style="max-width:100%;height:auto;" title="Screenshot 2026-05-28 at 9.47.32 AM" width="1380" alt="A screenshot of the Icanpreneur interface, built with KendoReact components" sf-size="752777" /><p>As features accumulate, custom CSS and one-off component implementations are a common source of bundle bloat and regression risk. At Icanpreneur, new features and modules all plug into the same KendoReact UI system (rather than introducing new patterns and components). That allows even a small team to control UI sprawl and manage bundle growth. Custom CSS &ndash; a common pain point for fast-growing applications &ndash; is significantly reduced and centralized, because the UI is themed consistently. This kept initial load times reasonable even as the feature surface expanded. </p><blockquote>&ldquo;When we introduce new AI-driven experiences, they use the same KendoReact components, so we see far fewer UI regressions. That made it much easier to roll out new AI features without exploding our QA surface.&rdquo; </blockquote><p>That smaller, bounded QA surface meant faster turnaround and faster time to ship, while the lower complexity means that the small team was able to manage the expedited growth without being overwhelmed. New features that reuse existing KendoReact components inherit known-good behavior, so regression risk didn't scale with feature additions. </p><p>KendoReact&rsquo;s components are designed for high-density, data-heavy enterprise applications; no reinvention (or re-optimization) was required even for complex components like grids, forms and dialogs. KendoReact reduced the need to solve hard performance problems manually, allowing Icanpreneur to access enterprise-level quality with a startup-size team. </p><h2>Icanpreneur: Powered by KendoReact </h2><p>Icanpreneur began as a structured way to guide founders from idea to product-market fit. Today it operates as a full AI co-founder, with IVA empowering entrepreneurs to ideate, validate and grow their companies as a trusted partner. </p><p>By treating the UI layer as infrastructure and building on KendoReact from day one, the team was able to: </p><ul><li>Scale complex, AI-driven workflows with consistency </li></ul><ul><li>Ship new features rapidly without fragmenting UX </li></ul><ul><li>Deliver a coherent experience across classic and AI-powered screens </li></ul><p>For teams building AI-driven workflows, the UI layer is crucial: it's what determines whether AI output becomes a usable, trustworthy product or a source of friction. Icanpreneur's architecture is a case study in treating that layer seriously from day one. Or, as the Icanpreneur team said themselves: </p><blockquote>&ldquo;A six-person core team is able to maintain and evolve a fairly large, AI-first product (research, interviews, personas, positioning, landing pages, sales decks, etc.) without a separate &ldquo;component team&rdquo; or design system squad &ndash; KendoReact is that system for us.&rdquo; </blockquote><p>For teams building AI-driven applications with complex workflows, treating the UI layer as infrastructure can dramatically reduce friction as the product evolves. For Icanpreneur, KendoReact became that foundation: explore how KendoReact could become that foundation for your team, as well.</p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:78e837f7-ae0c-4d36-a64b-f2f682cf9e0d</id>
    <title type="text">Design Principles Unpacked, No. 5: Contrast</title>
    <summary type="text">Every design principle in this series has been about one thing: managing differences on purpose. Contrast is the thread that ties them all together.</summary>
    <published>2026-05-28T13:17:15Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Teon Beijl </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/design-principles-unpacked-no-5-contrast"/>
    <content type="text"><![CDATA[<p><span class="featured">Every design principle in this series has been about one thing: managing differences on purpose. Contrast is the thread that ties them all together.</span></p><p>If you want to master one thing in design, master this.</p><p>Not layout, color or typography. <strong>Contrast.</strong></p><p>Because every design decision you&rsquo;ll ever make is a decision about contrast. Managing the differences.</p><h2 id="a-dashboard-with-sliders">A Dashboard With Sliders</h2><p>Designing is a bit like a mixing board. Every element has properties you can dial up or down. Size. Weight. Color. Spacing. Position.</p><p>When you move a slider, you&rsquo;re changing its relationship to everything around it. That is contrast.</p><p>And like any relationship, it only works when the differences serve a purpose.</p><p>Slide everything to the center and you get a flat design. Slide everything to the extremes and you get noise.</p><p>But find the right positions&mdash;some high, some low, some barely there&mdash;and the design works.</p><p>The best designers I&rsquo;ve worked with don&rsquo;t follow all the rules. They play with contrast the way a musician plays with sounds. They know when to push a slider up and when to pull it back.</p><h2 id="differences-that-mean-something">Differences That Mean Something</h2><p>Here&rsquo;s what most people miss about contrast: it&rsquo;s not about making things look different. It&rsquo;s about making differences mean something.</p><ul><li>A bigger heading isn&rsquo;t just bigger. It means, <em>this matters first</em>.</li><li>A muted label isn&rsquo;t just subtle. It means, <em>this can wait</em>.</li><li>Extra whitespace isn&rsquo;t just empty. It means, <em>breathe here</em>.</li></ul><p>Without intent, contrast is noise. With intent, contrast is communication.</p><p>That&rsquo;s the difference between a designer who arranges and a designer who composes.</p><h2 id="the-thread-through-this-series">The Thread Through This Series</h2><p>In this series, we&rsquo;ve unpacked principles that designers use every day. Alignment. Hierarchy. Affordance. Balance.</p><p>Each one looked different on the surface. But underneath, they&rsquo;ve all been about the same essence: contrast.</p><p>Alignment is about orienting to a guideline. When elements align, their differences become manageable. The chaos reduces. You can start to see the structure. Alignment works by <em>reducing</em> contrast&mdash;bringing things closer to a shared reference so the design feels cohesive.</p><p>Hierarchy does the opposite. It introduces difference on purpose. It separates what matters first from what can wait. A bold heading next to body text isn&rsquo;t just styling&mdash;it&rsquo;s a decision about priority. Hierarchy works by <em>increasing</em> contrast so the eye knows where to go.</p><p>Affordance makes purpose visible. A button that looks pressable, a handle that looks pullable&mdash;these work because they stand out from their surroundings just enough to signal what they&rsquo;re for. Affordance works by <em>emphasizing</em> contrast so action becomes obvious.</p><p>And balance&mdash;or rather, harmony&mdash;composes all of it. It doesn&rsquo;t flatten differences. It manages them. It asks whether each element is contributing to the whole, not whether everything has settled down. Harmony works by <em>orchestrating</em> contrast so differences collaborate instead of compete.</p><p>Every principle in this series has been a different way of using contrast. Reducing it. Increasing it. Emphasizing it. Orchestrating it.</p><p>Contrast is the key to good design.</p><h2 id="beyond-design">Beyond Design</h2><p>The more I design businesses, the more I see it: Good design is about managing change. The delta. The difference.</p><p>Every improvement is a contrast. Where you are versus where you want to be. The current state versus the intended one.</p><p>That&rsquo;s what designers do. We don&rsquo;t just make things look good. We make decisions about difference. We move sliders. We create the contrast that communicates purpose.</p><p>The people who stand out aren&rsquo;t louder than everyone else. They&rsquo;ve learned to leverage contrast. When to emphasize. Or when to step back. Conscious contrast.</p><p>That&rsquo;s design.</p><h2 id="the-wisdom-in-contrast">The Wisdom in Contrast</h2><p>Design is the art of managing differences on purpose.</p><p>That&rsquo;s the sentence I keep coming back to. Because it doesn&rsquo;t just describe what designers do. It describes what thoughtful people do.</p><p>So the next time you look at a design&mdash;a layout, a team, your life&mdash;don&rsquo;t just look at the elements.</p><p>Look at the differences between them. That&rsquo;s where you play with it.</p><p>On purpose. By design.</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Workflows in the Age of AI: How Design &amp; Development Workflows Changed in 2025&mdash;and What Comes Next</h4></div><div class="col-8"><p class="u-fs16 u-mb0"><a target="_blank" href="https://www.telerik.com/ai-design-development-workflows-report-2025">Check out our designer-developer survey report.</a> It&rsquo;s a look back at how AI reshaped collaboration in 2025&mdash;and what it means for teams, tools and roadmaps in 2026.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:35c1924e-328b-4115-9527-d1ebc341418d</id>
    <title type="text">Telerik and Kendo UI 2026 Q2 Release Is Here: Context‑Aware AI Where You Build</title>
    <summary type="text">The Telerik and Kendo UI Q2 2026 release embeds context-aware AI across UI generation, app migration, document processing and development tooling – helping teams accelerate everyday workflows across the application lifecycle.</summary>
    <published>2026-05-27T20:25:01Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Iva Borisova </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/telerik-and-kendo-ui-2026-q2-release-is-here-context-aware-ai-where-you-build"/>
    <content type="text"><![CDATA[<p><p>From generating accessible UI and modernizing legacy applications to automating document processing workflows and streamlining debugging, AI is reshaping how applications are built, modernized and tested, and the Q2 2026 release reflects this shift. With Telerik and Kendo UI, teams can deeply incorporate AI into their development process to move faster on common tasks such as UI creation, migration and troubleshooting, while continuing to rely on familiar tools and components.</p><p>At the same time, this release continues to invest heavily in core components and features for traditional development. With new UI controls, enhanced data handling capabilities, and expanded framework support, developers can rely on Telerik and Kendo UI to deliver high‑performance applications, whether they are building AI‑powered or classic solutions.</p><p>We&rsquo;ll let the release speak for itself, but before we dive into the highlights&hellip;don&rsquo;t forget to register for the Telerik and Kendo UI 2026 Q2 release webinar. 
    <a href="https://www.telerik.com/campaigns/telerik-and-kendo-ui-2026-q2-release-webinar">Save your seat now</a>!
</p><p><strong>Bonus:</strong>
 If you want to understand how to trace and debug AI systems with confidence, 
    <a href="https://www.telerik.com/webinars/progress-telerik/ai-observability">join the AI Observability webinar</a>
 tomorrow, May 28, 2026. Want more on AI observability? 
    <a href="https://www.telerik.com/ai-observability-platform">Visit our website</a>.
</p><p>Now, let&rsquo;s take a closer look at the key highlights shaping the Telerik and Kendo UI 2026 Q2 release.</p><h2 id="ai‑facilitated-development-and-document-workflows">AI‑Facilitated Development and Document Workflows</h2><h3>Improved Accessibility in Telerik Agentic UI Generator
</h3><p>The 
    <a href="https://www.telerik.com/mcp-servers">Agentic UI Generator</a>
 continues to evolve into a more practical development teammate. This release places greater emphasis on accessibility by guiding developers to component‑specific best practices and surfacing relevant accessibility APIs directly within the workflow.
</p><p>The 2026 Q2 release further enhances the overall experience with a new Getting Started tool, along with updates to the Telerik and Kendo UI CLI that automatically set up MCP servers with a single command, making onboarding faster and significantly easier.</p><p>Last but not least, the Agentic UI Generator is now also available directly within the 
    <a href="https://blazorrepl.telerik.com">Telerik REPL for Blazor</a>, allowing developers to generate components or full pages from the comfort of their browser.
</p><h3>AI Coding Assistant Improvements
</h3><p>A validator tool is now available in the Telerik and Kendo UI Coding Assistants to help reduce hallucinations and improve overall code reliability. A new icons generation tool for existing and custom icons is also introduced with this release.</p><h3>WebMCP in Preview: Agent-Ready Components in Angular, React and Blazor
</h3><p>WebMCP introduces a new paradigm for how AI agents interact with web applications. With the 2026 Q2 release, the components across 
    <a href="https://www.telerik.com/kendo-angular-ui/components/ai-tools/web-mcp">Kendo UI for Angular</a>, 
    <a href="https://www.telerik.com/kendo-react-ui/components/ai-tools/web-mcp">KendoReact</a>
 and 
    <a href="https://www.telerik.com/blazor-ui/documentation/ai/web-mcp/overview">Telerik UI for Blazor</a>
 libraries can now expose their capabilities as structured, callable tools that AI agents can use directly. This removes the need for unreliable techniques such as DOM scraping or screen interpretation, enabling precise, programmatic interaction powered by emerging browser standards.
</p><ul><li><a href="https://www.youtube.com/watch?v=UPzLqOjUsuM">Watch the Global Operations Hub video</a>
 </li><li><a href="https://www.youtube.com/watch?v=YSbnMzPu9SM">Watch the Financial Dashboard video</a>
 </li></ul><h3>Agent Tools for Telerik Document Processing Libraries (DPL)
</h3><p>Build intelligent document processing workflows with ease. The 
    <a href="https://docs.telerik.com/devtools/document-processing/ai-tools/agent-tools/overview">DPL Agentic Tools</a>
 let users extract structured data, edit content, convert formats, generate new Excel or PDF files and perform analysis on Excel documents directly inside .NET apps with no separate services required.
</p><h3>AI‑Driven WinForms App Modernization
</h3><p>Modernizing legacy applications becomes significantly easier with the new 
    <a href="https://www.telerik.com/products/winforms/documentation/ai-coding-assistant/converter/converter">AI‑powered Telerik UI for WinForms Converter</a>. This migration tool automatically transforms applications built with standard Microsoft controls into Telerik UI for WinForms, using intelligent control mapping, code parsing and automated project analysis. Delivered as an MCP‑based engine, it provides a fast and reliable path from legacy systems to modern desktop experiences.
</p><h3>Guided Setup and Debugging with Fiddler Agent Skills
</h3><p><a href="https://www.telerik.com/fiddler/fiddler-everywhere/mcp">Fiddler Agent Skills</a>
 simplify one of the most complex parts of agent‑driven workflows: setup and debugging. Instead of requiring developers to manually configure and explain steps, the agent can now guide itself through installing Fiddler, configuring MCP integration and executing debugging actions. This significantly lowers the barrier to entry and accelerates troubleshooting.
</p><h3>New Agentic RAG .NET SDK
</h3><p>.NET developers have a straightforward way to integrate retrieval‑augmented generation workflows into their applications. Powered by our own 
    <a href="https://www.progress.com/agentic-rag">Progress Agentic RAG</a>, the SDK provides a stable foundation for creating context‑aware AI solutions. Available as a 
    <a href="https://www.nuget.org/packages/Progress.Nuclia/1.0.0-preview1">public NuGet package</a>
 with sample integrations for 
    <a href="https://github.com/telerik/telerik-blazor-progress-rag-demo">Blazor</a>
 and 
    <a href="https://github.com/telerik/telerik-maui-progress-rag-demo">.NET MAUI</a>, the SDK makes it easy to ingest data, run semantic search and build AI‑powered app experiences using familiar .NET patterns.
</p><h3>Bonus Item: Integrated AI Chat in Documentation
</h3><p>The Telerik and Kendo UI documentation experience is enhanced with a built‑in AI chat, allowing you to ask questions and receive contextual answers directly within the documentation page. This conversational layer makes it easier to discover features, understand APIs and navigate documentation without breaking focus. The best part? It&rsquo;s available across all Telerik and Kendo UI libraries, Reporting and Document Processing tools. 
    Here is the Blazor one, for example.
</p><h2 id="new-ai-interface-and-smart-components">New AI-Interface and Smart Components</h2><h3>New AI Smart Paste Component
</h3><p>Reduce manual typing and speed up data entry in your apps. The AI Smart Paste automatically converts unstructured text into structured inputs by mapping content from emails, documents or messages to the right fields with zero extra effort.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/kendo-angular-ui/components/buttons/smartpastebutton">Kendo UI for Angular AI Smart Paste</a>
 </li><li><a href="https://www.telerik.com/kendo-react-ui/components/buttons/smartpaste">KendoReact AI Smart Paste</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui/smartpastebutton/index">Kendo UI for jQuery AI Smart Paste</a>
 </li><li><a href="https://www.telerik.com/kendo-vue-ui/components/buttons/smartpaste">Kendo UI for Vue AI Smart Paste</a>
 </li><li><a href="https://demos.telerik.com/blazor-ui/smartpastebutton/overview">Telerik UI for Blazor AI Smart Paste</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core/smartpastebutton">Telerik UI for ASP.NET Core AI Smart Paste</a>
 </li><li><a href="https://demos.telerik.com/aspnet-mvc/smartpastebutton">Telerik UI for ASP.NET MVC AI Smart Paste</a>
 </li><li><a href="https://demos.telerik.com/aspnet-ajax/smartpastebutton/overview/defaultcs.aspx">Telerik UI for ASP.NET AJAX AI Smart Paste</a>
 </li><li><a href="https://www.telerik.com/maui-ui/documentation/controls/smartpastebutton/overview">Telerik UI for .NET MAUI AI Smart Paste</a>
 </li></ul><h3>New PromptBox Component
</h3><p>Designed for seamless interaction with AI‑powered workflows, the PromptBox component provides a dedicated space where users can craft prompts, send messages and engage naturally with AI language models.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/kendo-angular-ui/components/conversational-ui/promptbox">Kendo UI for Angular PromptBox</a>
 </li><li><a href="https://www.telerik.com/kendo-react-ui/components/conversationalui/promptbox">KendoReact PromptBox</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui/promptbox/index">Kendo UI for jQuery PromptBox</a>
 </li><li><a href="https://www.telerik.com/kendo-vue-ui/components/conversationalui/promptbox">Kendo UI for Vue PromptBox</a>
 </li><li><a href="https://demos.telerik.com/blazor-ui/promptbox/overview">Telerik UI for Blazor PromptBox</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core/promptbox">Telerik UI for ASP.NET Core PromptBox</a>
 </li><li><a href="https://demos.telerik.com/aspnet-mvc/promptbox">Telerik UI for ASP.NET MVC PromptBox</a>
 </li></ul><h3><strong>SmartBox: Semantic Search and Prompting in Telerik and Kendo UI DataGrid</strong>
</h3><p>An AI-enabled DataGrid feature that combines natural-language prompting, keyword search, and semantic search into a single experience, SmartBox allows users to query, filter and manipulate grid data using the interaction option that best fits their needs. Users can control the grid through prompts to apply actions such as filtering, sorting, highlighting and grouping.</p><p>Semantic Search enhances discovery by understanding intent and context, returning relevant results even when the exact search terms are not present in the data.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/kendo-angular-ui/components/grid/smart-grid/ai-toolbar-tool">Kendo UI for Angular Grid SmartBox</a>
 </li><li><a href="https://www.telerik.com/kendo-react-ui/components/grid/smart/basic-operations">KendoReact SmartBox</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui/grid/ai-smartbox">Kendo UI for jQuery Grid SmartBox</a>
 </li><li><a href="https://demos.telerik.com/blazor-ui/grid/ai-smart-box">Telerik UI for Blazor Grid SmartBox</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core/grid/ai-smartbox">Telerik UI for ASP.NET Core Grid SmartBox</a>
 </li><li><a href="https://demos.telerik.com/aspnet-mvc/grid/ai-smartbox">Telerik UI for ASP.NET MVC Grid SmartBox</a>
 </li></ul><h3>Smart Grid: AI Chat Integration Demo
</h3><p>See how integrating the Telerik and Kendo UI AI Chat with the Data Grid delivers a complete, end-to-end AI prompting experience over the grid multi-step flows and contextual interactions driven through the Chat component.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/kendo-angular-ui/components/grid/smart-grid/ai-chat-assistant">Kendo UI for Angular Grid AI Chat Integration</a>
 </li><li><a href="https://www.telerik.com/kendo-react-ui/components/grid/smart/ai-chat-assistant">KendoReact Grid AI Chat Integration</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui/grid/ai-chat-integration">Kendo UI for jQuery Grid AI Chat Integration Demo</a>
 </li><li><a href="https://demos.telerik.com/blazor-ui/grid/ai-chat-assistant">Telerik UI for Blazor Grid AI Chat Integration Demo</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core/grid/ai-chat-integration">Telerik UI for ASP.NET Core Grid AI Chat Integration Demo</a>
 </li><li><a href="https://demos.telerik.com/aspnet-mvc/grid/ai-chat-integration">Telerik UI for ASP.NET MVC Grid AI Chat Integration Demo</a>
 </li><li><a href="https://www.telerik.com/maui-ui/documentation/controls/datagrid/smart-ai-features/ai-assistant/overview">Telerik UI for .NET MAUI Grid AI Chat Integration</a>
 </li></ul><h3>Telerik UI for .NET MAUI: Prompt
 Input UI Component
</h3><p>The new  
    <a href="https://www.telerik.com/maui-ui/documentation/controls/promptinput/overview">Telerik UI for .NET MAUI Prompt  Input</a>
 stands out as a feature‑rich control designed to bridge human‑AI interaction within applications. It provides a polished, ready‑made interface for sending prompts and managing the entire input lifecycle in AI‑driven experiences such as chatbots and in‑app assistants.
</p><h2 id="classic-components-beyond-ai">Classic Components Beyond AI</h2><h3>Segmented Control Across Telerik and Kendo UI web libraries
</h3><p>Let users choose between a small set of mutually exclusive options, for example, switching between profile types or view modes.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/kendo-angular-ui/components/buttons/segmentedcontrol">Kendo UI for Angular Segmented Control</a>
 </li><li><a href="https://www.telerik.com/kendo-react-ui/components/buttons/segmentedcontrol">KendoReact Segmented Control</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui/segmentedcontrol/index">Kendo UI for jQuery Segmented Control</a>
 </li><li><a href="https://www.telerik.com/kendo-vue-ui/components/buttons/segmentedcontrol">Kendo UI for Vue Segmented Control</a>
 </li><li><a href="https://demos.telerik.com/blazor-ui/segmentedcontrol/overview">Telerik UI for Blazor Segmented Control</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core/segmentedcontrol">Telerik UI for ASP.NET Core Segmented Control</a>
 </li><li><a href="https://demos.telerik.com/aspnet-mvc/segmentedcontrol">Telerik UI for ASP.NET MVC Segmented Control</a>
 </li><li><a href="https://demos.telerik.com/aspnet-ajax/segmentedcontrol/overview/defaultcs.aspx">Telerik UI for ASP.NET AJAX Segmented Control</a>
 </li></ul><h3>New Diagram in KendoReact
</h3><p>The 
    <a href="https://www.telerik.com/kendo-react-ui/components/diagram">new KendoReact Diagram component</a>
 allows you to build interactive visualizations that represent relationships between data. It lets you create diagrams using nodes (shapes) and connections (links), making it ideal for workflows, process maps and data-driven visual structures.
</p><h3>DropDownTree and TaskBoard in Telerik UI for Blazor
</h3><p>By combining the familiar structure of a TreeView with the convenience of a dropdown, the new 
    <a href="https://demos.telerik.com/blazor-ui/dropdowntree/overview">Blazor DropDownTree</a>
 component offers an intuitive, space-efficient interface that makes browsing, expanding and selecting nested items effortless.
</p><p>On the other hand, the 
    <a href="https://demos.telerik.com/blazor-ui/taskboard/overview">new Blazor TaskBoard</a>
 lets you manage tasks in a Kanban-style interface with ease. Cards are organized into columns by status and can be moved via drag-and-drop for quick updates. A built-in toolbar provides search functionality for filtering by title or description, along with an option to add new columns, helping you maintain clear and flexible work tasks.
</p><h3>Editor and DropDownButton in Telerik UI for .NET MAUI
</h3><p>Gain a richer, more flexible text‑input experience designed for scenarios that go beyond a simple entry field. Offering a multiline editor with built‑in scrolling, the new 
    <a href="https://www.telerik.com/maui-ui/documentation/controls/editor/overview">MAUI Editor</a>
 makes it easy for users to draft longer text, edit content and work comfortably within constrained mobile and desktop layouts.
</p><p>Meanwhile, the 
    <a href="https://www.telerik.com/maui-ui/documentation/controls/dropdownbutton/overview">Telerik UI for .NET MAUI DropDownButton</a>
 enables users to open a pop-up list of action items when they click the primary button.
</p><h3>Speech-to-Text Button Available in Desktop Products
</h3><p>Already available in all Telerik and Kendo UI web and mobile libraries, the Speech-to-Text Button is now ready to empower desktop users, too. They can convert speech into text with a single click, making it easy to add voice input to forms, search bars, chat interfaces and other interactive scenarios.</p><p>Learn more:</p><ul><li><a href="https://www.telerik.com/products/wpf/documentation/controls/radbuttons/features/speech-to-text-button">Telerik UI for WPF Speech-to-Text Button</a>
 </li><li><a href="https://www.telerik.com/products/winforms/documentation/controls/speechtotextbutton/overview">Telerik UI for WinForms Speech-to-Text Button</a>
 </li></ul><h2 id="developer-productivity-and-tooling">Developer Productivity and Tooling</h2><h3>CLI Getting Started in Blazor, Angular and React
</h3><p>CLI improvements further streamline how developers get started and build applications. The Telerik CLI .NET tool and the Kendo CLI provide the fastest way to set up development environments for 
    <a href="https://www.telerik.com/blazor-ui/documentation/installation/telerik-cli">Telerik UI for Blazor</a>, 
    <a href="https://www.telerik.com/kendo-angular-ui/components/installation/kendo-cli-angular-setup">Kendo UI for Angular</a>
 and 
    <a href="https://www.telerik.com/kendo-react-ui/components/installation/kendo-cli-react-setup">KendoReact</a>. With a single command, developers can run multiple setup steps simultaneously, including installing or updating license keys and configuring MCP servers.
</p><p>Beyond setup, the CLI accelerates the development process itself, enabling teams to quickly scaffold and build their first Telerik or Kendo UI application with minimal effort.</p><h3>Public NuGet Availability: Blazor, .NET MAUI and Document Processing
</h3><p>Accessing the Telerik UI libraries is now more streamlined with public NuGet availability for 
    <a href="https://www.nuget.org/packages/Telerik.UI.for.Blazor">Telerik UI for Blazor</a>, 
    <a href="https://www.nuget.org/packages/Telerik.UI.for.Maui">Telerik UI for .NET MAUI</a>
 and the 
    <a href="https://www.nuget.org/packages/Telerik.Documents.Core">Telerik Document Processing Libraries</a>. Developers can now easily discover, install and update these packages directly through NuGet.
</p><h3>Telerik Reporting: Entity Framework Core Data Source
</h3><p>The 
    <a href="https://www.telerik.com/products/reporting/documentation/designing-reports/report-designer-tools/desktop-designers/tools/data-source-wizards/entitycoredatasource-wizard">EntityCoreDataSource Wizard in the Standalone Report Designer for .NET</a>
 streamlines data binding by guiding you through the creation and configuration of data sources powered by Entity Framework Core. It automatically discovers available DbContext types from your assemblies, simplifies data retrieval setup and resolves required parameters.
</p><h3>Markdown Format Provider in Telerik Document Processing Libraries
</h3><p>Enable 
    <a href="https://www.telerik.com/document-processing-libraries/documentation/libraries/radwordsprocessing/formats-and-conversion/markdown/markdownformatprovider">seamless import and export of RadFlowDocument content to and from Markdown</a>, making it easy to integrate with modern documentation workflows. Built into RadWordsProcessing, it includes a robust Markdown parser and writer that support the most widely used syntax elements.
</p><h2 id="design-samples-and-developer-experience">Design, Samples and Developer Experience</h2><h3>New
 Meridian Theme and Updated Icons
 Set
</h3><p>A refreshed visual foundation is now available with the introduction of the 
    <a href="https://www.telerik.com/design-system/docs/themes/kendo-themes/meridian/">Meridian theme</a>
 and an 
    <a href="https://www.telerik.com/design-system/docs/foundation/iconography/icon-list/">updated icon set</a>. The new Meridian theme introduces a refined design language with improved colors, spacing and visual hierarchy, while the updated icons complement it with a more cohesive and flexible set of visuals.
</p><h3>New Healthcare Sample App with Built-In AI Assistant
</h3><p>To help developers get started faster and see real‑world patterns in action, this release introduces a new Healthcare Management sample application. The app brings together dashboards, scheduling, patient data and real-time alerts in a cohesive interface, while also demonstrating how AI can assist users directly.
</p><p>Learn more:</p><ul><li><a href="https://telerik.github.io/kendo-angular/healthcare-app/#/">Kendo UI for Angular Healthcare App</a>
 </li><li><a href="https://telerik.github.io/kendo-react/react-health-app/#/">KendoReact Healthcare App</a>
 </li><li><a href="https://demos.telerik.com/kendo-ui-healthcare/">Kendo UI for jQuery Healthcare App</a>
 </li><li><a href="https://demos.telerik.com/blazor-healthcare">Telerik UI for Blazor Healthcare App</a>
 </li><li><a href="https://demos.telerik.com/aspnet-core-healthcare">Telerik UI for ASP.NET Core Healthcare App</a>
 </li></ul><h3>New Project Tracker Sample App in KendoReact
</h3><p>A 
    <a href="https://telerik.github.io/kendo-react/kendo-react-project-tracker-app/">new Project Tracker sample application</a>
 is also available in KendoReact, demonstrating how to build a complete task and project management solution using the 
    <a href="https://www.telerik.com/kendo-react-ui/free-react-components">KendoReact free</a>
 components only. The app demonstrates how to combine key components, such as the Grid, inputs, dropdowns, buttons and the AppBar, into a cohesive, production-style interface.
</p><h2 id="more">More?</h2><p>Of course there is! The Telerik and Kendo UI 2026 Q2 release brings significant improvements in the existing components, adding new features and updating existing ones. A few examples:</p><ul><li><p>The DataGrid in Telerik and Kendo UI web UI libraries adds CSV export, row pinning, sticky groups functionality and stacked layout modes.</p></li><li><p>The Chat component is enhanced with a dedicated scroll-to-bottom button, improved status indicators that can display text, icons or both, failed message state, suggestions, single-line, multiline and auto-expand modes, customizable prefix and suffix content, built-in actions like speech-to-text and file selection and endless scrolling.</p></li><li><p>The Diagram component adds tooltips on nodes, resizable connection segments, resizable shapes, declarative shapes and rich text content.</p></li></ul><h2 id="what’s-new-and-release-history">What&rsquo;s New and Release History</h2><p>To see everything that&rsquo;s new in 2026 Q2, visit the 
    <a href="https://www.telerik.com/support/whats-new">What&rsquo;s New in Telerik and Kendo UI page</a>. For a deeper dive into each product, follow the links below.<span style="font-size:11pt;line-height:16.8667px;"></span></p><table><colgroup><col style="width:208px;" /><col style="width:208px;" /><col style="width:208px;" /></colgroup><thead><tr><th style="border:1pt solid windowtext;padding:0in 5.4pt;" data-role="resizable"><strong><span style="font-size:11pt;">Product</span></strong></th><th style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext currentcolor;border-image:initial;padding:0in 5.4pt;" data-role="resizable"><span style="font-size:11pt;"><strong>What&rsquo;s New</strong></span></th><th style="border-width:1pt 1pt 1pt medium;border-style:solid solid solid none;border-color:windowtext windowtext windowtext currentcolor;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;"><strong>Release History</strong></span></th></tr></thead><tbody><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Kendo UI for Angular</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/kendo-angular-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Kendo UI for Angular</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/kendo-angular-ui/components/changelogs/kendo-angular-ui#v24.0.1" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Kendo UI for Angular Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">KendoReact</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/kendo-react-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in KendoReact</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/kendo-react-ui/components/changelogs/ui-for-react#v15.0.0" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">KendoReact Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Kendo UI for Vue</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/kendo-vue-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Kendo UI for Vue</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/kendo-vue-ui/components/changelogs/ui-for-vue#v9.0.0" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Kendo UI for Vue Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Kendo UI for jQuery</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/kendo-jquery-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Kendo UI for jQuery</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/kendo-ui/release-history/kendo-ui-for-jquery-2026-2-520-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Kendo UI for jQuery Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for Blazor</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/blazor-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for Blazor</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/blazor-ui/release-history/telerik-ui-for-blazor-14-0-0-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for Blazor Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for ASP.NET Core</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-core-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for ASP.NET Core</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-core-ui/release-history/telerik-ui-for-asp-net-core-2026-2-520-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for ASP.NET Core Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for ASP.NET MVC</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-mvc/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for ASP.NET MVC</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-mvc/release-history/telerik-ui-for-asp-net-mvc-2026-2-520-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for ASP.NET MVC Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for ASP.NET AJAX</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-ajax/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for ASP.NET AJAX</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/aspnet-ajax/release-history/telerik-ui-for-asp-net-ajax-2026-2-519-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for ASP.NET AJAX Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for .NET MAUI</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/maui-ui/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for .NET MAUI</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/maui-ui/release-history/telerik-ui-for-net-maui-14-0-0-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for .NET MAUI Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for WPF</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/wpf/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for WPF</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/wpf/release-history/telerik-ui-for-wpf-2026-2-520-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for WPF Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik UI for WinForms</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/winforms/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik UI for WinForms</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/winforms/release-history/telerik-ui-for-winforms-2026-2-520-(2026-q2)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik UI for WinForms Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">ThemeBuilder</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/themebuilder/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in ThemeBuilder</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/themebuilder/documentation/release-notes#20-05-2026" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">ThemeBuilder Release Notes</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik Reporting</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/reporting/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik Reporting</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/reporting/release-history/progress-telerik-reporting-2026-q2-(20-1-26-520)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik Reporting Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik Report Server</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/report-server/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik Report Server</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/report-server/release-history/progress-telerik-report-server-2026-q2-(12-1-26-520)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik Report Server Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik Document Processing</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a style="color:#467886;text-decoration:underline;" target="_blank" href="https://www.telerik.com/document-processing-libraries"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik DPL</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/telerik-document-processing/release-history/progress-telerik-document-processing-2026-2-519" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik DPL Release History</span></a><span style="font-size:11pt;"></span></td></tr><tr><td style="border-width:medium 1pt 1pt;border-style:none solid solid;border-color:currentcolor windowtext windowtext;border-image:initial;padding:0in 5.4pt;"><span style="font-size:11pt;">Telerik JustMock</span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/justmock/2026-q2" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">What&rsquo;s New in Telerik JustMock</span></a><span style="font-size:11pt;"></span></td><td style="border-width:medium 1pt 1pt medium;border-style:none solid solid none;border-color:currentcolor windowtext windowtext currentcolor;padding:0in 5.4pt;"><a href="https://www.telerik.com/support/whats-new/justmock/release-history/justmock-2026-q2-(2026-2-519-512)" target="_blank" style="color:#467886;text-decoration:underline;"><span style="font-size:11pt;color:#054bff;text-decoration:none;">Telerik JustMock Release History</span></a><span style="font-size:11pt;"></span></td></tr></tbody></table><p style="margin:0in 0in 8pt;line-height:18.4px;font-size:12pt;font-family:Aptos, sans-serif;color:#000000;text-align:start;text-transform:none;word-spacing:0px;white-space:normal;"><br /></p></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:9941dce1-d02d-4fcd-9297-f3cd46f3ea42</id>
    <title type="text">Querying Reliable AI Resources with Telerik Agent Tools API</title>
    <summary type="text">Telerik Document Processing Libraries not only let you create RAG resources for your LLMs. They let you integrate those libraries into Microsoft’s latest agent-based tools.</summary>
    <published>2026-05-27T14:04:51Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Peter Vogel </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/querying-reliable-ai-resources-telerik-agent-tools-api"/>
    <content type="text"><![CDATA[<p><span class="featured">Telerik Document Processing Libraries not only let you create RAG resources for your LLMs. They let you integrate those libraries into Microsoft&rsquo;s latest agent-based tools.</span></p><p>In my previous post, I showed how to use Progress <a href="https://www.telerik.com/blogs/creating-reliable-ai-resources-with-telerik-agent-tools-api" target="_blank">Telerik Agent Tools API to create a workflow</a>&nbsp;that loads content into a Resource-Augmented Generation (RAG) resource that can be used with Large Language Models (LLMs). That RAG resource, integrated with an LLM in your application, helps your users get reliable, grounded answers, driven by the content you load into your resource.</p><p>This post shows how to tie your RAG resource to an LLM and integrate the combination in an application that allows users to query the resource&mdash;or any combination of resources that you&rsquo;ve created. Specifically, I&rsquo;ll show how to use Microsoft&rsquo;s current technology for querying an AI resource, the <code>ChatClientAgent</code> object.</p><p>Telerik Agent Tools API provides a collection of toolsets that the chat client agent works with to query your RAG resources. You just have to load your RAG resource(s) into in-memory repositories, attach the appropriate toolsets and pass the resulting tools to a chat client agent. Once you&rsquo;ve done that, you can submit prompts to the agent and get back the results driven by the RAG resources you&rsquo;ve loaded.</p><h2 id="configuring-your-project">Configuring Your Project</h2><p>To create an application that can query your resources, you first need the <a target="_blank" href="http://Telerik.Documents.AI">Telerik.Documents.AI</a>.* NuGet packages that work with the documents in your RAG resource (I covered those <a href="https://www.telerik.com/blogs/creating-reliable-ai-resources-with-telerik-agent-tools-api#configuring-your-project" target="_blank">libraries in my previous post</a>).</p><p>After that, you also need two Microsoft AI NuGet packages:</p><ul><li>Azure.AI.OpenAI</li><li>Microsoft.Agents.AI.OpenAI</li></ul><p>I used an ASP.NET Web API project for my case study so I also needed to add the Microsoft.AspNetCore.OpenApi package.</p><p>As I write this, the Microsoft.Agents.AI.OpenAI package was in &ldquo;release candidate&rdquo; mode which means that, while its interfaces and functionality are fixed, I needed to use the &ldquo;prerelease&rdquo; option when adding the package. Having said that, by the time you read this, the package may have moved to &ldquo;latest stable&rdquo; status (this is a <em>very</em> agile environment).</p><h3 id="configuring-a-chat-client-agent">Configuring a Chat Client Agent</h3><p>Before you create your <code>ChatClientAgent</code> agent object, you need to assemble a set of tools, tied to one or more of your RAG resources. Your first step is to create a repository of the right type (PDF, spreadsheet, Word/Word-related) and load the file that holds your RAG resource into that repository.</p><p>For my case study, I&rsquo;m only working with PDF documents&mdash;what Progress Telerik calls &ldquo;Fixed&rdquo; documents&mdash;so I created a <code>IFixedDocumentRepository pdfRepo</code> repository (all the repositories share a common interface so they all look very much alike).</p><p>Once I created the repository, I loaded my RAG resource using the repository&rsquo;s <code>Import</code> method. The <code>Import</code> method must be passed a <code>FileStream</code> object pointing to the resource and its format which, in this case, was <code>DocumentFormat.PDF</code> (see my previous post for the details on creating that resource).</p><p>Here&rsquo;s the code that loads my case study&rsquo;s repository:</p><pre class=" language-csharp"><code class="prism  language-csharp">IFixedDocumentRepository pdfRepo <span class="token operator">=</span> 
               <span class="token keyword">new</span> <span class="token class-name">InMemoryFixedDocumentRepository</span><span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">TimeSpan</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span> Path<span class="token punctuation">.</span><span class="token function">Exists</span><span class="token punctuation">(</span>repoPath<span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">string</span> name <span class="token operator">=</span>pdfRepo<span class="token punctuation">.</span><span class="token function">Import</span><span class="token punctuation">(</span>
                                        <span class="token function">FileStream</span><span class="token punctuation">(</span>repoFilePath<span class="token punctuation">,</span> FileMode<span class="token punctuation">.</span>Open<span class="token punctuation">,</span> FileAccess<span class="token punctuation">.</span>Read<span class="token punctuation">)</span><span class="token punctuation">,</span>
                                       DocumentFormat<span class="token punctuation">.</span>PDF<span class="token punctuation">,</span>
         Path<span class="token punctuation">.</span><span class="token function">GetFileNameWithoutExtension</span><span class="token punctuation">(</span>repoFilePath<span class="token punctuation">)</span>
                                     <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>If you provide the name of the file as the third parameter, the <code>Import</code> method returns that name (and returns &ldquo;ImportedDocument&rdquo; if you don&rsquo;t provide the third parameter).</p><p>To support having the chat client agent query my PDF repository, I just need the <code>FixedDocumentContentAgentTools</code> toolset. To create that toolset, I have to pass two parameters: the repository itself and a folder that holds any images used in those PDF documents. When attaching a toolset to a repository, you&rsquo;ll always have to pass the repository parameter, but other toolsets will require different parameters (and, often, no other parameters).</p><p>Once I&rsquo;ve created that toolset, I extract its tools using the toolset&rsquo;s <code>GetTools</code> method and add those tools to a list of <code>AITool</code> objects that will, eventually, be passed to my chat client agent. The code to do that looks like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">pdfReadTools <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FixedDocumentContentAgentTools</span><span class="token punctuation">(</span>pdfRepo<span class="token punctuation">,</span> repoPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
List<span class="token operator">&lt;</span>AITool<span class="token operator">&gt;</span> queryTools <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">List</span><span class="token operator">&lt;</span>AITool<span class="token operator">&gt;</span><span class="token punctuation">(</span> pdfReadTools<span class="token punctuation">.</span><span class="token function">GetTools</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>If I wanted to add more tools to my list, I would use the list&rsquo;s <code>AddRange</code> method. As an example, the following code:</p><ul><li>Creates a repository for holding spreadsheets</li><li>Imports a RAG resource file of spreadsheets into that repository using the repository&rsquo;s <code>Import</code> method</li><li>Attaches the <code>SpreadProcessingReadAgentTools</code> toolset (which only needs to be passed a reference to the repository)</li><li>Extracts the toolset&rsquo;s tools and adds them to my list of <code>AITools</code></li></ul><pre class=" language-csharp"><code class="prism  language-csharp">IWorkbookRepository workbookRepo <span class="token operator">=</span> 
              <span class="token keyword">new</span> <span class="token class-name">InMemoryWorkbookRepository</span><span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">TimeSpan</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
workbookRepo<span class="token punctuation">.</span><span class="token function">Import</span><span class="token punctuation">(</span>workbookRepoPath<span class="token punctuation">,</span> DocumentFormat<span class="token punctuation">.</span>XLSX<span class="token punctuation">)</span><span class="token punctuation">;</span>

SpreadProcessingReadAgentTools workbookTools <span class="token operator">=</span> <span class="token keyword">new</span><span class="token punctuation">(</span>workbookRepo<span class="token punctuation">)</span><span class="token punctuation">;</span>

queryTools<span class="token punctuation">.</span><span class="token function">AddRange</span><span class="token punctuation">(</span> workbookTools<span class="token punctuation">.</span><span class="token function">GetTools</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><h2 id="querying-your-repositories">Querying Your Repositories</h2><p>Now that I have a list of tools, I&rsquo;m ready to create an agent. There are three steps to doing that (but you can do it in one line of code).</p><p>First, you need to create a <code>AzureOpenAIClient</code> object which, in its simplest form, just requires passing the URL for the <a target="_blank" href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-1-configuring-llm-azure-ollama">LLM deployment you&rsquo;ve created</a> and the authorization key for that deployment.</p><p>One note: Using an authorization key is probably fine for development but, in production, you should be authorizing access using something more robust (e.g., <a target="_blank" href="https://www.telerik.com/blogs/coding-azure-4-securing-web-service-app-service-access-azure-sql-database">Managed Identities in Entra ID</a>). If you&rsquo;re using an authentication key, then you shouldn&rsquo;t hardcode into your application as I do here but move that key to some more secure location (e.g. An <a target="_blank" href="https://www.telerik.com/blogs/coding-azure-12-configuring-azure-key-vault-adding-secrets">Azure Key Vault</a>).</p><p>Once you&rsquo;ve created your <code>AzureOpenAIClient</code> object, your second step is to call its <code>GetChatCient</code> method to configure and return a <code>ChatClient</code> object. The <code>GetChatClient</code> method just needs to be passed the name of the deployment you created for your LLM.</p><p>Finally, you need to call your <code>ChatClient</code> object&rsquo;s <code>AsAIAgent</code> method to configure your agent. You can pass a variety of parameters as part of configuring your agent. I settled for specifying a name for my agent, some instructions on how my agent is to answer questions, and my list of tools:</p><pre class=" language-csharp"><code class="prism  language-csharp">AIAgent agent <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AzureOpenAIClient</span><span class="token punctuation">(</span>
                                      <span class="token keyword">new</span> <span class="token class-name">Uri</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">,</span>
                                      <span class="token keyword">new</span> <span class="token class-name">AzureKeyCredential</span><span class="token punctuation">(</span>apiKey<span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">GetChatClient</span><span class="token punctuation">(</span>deploymentName<span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">AsAIAgent</span><span class="token punctuation">(</span>
                instructions<span class="token punctuation">:</span> <span class="token string">"You provide guidance to Azure software developers"</span><span class="token punctuation">,</span>
                name<span class="token punctuation">:</span> <span class="token string">"Async App Expert"</span><span class="token punctuation">,</span>
                tools<span class="token punctuation">:</span> queryTools<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>With your chat client agent in hand, you process your user&rsquo;s prompts by calling the agent&rsquo;s <code>RunAsync</code> method and passing the prompt. The agent will return an <code>AgentResponse</code> object which has a <code>Messages</code> collection holding a list of responses drawn from the repositories associated with your tools (you probably want the first message). The <code>Text</code> property on a message will give you the agent&rsquo;s response.</p><p>Typical code would look like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">AgentResponse response <span class="token operator">=</span> <span class="token keyword">await</span> agent<span class="token punctuation">.</span><span class="token function">RunAsync</span><span class="token punctuation">(</span>"What <span class="token keyword">do</span> NuGet packages <span class="token keyword">do</span> I need&rdquo;<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">string</span> responseText <span class="token operator">=</span> response<span class="token punctuation">.</span>Messages<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>Text<span class="token punctuation">;</span>
</code></pre><h2 id="interacting-with-your-rag-enabled-sources">Interacting with Your RAG-Enabled Sources</h2><p>Of course, you&rsquo;ll also want to create a UI for your users to interact with when querying your RAG resource. In earlier posts, I showed how to leverage Telerik tools to create dedicated user-friendly <a href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-4-crafting-interactive-blazor-ui" target="_blank">UIs in Blazor</a>&nbsp;or <a href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-5-creating-interactive-ui-javascript" target="_blank">JavaScript</a>. Alternatively, instead of creating a UI dedicated to your RAG-enabled resource, you might want to more tightly <a href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-6-embedding-conversational-invisible-agents" target="_blank">integrate your resource into a JavaScript application&rsquo;s UI</a>.&nbsp;</p><p>But, really, it&rsquo;s up to you how you&rsquo;ll use your RAG resource to support your users.</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Get access to these tools and more</h4></div><div class="col-8"><p class="u-fs16 u-mb0">The free 30-day trial of <a target="_blank" href="https://www.telerik.com/devcraft">Telerik DevCraft</a> lets you really kick the tires for yourself. <a target="_blank" href="https://www.telerik.com/try/devcraft-ultimate">Try it today!</a></p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:3c1b27d0-6ddf-4b4f-8063-d9d6d3024ec6</id>
    <title type="text">From DevUI to Observability: Evolving the Agent Dev Loop in Microsoft Agent Framework</title>
    <summary type="text">This article shows .NET developers how to get started building and debugging agent-based applications locally with Microsoft Agent Framework and DevUI. The article also explores how DevUI shortens the agent development loop by providing a visual interface for running workflows and inspecting agent interactions. This can now be addressed with the Progress AI Observability Platform.</summary>
    <published>2026-05-26T19:41:09Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Ed Charbeneau </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/from-devui-to-observability-evolving-the-agent-dev-loop-in-microsoft-agent-framework"/>
    <content type="text"><![CDATA[<p>DevUI is a lightweight standalone application included with Microsoft Agent Framework that helps developers run, inspect, and debug agents and workflows during development. The tool provides a web-based interface for interactive testing alongside an OpenAI-compatible API backend, making it easier to iterate on workflows before integrating them into a larger application.</p><p>The key to DevUI&rsquo;s usefulness is its ability to shorten the agent development loop by giving developers immediate visibility into workflow execution and agent interactions. However, as agentic applications move from prototype to production, a new observability gap begins to appear. Developers need to understand not only what happened during a local debugging session, but how agents behave across users, sessions, models, tools, latency, cost, quality, and failures.</p><p>In this article, you'll use DevUI to develop, visualize, and debug workflows locally before expanding into observability to support multi-session debugging and production-ready diagnostics. By extending the agent development loop beyond local testing, observability helps bridge the gap between development-time insight and the operational visibility required for production systems.</p><h2 id="installing-the-microsoft-agent-framework-templates">Installing the Microsoft Agent Framework Templates</h2><p>To get started with DevUI and Microsoft Agent Framework, install the project templates from NuGet. The templates provide a starter project for building and debugging agent-based applications in .NET.</p><p>Install the templates using the .NET CLI:</p><pre><code class="language-bash">dotnet new install Microsoft.Agents.AI.ProjectTemplates::1.3.0-preview.1.26251.3
</code></pre><p>Once installed, the templates become available through Visual Studio under <strong>File &gt; New Project</strong>. Search for <code>Agent</code> to locate the available Microsoft Agent Framework project templates, shown in Figure 1.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/observability/ai-agent-template.png?sfvrsn=27c6cc2b_2" height="457" style="max-width:100%;height:auto;" width="800" alt="" /></p><p><strong>Figure 1: </strong>The project template shown in Visual Studio.</p><p>You can also create a new project directly from the command line:</p><pre><code class="language-bash">dotnet new aiagent-webapi
</code></pre><p>The generated project includes a starter implementation configured for Microsoft Agent Framework and DevUI, making it easy to begin experimenting with agents, orchestration, and workflow debugging locally.</p><h3 id="exploring-the-template">Exploring the Template</h3><p>The <code>aiagent-webapi</code> template includes a complete sample application that demonstrates how agents and workflows operate within Microsoft Agent Framework.</p><p>The sample application contains two hosted agents and a workflow:</p><ol><li><p><strong>Writer Agent</strong><br />Generates short stories based on a provided topic while keeping responses under 300 words.</p></li><li><p><strong>Editor Agent</strong><br />Reviews and refines the generated story by improving grammar, readability, and style while maintaining the word limit.</p></li><li><p><strong>Publisher Workflow Agent</strong><br />Coordinates the workflow between the writer and editor agents using a sequential process that passes content through each stage of execution.</p></li></ol><p>The agents are exposed through OpenAI-compatible API endpoints, making the sample easy to test with DevUI and simple to integrate with external tools and applications. By keeping the architecture approachable, the template creates a practical environment for understanding how agent orchestration works in a real .NET application.</p><h3 id="understanding-addagent-and-ihostedagentbuilder">Understanding <code>AddAgent</code> and <code>IHostedAgentBuilder</code></h3><p>Microsoft Agent Framework registers agents using the <code>AddAgent</code> extension method during application startup. This approach integrates agents directly into the standard ASP.NET Core dependency injection system, making the programming model feel familiar to .NET developers.</p><pre><code class="language-csharp">builder.AddAIAgent("writer", 
    "You write short stories (300 words or less) about the specified topic.");
</code></pre><p>The <code>AddAgent</code> method returns an <code>IHostedAgentBuilder</code>, which provides additional configuration options for the agent and its hosting behavior. The template uses this pattern to register the Writer, Editor, and Publisher workflow agents so they can be discovered and executed through DevUI and the framework&rsquo;s OpenAI-compatible endpoints.</p><h2 id="running-the-application">Running the Application</h2><p>With the project created, the next step is running the application and launching DevUI. Start the application using the .NET CLI:</p><pre><code class="language-bash">dotnet run
</code></pre><p>The application exposes OpenAI-compatible API endpoints that can be accessed from compatible clients and tools. During development, the application also maps a <code>/devui/</code> route that launches the Agent Framework development UI.</p><p>When running the project from Visual Studio or another IDE, the browser automatically opens to the DevUI endpoint. DevUI provides a web-based interface for interacting with agents and workflows while using the framework&rsquo;s Responses and Conversations endpoints behind the scenes. This creates a fast feedback loop for testing prompts, tracing interactions, and validating workflow execution during development.</p><h2 id="understanding-the-agent-development-loop">Understanding the Agent Development Loop</h2><p>DevUI improves the agent development loop by making it easier to build, run, inspect, and refine workflows during development. Instead of treating agents as black-box processes, developers can interact with workflows in real time and observe how messages move between agents during execution.</p><p>Both agents and workflows can be independently selected from the interface, shown in Figure 2.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/observability/agent-workflow-selection-steps.png?sfvrsn=a4dd7e97_2" height="479" style="max-width:100%;height:auto;" width="600" alt="" /></p><p><strong>Figure 2: </strong>The browser running DevUI with the agent selection showing the available agents and workflows. 1) The editor and writer agents can be selected and executed independently. 2) The publisher workflow can be executed.</p><p>This visibility becomes increasingly important as workflows grow more complex. Multi-agent systems introduce challenges that traditional request-response applications typically avoid, including non-deterministic behavior, chained execution steps, and state shared across conversations.</p><p>To run a selected workflow in DevUI, open a prompt by clicking Configure and Run. Then enter a prompt in the dialog box, shown in Figure 3. The prompt text is passed into the workflow and the entire workflow will execute when Run Workflow is clicked.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/observability/run-workflow.png?sfvrsn=7dce9b17_2" height="355" style="max-width:100%;height:auto;" width="500" alt="" /></p><p><strong>Figure 3: </strong>The Configure Workflow Input dialog box.</p><p>DevUI creates an approachable debugging experience, its current model focuses on short-lived, single-session workflows. The final output is clearly displayed on screen, shown in Figure 4.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/observability/workflow-complete.png?sfvrsn=906d9d62_2" height="584" style="max-width:100%;height:auto;" width="500" alt="" /></p><p><strong>Figure 4: </strong>The output shown in the workflow execution timeline.</p><p>This works well for experimentation and local testing. However, debugging becomes more difficult once multiple sessions are running concurrently or workflows require historical visibility for troubleshooting.</p><p>For example, the execution information is shown for this run in the Events panel in Figure 5. While the status and token information is visible from DevUI, it does not persist once the application stops.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/events.png?sfvrsn=a0b2a54e_2" height="431" style="max-width:100%;height:auto;" width="395" alt="" /></p><p><strong>Figure 5:</strong> The Events panel displays a completed status along with usage statistics for token consumption.</p><p>As developers move beyond isolated testing scenarios, the agent development loop begins to require more than interactive debugging alone. Understanding how workflows behave across sessions, tracing execution over time, and diagnosing failures in larger systems naturally leads to the next step: observability.</p><blockquote><p>Note: <a href="https://github.com/microsoft/agent-framework/issues/5806">Currently Telemetry is not supported within DevUI when using .NET.</a></p></blockquote><h2 id="introducing-ai-observability-across-tracing-debugging-cost-and-evaluation">Introducing AI Observability Across Tracing, Debugging, Cost, and Evaluation</h2><p>As workflows grow beyond simple development scenarios, observability becomes a critical part of the agent development loop. This is where the observability gap begins to appear. DevUI helps developers understand what happened during a local debugging session, but production systems require persistent visibility into how agents behave across users, sessions, models, tools, latency, cost, quality, and failures. While DevUI provides interactive debugging for local workflows, observability extends visibility across sessions, tool calls, evaluations, and distributed execution paths using OpenTelemetry and .NET&rsquo;s built-in <code>Activity</code> pipeline.</p><p>The .NET SDK instruments agents built with either <code>IChatClient</code> from <code>Microsoft.Extensions.AI</code> or <code>IAgent</code> from Microsoft Agent Framework. This allows developers to trace LLM requests, streaming responses, workflow execution, and tool calls while integrating naturally with existing .NET telemetry infrastructure.</p><p>To enable observability, we'll use <a href="https://www.telerik.com/ai-observability-platform">Progress AI Observability Platform</a>. The Progress AI Observability Platform is a cloud-based platform for tracing, debugging, cost analysis, and evaluation of AI applications. It provides visibility into how AI agents behave across models, tools, and sessions, helping teams identify issues as they happen, understand their impact, and continuously improve workflow quality over time.</p><p>Start by installing the .NET SDK for Progress AI Observability Platform.</p><pre><code class="language-bash">dotnet add package Progress.Observability.Instrumentation
</code></pre><p>Next, configure the desired options. Tags can be included for easier filtering within the observability reporting screen. In this example, the Environment name will capture: Development, Staging, and Production tags. Once the options are declared, the tracer is initialized.</p><pre><code class="language-csharp">// Configure the observiablity options, tags, and keys
var observabilityOptions = new ObservabilityOptions()
{
    AppName = builder.Environment.ApplicationName,
    ApiKey = builder.Configuration["Progress:ObservabilityKey"]!,
    AdditionalTags = new List&lt;string&gt; { builder.Environment.EnvironmentName }
};

// Initialize the observability tracer
ObservabilityTracer.Initialize(observabilityOptions);
</code></pre><p>Start capturing traces at the top level of applications using <code>IChatClient</code>, observability is added directly to the client:</p><pre><code class="language-csharp">var chatClient = new ChatClient(
        "gpt-4o-mini",
        new ApiKeyCredential(builder.Configuration["AzureOpenAI:Key"] ?? throw new InvalidOperationException("Missing configuration: AzureOpenAI:Key")),
        new OpenAIClientOptions { Endpoint = azureOpenAIEndpoint })
    .AsIChatClient()
    .AddObservability(o =&gt; o = observabilityOptions);

</code></pre><p>Applications using Microsoft Agent Framework can initialize observability through <code>AddObservability()</code> during agent construction:</p><pre><code class="language-csharp">var chatClient = new ChatClient(
        "gpt-4o-mini",
        new ApiKeyCredential(builder.Configuration["AzureOpenAI:Key"] ?? throw new InvalidOperationException("Missing configuration: AzureOpenAI:Key")),
        new OpenAIClientOptions { Endpoint = azureOpenAIEndpoint })
    .AsIChatClient()
    .AddObservability(o =&gt; o = observabilityOptions);
</code></pre><p>With observability enabled, you'll run the application using DevUI. Exercise the agents and workflows as before, but this time each session is collected for a deeper analysis through the AI Observability Platform. From the dashboard, you can perform cost analysis, run evaluations, and drill into traces across multiple sessions.</p><p>From the main Observations tab, all sessions are shown for a given period. Through the tagging feature the data is easily categorized, seen in Figure 6.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/observability/observability-all.png?sfvrsn=c8dd45c6_2" height="366" style="max-width:100%;height:auto;" width="800" alt="" /></p><p><strong>Figure 6: </strong>The observability platform with the Observations tab selected. 1) The date range and filter selection is chosen. 2) All sessions within the filter criteria.</p><p>Clicking on an individual item displays a complete breakdown of the trace log, see Figure 7. Including status, latency, cost and more. A tree interface allows deeper debugging, showing individual agent calls within the workflow, along with their corresponding inputs and outputs.</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/.net-maui-aiprompt/observability-drill-down.png?sfvrsn=92ef854f_2" height="458" style="max-width:100%;height:auto;" width="800" alt="" /></p><p><strong>Figure 7: </strong>A trace is selected. 1) The status section shows top level telemetry data including status, latency and costs. 2) A tree interface expands into nested trace activity. 3) The inputs and outputs of the selected agent are displayed.</p><p>This approach creates a more complete agent development loop, allowing local experimentation in DevUI to evolve into production-ready diagnostics and monitoring. In this article, tracing serves as the primary example, however production AI observability extends much further. Teams also need debugging, cost analysis, evaluation, governance, and operational insight to successfully operate AI systems at scale.</p><p>Progress AI Observability Platform supports that broader production view, helping teams connect trace-level detail with the trust, scale, and operational control required for enterprise AI applications.</p><h2 id="next-steps">Next Steps</h2><p>DevUI provides a strong starting point for building and debugging agents locally, but production AI systems require deeper visibility across tracing, debugging, evaluation, and operational monitoring.</p><p>Explore the <a href="https://www.telerik.com/ai-observability-platform">Progress AI Observability Platform</a> to see how observability extends the agent development loop from local experimentation to production-ready diagnostics.</p><p>Have questions or want to share what you're building? Join the conversation with the team on <a href="https://discord.gg/tK6RuSWKf">Discord</a>.</p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:ae1f2411-36d2-4ad3-b6db-f0c42d2f4a1d</id>
    <title type="text">The Silent Risk of Manual File Transfers: Why Secure File Transfer Software Matters</title>
    <summary type="text">Discover the hidden security, compliance and operational risks of manual file transfers and why businesses are adopting secure file transfer software.</summary>
    <published>2026-05-26T14:09:59Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Brien Posey </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/the-silent-risk-of-manual-file-transfers-why-secure-file-transfer-software-matters"/>
    <content type="text"><![CDATA[<h2><span data-contrast="auto">Manual File Transfers Are Riskier Than They Seem</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">Manual file transfers are a normal part of everyday business. On any given day, employees send emails with attachments, copy files to shared drives or use consumer-grade file transfer tools. These methods are quick, easy, familiar and they get the job done. Because these and other types of manual file transfers are so effective and so widely used, it&rsquo;s easy to assume that there is no real downside to their use.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Manual file transfers don&rsquo;t look risky but that&rsquo;s the problem. Such transfers simply look like a part of normal day-to-day business operations. Even so, manual file transfers can introduce potential risks to security, compliance and operational resiliency, leading many organizations to adopt secure file transfer software designed for centralized management, visibility and compliance.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">Why Manual File Transfers Are Risky</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">Imagine an organization that relies on a scheduled script to export data from a CRM system and upload it to an FTP server used by a partner. Each day, the script generates a file, names it according to a convention and places it in a designated folder for transfer. On the surface, this process seems routine and reliable. It runs in the background and requires little day-to-day attention.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">However, this seemingly simple workflow can introduce heightened security and compliance risks. If the script fails or runs incorrectly, files might not be transferred. There are also risks that in the event of an error, the script could send data that is outdated, incomplete or corrupt.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Such a script may also present challenges from a compliance standpoint. The script presumably stores credentials somewhere and those credentials may or may not be stored securely. The same can also be said of the data that is being sent. Depending on the way that the script works, personally identifiable data may lack appropriate protections, such as encryption, leading many organizations to replace ad hoc tools with secure file transfer software that improves visibility and compliance readiness.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">There is also the issue of visibility. If a transfer fails, is delayed or is accessed inappropriately, the organization may have no immediate way of knowing. This lack of oversight can be especially problematic for organizations operating in regulated industries, where proving how data was handled is every bit as important as securing it.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">Human Error</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">One of the biggest risks associated with manual file transfers is that of human error. Human error becomes possible any time that a process-driven task lacks safeguards.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">As an example, suppose that an employee is responsible for manually exporting a daily report and uploading it to a partner&rsquo;s server. In doing so, they might select the wrong file, upload an outdated version or place the file in the wrong directory. In other cases, they might forget to perform the transfer altogether or execute it outside of the required timeframe. At best, such mistakes are disruptive to the business. At worst, they could contribute to costly compliance issues.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Managed file transfer solutions are designed to help reduce these types of risks. By automating file transfers, enforcing policy and validating files, MFT solutions take the user out of the equation, thereby lowering the likelihood of error or compliance issues.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">Lack of Visibility</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">For businesses in regulated industries, one of the single biggest risks associated with manual file transfers is a lack of visibility into how data moves through the organization. There may be no centralized way to track what files were sent, when they were transferred, who initiated the transfer or whether the transfer was successful.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">From an operational standpoint, a lack of visibility makes it tough to troubleshoot problems when they occur. The organization might not even realize that a problem has occurred until much later.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">From a compliance perspective, the consequences are far more serious. Many regulatory frameworks require organizations to maintain detailed records of how sensitive data has been handled. In the event of a compliance audit, the inability to produce accurate transfer logs can quickly become a major problem.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Secure file transfer software can help address these challenges by providing centralized monitoring, detailed audit logs and real-time alerts. Organizations gain the ability to track every single file transfer. This level of visibility strengthens compliance and can make it easier to troubleshoot problems when they arise.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">Weak Security</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">Another potential risk associated with manual file transfers is that many commonly used tools such as FTP servers, shared network folders and even ad hoc cloud storage services were designed for convenience rather than security. Even if the organization itself does not adopt such tools, shadow IT remains an ever-present threat with end users adopting tools meant for consumers or tools that are outdated.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">For example, traditional FTP transmits data in clear text, meaning that sensitive data lacks even the most basic encryption. While there are more secure alternatives like SFTP or HTTPS-based tools, security is not guaranteed. These tools do encrypt the data that is being transferred but the overall level of security largely depends on how the tool has been configured. This is why many organizations replace legacy tools with secure file transfer software that helps standardize security controls and reduce the risk of misconfiguration.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">For businesses in regulated industries, shadow IT operations create significant risk. Organizations are often required to enforce strict controls around data encryption, access management and auditability. File transfers occurring through unmanaged or insecure tools may raise regulatory concerns. Even if a tool truly is secure, the lack of any centralized oversight and audit logging will still likely lead to compliance violations.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Managed file transfer tools and secure file transfer software help address these challenges by standardizing file transfers. They support policy enforcement, integrate with IAM providers and provide centralized governance over file movement. By reducing reliance on ad hoc tools and bringing transfers under a single, controlled framework, organizations can reduce security vulnerabilities and better align themselves with regulatory requirements.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">The Hidden Costs of Manual File Transfers</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">The most obvious way that manual file transfers can incur significant costs is through regulatory fines. However, even if an organization does not operate within a regulated industry, there can be various hidden costs that can come into play as a result of manual file transfers.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Manual file transfers occurring on a regular basis are by their very nature repetitive. Suppose that an employee spends 10 minutes each day preparing and transmitting a file. Given a five-day work week, that amounts to 50 minutes or nearly an hour per week spent on a process that could be automated. Assuming that the employee works 50 weeks per year, over a year&rsquo;s time, the file transfer would consume over 41 hours annually&mdash;more than an entire work week.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">More alarmingly, this process is rarely isolated to a single employee. If 25 employees across an organization each spend a similar amount of time on manual file transfers, the total exceeds 1,000 hours annually. Depending on the organization&rsquo;s average hourly labor rate, manual file transfer costs can easily reach tens of thousands of dollars each year.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Additional costs can arise when problems occur, for troubleshooting and fixing the issues, as well as opportunity costs from adverse effects of failed transfers like missed deadlines or workflow disruptions.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Managed file transfer solutions can help organizations address these hidden costs by automating otherwise manual processes. By reclaiming employee time and reducing the risk of disruption, organizations can improve operational efficiency while potentially reducing costs.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">A Better Option</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">Instead of relying on risky, time-consuming manual file transfers, organizations can consider implementing secure file transfer software that centralizes automation, security and control. Such tools can automate file transfers and are also designed to support security policies. Secure file transfer software typically provides visibility and audit-logging capabilities that are often used in regulated industries, helping organizations apply security policies consistently across the organization. To put it another way, secure file transfer software can reduce guesswork and help mitigate risks related to file transfers.</span><span data-ccp-props="{}">&nbsp;</span></p><h2><span data-contrast="auto">Conclusion</span><span data-ccp-props="{}">&nbsp;</span></h2><p><span data-contrast="auto">Although manual file transfers once had their place, they have increasingly become a poor fit for today&rsquo;s heavily regulated, security-focused world.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Unfortunately, manual file transfers have become so routine that organizations often underestimate the risks they introduce. Users have relied on such tools for generations, so these types of file transfers go unnoticed as they have become overly familiar in day-to-day operations. Over time, however, manual file transfers can introduce problems that may lead to serious consequences.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">What is most unsettling is that these risks tend to accumulate slowly over time. There might be an occasional missed file transfer or an untracked exchange with a third party. Individually, such occurrences might seem very insignificant. Collectively, though, they may create security risks and serious compliance violations. Worse still, such incidents may go completely undetected until they surface during a compliance audit or operational failure.</span><span data-ccp-props="{}">&nbsp;</span></p><p><span data-contrast="auto">Secure file transfer software can replace insecure manual processes with a more controlled and auditable framework, helping organizations better manage security and compliance risks that require ongoing attention.</span><span data-ccp-props="{}"></span></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:6808d742-f423-4697-ad7b-0da3008181c4</id>
    <title type="text">Share Functionality in Your .NET MAUI Apps</title>
    <summary type="text">Learn how to add share functionality to your .NET MAUI app whether in iOS, Android or Windows.</summary>
    <published>2026-05-26T13:50:18Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/share-functionality-net-maui-apps"/>
    <content type="text"><![CDATA[<p><span class="featured">Learn how to add share functionality to your .NET MAUI app whether in iOS, Android or Windows.</span></p><p>In recent years, many large companies have decided to rely on technology and move a big part&mdash;or even all&mdash;of their processes to mobile applications.</p><p>For example, not long ago, sending money from one bank account to another meant physically going to the bank and spending hours waiting in line. Today, that same process can be completed in just a few seconds using a mobile app. </p><p><strong>But&hellip; What happens next? </strong></p><p>How do we send a confirmation or receipt to the account owner so they can validate the transfer?</p><p>To solve this, applications usually include a <strong>share</strong> functionality, which allows users to send information through the familiar share sheet we all know&mdash;via WhatsApp, email, social media and more.</p><p>It&rsquo;s important to design the user experience from start to finish. It&rsquo;s not just about completing an action, but also about enabling users to easily share or confirm the result of that action.</p><p>In this article, you&rsquo;ll learn how to open the share sheet in your .NET MAUI apps, so you can share information quickly and effortlessly.</p><h2 id="what-is-ishare">What Is IShare?</h2><p>IShare is an interface that provides an API that allows you to share data such as links, files or text using the system&rsquo;s share functionality. When invoked, it opens a button sheet where the user can choose how and with whom they want to share that information.</p><p>The IShare interface is already available through the <code>Share.Default</code> property and is located in the Microsoft.Maui.ApplicationModel.DataTransfer namespace.</p><p>When the user interacts with this feature, they will see something like the following:</p><p><img sf-image-responsive="true" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/share.png?sfvrsn=a83f43eb_2" height="500" style="max-width:100%;height:auto;" title=".NET MAUI share" width="1136" alt=".NET MAUI share in Android, iOS, Windows" sf-size="113426" /></p><p><span style="font-size:11px;">Image obtained from the official documentation.</span></p><h3 id="platform-settings">Platform Settings</h3><p>To implement the share functionality, some platforms require additional configuration. These are the supported platforms and their requirements:</p><ul><li><strong>Android and Windows:</strong> No setup is required.</li><li><strong>iOS / Mac Catalyst:</strong> To be able to access photos and videos, you need to add the appropriate permissions. To do this, go to:
        <ul><li>Platforms/iOS/Info.plist</li><li>And Platforms/MacCatalyst/Info.plist</li></ul></li></ul><p>Then add the permission keys along with their descriptions. Keep in mind that this description will be shown to the user when requesting permission, so it&rsquo;s important to use clear and user-friendly text. Below is an example of how the configuration should look:</p><pre><code>&lt;key&gt;NSPhotoLibraryAddUsageDescription&lt;/key&gt; 
&lt;string&gt;This app needs access to the photo gallery to save photos and videos.&lt;/string&gt; 

&lt;key&gt;NSPhotoLibraryUsageDescription&lt;/key&gt; 
&lt;string&gt;This app needs access to the photo gallery to save photos and videos.&lt;/string&gt;
</code></pre><h2 id="what-information-can-i-share-">What Information Can I Share? </h2><p>You can share text, links, files or even multiple files at the same time, depending on your needs. .NET MAUI provides different request types to handle each scenario.</p><p>Below are the most common use cases and how to implement them.</p><h3 id="-text"> Text</h3><p>To share plain text, you can use the <code>ShareTextRequest</code> class. This allows you to pass the text you want to share along with a title.</p><pre><code>public async Task ShareText(string text) 
{ 
    await Share.Default.RequestAsync(new ShareTextRequest 
    { 
    Text = text, 
    Title = "I&rsquo;m the title" 
    }); 
}
</code></pre><h3 id="-links"> Links</h3><p>You can also share a link by using the <code>Uri</code> property of <code>ShareTextRequest</code>. Simply provide the URI and a title.</p><pre><code>public async Task ShareUri(string uri, IShare share) 
{ 
    await share.RequestAsync(new ShareTextRequest 
    { 
    Uri = uri, 
    Title = "I&rsquo;m the title" 
    }); 
}
</code></pre><h3 id="-files"> Files</h3><p>.NET MAUI automatically detects the file type (MIME) and handles the sharing process accordingly. However, keep in mind that each operating system may decide whether a specific file type can be shared or not, depending on platform restrictions.</p><p>To share a single file, use the <code>ShareFileRequest</code> type, as shown below:</p><pre><code>public async Task ShareFile() 
{ 
    string fn = "MyFile.txt"; 
    string file = Path.Combine(FileSystem.CacheDirectory, fn); 
    File.WriteAllText(file, "This is a file"); 
    await Share.Default.RequestAsync(new ShareFileRequest 
    { 
    Title = "Share text file", 
    File = new ShareFile(file) 
    }); 
}
</code></pre><h3 id="️-multiple-files">️ Multiple Files</h3><p>Oh yeah!!  We also have the option to share multiple files using the <code>ShareFileRequest</code> type. Let&rsquo;s look at the following example:</p><pre><code>public async Task ShareMultipleFiles() 
{ 
    string file1 = Path.Combine(FileSystem.CacheDirectory, "File1.txt"); 
    string file2 = Path.Combine(FileSystem.CacheDirectory, "File2.txt");  
    File.WriteAllText(file1, "Hello 1"); 
    File.WriteAllText(file2, "Hello 2");
     
    await Share.Default.RequestAsync(new ShareMultipleFilesRequest 
    { 
    Title = "I&rsquo;m sharing multiple files", 
    Files = new List&lt;ShareFile&gt; { new ShareFile(file1), new ShareFile(file2) } 
    }); 
}
</code></pre><h2 id="android-control-file-locations">Android Control File Locations</h2><p>On Android, there are scenarios where a file is located in the app&rsquo;s private storage. In these cases, Android temporarily copies the file to the app cache and shares it using a FileProvider.</p><p>This behavior is very useful, but it&rsquo;s important to be careful. If it&rsquo;s not configured correctly, it can expose more information than intended, including data that should not be publicly accessible.</p><p>The good news is that this can be prevented by following the steps below.</p><h3 id="step-1-add-the-fileprovider-path-file">Step 1: Add the FileProvider Path File</h3><p>Inside the following folder:</p><pre><code>Platforms/Android/Resources/xml
</code></pre><p>And add a file with the exact name:</p><p><code>microsoft_maui_essentials_fileprovider_file_paths.xml</code></p><h3 id="step-2-what-will-this-file-contain">Step 2: What Will This File Contain?</h3><p>This file defines the allowed locations from which files can be shared.</p><p>Example configuration:</p><pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; 
&lt;paths&gt; 
    &lt;external-path name="external_files" path="sharing-root" /&gt; 
    &lt;cache-path name="internal_cache" path="sharing-root" /&gt; 
    &lt;external-cache-path name="external_cache" path="sharing-root" /&gt; 
&lt;/paths&gt;
</code></pre><p><strong>What does each line mean?</strong></p><ul><li><strong><code>&lt;external-path&gt;:</code></strong> Allows sharing files from external storage. Useful when the file is stored in a location accessible to the user.</li><li><strong><code>&lt;cache-path&gt;:</code></strong> Allows sharing files from the app&rsquo;s internal cache. This is the most common and safest option, ideal for temporary files such as PDFs, images, or receipts.</li><li><strong><code>&lt;external-cache-path&gt;:</code></strong> Allows sharing files from the external cache. It is still a temporary location, but outside the internal storage.</li><li><strong>sharing-root:</strong> Is a folder that you define and that acts as a <strong>secure area for sharing files.</strong> Only files located inside this folder can be shared.</li></ul><h2 id="ipados-presentation-location">iPadOS Presentation Location</h2><p>When requesting a share or opening launcher on iPadOS, the system displays the action as a popover. To control where this popover appears on the screen and where its arrow points, you must specify a position using the <code>PresentationSourceBounds</code> property.</p><p>You can do it in the following way:</p><p><strong>Share</strong></p><pre><code>await Share.RequestAsync(new ShareFileRequest 
{ 
    Title = Title, 
    File = new ShareFile(file), 
    PresentationSourceBounds = 
    DeviceInfo.Platform == DevicePlatform.iOS &amp;&amp; 
    DeviceInfo.Idiom == DeviceIdiom.Tablet 
    ? new Rect(0, 20, 0, 0) 
    : Rect.Zero 
});
</code></pre><p><strong>Launcher</strong></p><pre><code>await Launcher.OpenAsync(new OpenFileRequest 
{ 
    File = new ReadOnlyFile(file), 
    PresentationSourceBounds = 
    DeviceInfo.Platform == DevicePlatform.iOS &amp;&amp; 
    DeviceInfo.Idiom == DeviceIdiom.Tablet 
    ? new Rect(0, 20, 0, 0) 
    : Rect.Zero 
})
</code></pre><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, you learned how to implement share functionality in your .NET MAUI apps, allowing users to easily share text, links, files and even multiple files across platforms.</p><p>You also explored important platform-specific considerations, such as additional permissions on iOS and Mac Catalyst, secure file sharing on Android using FileProvider, and how to properly handle popover presentation on iPadOS to avoid unexpected issues.</p><p>With these concepts in mind, you now have a clearer understanding of how to create a complete and secure sharing experience, taking care of both user experience and platform requirements.</p><p>If you have any questions or would like me to cover more .NET MAUI topics, feel free to leave a comment&mdash;I&rsquo;d be happy to help! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="reference">Reference</h3><p>Sample codes and explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/data/share?view=net-maui-10.0&amp;tabs=android">https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/data/share?view=net-maui-10.0&amp;tabs=android</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Get Your .NET MAUI App Up More Quickly</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Deliver native apps for every platform in half the time with 70+ customizable UI components, an AI Coding Assistant and unmatched productivity tools. <a href="https://www.telerik.com/maui-ui" target="_blank">Check out Progress Telerik UI for .NET MAUI</a>.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:58c27fcc-97ec-47bb-b8ed-a6bfff50ad27</id>
    <title type="text">Deploying Containerized NestJS Applications on GCP Using Cloud Run</title>
    <summary type="text">While there are numerous ways to deploy an app to Cloud Run, see how to containerize and deploy a NestJS API. We will use a few products on GCP, such as Buildpacks and Artifact Registry, to build and deploy our image, and then finally deploy it to Cloud Run.</summary>
    <published>2026-05-21T14:35:45Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Christian Nwamba </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/deploying-containerized-nestjs-applications-gcp-using-cloud-run"/>
    <content type="text"><![CDATA[<p><span class="featured">While there are numerous ways to deploy an app to Cloud Run, see how to containerize and deploy a NestJS API. We will use a few products on GCP, such as Buildpacks and Artifact Registry, to build and deploy our image, and then finally deploy it to Cloud Run.</span></p><p><a target="_blank" href="https://cloud.google.com/run">Google Cloud Run</a> is a serverless platform that allows developers to deploy and scale a wide range of applications, from web, server-side and functions to AI/ML workloads. Internally, it runs all applications as containerized payloads.</p><p>While there are numerous ways to deploy an app to Cloud Run, in this article, we will see how to containerize and deploy a NestJS API. We will use a few products on GCP, such as <a target="_blank" href="https://docs.cloud.google.com/docs/buildpacks/overview">Buildpacks</a> and <a target="_blank" href="https://docs.cloud.google.com/artifact-registry/docs">Artifact Registry</a>, to build and deploy our image, and then finally deploy it to Cloud Run.</p><h2 id="prerequisites">Prerequisites</h2><p>To proceed with this guide, it is assumed you are comfortable with TypeScript and have basic knowledge of building a web server with the NestJS framework.</p><h2 id="setting-up-a-nestjs-project">Setting Up a NestJS Project</h2><p>Assuming you have the <a target="_blank" href="https://docs.nestjs.com/cli/overview#installation">NestJS CLI</a> installed, open your terminal and run the following command to set up a basic NestJS project:</p><pre class=" language-shell"><code class="prism  language-shell">nest new sample-project
</code></pre><p>Follow the prompt to set up the project in a folder called sample-project. Feel free to choose your preferred name. We will be making changes to our project as we proceed.</p><h2 id="setting-up-our-project-on-gcp">Setting Up Our Project on GCP</h2><p>Let&rsquo;s now set up a project on GCP. To achieve this, you can do one of the following:</p><ul><li>Create a project using the Firebase console UI or CLI</li><li>Directly create it on the GCP console UI or using the Google Cloud CLI</li></ul><p>Regardless of which method we choose, we will get the same result. However, in our case, we will be using the second option and will mostly be working with the Google Cloud CLI in our terminal to create resources.</p><p>Assuming you have the Google Cloud CLI installed, open your terminal and run the following commands to set up the CLI. Skip these steps if you have already configured it.</p><p>Start by logging in:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud auth login
</code></pre><p>To verify the logged-in account, run this command: <code>gcloud auth list</code>.</p><p>Next, run the following command to create a project:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud projects create dummy-nest-swish0062 --name dummy-nest-project --set-as-default
</code></pre><p>We specify the project ID and the project name, and set it as the default project in our CLI.</p><p>We will also need to enable billing on the project to be able to use Cloud Run. Run the following command:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud billing accounts list 
</code></pre><p>The command above lists the available billing accounts, which will return a list that looks like so:</p><p><img title="List of billing account" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/list-of-billing-account.png?sfvrsn=7ca2978e_2" alt="List of billing account" /></p><p>Next, link the billing account by running this command:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud billing projects link dummy-nest-swish0062 --billing-account=017F58-A35A34-XXXXXX
</code></pre><p>The command above is similar to clicking create project on GCP and filling the form as shown below:</p><p><img title="Creating a project on GCP console" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/creating-a-project-on-gcp-console.png?sfvrsn=197f9625_2" alt="Creating a project on GCP console" /></p><h2 id="google-cloud-run-knative-and-kubernetes">Google Cloud Run, Knative and Kubernetes</h2><p>Google Cloud Run is built on top of Knative, and Knative is built on top of Kubernetes. These tools are designed to simplify the deployment of containerized applications.</p><p><img title="Google Cloud Run, Knative, and Kubernetes" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/google-cloud-run-knative-kubernetes.png?sfvrsn=e3ea634_2" alt="Google Cloud Run, Knative, and Kubernetes" /></p><p>As we move from top to bottom, there is increased experience and expertise required, more control, more knowledge gaps to be filled, and, of course, a greater margin for error.</p><p>The opposite applies when moving from bottom to top, with Google Cloud Run at the apex. Cloud Run requires the least experience from developers and gives them the best deployment experience while doing all the heavy lifting.</p><p>To understand the benefits of Cloud Run, let&rsquo;s do a basic walkthrough from bottom to top, outlining the struggles and benefits at each level.</p><h3 id="containers-and-kubernetes">Containers and Kubernetes</h3><p>It all starts with having a project written in some language that needs to be deployed live to users. To proceed, the developer may need to understand how to use a container runtime like Docker or Podman to build images. Next, they need to put the images on some registry (e.g., Docker Hub).</p><p>To deploy the images, that is, run them as containers in production, a lot of things can go wrong. They need to determine how many instances of the container to run, which ports to expose, how to route traffic, and much more. To achieve this, learning how to use a tool like Kubernetes might help, since it allows the developer to define the desired state of the application. The developer needs to understand how Kubernetes works, understanding concepts like the control plane, data plane, workloads, pods, deployments, services and ingresses.</p><h3 id="knative">Knative</h3><p>To save developers the stress, Knative was built. It abstracts all the inner complexities of working directly with Kubernetes and makes it easy to build and scale serverless applications with zero knowledge of containers, Kubernetes or any of its concepts. Since it is based on Kubernetes, it is highly portable and can run on any cloud platform.</p><p>Knative consists of three main components:</p><ol><li><p><strong>Functions Framework:</strong> A framework that allows developers to write HTTP-triggerable serverless functions in their preferred programming language. As of the time of writing, four languages are supported (Go, Python, Java and TypeScript/JavaScript). After writing their functions, developers can test them locally. The Functions Framework handles containerizing the function code, storing it in a registry and then passing it to Knative Serving for deployment.</p></li><li><p><strong>Knative Serving:</strong> This is responsible for deploying and running containers on top of Kubernetes. Containers can hold the logic for any HTTP-triggerable workload&mdash;for example, one using the Functions Framework, our NestJS web server, or an AI/ML workload. Under the hood, it interacts with Kubernetes to create service definitions, which house all the configurations required to run the containers, route incoming traffic to them and handle scaling as well. For AI/ML workloads, it verifies containers have access to GPUs. Service definitions also maintain revisions of the service, which are snapshots or versions of the configurations and the state of our application, allowing developers to roll back to previous states in case of errors or failures.</p></li><li><p><strong>Knative Eventing:</strong> Provides APIs for developers to employ an event-driven architecture suitable for building loosely coupled services. These APIs allow developers to route events between services via HTTP. Events are usually represented in the form of JSON. They originate from an event source and are then moved to a message broker, which routes the payload to an event consumer. An event source or consumer could be services running on Knative Serving or Kubernetes; event sources may also be external services and systems, such as databases.</p></li></ol><h3 id="cloud-run">Cloud Run</h3><p>Finally, we have Cloud Run, which, in the simplest terms, is Knative for Google Cloud Platform with extra superpowers:</p><ul><li>Deployment directly from source code or using containers, with or without knowledge of container runtimes like Docker or Podman</li><li>Runs containers in an isolated environment where running containers can still access your other cloud resources</li><li>Multiple options to run containers: as services, jobs or worker pools</li><li>Functions Framework with support for more languages, allowing you to write and deploy application logic in minutes</li><li>Flexible payment options&mdash;either pay per request or pay per instance&mdash;with autoscaling handled automatically</li><li>CI/CD tools to automatically deploy new versions of your application to production</li></ul><h2 id="deployment-options">Deployment Options</h2><p>Regardless of the method we choose to deploy an application, we already know that it ends up running as a container. Generally, we can deploy our application as one of the following:</p><ul><li><strong>Service:</strong> Used for HTTP-triggerable resources.</li><li><strong>Job:</strong> Jobs are typically used when we want our code to perform expensive computations that we trigger manually. Jobs are not called via HTTP.</li><li><strong>Worker pool:</strong> These are used to run resources that serve as consumers for jobs managed by a broker or queue service. Worker pools are always running and constantly listening for new data to process.</li></ul><p>Since our NestJS application is HTTP-triggerable and listens on a port, we will be deploying it as a service.</p><p>When deploying our application as a service, we have two main options:</p><ul><li><strong>Deploy from source:</strong> Here, you simply point Cloud Run to a repository (e.g., on GitHub), and it takes care of containerizing the application and deploying it. This option is available only for services.</li><li><strong>Deploy from container:</strong> Here, you point it to a container (e.g., on Docker Hub or Artifact Registry), and then it takes care of the rest. This is available for all resource types.</li></ul><p>We will be using the second option, since this is the goal of this article.</p><h2 id="deploy-from-container">Deploy from Container</h2><p>When deploying from containers, we can choose to build and publish the image either locally or remotely:</p><ul><li><strong>Locally:</strong> Here we install Docker, Podman or some other container runtime on a PC or VM, then build an image. To build the image locally, we can either write our build configuration in a Dockerfile or skip using a Dockerfile completely and install a local buildpack like the Pack CLI to build the image. We then publish it on Docker Hub, retrieve the URL to that image, and feed it to the Cloud Run console to deploy our app.</li><li><strong>Remotely:</strong> This is the option we will be using. Here, we don&rsquo;t need to install any tools. We will leverage Google Cloud Buildpacks to build the image remotely, then proceed to push the built image to Google&rsquo;s Artifact Registry and use the URL to the image to deploy the service.</li></ul><h2 id="preparing-our-nestjs-project-before-deployment">Preparing Our NestJS Project Before Deployment</h2><p>We will also need to make a few changes to our NestJS project before we can proceed with deployment.</p><h3 id="defining-the-project-descriptor">Defining the Project Descriptor</h3><p>In the root of your NestJS project, open your terminal and run the following command:</p><pre class=" language-shell"><code class="prism  language-shell">touch project.toml
</code></pre><p>Update its contents to match the following</p><pre class=" language-js"><code class="prism  language-js"><span class="token punctuation">[</span><span class="token punctuation">[</span>build<span class="token punctuation">.</span>env<span class="token punctuation">]</span><span class="token punctuation">]</span>
name <span class="token operator">=</span> <span class="token string">"GOOGLE_ENTRYPOINT"</span>
value <span class="token operator">=</span> <span class="token string">"node dist/main"</span>
</code></pre><p>Earlier, we said we will be using Google&rsquo;s Cloud Build service and the buildpacks it provides to build our application&rsquo;s image. A project descriptor is a file used to guide the repository (i.e., the Cloud Build service) on how to build the image. Think of it as informing the Google Cloud Build service on how to update the contents of the Dockerfile before it builds the image and when it runs the image as a container.</p><p>There are special environment variable names, some of which are specific to Google Cloud Build (i.e., for any runtime such as Node or Java) and others specific to our project&rsquo;s runtime (i.e., Node.js in our case).</p><p>In the <code>project.toml</code> file, we specified the one called <code>GOOGLE_ENTRYPOINT</code>. Without this variable, Cloud Run will not know how to execute our container. The value of this variable is synonymous with the CMD block in a Dockerfile.</p><p>It is important to note that the environment variables in the <code>project.toml</code> file are only for building the image and running the container. Later, we will describe how to add runtime-specific environment variables like database secrets that will be used in our NestJS app.</p><h2 id="configuring-the-port">Configuring the Port</h2><p>Update the <code>main.ts</code> file to look like this:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> NestFactory <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/core'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AppModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./app.module'</span><span class="token punctuation">;</span>

<span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">bootstrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token keyword">await</span> NestFactory<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>AppModule<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">await</span> app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>PORT <span class="token operator">||</span> <span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">bootstrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>The PORT environment variable is a special reserved variable that will be injected by Cloud Run when it runs our NestJS backend in a container. We updated the app to listen to the value of the PORT variable or fall back to the default value of 3000.</p><h2 id="building-and-deploying-our-nestjs-app-as-a-service">Building and Deploying Our NestJS App as a Service</h2><p>In this section, we will be doing the following:</p><ul><li>Creating an artifact repository</li><li>Building and publishing the image to the artifact repository</li><li>Creating a service on Cloud Run using the image URL</li></ul><h2 id="creating-an-artifact-repository">Creating an Artifact Repository</h2><p>Open your terminal, and run the following command to create a repository:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud artifacts repositories create dummy-nest-repo\
    --repository-format=docker \
    --location=europe-west2 \
    --description=" this "repo will hold my nestjs app" \
    --immutable-tags 
</code></pre><p>A repository holds one or more images. In the command above, we created one called &ldquo;dummy-nest-repo&rdquo; in the europe-west2 region with the Docker repository format.<br />If the command executes successfully, we get the newly created repository.</p><p>Here is a snapshot of the GCP console UI showing the newly created repository:</p><p><img title="Newly created repo on GCP console" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/newly-created-repo-on-gcp-console.png?sfvrsn=a38ed974_2" alt="Newly created repo on GCP console" /></p><h2 id="building-and-publishing-the-image-to-the-artifact-repository">Building and Publishing the Image to the Artifact Repository</h2><p>With our repository available, run the following command to trigger a build and publish it to the repository:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud builds submit --pack image=europe-west2-docker.pkg.dev/dummy-nest-swish0062/dummy-nest-repo/dummy-app:0.0001 
</code></pre><p>The command above triggers the Cloud Build service to build and deploy our image to the dummy-nest-repo repository.</p><p>The image URL is a string that takes the following form:</p><pre class=" language-js"><code class="prism  language-js">REGION<span class="token operator">-</span>docker<span class="token punctuation">.</span>pkg<span class="token punctuation">.</span>dev<span class="token operator">/</span>PROJECT<span class="token operator">-</span>ID<span class="token operator">/</span>REPOSITORY_NAME<span class="token operator">/</span>IMAGE_NAME<span class="token punctuation">:</span>TAG
</code></pre><p><img title="Image built and uploaded in repo" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/image-built-and-uploaded.png?sfvrsn=22dfb8ed_2" alt="Image built and uploaded in repo" /></p><h2 id="creating-a-service-on-cloud-run-using-the-image-url">Creating a Service on Cloud Run Using the Image URL</h2><p>Open your terminal and run the following command to deploy the image as a service:</p><pre class=" language-shell"><code class="prism  language-shell">gcloud run deploy my-nestjs-app  --image europe-west2-docker.pkg.dev/dummy-nest-swish0062/dummy-nest-repo/dummy-app:0.0001
</code></pre><p>The command above deploys a service called &ldquo;my-nestjs-app&rdquo; using the URL to the image we just uploaded.</p><p>The screenshot below shows the result of running the command.</p><p><img title="Deploying our NestJS application as a service on google cloud run using the image URL" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/deploying-our-nestjs-application.png?sfvrsn=e21c81ce_2" alt="Deploying our NestJS application as a service on google cloud run using the image URL" /></p><p>As seen above, we get a URL which we can use to connect to the application. We can visit this endpoint in our browser and receive a &ldquo;Hello World&rdquo; response from our NestJS server, as shown below.</p><p><img title="Testing the service URL in the browser" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/testing-the-service-url.png?sfvrsn=e7223305_2" alt="Testing the service URL in the browser" /></p><p>Also, on the GCP console, we can see the service, its revisions, configurations, routing, etc., similar to the definitions of the Knative Serving component described earlier.</p><p><img title="GCP console" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/gcp-console.png?sfvrsn=d91513eb_2" alt="GCP console" /></p><h2 id="adding-runtime-specific-environment-variables">Adding Runtime-Specific Environment Variables</h2><p>Server-side applications may use one or more environment variables to connect to a database, communicate with third-party APIs, etc. In this section, we will see how to include runtime environment variables when deploying services. We will be doing the following:</p><ul><li>Adding .env files to our NestJS app</li><li>Setting up and configuring the Config Module</li><li>Deploying a new version of the service referencing the environment variable files</li></ul><h3 id="adding-.env-files-to-our-nestjs-app">Adding .env files to our NestJS app</h3><p>Assuming you are in the project&rsquo;s root, open your terminal and run the following command to create two files: <code>.env.dev</code> and <code>.env.prod</code>.</p><pre class=" language-shell"><code class="prism  language-shell">touch .env.dev prod.env
</code></pre><p>These files will hold environment variables for development and production, respectively. Let&rsquo;s proceed to update their contents.</p><p>Update the <code>.env.dev</code> file with the following:</p><pre class=" language-js"><code class="prism  language-js">MESSAGE<span class="token operator">=</span><span class="token string">"this is dev message"</span>
</code></pre><p>Update the <code>prod.env</code> file with the following:</p><pre class=" language-js"><code class="prism  language-js">MESSAGE<span class="token operator">=</span><span class="token string">"this is production message"</span>
</code></pre><p>We included a variable named <code>MESSAGE</code> in each file, which holds a dummy message.</p><h3 id="setting-up-and-configuring-the-config-module">Setting Up and Configuring the Config Module</h3><p>Usually, when working with environment variables in a NestJS application, the <code>ConfigModule</code> is the recommended way to use and access them. That is what we will be doing in this guide.</p><p>Let&rsquo;s now install it in our app.</p><pre class=" language-shell"><code class="prism  language-shell">pnpm install -save @nestjs/config
</code></pre><p>Next, let&rsquo;s update the <code>app.module.ts</code> file to use this module:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AppController <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./app.controller'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AppService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./app.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
    imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>

    ConfigModule<span class="token punctuation">.</span><span class="token function">forRoot</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
        isGlobal<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">,</span>
        ignoreEnvFile<span class="token punctuation">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>NODE_ENV <span class="token operator">===</span> <span class="token string">'production'</span><span class="token punctuation">,</span>
        envFilePath<span class="token punctuation">:</span> <span class="token punctuation">[</span>
        <span class="token string">'.env.dev'</span>
        <span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">]</span><span class="token punctuation">,</span>
    controllers<span class="token punctuation">:</span> <span class="token punctuation">[</span>AppController<span class="token punctuation">]</span><span class="token punctuation">,</span>
    providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>AppService<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AppModule</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</code></pre><p>The <code>envFilePath</code> points to files where we want to load environment variables from. We only specified <code>.env.dev</code> since we will be using that during development. However, in production, we ignore all <code>.env</code> files since they will be injected for us automatically in our container.</p><p>Note that the <code>process.env.NODE_ENV</code> variable will be automatically injected by the Cloud Build service when building the image and will default to production. We can override this value in the <code>project.toml</code> file in case we want different behavior in different environments.</p><p>Let&rsquo;s now update the <code>app.service.ts</code> file and update its <code>getHello</code> method:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AppService</span> <span class="token punctuation">{</span>
    <span class="token keyword">constructor</span><span class="token punctuation">(</span><span class="token keyword">private</span> readonly configService<span class="token punctuation">:</span> ConfigService<span class="token punctuation">)</span> <span class="token punctuation">{</span>

    <span class="token punctuation">}</span>
    <span class="token function">getHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">string</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>configService<span class="token punctuation">.</span>getOrThrow<span class="token operator">&lt;</span><span class="token keyword">string</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token string">'MESSAGE'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The <code>getHello</code> method is now updated to return the contents of the <code>MESSAGE</code> environment variable.</p><p>Start the application locally by running:</p><pre class=" language-shell"><code class="prism  language-shell">pnpm run start:dev
</code></pre><p>If we visit localhost:3000 in our browser, we see the contents of the message from the <code>.env.dev</code> variable, as shown below:</p><p><img src="https://www.telerik.com/sfimages/default-source/blogs/2026/2026-05/message-from-env-dev-variable.png" alt="Message from the .env.dev variable" title="Message from the .env.dev variable" /></p><p>Let&rsquo;s now proceed to build and deploy a new version of our service.</p><pre class=" language-shell"><code class="prism  language-shell">gcloud builds submit --pack image=europe-west2-docker.pkg.dev/dummy-nest-swish0062/dummy-nest-repo/dummy-app:0.0002
</code></pre><p>The only notable change in the build command is that the new image has a tag of 0002. Next, let&rsquo;s deploy it.</p><pre class=" language-shell"><code class="prism  language-shell">gcloud run deploy my-nestjs-app  --image europe-west2-docker.pkg.dev/dummy-nest-swish0062/dummy-nest-repo/dummy-app:0.0002 --env-vars-file prod.env 
</code></pre><p>Notice we included the <code>&ndash;env-vars-file</code> option and set it to the <code>prod.env</code>.</p><blockquote><p>As a side note, verify that the file extension of the file holding environment variables that you intend to ship to production ends with <code>.env</code> (e.g., prod.env in our case). Setting it to <code>.env.prod</code> will not work.</p></blockquote><p>On the GCP console, look at our service and click on <strong>Edit and deploy new revision</strong>.<br />In the <strong>Variables and Secrets</strong> tab under <strong>Edit Container</strong>, we see the newly added variable, as shown below:</p><p><img title="Viewing runtime environment variables for servicee" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/viewing-runtime-environment-variables.png?sfvrsn=19e97179_2" alt="Viewing runtime environment variables for service" /></p><p>When we visit our service URL, we get the new message, as shown below:</p><p><img title="Production service url outputs contents of the injected runtime environment variable" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/production-service-url-output.png?sfvrsn=55f065b_2" alt="Production service url outputs contents of the injected runtime environment variable" /></p><h2 id="best-practices">Best Practices</h2><p>In this section, we will discuss a few best practices to keep in mind when deploying containerized applications on Google Cloud Run. We have already established the fact that when deploying services, we can have billing set either per request (default) or per instance. We will go over some general guidelines for all services to be deployed on Cloud Run and runtime-specific guidelines for Node.js.</p><ol><li>If services are configured to run as request-based, they should not perform background tasks since their runtime is short-lived (i.e., limited to only when there are incoming requests). If you need services to perform background tasks, run them as instance-based and set at least one running instance.</li><li>Start containers quickly. This can be done by keeping containers lightweight and removing unnecessary dependencies in your code. Also, if you are building the image yourself, use stable and community-maintained base images.</li><li>For Node.js applications, minimize the number of dependencies. When using many dependencies, you should employ lazy loading to only load them when necessary to minimize startup time. Preferably, start your containers using <code>node</code> instead of <code>npm</code>. For example, in our case we started our container using <code>node dist/main</code> instead of <code>npm run start</code>, which is slower.</li></ol><h2 id="next-steps">Next Steps</h2><p>When it comes to deploying applications, there is no one-size-fits-all approach. We have covered one of the numerous ways to deploy our application on GCP using the Cloud Run service. However, we can still make some improvements in our approach. The obvious one is the fact that we have to manually type each command.</p><p>Also, to streamline our workflow, we need to enable CI/CD to provide a better experience when deploying our code. We can use GitHub Actions and any of the Google Cloud Run provided workflows to automate that process.</p><p><img title="Google Cloud Run workflows" src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/google-cloud-run-workflows.png?sfvrsn=1024a270_2" alt="Google Cloud Run workflows" /></p><h2 id="conclusion">Conclusion</h2><p>While there are numerous options for deploying applications, in this guide we focused on using Google Cloud and the Cloud Run service. Hopefully, this will serve as a potential option for deploying your applications in future projects.</p><hr /><p><strong>Read more:</strong> <a href="https://www.telerik.com/blogs/build-nestjs-ai-chatbot-google-gemini" target="_blank">How to Build a NestJS AI Chatbot with Google Gemini</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:9388782c-bf6c-4dd7-bb29-78499ce92c79</id>
    <title type="text">AI Cost Visibility Before the Invoice: How to Trace, Measure and Optimize Token Spend</title>
    <summary type="text">Learn how to measure and optimize AI token spend before billing surprises hit. Discover why production AI costs diverge from estimates and how trace-level observability helps teams control LLM spending.</summary>
    <published>2026-05-21T11:02:14Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Nikolay Iliev </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/ai-cost-visibility-before-the-invoice"/>
    <content type="text"><![CDATA[<h2>The Cost Visibility Problem</h2><p style="font-weight:400;">Most AI teams don&rsquo;t realize they&rsquo;ve overspent until the invoice arrives. The math seems simple&mdash;you know the per-token rate, you estimate average usage and you multiply. But production agent behavior introduces compounding factors that make those estimates wildly inaccurate: retries, context window growth, multi-step reasoning chains, automated evaluations and framework-level overhead that&rsquo;s invisible without proper instrumentation.</p><p style="font-weight:400;">The real problem isn&rsquo;t just cost&mdash;it&rsquo;s the lack of visibility into what caused the cost.</p><h3>The Spreadsheet Model</h3><p style="font-weight:400;">When evaluating an LLM provider, the cost model looks deterministic:</p><p style="font-weight:400;">Monthly cost = (avg_input_tokens + avg_output_tokens) &times; per_token_rate &times; monthly_invocations</p><p style="font-weight:400;">For a simple weather agent: ~500 input tokens + ~200 output tokens per query, at GPT-4.1-mini rates ($0.40/1M input, $1.60/1M output), running 10,000 queries/month = roughly $3.60/month. Budget approved.</p><h3>The Production Reality</h3><p style="font-weight:400;">In production, that same agent exhibits behavior the spreadsheet never captured:</p><ol style="font-weight:400;"><li><strong>Context accumulation</strong> - each tool result is appended to the conversation context. A weather agent that calls one tool adds ~300 tokens of tool output to every subsequent LLM call. An agent with 5 tools might accumulate 2,000+ tokens of context before generating the final response.</li><li><strong>Retry amplification</strong> - most agent frameworks implement automatic retry logic. LangChain&rsquo;s create_agentwill retry on parsing failures. If the LLM returns a malformed tool call 20% of the time, you&rsquo;re paying 1.2x the expected token cost - and the retry itself includes the full accumulated context.</li><li><strong>Multi-step reasoning</strong> - ReAct-style agents loop: Think &rarr; Act &rarr; Observe &rarr; Think &rarr; Act &rarr; Observe &rarr; Final Answer. Each iteration sends the entire conversation history. A 3-iteration agent sends roughly 3 &times; (system_prompt + accumulated_context + new_thought) - not 3&times; the base cost but more like 5-7&times; due to context growth.</li><li><strong>Framework overhead</strong> - LangChain, LlamaIndex and other frameworks inject system prompts, format instructions and intermediate parsing prompts that aren&rsquo;t visible in your application code. These add 200-500 tokens per call that never appear in your cost estimate.</li><li><strong>Invisible evaluations</strong> - platforms that run automatic quality evaluations consume tokens for the judge LLM call. If evaluations run on every trace, they effectively double your token spend.</li></ol><p style="font-weight:400;">The result: that $3.60/month estimate becomes $25-40/month in practice. At enterprise scale with multiple agents, the gap between estimated and actual spend can reach thousands of dollars monthly.</p><h2>Why This Becomes Urgent with Usage-Based Billing</h2><p style="font-weight:400;">This problem is about to get significantly worse. The AI tooling industry is rapidly shifting from flat-rate to usage-based pricing, making every token a direct billing event.</p><p style="font-weight:400;">GitHub recently announced that Copilot is moving to usage-based billing starting June 2026. The reasoning is explicit: &ldquo;a quick chat question and a multi-hour autonomous coding session can cost the user the same amount&rdquo; under flat pricing - so they&rsquo;re replacing premium request counts with &ldquo;GitHub AI Credits&rdquo; consumed based on token usage (input, output and cached tokens) at published API rates per model.</p><p style="font-weight:400;">This isn&rsquo;t an isolated decision. It reflects a structural reality: as AI tools become agentic - running multi-step sessions, invoking tools, iterating across codebases - the cost variance between &ldquo;light&rdquo; and &ldquo;heavy&rdquo; usage becomes too large for flat pricing to absorb. Providers are pushing that variance downstream to users.</p><p style="font-weight:400;">The implication for engineering teams is clear: <strong>in a token-based billing world, cost optimization requires the same granular visibility as performance optimization.</strong> Every retry, long context window, tool call, model switch and evaluation becomes a measurable billing event. You can&rsquo;t optimize what you can&rsquo;t measure and you can&rsquo;t measure token economics with infrastructure metrics.</p><h2>What Teams Need for AI Cost Visibility and Management</h2><p style="font-weight:400;">Before choosing any tool or platform, it helps to define what metrics and dimensions actually matter for AI cost control. These are the building blocks of cost visibility regardless of implementation:</p><h3>Token Metrics</h3><ul><li><strong>Input, output, total and cached tokens</strong> - the raw cost drivers behind every LLM call. Cached tokens matter because many providers price them differently (often at a discount) and knowing your cache hit rate affects cost projections.</li></ul><h3>Cost Dimensions</h3><ul><li><strong>Cost by model and provider</strong> - shows where routing decisions affect spending. If 90% of cost comes from one model, that&rsquo;s where optimization has the highest leverage.</li><li><strong>Cost by request, trace, span, workflow, service and agent</strong> - progressively broader views from a single LLM call up to an entire service, enabling drill-down from aggregate anomalies to root causes.</li><li><strong>Cost by customer, team, environment, release and experiment</strong> - attribution dimensions that answer, &ldquo;who or what caused the spend?&rdquo; rather than just &ldquo;how much did we spend?&rdquo;</li></ul><h3>Behavioral Metrics</h3><ul><li><strong>Retry count and agent iteration count</strong> - expose hidden cost amplification. A retry rate of 20% means you&rsquo;re paying 1.2x what you expected, compounded by context size.</li><li><strong>Tool calls and retrieval steps</strong> - each tool invocation may trigger additional LLM calls or add context that inflates subsequent calls.</li><li><strong>Context growth across a conversation or workflow</strong> - the silent cost multiplier. If context grows linearly with conversation turns, cost grows quadratically.</li></ul><h3>Quality and Efficiency Metrics</h3><ul><li><strong>Evaluation usage and judge-model cost</strong> - quality checks that use LLM judges have their own token cost, which can rival or exceed the primary inference cost if unchecked.</li><li><strong>Latency, error status and failed/partial responses</strong> - failed responses still consume tokens. High latency may indicate retries or queuing that affects both cost and user experience.</li></ul><h3>Meta-Metrics</h3><ul><li><strong>Observability usage and cost</strong> - the observability layer itself should be measurable. If you can&rsquo;t quantify what observability costs you, it may become an uncontrolled expense.<br /><br /></li></ul><h2>When Observability Itself Becomes a Cost Problem</h2><p style="font-weight:400;">Teams need observability to manage AI cost but the observability layer itself needs to be transparent, predictable and intentional.</p><p style="font-weight:400;">A recent Reddit post from a developer using Azure AI Foundry illustrates the issue:</p><p style="font-weight:400;">&ldquo;I am noticing very high, unexpected charges coming from &lsquo;Observability&rsquo;. I do not need these logs, metrics or trace data right now and my main goal is to stop these charges completely.&rdquo;</p><p style="font-weight:400;">The root cause: Azure AI Foundry enables playground evaluations by default (which consume LLM tokens and are billed) and automatically configures Application Insights tracing for hosted agents. The developer was being charged for observability features they never consciously enabled.</p><p style="font-weight:400;">A Microsoft PM confirmed the fix: navigate to the agents playground, select metrics in the upper right and unselect all evaluators. The developer had to <em>disable all observability</em> to stop the charges&mdash;trading cost visibility for cost control.</p><p style="font-weight:400;">This creates a fundamental tension: you need observability to control AI costs but if observability itself is an uncontrolled cost with hidden defaults, it becomes part of the problem. The solution requires an observability platform where:</p><ul><li>Instrumentation is explicitly opt-in (nothing runs unless you add it to your code)</li><li>Pricing is predictable and based on discrete units, not data volume</li><li>The observability model should be predictable and ROI-positive, helping teams reduce avoidable AI spend without creating a new cost surprise<br /><br /></li></ul><h2>Why These Metrics Matter</h2><p style="font-weight:400;">Understanding what each metric tells you - and what decisions it enables - is the difference between collecting data and controlling cost:</p><ul><li><strong>Token counts</strong> show the raw cost driver. If you don&rsquo;t know how many tokens a workflow consumes, you can&rsquo;t estimate or optimize its cost.</li><li><strong>Model and provider data</strong> shows where routing decisions affect spend. Switching from a flagship model to a smaller model for classification tasks can reduce cost 10-50&times; for that step with minimal quality impact.</li><li><strong>Trace-level cost</strong> shows which step in a workflow created the spike. Without this, you know <em>that</em> cost went up but not <em>why</em>.</li><li><strong>Tags</strong> (customer, release, environment, experiment) make cost attributable. They turn &ldquo;we spent $4,000 this month&rdquo; into &ldquo;customer X&rsquo;s workflow costs 8&times; more than average because of context length.&rdquo;</li><li><strong>Retry and iteration counts</strong> expose hidden cost amplification. An agent that retries 3 times on 10% of requests is silently spending 30% more than expected on those requests.</li><li><strong>Evaluation metrics</strong> prevent quality checks from becoming invisible spend. If your judge model runs on every trace and costs $0.02 per evaluation, that&rsquo;s $200/month at 10,000 traces - potentially more than the inference cost you&rsquo;re trying to optimize.</li><li><strong>Latency</strong> helps teams optimize cost without degrading user experience. A cheaper model that adds 2 seconds of latency may not be an acceptable tradeoff but you need both metrics to make that decision.</li></ul><h2>Vendor-Neutral Workflow for Tracing, Observing and Optimizing AI Cost</h2><p style="font-weight:400;">Before introducing any specific tool, here is the general process teams should follow to move from reactive invoice surprises to proactive cost control:</p><ol><li><strong>Instrument</strong> - Capture AI requests, model calls, tool calls, retrieval steps and evaluations. Every step that could consume tokens or trigger billing should emit telemetry.</li><li><strong>Capture</strong> - Record token counts, model metadata, latency, status and cost estimates for each instrumented operation.</li><li><strong>Attribute</strong> - Add tags for customer, release, environment, team and experiment so cost can be sliced by any business dimension.</li><li><strong>Baseline</strong> - Establish a cost baseline for normal operations. Without a baseline, you can&rsquo;t distinguish a spike from expected variance.</li><li><strong>Monitor</strong> - Watch for spikes or regressions after deployments, prompt changes, model switches or traffic shifts.</li><li><strong>Investigate</strong> - Drill into expensive traces to identify the root cause: was it a retry loop, context bloat, a model routing error or an evaluation storm?</li><li><strong>Optimize</strong> - Fix the identified problem: optimize prompts, adjust routing, cap retries, manage context windows, prune unnecessary tool calls or limit evaluations.</li><li><strong>Validate</strong> - Confirm that cost improved without hurting quality or latency. Cost optimization that degrades user experience isn&rsquo;t optimization - it&rsquo;s a tradeoff that needs explicit approval.</li></ol><p style="font-weight:400;">This loop takes your cost discovery time from &ldquo;30 days (when the invoice arrives)&rdquo; to &ldquo;same day (when the trace appears).&rdquo;</p><h2>Progress Observability as a Practical Example</h2><p style="font-weight:400;">Here is what this framework looks like when implemented using Progress Observability. The sections below demonstrate each capability as a concrete example of the general principles.</p><h3>Instrumented Weather Agent - Example of Capturing Telemetry</h3><p style="font-weight:400;">A real Python agent instrumented with the Progress Observability SDK, using LangChain with OpenAI to answer weather questions:</p><h2><span lang="EN-US"></span></h2><p class="SourceCode"><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">os</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">dotenv </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">load_dotenv</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">langchain_community.utilities </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">OpenWeatherMapAPIWrapper</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">langchain_community.tools </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">OpenWeatherMapQueryRun</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">langchain_openai </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">ChatOpenAI</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">langchain.agents </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">create_agent</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">progress.observability </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">Observability, ObservabilityInstruments</span></span><span lang="EN-US"><br /></span><span class="ImportTok"><span lang="EN-US">from</span></span><span class="NormalTok"><span lang="EN-US">progress.observability </span></span><span class="ImportTok"><span lang="EN-US">import</span></span><span class="NormalTok"><span lang="EN-US">agent, workflow, task, tool</span></span><span lang="EN-US"><br /><br /><span class="NormalTok">load_dotenv()</span><br /><br /><span class="NormalTok">os.environ.pop(</span></span><span class="StringTok"><span lang="EN-US">"SSL_CERT_FILE"</span></span><span class="NormalTok"><span lang="EN-US">, </span></span><span class="VariableTok"><span lang="EN-US">None</span></span><span class="NormalTok"><span lang="EN-US">)</span></span><span lang="EN-US"><br /><br /></span><span class="CommentTok"><span lang="EN-US"># Initialize observability - explicitly opt-in, called before LLM usage</span></span><span lang="EN-US"><br /><span class="NormalTok">Observability.instrument(</span><br /><span class="NormalTok">&nbsp;&nbsp; app_name</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">os.getenv(</span></span><span class="StringTok"><span lang="EN-US">"OBSERVABILITY_APP_NAME"</span></span><span class="NormalTok"><span lang="EN-US">),</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp;&nbsp; api_key</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">os.getenv(</span></span><span class="StringTok"><span lang="EN-US">"OBSERVABILITY_API_KEY"</span></span><span class="NormalTok"><span lang="EN-US">),</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp;&nbsp; trace_content</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="VariableTok"><span lang="EN-US">True</span></span><span class="NormalTok"><span lang="EN-US">,</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp;&nbsp; instruments</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">{</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObservabilityInstruments.OPENAI,</span><br /><span class="NormalTok">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObservabilityInstruments.LANGCHAIN</span><br /><span class="NormalTok">&nbsp;&nbsp; },</span><br /><span class="NormalTok">&nbsp;&nbsp; additional_tags</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">[</span></span><span class="StringTok"><span lang="EN-US">"production"</span></span><span class="NormalTok"><span lang="EN-US">, </span></span><span class="StringTok"><span lang="EN-US">"release:2.5.1"</span></span><span class="NormalTok"><span lang="EN-US">]</span></span><span lang="EN-US"><br /><span class="NormalTok">)</span><br /><br /><span class="NormalTok">model </span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">ChatOpenAI(</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp; api_key</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">os.getenv(</span></span><span class="StringTok"><span lang="EN-US">"OPENAI_API_KEY"</span></span><span class="NormalTok"><span lang="EN-US">),</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp; model</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="StringTok"><span lang="EN-US">"gpt-5.4-mini"</span></span><span lang="EN-US"><br /><span class="NormalTok">)</span><br /><br /></span><span class="CommentTok"><span lang="EN-US"># Setup Tools</span></span><span lang="EN-US"><br /><span class="NormalTok">weather_api </span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">OpenWeatherMapAPIWrapper(</span></span><span lang="EN-US"><br /><span class="NormalTok">&nbsp;&nbsp;&nbsp; openweathermap_api_key</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">os.getenv(</span></span><span class="StringTok"><span lang="EN-US">"OPENWEATHERMAP_API_KEY"</span></span><span class="NormalTok"><span lang="EN-US">)</span></span><span lang="EN-US"><br /><span class="NormalTok">)</span><br /><span class="NormalTok">weather_tool </span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">OpenWeatherMapQueryRun(api_wrapper</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">weather_api)</span></span><span lang="EN-US"><br /><span class="NormalTok">tools </span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">[weather_tool]</span></span><span lang="EN-US"><br /><br /></span><span class="CommentTok"><span lang="EN-US"># Create Agent</span></span><span lang="EN-US"><br /><span class="NormalTok">lang_agent </span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">create_agent(model, tools</span></span><span class="OperatorTok"><span lang="EN-US">=</span></span><span class="NormalTok"><span lang="EN-US">tools)</span></span><br /></p><h2></h2><h3>Manual Instrumentation - Example of Cost Attribution</h3><p style="font-weight:400;">Auto-instrumentation captures LLM calls and framework operations but your own business logic - data pipelines, custom tools orchestration&mdash;needs explicit decoration to appear in traces with cost attribution:</p><p style="font-weight:400;">@tool(name="weather-lookup")<br /><strong>def</strong> fetch_weather_data(city: str) -&gt; str:<br />&nbsp;&nbsp;&nbsp; <em>"""Fetch raw weather data from OpenWeatherMap API."""</em><br />&nbsp;&nbsp;&nbsp; <strong>return</strong> weather_api.run(city)<br /><br /><br />@task(name="normalize-weather", attributes={"team": "ml"}, tags=["experiment-a"])<br /><strong>def</strong> normalize_weather_data(raw: str) -&gt; dict:<br />&nbsp;&nbsp;&nbsp; <em>"""Transform raw weather string into a structured dict."""</em><br />&nbsp;&nbsp;&nbsp; <strong>return</strong> {"raw_report": raw, "source": "openweathermap", "format": "normalized"}<br /><br /><br />@workflow(name="data-pipeline", version=2)<br /><strong>def</strong> retrieve_weather_context(query: str) -&gt; dict:<br />&nbsp;&nbsp;&nbsp; <em>"""Retrieve and normalize weather data for a given query."""</em><br />&nbsp;&nbsp;&nbsp; raw = fetch_weather_data(query)<br />&nbsp;&nbsp;&nbsp; <strong>return</strong> normalize_weather_data(raw)<br /><br /><br />@agent(name="weather-agent")<br /><strong>def</strong> handle_weather_request(query: str) -&gt; str:<br />&nbsp;&nbsp;&nbsp; <em>"""Top-level agent handler that orchestrates the full weather request."""</em><br />&nbsp;&nbsp;&nbsp; context = retrieve_weather_context("London")<br />&nbsp;&nbsp;&nbsp; result = lang_agent.invoke({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "messages": [{"role": "user", "content": query}]<br />&nbsp;&nbsp;&nbsp; })<br />&nbsp;&nbsp;&nbsp; <strong>return</strong> result["messages"][-1].content<br /><br /><br /><em># Run with proper shutdown to flush telemetry</em><br /><strong>try</strong>:<br />&nbsp;&nbsp;&nbsp; response = handle_weather_request("What is the weather in London?")<br />&nbsp;&nbsp;&nbsp; print(response)<br /><strong>finally</strong>:<br />&nbsp;&nbsp;&nbsp; Observability.shutdown()</p><h3>What This Captures - Example of Trace-Level Cost Granularity</h3><p style="font-weight:400;">Each decorator (@agent, @workflow, @task, @tool) creates a span with a specific kind. The auto-instrumentation adds spans for every LLM call with token counts and model information. Together, the trace tree for this agent looks like:</p><p style="font-weight:400;">▼ agent: weather-agent<br />&nbsp; ▼ workflow: data-pipeline (v2)<br />&nbsp;&nbsp;&nbsp; ▼ tool: weather-lookup<br />&nbsp;&nbsp;&nbsp; ▼ task: normalize-weather [tags: experiment-a]<br />&nbsp; ▼ llm_call: ChatOpenAI.chat (model: gpt-5.4-mini, 364 tokens, $0.0004)<br />&nbsp; ▼ tool: OpenWeatherMapQueryRun<br />&nbsp; ▼ llm_call: ChatOpenAI.chat (model: gpt-5.4-mini, 128 tokens, $0.0002)</p><p style="font-weight:400;">Every span records: duration, token count (for LLM calls), model name and estimated cost. This is the granularity needed to answer &ldquo;why did costs spike?&rdquo; - you can see exactly which step consumed tokens and whether it was expected.</p><h3>Cost Analytics Dashboard - Example of Aggregate Cost Visibility</h3><p style="font-weight:400;">The Cost Analytics Dashboard aggregates token usage and costs across your organization, calculated server-side by the Collector (which maps model names to current per-token pricing - meaning costs stay accurate even as providers change rates).</p><p style="font-weight:400;">The dashboard surfaces two critical dimensions:</p><ul><li><strong>Cost by model</strong> - immediately see that gpt-5.5 accounts for 90%+ of spend while gpt-5.4-mini is orders of magnitude cheaper. This drives model routing decisions: can you use the cheaper model for initial reasoning and reserve the expensive model for final responses only?</li><li><strong>Cost by service/application</strong> - attribute spend to specific agents and workflows. Your &ldquo;weather-agent&rdquo; costs $0.0092/day while your &ldquo;document-processor&rdquo; costs $4.30/day. Now you know where to focus optimization efforts.<br /></li></ul><p class="FirstParagraph"><em style="font-weight:400;">The Cost Analytics dashboard breaks down spending by model and by service, with totals for cost and token usage over any selected time range.</em><img src="https://www.telerik.comdata:image/png;base64,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" /><em style="font-weight:400;"><br /><br /></em><em style="font-weight:400;"><br /></em></p><h2></h2><p style="font-weight:400;">This is the view you check weekly (or daily during rollouts) to catch cost regressions before they hit the invoice.</p><h3>Trace Explorer - Example of Trace-Level Cost Investigation</h3><p style="font-weight:400;">When the Cost Analytics dashboard shows a spike, the Observations page lets you drill into individual traces to find the root cause.</p><p style="font-weight:400;"><em>The Observations page lists all traces with span kind, model, tokens, cost and status. Click any trace to expand the full span tree.</em></p><h2></h2><p style="font-weight:400;"><img src="https://www.telerik.comdata:image/png;base64,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" /></p><p style="font-weight:400;">Each trace shows the full span tree with token counts and costs per span. You can filter by: - Time range (isolate the spike window)</p><p style="font-weight:400;">- Application name</p><p style="font-weight:400;">- Tags (e.g., customer:acme, env:production)</p><p style="font-weight:400;">- Success/failure status<br /><br /></p><p style="font-weight:400;">For cost investigation, the typical workflow is: <br />1. Dashboard shows Tuesday had 40% higher cost than Monday</p><ol start="2"><li style="font-weight:400;">Filter Observations to Tuesday, sort by token count descending</li><li style="font-weight:400;">Find the expensive traces - maybe a subset of users triggers a 5-iteration agent loop</li><li style="font-weight:400;">Open the trace, see that iteration 4 and 5 add 8,000 tokens with no useful output</li><li style="font-weight:400;">Fix the agent&rsquo;s termination logic, deploy, verify cost drops Wednesday<br /><br /></li></ol><h3>LLM Requests - Example of Real-Time Token Monitoring</h3><p style="font-weight:400;">The LLM Requests view provides a live stream of individual LLM calls. Each entry shows model, provider, token count and cost. This is your real-time cost monitor during deployments - if a new prompt template increases average tokens per call from 400 to 1,200, you&rsquo;ll see it immediately, not on next month&rsquo;s invoice.</p><h3>Tag-Based Attribution - Example of Customer/Release/Environment Cost Breakdown</h3><p style="font-weight:400;">Tags enable multi-dimensional cost analysis. The SDK supports three levels:</p><p style="font-weight:400;"><em># 1. Global tags - applied to ALL spans</em><br />Observability.instrument(<br />&nbsp;&nbsp;&nbsp; app_name="weather-agent",<br />&nbsp;&nbsp;&nbsp; api_key="...",<br />&nbsp;&nbsp;&nbsp; additional_tags=["production", "release:2.5.1"]<br />)<br /><br /><em># 2. Scoped tags - applied within a context block</em><br /><strong>from</strong> progress.observability <strong>import</strong> propagate_attributes<br /><br /><strong>with</strong> propagate_attributes(tags=["customer:acme-corp", "request:req-abc-123"]):<br />&nbsp;&nbsp;&nbsp; result = handle_weather_request(query)<br />&nbsp;&nbsp;&nbsp; <em># All spans (including LLM calls) inside this block get these tags</em><br /><br /><em># 3. Decorator tags - applied to a single function's span</em><br />@task(tags=["cohort-a", "experiment:new-prompt"])<br /><strong>def</strong> my_function():<br />&nbsp;&nbsp;&nbsp; ...</p><p style="font-weight:400;">With customer-level tags, you can answer: &ldquo;Which customers trigger the most expensive agent paths?&rdquo; With experiment tags: &ldquo;Did the new prompt template reduce or increase token consumption?&rdquo; With release tags: &ldquo;Did v2.5.1 introduce a cost regression vs v2.5.0?&rdquo;</p><p style="font-weight:400;">All three levels merge and deduplicate automatically. Each tag is limited to 200 characters.</p><h3>SDK Instrumentation - Example of How Teams Capture the Required Telemetry</h3><p style="font-weight:400;">Every SDK parameter can be overridden via environment variables, enabling the same code to run across dev/staging/prod with different cost configurations:</p><p style="font-weight:400;">export OBSERVABILITY_APP_NAME="weather-agent"<br />export OBSERVABILITY_API_KEY="ac_p_001_..."<br />export OBSERVABILITY_ENDPOINT="https://collector.observability.progress.com:443"<br />export OBSERVABILITY_TRACE_CONTENT="true"</p><p style="font-weight:400;">This means you can:</p><p style="font-weight:400;">- Use trace_content=True in development (full prompt/completion capture for debugging)</p><p style="font-weight:400;">- Use trace_content=False in production (reduces telemetry size, still captures token counts and costs)</p><p style="font-weight:400;">&nbsp;- Tag environments differently for cost comparison</p><p style="font-weight:400;">For teams using .NET with IChatClient from Microsoft.Extensions.AI:</p><p style="font-weight:400;"><strong>using</strong> Microsoft.Extensions.AI;<br /><strong>using</strong> Progress.Observability.Extensions.AI;<br /><br />IChatClient chatClient = <strong>new</strong> OpenAI.Chat.ChatClient("gpt-4.1-mini", openAIApiKey)<br />&nbsp;&nbsp;&nbsp; .AsIChatClient();<br /><br />chatClient = chatClient.AddObservability(options =&gt; {<br />&nbsp;&nbsp;&nbsp; options.AppName = "Weather Agent";<br />&nbsp;&nbsp;&nbsp; options.ApiKey = "ac_p_001_.....";<br />&nbsp;&nbsp;&nbsp; options.RecordInputs = <strong>true</strong>;<br />&nbsp;&nbsp;&nbsp; options.RecordOutputs = <strong>true</strong>;<br />&nbsp;&nbsp;&nbsp; options.AdditionalTags = <strong>new</strong> List&lt;string&gt; { "production", "v2.1.0" };<br />});<br /><br /><em>// Tool observability for cost attribution on tool calls</em><br />ChatOptions chatOptions = <strong>new</strong>() { Tools = [..tools] };<br />chatOptions.AddToolObservability();</p><p style="font-weight:400;">The .NET SDK provides the same cost visibility&mdash;every chat completion and tool invocation generates a span with token counts, model name and cost calculated server-side by the Collector.</p><h3>Units and Pricing - Example of Making Observability Usage Predictable</h3><p style="font-weight:400;">The Progress Observability Platform prices usage in <strong>units</strong>, which keeps the model straightforward and predictable: - 1 telemetry span = 1 unit - 1 evaluation = 2 units, since the judge LLM generates internal spans</p><p style="font-weight:400;">The free tier includes <strong>20,000 units/month</strong>, 1 seat and 7 days of data retention. In the weather agent example above, a single execution produces about 6 spans total (agent + workflow + task + tool + 2 LLM calls), which means each run consumes 6 units. At that rate, the free tier supports roughly 3,333 agent executions per month - enough for development, testing and smaller production workloads.</p><p style="font-weight:400;">The key characteristic of this model is that cost is fixed per span, regardless of how much content that span contains. A span carrying a 10,000-token prompt still costs the same 1 unit as a span carrying a 50-token prompt. That removes the perverse incentive common in traditional APM systems, where richer AI traces become disproportionately expensive to observe - exactly the failure mode highlighted by the Azure AI Foundry example.</p><h3>Shutdown and Telemetry Flushing</h3><p style="font-weight:400;">Always call shutdown before your process exits so that buffered spans (including cost-critical token count data) are flushed:</p><p style="font-weight:400;"><strong>try</strong>:<br />&nbsp;&nbsp;&nbsp; run_agent()<br /><strong>finally</strong>:<br />&nbsp;&nbsp;&nbsp; Observability.shutdown()</p><p style="font-weight:400;">Without this, the last batch of spans may be lost - especially in short-lived processes like serverless functions or CLI tools. Lost spans mean lost cost data, which defeats the purpose of instrumentation.</p><h2>Closing Thoughts</h2><p style="font-weight:400;">AI cost surprises are visibility problems. The per-token rates are published and stable. What&rsquo;s unpredictable is agent behavior&mdash;retries, context growth, multi-step reasoning, automated evaluations - and that behavior is invisible to traditional monitoring. Teams need trace-level cost context before the invoice arrives.</p><p style="font-weight:400;">The workflow is straightforward: instrument, attribute, baseline, monitor, investigate, optimize, validate. Any platform that gives you token-level cost data per trace, per span and per tag will close the visibility gap. Progress Observability is one way to put that into practice - with explicit opt-in instrumentation, predictable unit-based pricing and trace-level cost visibility from the first call.</p><p style="font-weight:400;">If you want to explore this approach, get started free at telerik.com/ai-observability-platform or reach out to discuss how cost visibility fits your team&rsquo;s workflow.</p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:ce866956-4550-4c69-a546-7ae35e4fdbc6</id>
    <title type="text">Creating Reliable AI Resources with Telerik Agent Tools API</title>
    <summary type="text">The RAG resources you create to use with your LLMs are strategic resources, just like your organization’s databases. Telerik Agent Tools let you create the custom tools for managing those resources.</summary>
    <published>2026-05-20T13:36:52Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Peter Vogel </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/creating-reliable-ai-resources-telerik-agent-tools-api"/>
    <content type="text"><![CDATA[<p><span class="featured">The RAG resources you create to use with your LLMs are strategic resources, just like your organization&rsquo;s databases. Telerik Agent Tools let you create the custom tools for managing those resources.</span></p><p>Like your organization&rsquo;s databases, you should regard your AI resources as strategic, <em>organizational</em> resources. And, like the data in your organization&rsquo;s databases, you need to manage the content used by your AI resources to enable those resources give you reliable, grounded answers. Telerik Agent Tools API lets gives you the tools for automating the process of creating and maintaining the content in your AI resources.</p><p>In an earlier post, I showed how to use Progress Telerik <a target="_blank" href="https://www.telerik.com/document-processing-libraries">Document Processing Libraries</a> (DPL) to create an <a target="_blank" href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-1-configuring-llm-azure-ollama">AI resource with content from existing documents and then tie that resource to a Large Language Model</a> (LLM) that your users could query.</p><p>Tying an LLM to your content creates a <a target="_blank" href="https://www.telerik.com/blogs/understanding-rag-retrieval-augmented-generation">Resource Augmented Generation</a> (RAG) resource that helps get your users grounded answers driven by the content you load into your resource. And using the DPL toolset is a great solution when you&rsquo;re building an application that creates a RAG resource &ldquo;as needed.&rdquo;</p><p>But if you want to reliably create/update a RAG resource that will be used (and reused) by multiple applications and multiple users, then you need the Telerik Agent Tools API. Once you have a reliable process for creating your RAG resource, the Agent Tools API also lets you then use that resource to support your users by integrating with Microsoft&rsquo;s latest toolset for responding to your user&rsquo;s prompts.</p><p>In this post, I&rsquo;m going to cover how to construct an automated workflow for creating a RAG resource that can be used across applications and users. In my next post, I&rsquo;ll cover how to use that resource with the LLM of your choice.</p><h2 id="building-a-rag-resource-workflow">Building a RAG Resource Workflow</h2><p>You can use the Tools API to create an interactive application that lets you manage the documents that make up your resource&rsquo;s content. However, for this post, I&rsquo;m going to assume a simpler process than that (though I&rsquo;ll cover all the tools you&rsquo;d need for an interactive solution).</p><p>For this post, I&rsquo;m going to assume there&rsquo;s a folder that holds all the documents with the content that should be in my RAG resource (which might be Word documents, spreadsheets, PDF, text files&mdash;basically, all the content that you can load with Telerik DPL tools). Users control what goes into my resource by adding and removing documents from that folder.</p><p>In this case study, then, I build my RAG resource by running a batch program that reads all the documents in the folder, adds them all to a RAG resource in memory, and then saves the new resource, replacing any existing version with a new, updated version.</p><h2 id="configuring-your-project">Configuring Your Project</h2><p>To start building an application to manage your RAG resource, you must first add the Telerik.Documents.AI.Tools.Core NuGet package to your project. After that, you need the specific Telerik packages that support the document types that you&rsquo;ll add to your RAG resource.</p><p>For my case study, I&rsquo;m just going to use PDF documents, so I just need the &ldquo;Fixed&rdquo; packages:</p><pre><code>- Telerik.Documents.AI.Tools.Fixed.Core
- Telerik.Documents.AI.AgentTools.Fixed 
</code></pre><p>If you&rsquo;re working with spreadsheets, you&rsquo;ll want to add the equivalent Spreadsheet packages:<br />- Telerik.Documents.AI.Tools.Spreadsheet.Core<br />-Telerik.Documents.AI.AgentTools.Spreadsheet)</p><p>To support Microsoft Word, HTML and text documents, you also need to add the Telerik.Documents.AI.Tools.Flow.Core package.</p><p>And, of course, there&rsquo;s no reason you couldn&rsquo;t make your life simpler by adding all the <a target="_blank" href="http://Telerik.Documents.AI">Telerik.Documents.AI</a>.* libraries to your application, even if you don&rsquo;t need to use them all right now. In this case study, I also didn&rsquo;t take advantage of the some of the other packages available&mdash;the Telerik.Documents.AI.AgentTools.Conversion package that handles conversions between document types, for example.</p><h2 id="building-your-rag-resource">Building Your RAG Resource</h2><p>The process for creating a RAG resource begins with creating an in-memory repository which holds your documents. A repository can hold one of three categories of documents: spreadsheets, PDF documents or Word and Word-related documents.</p><p>In my case study, I&rsquo;m only going to work with PDF documents (which Progress Telerik classifies as &ldquo;Fixed&rdquo; documents), so I created an <code>inMemoryFixedDocumentRepository</code> object and then stored a reference to that repository in an <code>IFixedDocumentRepository</code> variable.</p><p>The code to do that looks like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">IFixedDocumentRepository pdfRepo <span class="token operator">=</span> 
          <span class="token keyword">new</span> <span class="token class-name">InMemoryFixedDocumentRepository</span><span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">TimeSpan</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>All of the three types of repositories look very much alike though (they all share a common <code>IDocumentRepository</code> interface, for example). As a result, working with other document types is similar.</p><p>If, for example, you were loading spreadsheet files (&ldquo;Workbook&rdquo; documents), you&rsquo;d use the <code>InMemoryWorkbookRepository</code> object and the <code>IWorkbookRepository</code> interface. For Word and Word-related documents (&ldquo;Flow&rdquo; documents), you&rsquo;d use the <code>InMemoryFlowDocumentRepository</code> object and the <code>IFlowDocumentRepository</code> interface.</p><p>Repositories have some built-in functionality (they all include a <code>ListDocuments</code> method that returns a list of documents in the repository, for example). You will, however, want to extend your repository by attaching one or more toolsets containing tools that add additional functionality to your repository.</p><p>For my case study, I just needed to be able to import documents into an empty repository so the only toolset I attached was the <code>FixedFileManagementAgentTools</code> toolset that supports working with a PDF repository and has import (and export) methods for individual documents. To that toolset looks like this, I pass a reference to my repository, I pass a reference to my repository and the path to the folder containing the documents that the tools will work with:</p><pre class=" language-csharp"><code class="prism  language-csharp">FixedFileManagementAgentTools pdfFileTools <span class="token operator">=</span> 
            <span class="token keyword">new</span> <span class="token class-name">FixedFileManagementAgentTools</span><span class="token punctuation">(</span>pdfRepo<span class="token punctuation">,</span> repoFolderPath<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>You can add additional toolsets if you need additional functionality or need to work with more folders. If, for example, I wanted to work with PDF forms, I could add the <code>FixedDocumentFormAgentTools</code> toolset to my repository. When creating a toolset, you&rsquo;ll always need to pass a reference to the repository the toolset will be attached to, but other parameters (if any) will vary from one toolset to another.</p><h2 id="managing-repositories-with-registries">Managing Repositories with Registries</h2><p>If you&rsquo;re going to be working with multiple repositories in your workflow, you might want to create a registry to simplify managing your repositories. In my case study, for example, where I&rsquo;m potentially loading several different kinds of files, I could end up supporting all three types of repositories (PDF files, spreadsheets, Word and Word-related documents)&mdash;creating a registry simplifies switching between the different types of repositories.</p><p>Registries are created using the <code>DocumentRepositoryRegistry</code> object and support registering one repository of each document category using their <code>RegisterRespository</code> method.</p><p>You can then retrieve the repository you want from a registry by using the registry&rsquo;s <code>TryGetRepository</code> method, passing two parameters: the document type of the repository you want and an <code>out</code> parameter of type <code>IDocumentRepository</code>. Like other TryGet* methods, the <code>TryGetRepository</code> method returns return true if the method finds the repository you want and false if the method does not (the actual repository, if found, is loaded into the method&rsquo;s second, <code>out</code> parameter).</p><p>The following code creates a registry, registers my PDF repository using the <code>RegisterRepository</code> method and then immediately retrieves the repository using the registry&rsquo;s <code>TryGetRepository</code> method. Because the repository is returned using the common <code>IDocumentRepository</code> interface type, I cast the returned reference to the <code>IFixedDocumentRepository</code> type before working with it:</p><pre class=" language-csharp"><code class="prism  language-csharp">DocumentRepositoryRegistry registry <span class="token operator">=</span> <span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

registry<span class="token punctuation">.</span><span class="token function">RegisterRepository</span><span class="token punctuation">(</span>DocumentType<span class="token punctuation">.</span>FixedDocument<span class="token punctuation">,</span> pdfRepo<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span>registry<span class="token punctuation">.</span><span class="token function">TryGetRepository</span><span class="token punctuation">(</span>DocumentType<span class="token punctuation">.</span>FixedDocument<span class="token punctuation">,</span> 
                                                           <span class="token keyword">out</span> IDocumentRepository<span class="token operator">?</span> repo<span class="token punctuation">)</span> <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
     IFixedDocumentRepository fixedRepo <span class="token operator">=</span> <span class="token punctuation">(</span>IFixedDocumentRepository<span class="token punctuation">)</span> repo<span class="token punctuation">;</span>
    <span class="token comment">//&hellip;work with the fixedRepo repository</span>
<span class="token punctuation">}</span>
</code></pre><p>You&rsquo;ll also want to create a registry if, as part of your workflow, you want to support converting documents between formats or merging multiple documents. The toolsets that support that are <code>ConvertDocumentsAgentTool</code> and <code>MergeDocumentsAgentTool</code> toolsets and they attach to registries rather than repositories.</p><h2 id="loading-saving-and-retrieving-your-repository">Loading, Saving and Retrieving Your Repository</h2><p>Adding a document to a repository is easy: Just call the appropriate import method on the appropriate toolset that&rsquo;s tied to the repository you want to update.</p><p>To add a PDF document to my repository, for example, I&rsquo;d use the <code>ImportFixedDocument</code> method on my <code>FixedFileManagementAgentTools</code> toolset, tied to my PDF repository. To use the <code>ImportFixedDocument</code> method, I pass the path to the document I want to load and its document format (e.g., PDF, XLSX, etc.). Optionally, I can pass a name for the document which will be returned as part of the <code>ListDocuments</code> method.</p><p>Which means that importing a PDF document into my repository would look like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">CallToolResponse res <span class="token operator">=</span>
          pdfRepoTools<span class="token punctuation">.</span><span class="token function">ImportFixedDocument</span><span class="token punctuation">(</span>documentPath<span class="token punctuation">,</span> 
                                                                                         DocumentFormat<span class="token punctuation">.</span>PDF<span class="token punctuation">,</span>
                                                                                          Path<span class="token punctuation">.</span><span class="token function">GetFileNameWithoutExtension</span><span class="token punctuation">(</span>documentPath<span class="token punctuation">)</span>
                                                                                        <span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>The <code>CallToolResponse</code> object&rsquo;s <code>IsError</code> property will be set to <code>true</code> if your import succeeds (and the <code>Message</code> property will contain additional information regardless of whether the call succeeds or fails).</p><p>Once I&rsquo;ve added all the documents from my folder to my repository, I can save my repository with all of its content to a single file using my repository&rsquo;s <code>MergeAndExport</code> method. The <code>MergeAndExport</code> method requires three parameters:</p><ul><li>An array of the <code>id</code> property for each of the documents in the repository. You can use that array both to control which documents are exported and the merge order of the documents. I didn&rsquo;t bother and just used a LINQ <code>Select</code> method to retrieve all the <code>id</code> property values.</li><li>A <code>FileStream</code> object that points to your repository file (I set this up to overwrite my repository every time).</li><li>The document type for the file (<code>PDF</code>, in my case).</li></ul><p>You must close your <code>FileStream</code> after you finish exporting your documents. As a result, the code to export my repository of PDF documents would look like this:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> ids <span class="token operator">=</span> pdfRepo<span class="token punctuation">.</span><span class="token function">ListDocuments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Select</span><span class="token punctuation">(</span> doc <span class="token operator">=</span><span class="token operator">&gt;</span> doc<span class="token punctuation">.</span>Id <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
FileStream fs <span class="token operator">=</span>  <span class="token keyword">new</span> <span class="token class-name">FileStream</span><span class="token punctuation">(</span>repoFilePath<span class="token punctuation">,</span> FileMode<span class="token punctuation">.</span>CreateNew<span class="token punctuation">)</span><span class="token punctuation">,</span>
                                 
repo<span class="token punctuation">.</span><span class="token function">MergeAndExport</span><span class="token punctuation">(</span>ids<span class="token punctuation">,</span>
                                                fs<span class="token punctuation">,</span>  
                                                DocumentFormat<span class="token punctuation">.</span>PDF<span class="token punctuation">)</span><span class="token punctuation">;</span>
fs<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre><p>You can now tie that file to an LLM using Microsoft <code>ChatClientAgent</code> object to let your users query your RAG resource. I&rsquo;ll walk through how to do that in my next post.</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Get Access to These Tools and More</h4></div><div class="col-8"><p class="u-fs16 u-mb0">The free 30-day trial of <a target="_blank" href="https://www.telerik.com/devcraft">Telerik DevCraft</a> lets you really kick the tires for yourself. <a target="_blank" href="https://www.telerik.com/try/devcraft-ultimate">Try it today!</a></p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:c37f48f7-cf9d-4e8d-95b3-010546859051</id>
    <title type="text">Protect Your Entities with Domain Validation</title>
    <summary type="text">Learn about error-prone domain validations in ASP.NET Core and how to correctly model them.</summary>
    <published>2026-05-19T13:32:48Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Assis Zang </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/protect-entities-domain-validation"/>
    <content type="text"><![CDATA[<p><span class="featured">Learn about error-prone domain validations in ASP.NET Core and how to correctly model them.</span></p><p>In ASP.NET Core applications, developers often underestimate the importance of validating objects and classes. An <code>if</code> statement in the controller, a <code>FluentValidation</code> in the request or some <code>DataAnnotations</code> in the model, and that&rsquo;s it. The problem is that, if care isn&rsquo;t taken when implementing domain validations, responsibility ends up leaking, which can compromise the entire system&rsquo;s evolution.</p><p>In this article, we will analyze common examples of domain validation that are highly prone to errors and how these validations should be correctly modeled according to the principles of Domain-Driven Design (DDD).</p><h2 id="poorly-structured-validations">Poorly Structured Validations</h2><h3 id="validation-in-the-controller">1. Validation in the Controller</h3><p>Although it speeds up development, implementing validations in API controllers is discouraged, as it makes the controller highly coupled to business rules. Furthermore, the rules created there are impossible to reuse. Finally, validations in controllers allow other parts of the code to execute the same actions, bypassing the rules.</p><p>Consider the following example:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token punctuation">[</span><span class="token function">Route</span><span class="token punctuation">(</span><span class="token string">"api/[controller]"</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span>ApiController<span class="token punctuation">]</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">OrderController</span> <span class="token punctuation">:</span> ControllerBase
<span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token keyword">readonly</span> OrderRepository _orderRepository<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token function">OrderController</span><span class="token punctuation">(</span>OrderRepository orderRepository<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        _orderRepository <span class="token operator">=</span> orderRepository<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span>HttpPost<span class="token punctuation">]</span>
    <span class="token keyword">public</span> IActionResult <span class="token function">Create</span><span class="token punctuation">(</span>CreateOrderDto dto<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>dto<span class="token punctuation">.</span>Total <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token keyword">return</span> <span class="token function">BadRequest</span><span class="token punctuation">(</span><span class="token string">"Total must be greater than zero"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>dto<span class="token punctuation">.</span>Items <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> <span class="token operator">!</span>dto<span class="token punctuation">.</span>Items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">return</span> <span class="token function">BadRequest</span><span class="token punctuation">(</span><span class="token string">"Order must have at least one item"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">var</span> order <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Order</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            Total <span class="token operator">=</span> dto<span class="token punctuation">.</span>Total<span class="token punctuation">,</span>
            Items <span class="token operator">=</span> dto<span class="token punctuation">.</span>Items
        <span class="token punctuation">}</span><span class="token punctuation">;</span>

        _orderRepository<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span>order<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">return</span> <span class="token function">Ok</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The code above is a common example of validations in the Controller, and it&rsquo;s a bad example because it has all the flaws mentioned earlier. Note that the <code>_orderRepository.Add(order);</code> method is called at the end, meaning there are loopholes here.</p><p>Imagine that the parameter <code>CreateOrderDto dto</code> has a total greater than zero, and the Items list has one item, but the rest of the properties are null. Even so, the <code>Add</code> method will be called and will create problematic entities or generate a bug.</p><h3 id="validation-in-the-service-class">2. Validation in the Service Class</h3><p>Although common, the use of validations in the Service class should also be avoided because they place business rules in the wrong place. Considering the previous example, they only changed location but still remain a problem.</p><p>When a business rule is coupled to a Service, the domain model becomes passive, and entities can be created or modified in invalid states because there is nothing to prevent them from doing so. The result is a fragile system, as object validation ceases to be a priority and becomes solely dependent on the execution flow.</p><p>Another problem is rule duplication. In large systems, the same rule is often needed in more than one use case. When it is in the Service, it ends up being copied to other services, handlers or jobs, which increases the risk of inconsistency and hinders business evolution.</p><p>Finally, the Service Layer is responsible for orchestrating use cases, coordinating repositories, transactions and external calls. When it validates domain rules, it mixes responsibilities and becomes a central point of complexity, bloated with if statements and exceptions that don&rsquo;t belong to it.</p><p>The example below shows what a Service class looks like with business rules defined in it:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">OrderService</span>
<span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token keyword">readonly</span> OrderRepository _orderRepository<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token function">OrderService</span><span class="token punctuation">(</span>OrderRepository orderRepository<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        _orderRepository <span class="token operator">=</span> orderRepository<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">Create</span><span class="token punctuation">(</span>CreateOrderDto dto<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>dto<span class="token punctuation">.</span>Total <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string">"Total must be greater than zero"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>dto<span class="token punctuation">.</span>Items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string">"Order must have at least one item"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">var</span> order <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Order</span><span class="token punctuation">(</span>dto<span class="token punctuation">.</span>Total<span class="token punctuation">,</span> dto<span class="token punctuation">.</span>Items<span class="token punctuation">)</span><span class="token punctuation">;</span>
        _orderRepository<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span>order<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Note that the logic of <code>if</code> and <code>else</code> statements remains the same, it has only changed location, allowing objects to change state and create corrupted states.</p><h3 id="using-data-annotations">3. Using Data Annotations</h3><p>Another common form of validation is through the Data Annotations Model Binder, which is implemented using attributes placed above the properties of an entity class.</p><p>The problem is that, as they make the domain dependent on a framework, the validation only works in binding (MVC), and they may not work in non-web scenarios such as workers, messaging and tests.</p><pre class=" language-csharp"><code class="prism  language-csharp"> <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Order</span>
  <span class="token punctuation">{</span>
      <span class="token punctuation">[</span>Required<span class="token punctuation">]</span>
      <span class="token punctuation">[</span><span class="token function">Range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">double</span><span class="token punctuation">.</span>MaxValue<span class="token punctuation">)</span><span class="token punctuation">]</span>
      <span class="token keyword">public</span> <span class="token keyword">decimal</span> Total <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
      <span class="token keyword">public</span> List<span class="token operator">&lt;</span>OrderItem<span class="token operator">&gt;</span> Items <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
</code></pre><p>Note that we are requiring the Total property to have a minimum value of 1. But even so, it is not yet a secure validation because it is still possible to create an entity with an invalid state.</p><h2 id="domain-validation-with-ddd">Domain Validation with DDD</h2><p>Domain-Driven Design emphasizes the importance of keeping validations within the domain. The main reason is that this way, the domain becomes self-protecting.</p><p>Entities and aggregates cease to be passive structures (as seen in previous examples) and ensure that their rules are always respected, regardless of where or how they are used.</p><p>Another positive aspect of this approach is the model&rsquo;s coherence. When business rules are in the domain, they are closer to the concept they represent, making the code more expressive and easier to understand. Reading an entity or a behavioral method reveals the rules governing that concept. In other words, you understand the intention behind that behavior.</p><p>Finally, implementing validations in the domain makes system evolution safer. New use cases can be added without fear of breaking existing rules because the domain itself acts as a safety barrier. This reduces maintenance costs and makes the system more resilient to business growth and changes.</p><p>Next, we&rsquo;ll look at an example of a domain guided by DDD principles and analyze each point. You can access the source code in this GitHub repository: <a target="_blank" href="https://github.com/zangassis/domain-validations">Domain Validations code</a>.</p><p>Order class with Domain Validations:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Order</span>
<span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token keyword">readonly</span> List<span class="token operator">&lt;</span>OrderItem<span class="token operator">&gt;</span> _items <span class="token operator">=</span> <span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">public</span> Guid Id <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> DateTime CreatedAt <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> IReadOnlyCollection<span class="token operator">&lt;</span>OrderItem<span class="token operator">&gt;</span> Items <span class="token operator">=</span><span class="token operator">&gt;</span> _items<span class="token punctuation">.</span><span class="token function">AsReadOnly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">public</span> <span class="token keyword">decimal</span> Total <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token function">Order</span><span class="token punctuation">(</span>IEnumerable<span class="token operator">&lt;</span>OrderItem<span class="token operator">&gt;</span> items<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>items <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> <span class="token operator">!</span>items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order must have at least one item."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        Id <span class="token operator">=</span> Guid<span class="token punctuation">.</span><span class="token function">NewGuid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        CreatedAt <span class="token operator">=</span> DateTime<span class="token punctuation">.</span>UtcNow<span class="token punctuation">;</span>

        <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token keyword">var</span> item <span class="token keyword">in</span> items<span class="token punctuation">)</span>
            <span class="token function">AddItem</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">ValidateItemsQuantity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">AddItem</span><span class="token punctuation">(</span>OrderItem item<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>item <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order item cannot be null."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        _items<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">RecalculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">RecalculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        Total <span class="token operator">=</span> _items<span class="token punctuation">.</span><span class="token function">Sum</span><span class="token punctuation">(</span>i <span class="token operator">=</span><span class="token operator">&gt;</span> i<span class="token punctuation">.</span>Subtotal<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>Total <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order total must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">ValidateItemsQuantity</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>_items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order cannot exist without items."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Item class with Domain Validations:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">OrderItem</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> Guid ProductId <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">decimal</span> Price <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">int</span> Quantity <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">decimal</span> Subtotal <span class="token operator">=</span><span class="token operator">&gt;</span> Price <span class="token operator">*</span> Quantity<span class="token punctuation">;</span>

    <span class="token keyword">protected</span> <span class="token function">OrderItem</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">// EF</span>

    <span class="token keyword">public</span> <span class="token function">OrderItem</span><span class="token punctuation">(</span>Guid productId<span class="token punctuation">,</span> <span class="token keyword">decimal</span> price<span class="token punctuation">,</span> <span class="token keyword">int</span> quantity<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>productId <span class="token operator">==</span> Guid<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"ProductId is required."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>price <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Price must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>quantity <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Quantity must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        ProductId <span class="token operator">=</span> productId<span class="token punctuation">;</span>
        Price <span class="token operator">=</span> price<span class="token punctuation">;</span>
        Quantity <span class="token operator">=</span> quantity<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="private-setters-and-readonly-properties">Private Setters and ReadOnly Properties</h3><p>The first aspect we can notice in this new version of the Order class is that the Items property is private, which means it is inaccessible outside the class: <code>private readonly List&lt;OrderItem&gt; _items = new();</code>.</p><p>We also have a public list of items: <code>public IReadOnlyCollection&lt;OrderItem&gt; Items =&gt; _items.AsReadOnly();</code>, but note that it is defined as read-only. This means that it can be accessed by external sources, but only for reading the data and never for modification.</p><p>Another factor protecting the class properties is that, despite being public, they have private setters: <code>public Guid Id { get; private set; }</code>, preventing external sources from modifying their states.</p><h3 id="protected-constructor">Protected Constructor</h3><p>Protecting the constructor method means allowing only valid states of an entity to be created. In our example, we are defining rules within the constructor:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token function">Order</span><span class="token punctuation">(</span>IEnumerable<span class="token operator">&lt;</span>OrderItem<span class="token operator">&gt;</span> items<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>items <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> <span class="token operator">!</span>items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order must have at least one item."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    Id <span class="token operator">=</span> Guid<span class="token punctuation">.</span><span class="token function">NewGuid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    CreatedAt <span class="token operator">=</span> DateTime<span class="token punctuation">.</span>UtcNow<span class="token punctuation">;</span>

    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token keyword">var</span> item <span class="token keyword">in</span> items<span class="token punctuation">)</span>
        <span class="token function">AddItem</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token function">ValidateItemsQuantity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">AddItem</span><span class="token punctuation">(</span>OrderItem item<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>item <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order item cannot be null."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    _items<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">RecalculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">RecalculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    Total <span class="token operator">=</span> _items<span class="token punctuation">.</span><span class="token function">Sum</span><span class="token punctuation">(</span>i <span class="token operator">=</span><span class="token operator">&gt;</span> i<span class="token punctuation">.</span>Subtotal<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>Total <span class="token operator">&lt;=</span> <span class="token number">0</span><span class="token punctuation">)</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order total must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">ValidateItemsQuantity</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>_items<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">DomainException</span><span class="token punctuation">(</span><span class="token string">"Order cannot exist without items."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>Note that the item quantity validation is performed within the constructor. That is, when creating a new object state, values are also set for the <code>Id</code> and <code>CreatedAt</code> properties. Finally, the <code>ValidateItemsQuantity</code> method verifies if the private property <code>_items</code> has actually been loaded with items, adding an extra layer of validation. In this way, the database will only receive valid states, a corrupted or incomplete entity will never be inserted, enabling data consistency.</p><h3 id="domain-exceptions">Domain Exceptions</h3><p>Domain exceptions are errors thrown when a business rule (invariant) is violated. Unlike technical failures such as database outages or timeouts, domain exceptions represent violations of the system&rsquo;s business rules, such as an order without items, for example.</p><p>Domain exceptions are important because they help prevent an entity or aggregate from existing in an invalid state. If a rule is broken, the domain needs to react immediately, and the exception is a suitable mechanism to keep inconsistent data from reaching the database or being manipulated in any way.</p><p>In the previous example, we validated whether the value was less than zero and whether the list of items was empty. If either condition is met, a <code>DomainException</code> will be thrown, which is a custom exception. The code below shows how the exception is implemented:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">namespace</span> DomainValidation<span class="token punctuation">;</span>

<span class="token punctuation">[</span>Serializable<span class="token punctuation">]</span>
<span class="token keyword">internal</span> <span class="token keyword">class</span> <span class="token class-name">DomainException</span> <span class="token punctuation">:</span> Exception
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token function">DomainException</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token function">DomainException</span><span class="token punctuation">(</span><span class="token keyword">string</span><span class="token operator">?</span> message<span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">base</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token function">DomainException</span><span class="token punctuation">(</span><span class="token keyword">string</span><span class="token operator">?</span> message<span class="token punctuation">,</span> Exception<span class="token operator">?</span> innerException<span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">base</span><span class="token punctuation">(</span>message<span class="token punctuation">,</span> innerException<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="is-fluentvalidation-still-useful">Is FluentValidation Still Useful?</h3><p>FluentValidation is a widely used .NET library for validations, and even in scenarios where we use the domain validation approach, it certainly remains useful.</p><p>The main functionality of FluentValidation is to validate input data, not business rules. Therefore, by using it in the application, we can obtain an extra layer of validation, preventing corrupted data from reaching the domain.</p><p>The code below demonstrates how FluentValidation can be used to validate input data:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">using</span> FluentValidation<span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CreateOrderRequest</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> List<span class="token operator">&lt;</span>CreateOrderItemRequest<span class="token operator">&gt;</span> Items <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CreateOrderRequestValidator</span> <span class="token punctuation">:</span> AbstractValidator<span class="token operator">&lt;</span>CreateOrderRequest<span class="token operator">&gt;</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token function">CreateOrderRequestValidator</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">RuleFor</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span>Items<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">NotNull</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">WithMessage</span><span class="token punctuation">(</span><span class="token string">"Items cannot be null."</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">Must</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">WithMessage</span><span class="token punctuation">(</span><span class="token string">"Order must contain at least one item."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">RuleForEach</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span>Items<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">SetValidator</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">CreateOrderItemRequestValidator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CreateOrderItemRequest</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> Guid ProductId <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">decimal</span> Price <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">int</span> Quantity <span class="token punctuation">{</span> <span class="token keyword">get</span><span class="token punctuation">;</span> <span class="token keyword">set</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CreateOrderItemRequestValidator</span> <span class="token punctuation">:</span> AbstractValidator<span class="token operator">&lt;</span>CreateOrderItemRequest<span class="token operator">&gt;</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token function">CreateOrderItemRequestValidator</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">RuleFor</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span>ProductId<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">NotEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">WithMessage</span><span class="token punctuation">(</span><span class="token string">"ProductId is required."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">RuleFor</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span>Price<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">GreaterThan</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">WithMessage</span><span class="token punctuation">(</span><span class="token string">"Price must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">RuleFor</span><span class="token punctuation">(</span>x <span class="token operator">=</span><span class="token operator">&gt;</span> x<span class="token punctuation">.</span>Quantity<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">GreaterThan</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">WithMessage</span><span class="token punctuation">(</span><span class="token string">"Quantity must be greater than zero."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h2 id="when-out-of-domain-validations-make-sense">When Out-of-Domain Validations Make Sense</h2><p>Validations in the Controller and Service classes make sense when they are not business rules, but rather validations such as security, flow or format.</p><p>It is common to perform authentication/authorization validations in the Controller, because this is the responsibility of the edge (API), and if a user or system is not properly authenticated/authorized, it should not have access to the domain or the rest of the system; it should be blocked at the entrance.</p><p>The Service class, on the other hand, can have validations used to manage operational flows, for example, checking if the customer exists before creating an order, checking if the product exists, checking if there is already an open order for the customer.</p><p>In this way, we do not validate the internal state of the entity. Instead, we validate the interactions between aggregates or external systems.</p><h2 id="conclusion">Conclusion</h2><p>Implementing domain validations in an application means explicitly stating the reason for that domain&rsquo;s existence and the rules that determine its behavior. Furthermore, domain validations keep an invalid object from reaching the database, preventing future bugs and the resulting damage.</p><p>Throughout this post, we&rsquo;ve seen examples of incorrectly implemented validations, scattered across controllers or services, resulting in fragile and difficult-to-maintain code. In contrast, we implemented validations directly on the entities, applying DDD principles.</p><p>I hope this post has helped you see the domain as the heart of the application and the importance of keeping it consistent, protected and expressive.</p><hr /><p><strong>More on DDD: </strong><a href="https://www.telerik.com/blogs/getting-started-domain-driven-design-aspnet-core" target="_blank">Getting Started with Domain-Driven Design in ASP.NET Core</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:b761f26f-90ec-497a-8858-043a53dedcdd</id>
    <title type="text">Installing and Basics of Telerik UI for .NET MAUI AI Coding Assistant</title>
    <summary type="text">Check out the Telerik UI for .NET MAUI AI Coding Assistant, the MCP server native to Telerik controls and MAUI.</summary>
    <published>2026-05-18T14:25:07Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Héctor Pérez </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/installing-basics-telerik-ui-net-maui-ai-coding-assistant"/>
    <content type="text"><![CDATA[<p><span class="featured">Check out the Telerik UI for .NET MAUI AI Coding Assistant, the MCP server native to Telerik controls and MAUI.</span></p><p>Code generation using artificial intelligence has improved impressively over the past few months. One of the features that has helped this growth are MCP servers, which allow connecting an AI to information sources quickly. From consulting Microsoft Learn documentation, to those that perform actions on a calendar, to MCP servers for retrieving information from databases, these servers help improve the accuracy of results by obtaining up-to-date and reliable information.</p><p>The team at Progress has released an <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/ai/mcp-server">AI Coding Assistant for .NET MAUI</a>, which helps create and improve graphical interfaces, using the latest features of its UI controls reliably. Let&rsquo;s see it in action.</p><h2 id="what-is-telerik-ui-for-.net-maui-ai-coding-assistant-mcp-server">What Is Telerik UI for .NET MAUI AI Coding Assistant (MCP Server)?</h2><p>Telerik AI Coding Assistant for .NET MAUI is an MCP server that allows retrieving information provided directly by Progress, with the purpose of letting users learn about the use of a specific component or, alternatively, create high-quality graphical interfaces using the latest features and capabilities of the controls in the Telerik suite. Some available features are:</p><ul><li><strong>Prompt handling</strong>: Handles complex prompts</li><li><strong>Client compatibility</strong>: You can use it in different clients, such as VS Code, Cursor, etc.</li><li><strong>Code suggestions</strong>: It can suggest code and perform automatic rebuilds to check for errors</li><li><strong>Response focus</strong>: Focused on code generation</li></ul><p>The above features enable a variety of use cases, including:</p><ul><li><strong>Generation of complex interfaces</strong>: You can rely on the MCP server to generate dashboards, specific pages, etc., requesting the use of specific controls to be used</li><li><strong>Advanced Grid configuration</strong>: Specify which features you need to include in a DataGrid</li><li><strong>Better testing using mock data</strong>: Get a more robust preview by entering test data before connecting to a data source</li><li><strong>Modernization of graphical interfaces</strong>: Refactor your UI, improving it for modern times and better user experiences</li></ul><p>Let&rsquo;s see how to use it.</p><h2 id="installing-telerik-ui-for-.net-maui-ai-coding-assistant-mcp-server">Installing Telerik UI for .NET MAUI AI Coding Assistant (MCP Server)</h2><p>To be able to use Telerik MCP server for .NET MAUI, you must meet some prerequisites:</p><ol><li>A version of .NET equal or greater than 9</li><li>A client compatible with the MCP protocol, such as VS Code, Visual Studio 2026, Cursor, etc.</li><li>A Telerik account</li><li>An active Telerik license (including a trial account)</li><li>A .NET MAUI app that includes the Telerik UI for .NET MAUI controls</li></ol><h2 id="installing-a-license-key">Installing a License Key</h2><p>Before running any command, I recommend that you obtain a <strong>License Key</strong> so your account can be verified and you can use the MCP server. There are several ways to do this. For example, you can go to your <a target="_blank" href="https://www.telerik.com/account">Progress account</a>, where you select the <strong>License Keys</strong> option:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/progress-dashboard-license-keys.png?sfvrsn=bf495214_2" alt="User dashboard showing download area for license keys." /></p><p>On the <strong>License Keys</strong> page, click the <strong>Download License Key</strong> button:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/download-license-key-button.png?sfvrsn=de79abe1_2" alt="Download license key button on settings page" /></p><p>The downloaded file <strong>telerik-license.txt</strong> should be placed in <code>%AppData%\Telerik\telerik-license.txt</code> if you&rsquo;re using Windows, as in my case, or in <code>~/.telerik/telerik-license.txt</code> if you&rsquo;re on Linux. Now, it&rsquo;s time to install the MCP server.</p><h2 id="installing-the-mcp-server">Installing the MCP Server</h2><p>With a License Key on your machine, installing the server is quite simple. In my case I will run the command for <strong>.NET 10</strong>:</p><pre class=" language-text"><code class="prism  language-text">dnx Telerik.MAUI.MCP
</code></pre><p>Once the Telerik MCP for MAUI is installed, the next step is to configure your preferred editor. In the case of VS Code, you should first open the folder containing the .NET MAUI project you&rsquo;ll be working on.</p><p>Then, create a folder at the root named <code>.vscode</code>, inside which you should create a file <code>mcp.json</code>. This file must be replaced or adapted (if you already have previous MCP servers), adding the following entry valid for .NET 10:</p><pre class=" language-json"><code class="prism  language-json"><span class="token punctuation">{</span>
  <span class="token string">"servers"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"telerik-maui-assistant"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token string">"type"</span><span class="token punctuation">:</span> <span class="token string">"stdio"</span><span class="token punctuation">,</span>
      <span class="token string">"command"</span><span class="token punctuation">:</span> <span class="token string">"dnx"</span><span class="token punctuation">,</span>
      <span class="token string">"args"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"Telerik.MAUI.MCP"</span><span class="token punctuation">,</span> <span class="token string">"--yes"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Alternatively, to use it in Visual Studio, you must create the file <code>.mcp.json</code> at the solution level and add the following content inside:</p><pre class=" language-json"><code class="prism  language-json"><span class="token punctuation">{</span>
  <span class="token string">"servers"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"telerik-maui-assistant"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token string">"type"</span><span class="token punctuation">:</span> <span class="token string">"stdio"</span><span class="token punctuation">,</span>
      <span class="token string">"command"</span><span class="token punctuation">:</span> <span class="token string">"dnx"</span><span class="token punctuation">,</span>
      <span class="token string">"args"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"Telerik.MAUI.MCP"</span><span class="token punctuation">,</span> <span class="token string">"--yes"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Once done, you will be able to find the new MCP server as part of the tools in both VS Code and Visual Studio 2026:</p><p><strong>VS Code</strong></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/telerik-mcp-server-net-maui-vscode.png?sfvrsn=35a1a02c_2" alt="Telerik MCP server running for .NET MAUI in VS Code" /></p><p><strong>Visual Studio 2026</strong></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/telerik-mcp-setup-maui-vs2026.png?sfvrsn=32760bb7_2" alt="Telerik MCP server setup for .NET MAUI project" /></p><p>With the MCP server configured, we&rsquo;re ready to continue.</p><h2 id="testing-the-telerik-mcp-server-to-create-.net-maui-apps">Testing the Telerik MCP Server to Create .NET MAUI Apps</h2><p>As I mentioned before, the Telerik MCP server can help us perform different tasks.</p><p>For example, suppose you have a page you made using standard .NET MAUI controls, using code similar to the following:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto,*<span class="token punctuation">"</span></span> <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!-- Header --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Product List<span class="token punctuation">"</span></span>
        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>22<span class="token punctuation">"</span></span>
        <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
        <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,0,0,12<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

    <span class="token comment">&lt;!-- Loading indicator --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ActivityIndicator</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
        <span class="token attr-name">IsRunning</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding IsBusy}<span class="token punctuation">"</span></span>
        <span class="token attr-name">IsVisible</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding IsBusy}<span class="token punctuation">"</span></span>
        <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
        <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

    <span class="token comment">&lt;!-- CollectionView --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>CollectionView</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
        <span class="token attr-name">ItemsSource</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Products}<span class="token punctuation">"</span></span>
        <span class="token attr-name">SelectedItem</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SelectedProduct}<span class="token punctuation">"</span></span>
        <span class="token attr-name">SelectionMode</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Single<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>CollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>DataTemplate</span> <span class="token attr-name"><span class="token namespace">x:</span>DataType</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>models:ProductModel<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                    <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,4<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                    <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{AppThemeBinding Light=White, Dark=#1E1E1E}<span class="token punctuation">"</span></span>
                    <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 8<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Stroke</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#E0E0E0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*,Auto<span class="token punctuation">"</span></span> <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto,Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

                        <span class="token comment">&lt;!-- Product name --&gt;</span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Name}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                        <span class="token comment">&lt;!-- Price --&gt;</span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Price, StringFormat=<span class="token punctuation">'</span>${0:F2}<span class="token punctuation">'</span>}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#512BD4<span class="token punctuation">"</span></span>
                            <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>End<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                        <span class="token comment">&lt;!-- Category --&gt;</span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Category}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Gray<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                        <span class="token comment">&lt;!-- In Stock badge --&gt;</span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding InStock, Converter={StaticResource BoolToStockConverter}}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding InStock, Converter={StaticResource BoolToStockColorConverter}}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>End<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>DataTemplate</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>CollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>CollectionView</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>In the previous code there isn&rsquo;t much customization, because an unmodified <code>CollectionView</code> is being used:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/dotnet-maui-collectionview-vertical-list.png?sfvrsn=95310cd6_2" alt="Native .NET MAUI CollectionView displaying a vertical list" /></p><p>Although it&rsquo;s true that we could customize it manually through a <code>DataTemplate</code>, most of the time what is required is a quick but robust implementation. Let&rsquo;s use the MCP server to modify the look and feel by giving the following instruction:</p><pre class=" language-text"><code class="prism  language-text">#telerik-maui-assistant  I need you to improve the ProductsPageTelerik page. Replace the CollectionView with a DataGrid. I need the page and its controls to look modern and interactive.
</code></pre><p>When running the instruction and having the Telerik MCP server selected, we will receive a request to run tools, whose information is obtained automatically based on the query made:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/telerik-mcp-maui-permission-prompt.png?sfvrsn=2d8aa7cf_2" alt="Telerik MCP server permission dialog requesting tool execution" /></p><p>With the evolution of AI models, we can achieve that in a single call our instruction is executed, with the GitHub Copilot agent responsible for modifying the code, compiling and testing that everything works correctly. In just a few minutes, the replacement is very precise:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/maui-datagrid-table.png?sfvrsn=ae2254d8_2" alt="Converted DataGrid showing tabular data with columns" /></p><p>Another thing we can do is use the Telerik <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/ai/prompt-library">Prompt Library</a>, which contains a list of prompts for different use cases.</p><p>For example, suppose you&rsquo;d like to add paging to the component. To accomplish this, you can take the prompt <strong>DataGrid with Paging</strong> and adapt it to your use case, as follows:</p><pre class=" language-text"><code class="prism  language-text">#telerik-maui-assistant Modify the DataGrid to include pagination of 20 records per page.
</code></pre><p>Again, after a few calls to the MCP tool, the change is implemented in just a few minutes:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-05/pagination-added-with-mcp.png?sfvrsn=d786983d_2" alt="Pagination feature added quickly using the MCP server" /></p><p>With the previous exercises, you have been able to verify the power of using the Telerik MCP server for .NET MAUI to create robust graphical interfaces in much less time.</p><h2 id="conclusion">Conclusion</h2><p>In this article you learned about the Telerik UI for .NET MAUI AI Coding Assistant, a powerful MCP server specialized in using Telerik controls to guide you and implement complex graphical interfaces using artificial intelligence.</p><p>Undoubtedly, having this assistant provides a competitive advantage by helping you reduce the time required to create graphical interfaces, while also allowing you to explore design alternatives.</p><hr /><p><strong>Remember:</strong> Telerik UI for .NET MAUI comes with a free 30-day trial. </p><p><a href="https://www.telerik.com/try/ui-for-maui" target="_blank" class="Btn">Try Now</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:6474f4bb-8be6-4855-88f7-d84c8ef0da59</id>
    <title type="text">How to Build a Multi-Tenant SaaS API with NestJS and Postgres Row-Level Security</title>
    <summary type="text">We’ll build a multi-tenant task management API where customer data is isolated automatically at the database level. We’ll use Postgres Row-Level Security to enforce tenant isolation, with NestJS as our application framework and TypeORM to interact with the database.</summary>
    <published>2026-05-14T12:50:00Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Christian Nwamba </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/how-to-build-multi-tenant-saas-api-nestjs-postgres-row-level-security"/>
    <content type="text"><![CDATA[<p><span class="featured">We&rsquo;ll build a multi-tenant task management API where customer data is isolated automatically at the database level. We&rsquo;ll use Postgres Row-Level Security to enforce tenant isolation, with NestJS as our application framework and TypeORM to interact with the database.</span></p><p>In this post, we will build a multi-tenant task management API where customer data is isolated automatically at the database level. We&rsquo;ll use <a target="_blank" href="https://www.postgresql.org/docs/current/ddl-rowsecurity.html">Postgres Row-Level Security</a> to enforce tenant isolation, with <a target="_blank" href="https://nestjs.com/">NestJS</a> as our application framework and <a target="_blank" href="https://typeorm.io/">TypeORM</a> to interact with the database.</p><p>You&rsquo;ll learn how to set up RLS policies that filter queries by tenant, extract tenant information from JWT tokens, manage tenant onboarding and test that isolation works even against direct ID access attempts. By the end, you&rsquo;ll have a working multi-tenant SaaS API where tenants only see their own data, enforced at the database layer rather than in application code.</p><h2 id="prerequisites">Prerequisites</h2><p>To follow along, you&rsquo;ll need:</p><ul><li>Node.js installed</li><li><a target="_blank" href="https://www.postgresql.org/">Postgres</a> installed locally</li><li>Basic knowledge of NestJS and <a target="_blank" href="https://www.typescriptlang.org/">TypeScript</a></li><li>Basic knowledge of HTTP, RESTful APIs and cURL</li><li>Basic knowledge of JWT authentication</li></ul><aside><hr /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Introduction to JSON Web Tokens (JWT)
            </h4></div><div class="col-8"><p class="u-fs16 u-mb0"><a target="_blank" href="https://www.telerik.com/blogs/introduction-json-web-tokens-jwt">Learn the basics about using JWTs</a> to implement authorization in web applications.
            </p></div></div><hr class="u-mb3" /></aside><h2 id="what-is-multi-tenancy">What Is Multi-Tenancy?</h2><p>Multi-tenancy is an architecture where one application instance serves multiple customers (tenants). Each tenant&rsquo;s data is completely isolated from other tenants. If Company A creates a task, Company B should not be able to see it.</p><p>There are three main ways to achieve this:</p><ul><li><strong>Database per tenant:</strong> Each tenant gets their own database. This provides maximum isolation but is expensive and difficult to maintain at scale.</li><li><strong>Schema per tenant:</strong> All tenants share one database, but each gets their own schema. This is cheaper than separate databases, but migration management becomes complex.</li><li><strong>Shared schema with RLS:</strong> All tenants share the same database and schema. Isolation is enforced by the database itself using Row-Level Security policies.</li></ul><p>For a quick MVP build, the shared schema approach with RLS provides strong isolation without operational complexity.</p><h2 id="what-is-row-level-security">What Is Row-Level Security?</h2><p>Row-Level Security (RLS) is a Postgres feature that lets you define policies controlling which rows users can see or modify.</p><p>When RLS is enabled on a table, Postgres automatically filters query results based on the policies you define. Even if our application code doesn&rsquo;t add <code>WHERE tenant_id = ?</code>, the database allows tenants to only see their own data.</p><p>When a query runs, Postgres checks the policy conditions and rewrites the query. If our policy says <code>USING (tenant_id = current_setting('app.tenant_id'))</code>, then <code>SELECT * FROM tasks</code> becomes <code>SELECT * FROM tasks WHERE tenant_id = current_setting('app.tenant_id')</code>.<br />This moves security from the application layer (where programmers might make mistakes) to the database layer (where it is enforced automatically).</p><h2 id="project-setup">Project Setup</h2><p>First, create a NestJS project:</p><pre class=" language-shell"><code class="prism  language-shell">nest new task-management-api
cd task-management-api
</code></pre><p>Next, run the following command in your terminal to install our dependencies:</p><pre class=" language-shell"><code class="prism  language-shell">npm install @nestjs/config @nestjs/typeorm typeorm pg bcrypt @nestjs/jwt @nestjs/passport passport passport-jwt nestjs-cls uuid
npm install --save-dev @types/bcrypt @types/uuid @types/passport-jwt
</code></pre><p>Here&rsquo;s what each package does:</p><ul><li><strong>@nestjs/config:</strong> Manages environment variables</li><li><strong>@nestjs/typeorm and typeorm:</strong> ORM for Postgres</li><li><strong>pg:</strong> Postgres driver</li><li><strong>bcrypt:</strong> Password hashing</li><li><strong>@nestjs/jwt and @nestjs/passport:</strong> Create and validate JWT tokens</li><li><strong>passport and passport-jwt:</strong> Provide authentication strategies</li><li><strong>nestjs-cls:</strong> Request-scoped context storage for tracking tenants</li><li><strong>uuid:</strong> Creates unique IDs</li></ul><p>Next, create a <code>.env</code> file at the root of your project and add the following to it:</p><pre class=" language-js"><code class="prism  language-js">DB_HOST<span class="token operator">=</span>localhost
DB_PORT<span class="token operator">=</span><span class="token number">5432</span>
DB_USERNAME<span class="token operator">=</span>app_user
DB_PASSWORD<span class="token operator">=</span>newpassword123
DB_NAME<span class="token operator">=</span>task_management

JWT_SECRET<span class="token operator">=</span>your<span class="token operator">-</span>secret<span class="token operator">-</span>key<span class="token operator">-</span>change<span class="token operator">-</span><span class="token keyword">this</span><span class="token operator">-</span><span class="token keyword">in</span><span class="token operator">-</span>production
JWT_EXPIRATION<span class="token operator">=</span>24h
</code></pre><p>The variables above configure our database connection and JWT settings.</p><p>Now update your app.module.ts file to load these variables:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>
    ConfigModule<span class="token punctuation">.</span><span class="token function">forRoot</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      isGlobal<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">,</span>
      envFilePath<span class="token punctuation">:</span> <span class="token string">'.env'</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token comment">// ... we will add other modules here later</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AppModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h2 id="database-setup">Database Setup</h2><p>Let&rsquo;s set up our Postgres database with the tables and RLS policies needed for tenant isolation.</p><h3 id="connect-to-postgres">Connect to Postgres</h3><p>Open the psql shell (search for &ldquo;SQL Shell (psql)&rdquo; in your Start menu). When prompted:</p><ul><li><strong>Server:</strong> localhost</li><li><strong>Database:</strong> postgres</li><li><strong>Port:</strong> 5432</li><li><strong>Username:</strong> postgres</li><li><strong>Password:</strong> [your postgres password]</li></ul><h3 id="create-database-and-user">Create Database and User</h3><p>Run these commands in the psql shell:</p><pre class=" language-shell"><code class="prism  language-shell">CREATE DATABASE task_management;
CREATE USER app_user WITH PASSWORD 'newpassword123' NOSUPERUSER;
GRANT CONNECT ON DATABASE task_management TO app_user;
\c task_management
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
GRANT USAGE ON SCHEMA public TO app_user;
GRANT CREATE ON SCHEMA public TO app_user;
\q
</code></pre><p>We create <code>app_user</code> with <code>NOSUPERUSER</code> because superusers bypass RLS policies, which would completely break our isolation.</p><h3 id="create-tables-and-rls-policies">Create Tables and RLS Policies</h3><p>Open psql again and connect as app_user:</p><pre class=" language-shell"><code class="prism  language-shell">Server: localhost
Database: task_management
Port: 5432
Username: app_user
Password: newpassword123
</code></pre><p>Now, run the complete SQL setup:</p><pre class=" language-shell"><code class="prism  language-shell">-- Create tenants table (no RLS needed here)
CREATE TABLE tenants (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  name VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

-- Create users table (NO RLS - needed for login)
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
  email VARCHAR(255) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

-- Create tasks table
CREATE TABLE tasks (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  status VARCHAR(50) DEFAULT 'pending',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Enable RLS ONLY on tasks table
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;

-- Force RLS even for table owner
ALTER TABLE tasks FORCE ROW LEVEL SECURITY;

-- Create RLS policy for tasks with both USING and WITH CHECK
CREATE POLICY tenant_isolation_tasks ON tasks
  USING (tenant_id = current_setting('app.current_tenant_id', true)::uuid)
  WITH CHECK (tenant_id = current_setting('app.current_tenant_id', true)::uuid);

-- Create indexes for performance
CREATE INDEX idx_users_tenant_id ON users(tenant_id);
CREATE INDEX idx_tasks_tenant_id ON tasks(tenant_id);
CREATE INDEX idx_tasks_tenant_status ON tasks(tenant_id, status);

-- Exit psql
\q
</code></pre><p>The <code>ENABLE ROW LEVEL SECURITY</code> command turns on RLS for the tasks table. The <code>FORCE ROW LEVEL SECURITY</code> command applies RLS even to the table owner, helping prevent unintended data exposure during manual database work.</p><p>The <code>USING</code> clause in our policy checks if the row&rsquo;s tenant_id corresponds to the session variable app.current_tenant_id. The <code>WITH CHECK</code> clause validates INSERT and UPDATE operations to ensure the tenant_id matches. The <code>true</code> parameter in current_setting tells Postgres to return NULL instead of throwing an error if the variable isn&rsquo;t set.</p><p>We&rsquo;re using UUID primary keys instead of sequential integers because with integers, a malicious tenant could guess other tenants&rsquo; IDs and probe for data leaks through foreign key violations.</p><blockquote><p>The users table doesn&rsquo;t have RLS enabled. This is intentional because we need to query users across tenants during login, before we have a tenant context.</p></blockquote><h2 id="project-structure">Project Structure</h2><p>Our project structure will look like this:</p><pre class=" language-js"><code class="prism  language-js">src<span class="token operator">/</span>
├── auth<span class="token operator">/</span>
│   ├── guards<span class="token operator">/</span>
│   │   └── jwt<span class="token operator">-</span>auth<span class="token punctuation">.</span>guard<span class="token punctuation">.</span>ts
│   ├── strategies<span class="token operator">/</span>
│   │   └── jwt<span class="token punctuation">.</span>strategy<span class="token punctuation">.</span>ts
│   ├── auth<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>ts
│   ├── auth<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>spec<span class="token punctuation">.</span>ts
│   ├── auth<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
│   ├── auth<span class="token punctuation">.</span>service<span class="token punctuation">.</span>ts
│   └── auth<span class="token punctuation">.</span>service<span class="token punctuation">.</span>spec<span class="token punctuation">.</span>ts
├── database<span class="token operator">/</span>
│   ├── database<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
│   └── tenant<span class="token operator">-</span>context<span class="token punctuation">.</span>interceptor<span class="token punctuation">.</span>ts
├── middleware<span class="token operator">/</span>
│   └── tenant<span class="token punctuation">.</span>middleware<span class="token punctuation">.</span>ts
├── tasks<span class="token operator">/</span>
│   ├── entities<span class="token operator">/</span>
│   │   └── task<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>ts
│   ├── tasks<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>ts
│   ├── tasks<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>spec<span class="token punctuation">.</span>ts
│   ├── tasks<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
│   └── tasks<span class="token punctuation">.</span>service<span class="token punctuation">.</span>ts
├── tenants<span class="token operator">/</span>
│   ├── entities<span class="token operator">/</span>
│   │   └── tenant<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>ts
│   ├── tenants<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>ts
│   ├── tenants<span class="token punctuation">.</span>controller<span class="token punctuation">.</span>spec<span class="token punctuation">.</span>ts
│   ├── tenants<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
│   └── tenants<span class="token punctuation">.</span>service<span class="token punctuation">.</span>ts
├── users<span class="token operator">/</span>
│   ├── entities<span class="token operator">/</span>
│   │   └── user<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>ts
│   ├── users<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
│   ├── users<span class="token punctuation">.</span>service<span class="token punctuation">.</span>ts
│   └── users<span class="token punctuation">.</span>service<span class="token punctuation">.</span>spec<span class="token punctuation">.</span>ts
├── app<span class="token punctuation">.</span>module<span class="token punctuation">.</span>ts
└── main<span class="token punctuation">.</span>ts
</code></pre><p>Use the commands below to create the basic structure:</p><pre class=" language-shell"><code class="prism  language-shell">nest g module tenants &amp;&amp; \
nest g controller tenants &amp;&amp; \
nest g service tenants &amp;&amp; \
nest g module auth &amp;&amp; \
nest g controller auth &amp;&amp; \
nest g service auth &amp;&amp; \
nest g module tasks &amp;&amp; \
nest g controller tasks &amp;&amp; \
nest g service tasks &amp;&amp; \
nest g module users &amp;&amp; \
nest g service users &amp;&amp; \
nest g module database
</code></pre><p>We&rsquo;ll also need to manually create the entities, guards, strategies, middleware and interceptor files later on.</p><h2 id="configure-typeorm">Configure TypeORM</h2><p>TypeORM needs to connect to Postgres and recognize our entities.</p><p>Update the <code>src/app.module.ts</code> file to add TypeORM:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module<span class="token punctuation">,</span> MiddlewareConsumer<span class="token punctuation">,</span> RequestMethod <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigModule<span class="token punctuation">,</span> ConfigService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TypeOrmModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ClsModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'nestjs-cls'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantMiddleware <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./middleware/tenant.middleware'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantsModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tenants/tenants.module'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AuthModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./auth/auth.module'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./users/users.module'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TasksModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tasks/tasks.module'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> DatabaseModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./database/database.module'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>
    ConfigModule<span class="token punctuation">.</span><span class="token function">forRoot</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      isGlobal<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">,</span>
      envFilePath<span class="token punctuation">:</span> <span class="token string">'.env'</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    TypeOrmModule<span class="token punctuation">.</span><span class="token function">forRootAsync</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      inject<span class="token punctuation">:</span> <span class="token punctuation">[</span>ConfigService<span class="token punctuation">]</span><span class="token punctuation">,</span>
      useFactory<span class="token punctuation">:</span> <span class="token punctuation">(</span>config<span class="token punctuation">:</span> ConfigService<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">(</span><span class="token punctuation">{</span>
        <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'postgres'</span><span class="token punctuation">,</span>
        host<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'DB_HOST'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        port<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'DB_PORT'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        username<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'DB_USERNAME'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        password<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'DB_PASSWORD'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        database<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'DB_NAME'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        entities<span class="token punctuation">:</span> <span class="token punctuation">[</span>__dirname <span class="token operator">+</span> <span class="token string">'/**/*.entity{.ts,.js}'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
        synchronize<span class="token punctuation">:</span> <span class="token keyword">false</span><span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    ClsModule<span class="token punctuation">.</span><span class="token function">forRoot</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      global<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">,</span>
      middleware<span class="token punctuation">:</span> <span class="token punctuation">{</span> mount<span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    AuthModule<span class="token punctuation">,</span>
    TenantsModule<span class="token punctuation">,</span>
    UsersModule<span class="token punctuation">,</span>
    TasksModule<span class="token punctuation">,</span>
    DatabaseModule<span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AppModule</span> <span class="token punctuation">{</span>
  <span class="token function">configure</span><span class="token punctuation">(</span>consumer<span class="token punctuation">:</span> MiddlewareConsumer<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    consumer
      <span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>TenantMiddleware<span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">exclude</span><span class="token punctuation">(</span>
        <span class="token punctuation">{</span> path<span class="token punctuation">:</span> <span class="token string">'tenants/register'</span><span class="token punctuation">,</span> method<span class="token punctuation">:</span> RequestMethod<span class="token punctuation">.</span>POST <span class="token punctuation">}</span><span class="token punctuation">,</span>
        <span class="token punctuation">{</span> path<span class="token punctuation">:</span> <span class="token string">'auth/login'</span><span class="token punctuation">,</span> method<span class="token punctuation">:</span> RequestMethod<span class="token punctuation">.</span>POST <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">forRoutes</span><span class="token punctuation">(</span><span class="token string">'*'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>We set <code>synchronize: false</code> because we created our tables manually with RLS policies. If we let TypeORM auto-generate tables, it won&rsquo;t add the RLS policies.</p><p>The ClsModule provides request-scoped storage that persists across async operations. When we set a value in the CLS store, it is only accessible within that specific request&rsquo;s execution context. The ClsModule is configured with <code>global: true</code>, so it is available throughout the entire application without importing it into every module. The <code>middleware: { mount: true }</code> setting tells CLS to automatically track the request context as it passes through our application.</p><p>The configure method at the bottom sets up our tenant middleware to run on all routes except registration and login. These two endpoints need to be public because users don&rsquo;t have tokens yet when they&rsquo;re signing up or logging in. We&rsquo;ll create the middleware file and add the logic later.</p><h2 id="creating-entities">Creating Entities</h2><h3 id="tenant-entity">Tenant Entity</h3><p>Create a file named <code>tenant.entity.ts</code> in the <code>src/tenants/entities/</code> folder:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Entity<span class="token punctuation">,</span> PrimaryGeneratedColumn<span class="token punctuation">,</span> Column<span class="token punctuation">,</span> CreateDateColumn <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>

@<span class="token function">Entity</span><span class="token punctuation">(</span><span class="token string">'tenants'</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">Tenant</span> <span class="token punctuation">{</span>
  @<span class="token function">PrimaryGeneratedColumn</span><span class="token punctuation">(</span><span class="token string">'uuid'</span><span class="token punctuation">)</span>
  id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'varchar'</span><span class="token punctuation">,</span> length<span class="token punctuation">:</span> <span class="token number">255</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  name<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">CreateDateColumn</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'created_at'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  createdAt<span class="token punctuation">:</span> Date<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="user-entity">User Entity</h3><p>Create a file named <code>user.entity.ts</code> in the <code>src/users/entities/</code> folder:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Entity<span class="token punctuation">,</span> PrimaryGeneratedColumn<span class="token punctuation">,</span> Column<span class="token punctuation">,</span> CreateDateColumn <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>

@<span class="token function">Entity</span><span class="token punctuation">(</span><span class="token string">'users'</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token punctuation">{</span>
  @<span class="token function">PrimaryGeneratedColumn</span><span class="token punctuation">(</span><span class="token string">'uuid'</span><span class="token punctuation">)</span>
  id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'tenant_id'</span><span class="token punctuation">,</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'uuid'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  tenantId<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'varchar'</span><span class="token punctuation">,</span> length<span class="token punctuation">:</span> <span class="token number">255</span><span class="token punctuation">,</span> unique<span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'password_hash'</span><span class="token punctuation">,</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'varchar'</span><span class="token punctuation">,</span> length<span class="token punctuation">:</span> <span class="token number">255</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  passwordHash<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">CreateDateColumn</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'created_at'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  createdAt<span class="token punctuation">:</span> Date<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="task-entity">Task Entity</h3><p>Create a file named <code>task.entity.ts</code> in the <code>src/tasks/entities/</code> folder:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Entity<span class="token punctuation">,</span> PrimaryGeneratedColumn<span class="token punctuation">,</span> Column<span class="token punctuation">,</span> CreateDateColumn<span class="token punctuation">,</span> UpdateDateColumn <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>

@<span class="token function">Entity</span><span class="token punctuation">(</span><span class="token string">'tasks'</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">Task</span> <span class="token punctuation">{</span>
  @<span class="token function">PrimaryGeneratedColumn</span><span class="token punctuation">(</span><span class="token string">'uuid'</span><span class="token punctuation">)</span>
  id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'tenant_id'</span><span class="token punctuation">,</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'uuid'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  tenantId<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'varchar'</span><span class="token punctuation">,</span> length<span class="token punctuation">:</span> <span class="token number">255</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  title<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'text'</span><span class="token punctuation">,</span> nullable<span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  description<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">Column</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token keyword">type</span><span class="token punctuation">:</span> <span class="token string">'varchar'</span><span class="token punctuation">,</span> length<span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token string">'pending'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  status<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span>

  @<span class="token function">CreateDateColumn</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'created_at'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  createdAt<span class="token punctuation">:</span> Date<span class="token punctuation">;</span>

  @<span class="token function">UpdateDateColumn</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'updated_at'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
  updatedAt<span class="token punctuation">:</span> Date<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><h2 id="building-the-tenant-context-system">Building the Tenant Context System</h2><p>The main challenge in using RLS with Node.js is propagating the tenant ID through asynchronous operations.</p><p>Since Node.js handles multiple requests concurrently, we can&rsquo;t use global variables, as they would be overwritten. We need request-scoped storage that persists across async boundaries.</p><h3 id="creating-the-tenant-middleware">Creating the Tenant Middleware</h3><p>The middleware extracts the tenant ID from the JWT and stores it in the CLS context.</p><p>Create a file named <code>tenant.middleware.ts</code> in the <code>src/middleware/</code> folder:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable<span class="token punctuation">,</span> NestMiddleware<span class="token punctuation">,</span> UnauthorizedException <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Request<span class="token punctuation">,</span> Response<span class="token punctuation">,</span> NextFunction <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'express'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ClsService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'nestjs-cls'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> JwtService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/jwt'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TenantMiddleware</span> <span class="token keyword">implements</span> <span class="token class-name">NestMiddleware</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    <span class="token keyword">private</span> readonly cls<span class="token punctuation">:</span> ClsService<span class="token punctuation">,</span>
    <span class="token keyword">private</span> readonly jwtService<span class="token punctuation">:</span> JwtService<span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token function">use</span><span class="token punctuation">(</span>req<span class="token punctuation">:</span> Request<span class="token punctuation">,</span> res<span class="token punctuation">:</span> Response<span class="token punctuation">,</span> next<span class="token punctuation">:</span> NextFunction<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> authHeader <span class="token operator">=</span> req<span class="token punctuation">.</span>headers<span class="token punctuation">.</span>authorization<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>authHeader <span class="token operator">||</span> <span class="token operator">!</span>authHeader<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">'Bearer '</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnauthorizedException</span><span class="token punctuation">(</span><span class="token string">'Missing or invalid authorization header'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">const</span> token <span class="token operator">=</span> authHeader<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">const</span> payload <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>jwtService<span class="token punctuation">.</span><span class="token function">verify</span><span class="token punctuation">(</span>token<span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>payload<span class="token punctuation">.</span>tenantId<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnauthorizedException</span><span class="token punctuation">(</span><span class="token string">'Token missing tenant context'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>

      <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token string">'TENANT_ID'</span><span class="token punctuation">,</span> payload<span class="token punctuation">.</span>tenantId<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token string">'USER_ID'</span><span class="token punctuation">,</span> payload<span class="token punctuation">.</span>sub<span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnauthorizedException</span><span class="token punctuation">(</span><span class="token string">'Invalid token'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
</code></pre><p>This middleware runs on every request except the excluded routes (registration and login). It extracts the JWT from the Authorization header, verifies it and stores the tenantId in the CLS context. Any service can then retrieve this value using <code>this.cls.get('TENANT_ID')</code>.</p><h2 id="typeorm-with-rls-the-challenge">TypeORM with RLS: The Challenge</h2><p>TypeORM manages a pool of database connections that are reused across requests. When you call <code>repository.find()</code>, TypeORM borrows a connection, runs our query, then returns that connection to the pool for the next request to use.</p><p>The issue is there&rsquo;s no way to tell TypeORM &ldquo;before you run this query, first execute <code>SET app.current_tenant_id = ...</code> on this specific connection.&rdquo; By the time our service code runs, TypeORM has already grabbed the connection and is ready to execute.</p><p>The solution is to bypass TypeORM&rsquo;s automatic connection management and use QueryRunner instead. This gives us manual control. We can grab a connection, set the tenant context, run queries and then release it&mdash;all within a single transaction.</p><h3 id="creating-the-tenant-context-interceptor">Creating the Tenant Context Interceptor</h3><p>Let&rsquo;s create an interceptor that wraps every request in a transaction and sets the tenant context.</p><p>Create a file called <code>tenant-context.interceptor.ts</code> in the <code>src/database/</code>:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span>
  Injectable<span class="token punctuation">,</span>
  NestInterceptor<span class="token punctuation">,</span>
  ExecutionContext<span class="token punctuation">,</span>
  CallHandler<span class="token punctuation">,</span>
<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Observable<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> lastValueFrom <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'rxjs'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> DataSource <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ClsService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'nestjs-cls'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TenantContextInterceptor</span> <span class="token keyword">implements</span> <span class="token class-name">NestInterceptor</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    <span class="token keyword">private</span> dataSource<span class="token punctuation">:</span> DataSource<span class="token punctuation">,</span>
    <span class="token keyword">private</span> cls<span class="token punctuation">:</span> ClsService<span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token function">intercept</span><span class="token punctuation">(</span>context<span class="token punctuation">:</span> ExecutionContext<span class="token punctuation">,</span> next<span class="token punctuation">:</span> CallHandler<span class="token punctuation">)</span><span class="token punctuation">:</span> Observable<span class="token operator">&lt;</span><span class="token keyword">any</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> tenantId <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'TENANT_ID'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>tenantId<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> next<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">return</span> <span class="token keyword">from</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setupTransaction</span><span class="token punctuation">(</span>tenantId<span class="token punctuation">,</span> next<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">private</span> <span class="token keyword">async</span> <span class="token function">setupTransaction</span><span class="token punctuation">(</span>tenantId<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> next<span class="token punctuation">:</span> CallHandler<span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span><span class="token keyword">any</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> queryRunner <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>dataSource<span class="token punctuation">.</span><span class="token function">createQueryRunner</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">startTransaction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span>
        <span class="token template-string"><span class="token string">`SELECT set_config('app.current_tenant_id', $1, TRUE)`</span></span><span class="token punctuation">,</span>
        <span class="token punctuation">[</span>tenantId<span class="token punctuation">]</span><span class="token punctuation">,</span>
      <span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token string">'QUERY_RUNNER'</span><span class="token punctuation">,</span> queryRunner<span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token keyword">const</span> result <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">lastValueFrom</span><span class="token punctuation">(</span>next<span class="token punctuation">.</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">commitTransaction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> result<span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">rollbackTransaction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">throw</span> error<span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span>
      <span class="token keyword">await</span> queryRunner<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token string">'QUERY_RUNNER'</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>This interceptor creates a new transaction for every request, sets the tenant ID using <code>set_config</code>, and stores the QueryRunner in CLS so services can access it.</p><p>The <code>TRUE</code> parameter in <code>set_config</code> is very important; it makes the setting local to this transaction. When the transaction commits or rolls back, the setting is automatically cleared. This prevents the &ldquo;leaky tenant&rdquo; problem, where one request&rsquo;s tenant ID bleeds into another request using the same pooled connection.</p><p>Update the <code>src/database/database.module.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantContextInterceptor <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tenant-context.interceptor'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>TenantContextInterceptor<span class="token punctuation">]</span><span class="token punctuation">,</span>
  exports<span class="token punctuation">:</span> <span class="token punctuation">[</span>TenantContextInterceptor<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">DatabaseModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h2 id="building-services-with-rls">Building Services with RLS</h2><p>Now, let&rsquo;s set up our services to use the QueryRunner from CLS instead of the standard repository.</p><h3 id="tenants-service">Tenants Service</h3><p>Update the <code>src/tenants/tenants.service.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable<span class="token punctuation">,</span> ConflictException <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> InjectRepository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Repository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Tenant <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/tenant.entity'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TenantsService</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    @<span class="token function">InjectRepository</span><span class="token punctuation">(</span>Tenant<span class="token punctuation">)</span>
    <span class="token keyword">private</span> tenantsRepo<span class="token punctuation">:</span> Repository<span class="token operator">&lt;</span>Tenant<span class="token operator">&gt;</span><span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">create</span><span class="token punctuation">(</span>name<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Tenant<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> existing <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tenantsRepo<span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span><span class="token punctuation">{</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span> name <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>existing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">ConflictException</span><span class="token punctuation">(</span><span class="token string">'Tenant name already exists'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">const</span> tenant <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tenantsRepo<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tenantsRepo<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>tenant<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">findById</span><span class="token punctuation">(</span>id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Tenant <span class="token operator">|</span> <span class="token keyword">null</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tenantsRepo<span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span><span class="token punctuation">{</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span> id <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The tenants table doesn&rsquo;t have RLS enabled, so we can use the standard repository here.</p><h3 id="users-service">Users Service</h3><p>Update the <code>src/users/users.service.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> InjectRepository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Repository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> User <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/user.entity'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token operator">*</span> <span class="token keyword">as</span> bcrypt <span class="token keyword">from</span> <span class="token string">'bcrypt'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">UsersService</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    @<span class="token function">InjectRepository</span><span class="token punctuation">(</span>User<span class="token punctuation">)</span>
    <span class="token keyword">private</span> usersRepo<span class="token punctuation">:</span> Repository<span class="token operator">&lt;</span>User<span class="token operator">&gt;</span><span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">create</span><span class="token punctuation">(</span>tenantId<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> password<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>User<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> passwordHash <span class="token operator">=</span> <span class="token keyword">await</span> bcrypt<span class="token punctuation">.</span><span class="token function">hash</span><span class="token punctuation">(</span>password<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>usersRepo<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      tenantId<span class="token punctuation">,</span>
      email<span class="token punctuation">,</span>
      passwordHash<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>usersRepo<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">findByEmail</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>User <span class="token operator">|</span> <span class="token keyword">null</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>usersRepo<span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span><span class="token punctuation">{</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span> email <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Update the <code>src/users/users.module.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TypeOrmModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./users.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> User <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/user.entity'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>TypeOrmModule<span class="token punctuation">.</span><span class="token function">forFeature</span><span class="token punctuation">(</span><span class="token punctuation">[</span>User<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>UsersService<span class="token punctuation">]</span><span class="token punctuation">,</span>
  exports<span class="token punctuation">:</span> <span class="token punctuation">[</span>UsersService<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">UsersModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h3 id="tasks-service">Tasks Service</h3><p>Update the <code>src/tasks/tasks.service.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable<span class="token punctuation">,</span> NotFoundException <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> InjectRepository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Repository <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ClsService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'nestjs-cls'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Task <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/task.entity'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TasksService</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    @<span class="token function">InjectRepository</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span>
    <span class="token keyword">private</span> tasksRepo<span class="token punctuation">:</span> Repository<span class="token operator">&lt;</span>Task<span class="token operator">&gt;</span><span class="token punctuation">,</span>
    <span class="token keyword">private</span> cls<span class="token punctuation">:</span> ClsService<span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token keyword">private</span> <span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> queryRunner <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'QUERY_RUNNER'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> queryRunner <span class="token operator">?</span> queryRunner<span class="token punctuation">.</span>manager <span class="token punctuation">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksRepo<span class="token punctuation">.</span>manager<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">create</span><span class="token punctuation">(</span>title<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> description<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Task<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> tenantId <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cls<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'TENANT_ID'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> manager <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">const</span> task <span class="token operator">=</span> manager<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>Task<span class="token punctuation">,</span> <span class="token punctuation">{</span>
      tenantId<span class="token punctuation">,</span>
      title<span class="token punctuation">,</span>
      description<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> manager<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>task<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Task<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> manager <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> manager<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span>Task<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">findOne</span><span class="token punctuation">(</span>id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Task<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> manager <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> task <span class="token operator">=</span> <span class="token keyword">await</span> manager<span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span>Task<span class="token punctuation">,</span> <span class="token punctuation">{</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span> id <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>task<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">NotFoundException</span><span class="token punctuation">(</span><span class="token string">'Task not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">return</span> task<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">update</span><span class="token punctuation">(</span>id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> title<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> description<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> status<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Task<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> manager <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> task <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>title<span class="token punctuation">)</span> task<span class="token punctuation">.</span>title <span class="token operator">=</span> title<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>description <span class="token operator">!==</span> undefined<span class="token punctuation">)</span> task<span class="token punctuation">.</span>description <span class="token operator">=</span> description<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>status<span class="token punctuation">)</span> task<span class="token punctuation">.</span>status <span class="token operator">=</span> status<span class="token punctuation">;</span>

    <span class="token keyword">return</span> manager<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>task<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">remove</span><span class="token punctuation">(</span>id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Promise<span class="token operator">&lt;</span>Task<span class="token operator">&gt;</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> manager <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> task <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">await</span> manager<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>task<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> task<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The <code>getManager()</code> helper checks if we have a QueryRunner in CLS. If we do, we use its manager (which has the tenant context set). If not, we fall back to the standard repository manager.</p><p>Note: RLS automatically filters all queries, so <code>findAll()</code> only returns tasks belonging to the current tenant even though we don&rsquo;t explicitly filter by tenant_id. If the standard repository manager is used, however, we&rsquo;ll get null (zero rows) instead of an error because of the <code>true</code> parameter in <code>current_setting</code>.</p><p>Update the <code>src/tasks/tasks.module.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TypeOrmModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TasksController <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tasks.controller'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TasksService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tasks.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Task <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/task.entity'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> DatabaseModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../database/database.module'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>TypeOrmModule<span class="token punctuation">.</span><span class="token function">forFeature</span><span class="token punctuation">(</span><span class="token punctuation">[</span>Task<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> DatabaseModule<span class="token punctuation">]</span><span class="token punctuation">,</span>
  controllers<span class="token punctuation">:</span> <span class="token punctuation">[</span>TasksController<span class="token punctuation">]</span><span class="token punctuation">,</span>
  providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>TasksService<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TasksModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h2 id="tenant-registration">Tenant Registration</h2><p>The tenant registration endpoint creates a new tenant and its first user.</p><p>Update the <code>src/tenants/tenants.controller.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Controller<span class="token punctuation">,</span> Post<span class="token punctuation">,</span> Body <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantsService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tenants.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../users/users.service'</span><span class="token punctuation">;</span>

@<span class="token function">Controller</span><span class="token punctuation">(</span><span class="token string">'tenants'</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TenantsController</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    <span class="token keyword">private</span> tenantsService<span class="token punctuation">:</span> TenantsService<span class="token punctuation">,</span>
    <span class="token keyword">private</span> usersService<span class="token punctuation">:</span> UsersService<span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  @<span class="token function">Post</span><span class="token punctuation">(</span><span class="token string">'register'</span><span class="token punctuation">)</span>
  <span class="token keyword">async</span> <span class="token function">register</span><span class="token punctuation">(</span>
    @<span class="token function">Body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> body<span class="token punctuation">:</span> <span class="token punctuation">{</span> tenantName<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> password<span class="token punctuation">:</span> <span class="token keyword">string</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> tenant <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tenantsService<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>body<span class="token punctuation">.</span>tenantName<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>usersService<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>
      tenant<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
      body<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
      body<span class="token punctuation">.</span>password<span class="token punctuation">,</span>
    <span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token punctuation">{</span>
      tenant<span class="token punctuation">:</span> <span class="token punctuation">{</span> id<span class="token punctuation">:</span> tenant<span class="token punctuation">.</span>id<span class="token punctuation">,</span> name<span class="token punctuation">:</span> tenant<span class="token punctuation">.</span>name <span class="token punctuation">}</span><span class="token punctuation">,</span>
      user<span class="token punctuation">:</span> <span class="token punctuation">{</span> id<span class="token punctuation">:</span> user<span class="token punctuation">.</span>id<span class="token punctuation">,</span> email<span class="token punctuation">:</span> user<span class="token punctuation">.</span>email <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Update the <code>TenantsModule</code> to import <code>UsersModule</code>:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TypeOrmModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/typeorm'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantsController <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tenants.controller'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> TenantsService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tenants.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> Tenant <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./entities/tenant.entity'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../users/users.module'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>TypeOrmModule<span class="token punctuation">.</span><span class="token function">forFeature</span><span class="token punctuation">(</span><span class="token punctuation">[</span>Tenant<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> UsersModule<span class="token punctuation">]</span><span class="token punctuation">,</span>
  controllers<span class="token punctuation">:</span> <span class="token punctuation">[</span>TenantsController<span class="token punctuation">]</span><span class="token punctuation">,</span>
  providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>TenantsService<span class="token punctuation">]</span><span class="token punctuation">,</span>
  exports<span class="token punctuation">:</span> <span class="token punctuation">[</span>TenantsService<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TenantsModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h2 id="authentication-with-jwt">Authentication with JWT</h2><p>Our JWT tokens need to include the tenant ID so the middleware can extract it.</p><h3 id="jwt-strategy">JWT Strategy</h3><p>Create the <code>src/auth/strategies/jwt.strategy.ts</code> file and add the following to it:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> PassportStrategy <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/passport'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ExtractJwt<span class="token punctuation">,</span> Strategy <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'passport-jwt'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">JwtStrategy</span> <span class="token keyword">extends</span> <span class="token class-name">PassportStrategy</span><span class="token punctuation">(</span>Strategy<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>configService<span class="token punctuation">:</span> ConfigService<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      jwtFromRequest<span class="token punctuation">:</span> ExtractJwt<span class="token punctuation">.</span><span class="token function">fromAuthHeaderAsBearerToken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      ignoreExpiration<span class="token punctuation">:</span> <span class="token keyword">false</span><span class="token punctuation">,</span>
      secretOrKey<span class="token punctuation">:</span> configService<span class="token punctuation">.</span><span class="token function">getOrThrow</span><span class="token punctuation">(</span><span class="token string">'JWT_SECRET'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">validate</span><span class="token punctuation">(</span>payload<span class="token punctuation">:</span> <span class="token keyword">any</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token punctuation">{</span>
      userId<span class="token punctuation">:</span> payload<span class="token punctuation">.</span>sub<span class="token punctuation">,</span>
      tenantId<span class="token punctuation">:</span> payload<span class="token punctuation">.</span>tenantId<span class="token punctuation">,</span>
      email<span class="token punctuation">:</span> payload<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="jwt-auth-guard">JWT Auth Guard</h3><p>Create a <code>src/auth/guards/jwt-auth.guard.ts</code> file and add the following to it:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AuthGuard <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/passport'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">JwtAuthGuard</span> <span class="token keyword">extends</span> <span class="token class-name">AuthGuard</span><span class="token punctuation">(</span><span class="token string">'jwt'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h3 id="auth-service">Auth Service</h3><p>Update the <code>src/auth/auth.service.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Injectable<span class="token punctuation">,</span> UnauthorizedException <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> JwtService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/jwt'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../users/users.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token operator">*</span> <span class="token keyword">as</span> bcrypt <span class="token keyword">from</span> <span class="token string">'bcrypt'</span><span class="token punctuation">;</span>

@<span class="token function">Injectable</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AuthService</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span>
    <span class="token keyword">private</span> usersService<span class="token punctuation">:</span> UsersService<span class="token punctuation">,</span>
    <span class="token keyword">private</span> jwtService<span class="token punctuation">:</span> JwtService<span class="token punctuation">,</span>
  <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  <span class="token keyword">async</span> <span class="token function">login</span><span class="token punctuation">(</span>email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span> password<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>usersService<span class="token punctuation">.</span><span class="token function">findByEmail</span><span class="token punctuation">(</span>email<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>user<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnauthorizedException</span><span class="token punctuation">(</span><span class="token string">'Invalid credentials'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">const</span> isPasswordValid <span class="token operator">=</span> <span class="token keyword">await</span> bcrypt<span class="token punctuation">.</span><span class="token function">compare</span><span class="token punctuation">(</span>password<span class="token punctuation">,</span> user<span class="token punctuation">.</span>passwordHash<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>isPasswordValid<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnauthorizedException</span><span class="token punctuation">(</span><span class="token string">'Invalid credentials'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">const</span> payload <span class="token operator">=</span> <span class="token punctuation">{</span>
      sub<span class="token punctuation">:</span> user<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
      tenantId<span class="token punctuation">:</span> user<span class="token punctuation">.</span>tenantId<span class="token punctuation">,</span>
      email<span class="token punctuation">:</span> user<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token punctuation">{</span>
      access_token<span class="token punctuation">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span>jwtService<span class="token punctuation">.</span><span class="token function">sign</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">,</span>
      user<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        id<span class="token punctuation">:</span> user<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
        email<span class="token punctuation">:</span> user<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
        tenantId<span class="token punctuation">:</span> user<span class="token punctuation">.</span>tenantId<span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="auth-controller">Auth Controller</h3><p>Update the <code>src/auth/auth.controller.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Controller<span class="token punctuation">,</span> Post<span class="token punctuation">,</span> Body <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AuthService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./auth.service'</span><span class="token punctuation">;</span>

@<span class="token function">Controller</span><span class="token punctuation">(</span><span class="token string">'auth'</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AuthController</span> <span class="token punctuation">{</span>
  <span class="token keyword">constructor</span><span class="token punctuation">(</span><span class="token keyword">private</span> authService<span class="token punctuation">:</span> AuthService<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>

  @<span class="token function">Post</span><span class="token punctuation">(</span><span class="token string">'login'</span><span class="token punctuation">)</span>
  <span class="token keyword">async</span> <span class="token function">login</span><span class="token punctuation">(</span>@<span class="token function">Body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> body<span class="token punctuation">:</span> <span class="token punctuation">{</span> email<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> password<span class="token punctuation">:</span> <span class="token keyword">string</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>authService<span class="token punctuation">.</span><span class="token function">login</span><span class="token punctuation">(</span>body<span class="token punctuation">.</span>email<span class="token punctuation">,</span> body<span class="token punctuation">.</span>password<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><h3 id="auth-module">Auth Module</h3><p>Update the <code>src/auth/auth.module.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> Module <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> JwtModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/jwt'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> PassportModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/passport'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> ConfigModule<span class="token punctuation">,</span> ConfigService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/config'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AuthController <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./auth.controller'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> AuthService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./auth.service'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> JwtStrategy <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./strategies/jwt.strategy'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span> UsersModule <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../users/users.module'</span><span class="token punctuation">;</span>

@<span class="token function">Module</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>
    UsersModule<span class="token punctuation">,</span>
    PassportModule<span class="token punctuation">,</span>
    JwtModule<span class="token punctuation">.</span><span class="token function">registerAsync</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      imports<span class="token punctuation">:</span> <span class="token punctuation">[</span>ConfigModule<span class="token punctuation">]</span><span class="token punctuation">,</span>
      inject<span class="token punctuation">:</span> <span class="token punctuation">[</span>ConfigService<span class="token punctuation">]</span><span class="token punctuation">,</span>
      useFactory<span class="token punctuation">:</span> <span class="token punctuation">(</span>config<span class="token punctuation">:</span> ConfigService<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">(</span><span class="token punctuation">{</span>
        secret<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token function">getOrThrow</span><span class="token punctuation">(</span><span class="token string">'JWT_SECRET'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        signOptions<span class="token punctuation">:</span> <span class="token punctuation">{</span> expiresIn<span class="token punctuation">:</span> config<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token string">'JWT_EXPIRATION'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  controllers<span class="token punctuation">:</span> <span class="token punctuation">[</span>AuthController<span class="token punctuation">]</span><span class="token punctuation">,</span>
  providers<span class="token punctuation">:</span> <span class="token punctuation">[</span>AuthService<span class="token punctuation">,</span> JwtStrategy<span class="token punctuation">]</span><span class="token punctuation">,</span>
  exports<span class="token punctuation">:</span> <span class="token punctuation">[</span>JwtModule<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">AuthModule</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre><h2 id="building-the-tasks-api">Building the Tasks API</h2><p>Now we can build the actual task management endpoints.</p><p>Update the <code>src/tasks/tasks.controller.ts</code> file with the following:</p><pre class=" language-ts"><code class="prism  language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span>
    Controller<span class="token punctuation">,</span>
    Get<span class="token punctuation">,</span>
    Post<span class="token punctuation">,</span>
    Patch<span class="token punctuation">,</span>
    Delete<span class="token punctuation">,</span>
    Body<span class="token punctuation">,</span>
    Param<span class="token punctuation">,</span>
    UseGuards<span class="token punctuation">,</span>
    UseInterceptors<span class="token punctuation">,</span>
  <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@nestjs/common'</span><span class="token punctuation">;</span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span> TasksService <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./tasks.service'</span><span class="token punctuation">;</span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span> JwtAuthGuard <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../auth/guards/jwt-auth.guard'</span><span class="token punctuation">;</span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span> TenantContextInterceptor <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../database/tenant-context.interceptor'</span><span class="token punctuation">;</span>
  
  @<span class="token function">Controller</span><span class="token punctuation">(</span><span class="token string">'tasks'</span><span class="token punctuation">)</span>
  @<span class="token function">UseGuards</span><span class="token punctuation">(</span>JwtAuthGuard<span class="token punctuation">)</span>
  @<span class="token function">UseInterceptors</span><span class="token punctuation">(</span>TenantContextInterceptor<span class="token punctuation">)</span>
  <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">TasksController</span> <span class="token punctuation">{</span>
    <span class="token keyword">constructor</span><span class="token punctuation">(</span><span class="token keyword">private</span> tasksService<span class="token punctuation">:</span> TasksService<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  
    @<span class="token function">Get</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">async</span> <span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksService<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  
    @<span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">':id'</span><span class="token punctuation">)</span>
    <span class="token keyword">async</span> <span class="token function">findOne</span><span class="token punctuation">(</span>@<span class="token function">Param</span><span class="token punctuation">(</span><span class="token string">'id'</span><span class="token punctuation">)</span> id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksService<span class="token punctuation">.</span><span class="token function">findOne</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  
    @<span class="token function">Post</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">async</span> <span class="token function">create</span><span class="token punctuation">(</span>@<span class="token function">Body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> body<span class="token punctuation">:</span> <span class="token punctuation">{</span> title<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> description<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksService<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>body<span class="token punctuation">.</span>title<span class="token punctuation">,</span> body<span class="token punctuation">.</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  
    @<span class="token function">Patch</span><span class="token punctuation">(</span><span class="token string">':id'</span><span class="token punctuation">)</span>
    <span class="token keyword">async</span> <span class="token function">update</span><span class="token punctuation">(</span>
      @<span class="token function">Param</span><span class="token punctuation">(</span><span class="token string">'id'</span><span class="token punctuation">)</span> id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">,</span>
      @<span class="token function">Body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> body<span class="token punctuation">:</span> <span class="token punctuation">{</span> title<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> description<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">;</span> status<span class="token operator">?</span><span class="token punctuation">:</span> <span class="token keyword">string</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksService<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span>id<span class="token punctuation">,</span> body<span class="token punctuation">.</span>title<span class="token punctuation">,</span> body<span class="token punctuation">.</span>description<span class="token punctuation">,</span> body<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    @<span class="token function">Delete</span><span class="token punctuation">(</span><span class="token string">':id'</span><span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token function">remove</span><span class="token punctuation">(</span>@<span class="token function">Param</span><span class="token punctuation">(</span><span class="token string">'id'</span><span class="token punctuation">)</span> id<span class="token punctuation">:</span> <span class="token keyword">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>tasksService<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The <code>@UseGuards(JwtAuthGuard)</code> ensures all requests are authenticated. The <code>@UseInterceptors(TenantContextInterceptor)</code> wraps each request in a transaction with the tenant context set.</p><h2 id="testing-tenant-isolation">Testing Tenant Isolation</h2><p>Start the server:</p><pre class=" language-shell"><code class="prism  language-shell">npm run start:dev
</code></pre><h3 id="register-two-tenants">Register Two Tenants</h3><p>Register the first tenant (Company A):</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/tenants/register \
  -H "Content-Type: application/json" \
  -d "{\"tenantName\": \"Company A\", \"email\": \"admin@companyA.com\", \"password\": \"password123\"}"
</code></pre><p>You should get a response like this:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/company-a-registration-response.png?sfvrsn=7d1f476c_2" title="Company A registration response" alt="Company A registration response" /></p><p>Register the second tenant (Company B):</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/tenants/register \
  -H "Content-Type: application/json" \
  -d "{\"tenantName\": \"Company B\", \"email\": \"admin@companyB.com\", \"password\": \"password123\"}"
</code></pre><h3 id="login-and-get-tokens">Login and Get Tokens</h3><p>Log in as Company A:</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"email\": \"admin@companyA.com\", \"password\": \"password123\"}"
</code></pre><p>You should get a response like this with an access token:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/company-a-logs-in-with-jwt-token.png?sfvrsn=221520cd_2" title="Company A logs in with JWT token" alt="Company A logs in with JWT token" /></p><p>Copy the token; we&rsquo;ll call it TOKEN_A. Do the same for Company B, and we&rsquo;ll call its token TOKEN_B.</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"email\": \"admin@companyB.com\", \"password\": \"password123\"}"
</code></pre><h2 id="create-tasks">Create Tasks</h2><p>Create a task for Company A:</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN_A" \
  -d "{\"title\": \"Company A Task\", \"description\": \"This belongs to Company A\"}"
</code></pre><p>Create a task for Company B:</p><pre class=" language-shell"><code class="prism  language-shell">curl -X POST http://localhost:3000/tasks \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN_B" \
  -d "{\"title\": \"Company B Task\", \"description\": \"This belongs to Company B\"}"
</code></pre><h2 id="verify-isolation">Verify Isolation</h2><p>List tasks as Company A:</p><pre class=" language-shell"><code class="prism  language-shell">curl http://localhost:3000/tasks \
  -H "Authorization: Bearer TOKEN_A"
</code></pre><p>You should only see Company A&rsquo;s task as seen below:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/company-a-task-list.png?sfvrsn=fbab1757_2" title="Company A’s task list" alt="Company A’s task list" /></p><p>List tasks as Company B:</p><pre class=" language-shell"><code class="prism  language-shell">curl http://localhost:3000/tasks \
  -H "Authorization: Bearer TOKEN_B"
</code></pre><p>You should only see Company B&rsquo;s task. This confirms that RLS is working, as each tenant only sees their own data.</p><h3 id="test-direct-id-access">Test Direct ID Access</h3><p>Now try to access Company A&rsquo;s task using Company B&rsquo;s token. First, get Company A&rsquo;s task ID from the previous response, then:</p><pre class=" language-shell"><code class="prism  language-shell">curl http://localhost:3000/tasks/ed396863-255f-49b4-a4c8-906f71465c9e \
  -H "Authorization: Bearer TOKEN_B"
</code></pre><p>You should get a 404 Not Found error like this:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/company-b-blocked.png?sfvrsn=8655cd8e_2" title="Company B blocked from accessing Company A&#39;s task" alt="Company B blocked from accessing Company A&#39;s task" /></p><p>Even though the task exists in the database, RLS prevents Company B from seeing it. This is the power of database-level isolation. Even if our application code has a bug, the database ensures tenants can&rsquo;t access each other&rsquo;s data.</p><h3 id="verify-company-a-can-access-its-own-task">Verify Company A Can Access Its Own Task</h3><p>Confirm the task exists and Company A can access it:</p><pre class=" language-shell"><code class="prism  language-shell">curl http://localhost:3000/tasks/ed396863-255f-49b4-a4c8-906f71465c9e \
  -H "Authorization: Bearer TOKEN_A"
</code></pre><p>You should get the full task details as shown below:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/company-a-can-access-their-task.png?sfvrsn=16fe441f_2" title="Company A can access their task successfully" alt="Company A can access their task successfully" /></p><h2 id="conclusion">Conclusion</h2><p>Now you can build a multi-tenant SaaS API using NestJS and Postgres Row-Level Security. We&rsquo;ve covered how to set up RLS policies at the database level, extract tenant context from JWT tokens, use TypeORM with transaction-scoped session variables, and verify that data isolation works even against direct ID access attempts.</p><p>This approach provides strong security guarantees without complex application logic. The database enforces isolation automatically, reducing the risk of accidentally exposing data across tenants.</p><p>Possible next steps include adding tenant-specific rate limiting, implementing admin endpoints for cross-tenant reporting (using <code>SECURITY DEFINER</code> functions to bypass RLS safely), or exploring performance optimizations for high-scale scenarios with connection pooling strategies.</p><hr /><p>&nbsp;</p><p>Read more:&nbsp;<a href="https://www.telerik.com/blogs/how-build-semantic-search-documentation-nestjs-qdrant-xenova" target="_blank">How to Build Semantic Search for Documentation with NestJS, Qdrant and Xenova</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:76fee4ac-a66f-4d26-a5ac-69295f6514a1</id>
    <title type="text">Creating a Custom AI Agent with Telerik Tools 6: Embedding Conversational and Invisible Agents</title>
    <summary type="text">Different kinds of AI-enabled applications need different UIs. Progress has the components you need for all of them.</summary>
    <published>2026-05-13T12:09:46Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Peter Vogel </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/creating-custom-ai-agent-telerik-tools-6-embedding-conversational-invisible-agents"/>
    <content type="text"><![CDATA[<p><span class="featured">For some AI-enabled applications, your user will want to have a conversation with your AI agent. Other times, your user will want your agent to stay out of the way until needed. With the right UI component, you can handle both kinds of applications.</span></p><p>By themselves, AI agents can be useful. Integrated into an application, however, a custom AI agent can provide users with the ability to navigate the application and to better understand the business area that the application is part of.</p><p>Progress provides multiple tools for embedding AI agents into your application&rsquo;s UI. In previous posts, for example, I&rsquo;ve looked at Progress Telerik and Kendo UI AI Prompt components in JavaScript [in post 5](Creating a Custom AI Agent with Telerik Tools: Creating an Interactive UI in JavaScript) and Blazor [in post 4](Creating a Custom AI Agent with Telerik Tools: Crafting an Interactive Blazor UI). In this post, I&rsquo;m going to address two different UI scenarios where the AI Prompt might not be your best choice.</p><p>The first scenario is when your AI agent <em>isn&rsquo;t</em> the point of your application&mdash;it&rsquo;s just a useful tool that your users can invoke when they need it. The AI Prompt component isn&rsquo;t necessarily your best choice there because, by default, the AI Prompt takes over a significant portion of your application&rsquo;s UI (though you can customize that using the AI Prompt&rsquo;s various templates). Out of the box, however, the <a target="_blank" href="https://www.telerik.com/kendo-jquery-ui/documentation/controls/inline-aiprompt/overview">Inline AIPrompt</a> provides a compact interface that users can bring up when they need your agent and, equally important, dismiss it when they don&rsquo;t need your agent.</p><p>The AI Prompt component also assumes a specific workflow, with the user alternatively entering a prompt and viewing the current output from your agent (along with a history of responses to previous prompts). But when the interaction with your AI agent <em>is</em> the point of your application, you might want to create more natural back-and-forth conversational interaction between your user and the agent. The Telerik Chat component will let you do that, again, out of the box.</p><p>I&rsquo;m going to show how to use both in this post.</p><p>By the way (which means you can skip this paragraph&mdash;it&rsquo;s all background): In this post, I&rsquo;m assuming the existence of a custom AI agent that provides application-specific support to your users. That means that you&rsquo;ve [selected a Large Language Model](reference to Creating a Custom AI Agent with Telerik Tools: Configuring an LLM for Azure or Ollama) (LLM) for processing your user&rsquo;s input, loaded your own content into your [custom AI agent](reference to Creating a Custom AI Agent with Telerik Tools: Loading and Accessing Your Agent&rsquo;s Content) (about 10 lines of code) and written another 10 lines of code to tie your agent into your application. For a JavaScript application, you&rsquo;ll need to wrap that code in a web service (I covered the, literally, two lines of code to make that happen at the start of a [post on using the AI Prompt component from JavaScript](reference to Creating a Custom AI Agent with Telerik Tools: Creating an Interactive UI in JavaScript)) and write the five lines of JavaScript code to all your agent. That probably sounds like a lot. It is, however, only about two dozen lines of code to give you an AI-enabled application with domain-specific knowledge.</p><h2 id="letting-the-user-access-your-ai-agent-when-they-want-it">Letting the User Access Your AI Agent When They Want It</h2><p>I&rsquo;m going to start with the scenario where you want to enable your user to invoke your AI agent when they need it and ignore the agent the rest of the time. The Inline AIPrompt lets you do that: implement a minimal user interface that pops up when the user needs to send a prompt to your agent and then review your agent&rsquo;s response:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/aiprompt-javascript-7---inline-aiprompt.png?sfvrsn=9294e5a3_2" alt="A screenshot of a Web page discussing creating asynchronous applications with Azure Storage queues with a dialog box hovering over it. The dialog box has a textbox at the bottom where the user has typed in a question (“What code is required to write a message?”). Above the textbox, a panel displays the code." /></p><p>I&rsquo;m going to use the <a target="_blank" href="https://www.telerik.com/kendo-jquery-ui/jquery-inline-ai-prompt">Kendo UI for jQuery Inline AIPrompt</a> in this case study, but there are also versions of the component for <a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/conversationalui/inline-ai-prompt/getting-started">React</a>, <a target="_blank" href="https://www.telerik.com/kendo-angular-ui/angular-inline-ai-prompt">Angular</a>, <a target="_blank" href="https://www.telerik.com/aspnet-core-ui/inline-ai-prompt">ASP.NET Core</a>, <a target="_blank" href="https://www.telerik.com/aspnet-mvc/inline-ai-prompt">ASP.NET MVC</a> and <a target="_blank" href="https://www.telerik.com/blazor-ui/documentation/components/inlineaiprompt/overview">Blazor</a>.</p><h3 id="configuring-the-inline-ai-prompt">Configuring the Inline AI Prompt</h3><p>Your first step is to add the Inline AIPrompt to your webpage with a <code>&lt;div&gt;</code> element that has its <code>id</code> attribute set to some name (I used <code>customAgent</code>):</p><pre class=" language-html"><code class="prism  language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>customAgent<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><p>You can place that <code>&lt;div&gt;</code> element wherever you want in your page&rsquo;s body (I put it near the top of my application&rsquo;s HTML, but it really doesn&rsquo;t matter).</p><p>Next, you need to configure your Inline AIPrompt component. You do that by writing a jQuery command to find your <code>&lt;div&gt;</code> element, passing the name you put in the <code>&lt;div&gt;</code> element&rsquo;s <code>id</code> attribute.</p><p>You then call the <code>kendoInlineAIPrompt</code> function from the retrieved element, passing a configuration object. The <code>kendoInlineAIPrompt</code> function returns an object and you then call that object&rsquo;s <code>data</code> function, passing the string <code>kendoInlineAIPrompt</code>. That, in turn, will return an object you can use to manage the component.</p><p>You only want to do this configuration once, so you should tuck that code into jQuery&rsquo;s ready function. That means you&rsquo;ll end up with code like this to set up your component:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token function">$</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span>
<span class="token punctuation">{</span>
  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#customAgent"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoInlineAIPrompt</span><span class="token punctuation">(</span>
    <span class="token punctuation">{</span>
      <span class="token comment">//&hellip;configuration object</span>
     <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token string">"kendoInlineAIPrompt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>In the customization object that you pass to the <code>kendoInlineAIPrompt</code> function, you need to set two properties on the object:</p><ul><li><code>isStreaming</code>: Set this to <code>true</code> to let you update the component&rsquo;s UI with the output from your custom AI agent</li><li><code>promptRequest</code>: Set this to a function to be called when your user enters a prompt and clicks the &ldquo;go&rdquo; button in the Inline AIPrompt&rsquo;s UI</li></ul><p>By the way, you don&rsquo;t have to put a function in the <code>promptRequest</code> property. You can configure the Inline AIPrompt to <a target="_blank" href="https://www.telerik.com/kendo-jquery-ui/documentation/controls/inline-aiprompt/get-started">call an LLM directly</a> by setting your configuration object&rsquo;s <code>service</code> and <code>systemPrompt</code> properties. Using the <code>promptRequest</code> function, however, simplifies calling a custom AI agent.</p><p>A minimal implementation might look like this:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token keyword">let</span> ca <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#customAgent"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoInlineAIPrompt</span><span class="token punctuation">(</span>
 <span class="token punctuation">{</span>
   isStreaming<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
   promptRequest<span class="token punctuation">:</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>req<span class="token punctuation">)</span> <span class="token punctuation">{</span>
     <span class="token comment">//&hellip;function code           </span>
   <span class="token punctuation">}</span>
 <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token string">"kendoInlineAIPrompt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>         
</code></pre><p>Your <code>promptRequest</code> function will be passed a parameter. From that parameter, you can retrieve the user&rsquo;s prompt by reading a property cleverly called <code>prompt</code>. Once you have the user&rsquo;s prompt, you can pass it to your agent and catch your agent&rsquo;s response. In my case, that means passing the prompt to my JavaScript function that calls my AI agent&rsquo;s web service.</p><p>Once you get a response from your agent, you need to add it to the Inline AIPrompt&rsquo;s UI. To do that, you just need call the component&rsquo;s <code>updatePromptOutputContent</code> function, passing the output from your agent.</p><p>Since the JavaScript function that calls my agent is called <code>asyncAppAgent</code> and returns the agent&rsquo;s response as a string ready to add to the Inline AIPrompt&rsquo;s UI, my <code>promptResult</code> function is a single line of code (my web service function is asynchronous so I have to use the <code>await</code> keyword when calling it and flag the function as <code>async</code>):</p><pre class=" language-javascript"><code class="prism  language-javascript">ca <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#customAgent"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoInlineAIPrompt</span><span class="token punctuation">(</span>
  <span class="token punctuation">{</span>
    isStreaming<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    promptRequest<span class="token punctuation">:</span> <span class="token keyword">async</span> <span class="token keyword">function</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span> 
      <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">updatePromptOutputContent</span><span class="token punctuation">(</span>                                                       
          <span class="token keyword">await</span> <span class="token function">asyncAppAgent</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>prompt<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token string">"kendoInlineAIPrompt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
</code></pre><p>There&rsquo;s more you can do with the component (for example, as with the AI Prompt component, you can give the user some predefined commands to use with the component). But before you can do any of that&mdash;because, by default, the component isn&rsquo;t visible&mdash;you need give your users a way to display the Inline AIPrompt when they want it.</p><h3 id="opening-the-prompt">Opening the Prompt</h3><p>Since I&rsquo;m trying to minimize the UI footprint for my agent&rsquo;s interface, I decided to use the Kendo UI for <a target="_blank" href="https://www.telerik.com/kendo-jquery-ui/documentation/controls/menu/contextmenu/overview">jQuery Context Menu</a> to let the user invoke my prompt (you could just have a button on your page that opens Inline AIPrompt).</p><p>Since I was using the context menu (which implies giving the user choices), I also decided to give the user the ability to choose between two custom agents:</p><ul><li>One agent would be loaded with content about using the application (e.g., the application&rsquo;s user guide, enhanced with a download of questions and responses from the application&rsquo;s end user forum)</li><li>The other agent would be loaded with content about the application&rsquo;s topic area (in my case, that topic area is creating an asynchronous application and the content is from another series of <a target="_blank" href="https://www.telerik.com/blogs/coding-azure-18-creating-securing-azure-storage-queues">posts on Coding Azure</a> I wrote).</li></ul><p>The first step in using the context menu is to add a <code>&lt;ul&gt;</code> element anywhere on your page and set its <code>id</code> attribute to some name (in this case, I picked <code>selectAgentMenu</code>).</p><p>Within that <code>&lt;ul&gt;</code> element, you use <code>&lt;li&gt;</code> elements to define your popup menu&rsquo;s choices. I also (for reasons that will become obvious), assigned values to the <code>&lt;li&gt;</code> elements&rsquo; <code>name</code> attributes:</p><pre class=" language-html"><code class="prism  language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>selectAgentMenu<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Ask<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Ask about asynchronouse processing<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">&gt;</span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Help<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Ask about using this application<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>Next, you need to configure your content menu, this time by calling the <code>kendoContextMenu</code> function on the <code>&lt;ul&gt;</code> element that defines your menu. In the configuration object you pass to this function, you must set its <code>select</code> property to a function that will be called when a user clicks a choice in the menu. That function is passed a parameter with an <code>item</code> property that holds the <code>&lt;li&gt;</code> element that defined the menu choice the user selected.</p><p>In this code, I use the element&rsquo;s <code>attr</code> function to retrieve the element&rsquo;s <code>name</code> attribute and use that value to set a variable I called mode. Later on, I&rsquo;ll use that mode variable in my Inline AIPrompt&rsquo;s <code>promptRequest</code> function to call the right AI agent. I then use the variable created when I configured my Inline AI Prompt component to display the component by calling the its <code>open</code> method:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token keyword">let</span> mode <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span>
<span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> 
<span class="token punctuation">{</span>
  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#selectAgentMenu"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoContextMenu</span><span class="token punctuation">(</span>
    <span class="token punctuation">{</span>
      select<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        mode <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>item<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                                
        ca<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>           
      <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>With my context menu in place, I can enhance my <code>promptRequest</code> function to pick the AI agent, based on the user&rsquo;s menu choice:</p><pre class=" language-javascript"><code class="prism  language-javascript">promptRequest<span class="token punctuation">:</span> <span class="token keyword">async</span> <span class="token keyword">function</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">switch</span> <span class="token punctuation">(</span>mode<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>
    <span class="token keyword">case</span> <span class="token string">"Ask"</span><span class="token punctuation">:</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">updatePromptOutputContent</span><span class="token punctuation">(</span>                                                       
    <span class="token keyword">await</span> <span class="token function">asyncInfoAgent</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>prompt<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      
    <span class="token keyword">break</span><span class="token punctuation">;</span>
    <span class="token keyword">case</span> <span class="token string">"Help"</span><span class="token punctuation">:</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">updatePromptOutputContent</span><span class="token punctuation">(</span>                                                       
    <span class="token keyword">await</span> <span class="token function">appHelpAgent</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>prompt<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      
    <span class="token keyword">break</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The user can dismiss the component by clicking anywhere on the webpage, so using the resulting interface looks like this:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/integrating-ai-8---inline.gif?sfvrsn=683c9935_2" alt="An animated gif showing the user right-clicking on a web page which causes a popup menu to appear, with two menu choices. The user clicks the top menu choice which causes the menu to disappear and the Inline AIPrompt’s dialog box to appear. The user types a prompt into the textbox in the Inline AIPrompt’s UI and clicks an arrow at the right end of the textbox. A panel opens at the top of the panel with the text “Thinking…”. After a pause, the panel is filled with the response from the AI agent. The user then clicks on the page outside of the Inline AIPrompt’s dialog box and the dialog box disappears" /></p><p>At this point you have an interface to your AI agent that appears and disappears as the user needs it.</p><h2 id="conversational-ai">Conversational AI</h2><p>Sometimes, however, you want a UI that allows your user to have a conversation with your agent. You can enable <a target="_blank" href="https://demos.telerik.com/kendo-ui/chat/index">Kendo UI for jQuery Chat</a> component for that (and, again, versions of the Chat component exist for multiple other platforms). The component creates a chat UI familiar to your user, with a textbox at the bottom for your user to enter their prompt and a chat history above that to display the user&rsquo;s prompts and the agent&rsquo;s responses:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/aiprompt-javascript-9---chat-aiprompt.png?sfvrsn=cf734fba_2" alt="A web page discussing creating asynchronous processes using Azure storage queues, with a chat window at the bottom. There is a conversation in progress in the chat history part of the chat window: The user earlier asked for a summary of key issues in 50 words and an agent responded with a short paragraph." /></p><p>Your first step is to decide where on your page you want your chat dialog to appear and to add a <code>&lt;div&gt;</code> element there, with the <code>&lt;div&gt;</code> element&rsquo;s <code>id</code> attribute set to some name (I used <code>dialogAgent</code>):</p><pre class=" language-html"><code class="prism  language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>dialogAgent<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><p>After that, you need to configure your chat dialog by using a jQuery query to find your <code>&lt;div&gt;</code> element and call the <code>kendoChat</code> function from it, passing a configuration object. In the configuration object, you need to set its <code>sendMessage</code> property to a function to be called when your user enters a prompt. In that function, you&rsquo;ll call your agent and update the chat with your agent&rsquo;s response.</p><p>You only want to configure your chat once, so you should wrap that code in jQuery&rsquo;s ready function, like this:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> 
<span class="token punctuation">{</span>
  <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#dialogAgent"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoChat</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
    sendMessage<span class="token punctuation">:</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  <span class="token comment">//&hellip;function</span>
  <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>Rather than using a function in the <code>sendMessage</code> property, you can configure your chat component to <a target="_blank" href="https://demos.telerik.com/kendo-ui/chat/ai-integration">call an LLM directly</a> by setting the configuration object&rsquo;s <code>aiServiceUrl</code> property. Using a function in the <code>sendMessage</code> property, however, simplifies calling a custom agent.</p><p>Now you need to write the <code>sendMessage</code> function that will send a message to your agent. You function will be passed a parameter that has two useful properties:</p><ul><li><code>message</code>: You use this property both to retrieve the user&rsquo;s prompt and to manage the display of the user&rsquo;s prompt in the chat history pane</li><li><code>sender</code>: Use this to add the response from your agent to the chat history (your user&rsquo;s prompt will be added to the chat history automatically)</li></ul><p>In your <code>sendMessage</code> function, you need to set the <code>authorName</code> property on the parameter&rsquo;s <code>message</code> property. That controls the label displayed in the chat history window with your user&rsquo;s prompts. I picked <code>Me</code>:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">"#dialogAgent"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">kendoChat</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  sendMessage<span class="token punctuation">:</span> <span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  c<span class="token punctuation">.</span>message<span class="token punctuation">.</span>authorName <span class="token operator">=</span> <span class="token string">"Me"</span><span class="token punctuation">;</span>
  <span class="token comment">//&hellip;more</span>
<span class="token punctuation">}</span>
</code></pre><p>You can retrieve the user&rsquo;s prompt from the <code>text</code> property on the object in the parameter&rsquo;s <code>message</code> property. You then pass that prompt to your agent (I used the JavaScript function I wrote to call my agent&rsquo;s web service) and catch your agent&rsquo;s response.</p><p>To add the agent&rsquo;s response to the chat history, you call the <code>postMessage</code> of the object in the <code>sender</code> property of the parameter passed to your function. You pass the <code>postMessage</code> property an object with three properties set:</p><ul><li><code>authorId</code>: A unique identifier to distinguish your user&rsquo;s prompt from your agent&rsquo;s responses</li><li><code>authorName</code>: The name that will be displayed with the agent&rsquo;s response in the chat history</li><li><code>text</code>: The response from your agent</li></ul><p>That code is also pretty short:</p><pre class=" language-javascript"><code class="prism  language-javascript">sendMessage<span class="token punctuation">:</span> <span class="token keyword">async</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  e<span class="token punctuation">.</span>message<span class="token punctuation">.</span>authorName <span class="token operator">=</span> <span class="token string">"Me"</span><span class="token punctuation">;</span>
  e<span class="token punctuation">.</span>sender<span class="token punctuation">.</span><span class="token function">postMessage</span><span class="token punctuation">(</span>
  <span class="token punctuation">{</span>
    authorId<span class="token punctuation">:</span> <span class="token string">"Agent"</span><span class="token punctuation">,</span>
    authorName<span class="token punctuation">:</span> <span class="token string">"Agent"</span><span class="token punctuation">,</span>
    text<span class="token punctuation">:</span> <span class="token keyword">await</span> <span class="token function">asyncInfoAgent</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>message<span class="token punctuation">.</span>text<span class="token punctuation">)</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>Your user can now interactively query your AI agent to extract whatever information you need.</p><p>There&rsquo;s more you can do here (creating a context-aware conversation by using state management to store message history and including that in your user&rsquo;s requests, for example). But, even with this simple implementation, you&rsquo;re ready to let your user have a conversation with your agent.</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/intergating-ai-10---chat.gif?sfvrsn=c220c1bb_2" alt="An animated GIF showing a web page with an embedded chat window. The user enters “Summarize in 50 words” in the textbox at the bottom of the chat window and clicks the arrow at the right end of the textbox. The user’s prompt appears in the chat history pane, there is a pause of three or four sections, and then the AI agent’s response appears in the chat history pane, on the opposite side of the pane, in a different color, and labelled “Agent”" /></p><p>There are, at least, three scenarios when you&rsquo;ll want to integrate an AI-enabled component into your application&rsquo;s UI: when the interaction with your agent is the primary point of your application, when your AI agent is not the primary part by &ldquo;just another part&rdquo; of your application, and when your users will only occasionally need to access your agent (and these are just points on a continuum).</p><p>All three of the Progress Telerik and Kendo UI &ldquo;UI for AI&rdquo; components&mdash;Chat, AIPrompt and Inline AIPrompt&mdash;support those three scenarios (and all the points in between). Picking the right component, however, will simplify your code and let you get your application up and running faster.</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Get Access to All These Components and More</h4></div><div class="col-8"><p class="u-fs16 u-mb0">The free 30-day trial of <a target="_blank" href="https://www.telerik.com/devcraft">Telerik DevCraft</a> lets you really kick the tires for yourself. <a target="_blank" href="https://www.telerik.com/try/devcraft-ultimate">Try it today!</a></p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:1feea2d1-2fa0-48fa-a5fa-f1d611bdf2d5</id>
    <title type="text">Streaming Server Events with SSE and Blazor</title>
    <summary type="text">Understand the SSE standard, the .NET 10  changes to simplify SSE endpoints and how to add real-time events to your Blazor clients.</summary>
    <published>2026-05-12T13:18:03Z</published>
    <updated>2026-05-29T14:34:45Z</updated>
    <author>
      <name>Héctor Pérez </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/streaming-server-events-sse-blazor"/>
    <content type="text"><![CDATA[<p><span class="featured">Understand the SSE standard, the .NET 10 changes to simplify SSE endpoints and how to add real-time events to your Blazor clients.</span></p><p>In the world of web development, there are scenarios where you need to receive real-time information, such as notifications about an event, server metrics or live logs. One possible solution to achieve this is the use of Server-Sent Events (SSE). With the arrival of .NET 10, implementing this type of solution has become much easier, so let&rsquo;s see how to integrate this web standard into your projects.</p><h2 id="what-are-server-sent-events">What Are Server-Sent Events?</h2><p>The <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events">Server-Sent Events (SSE)</a> are not a new technology. Their origins date back to around 2006, and they are a web standard that allows data to be sent to clients continuously using a persistent HTTP connection.</p><p>If you wonder the difference compared to other similar technologies, we can make a comparison:</p><ul><li><p><strong>SSE vs. Polling</strong>: In the case of polling, the direction goes from the client to the server, using the HTTP protocol. We can see it as a client asking the server if there are updates at certain intervals. It involves low implementation complexity.</p></li><li><p><strong>SSE vs. WebSockets</strong>: With WebSockets there is bidirectional communication. It involves high complexity and is ideal for scenarios like video games, chats, etc. It works over the WS protocol.</p></li><li><p><strong>SSE vs. SignalR</strong>: SignalR also establishes bidirectional communication, with medium implementation complexity. It allows the use of binary protocols, which makes it a very good option for scalable enterprise apps. It uses variable protocols.</p></li></ul><p>Analyzing the above, we can conclude that SSE is ideal when the data flow is unidirectional, you need it to work over the HTTP protocol and it must be easy to implement.</p><h2 id="how-does-the-sse-protocol-work">How Does the SSE Protocol Work?</h2><p>The workings behind the scenes of the SSE protocol, in broad terms, are as follows: a server SSE endpoint needs to send an HTTP response of the type <code>Content-Type: text/event-stream</code>. The response looks similar to the following:</p><pre class=" language-json"><code class="prism  language-json">event<span class="token punctuation">:</span> app<span class="token operator">-</span>event
data<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"id"</span><span class="token punctuation">:</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token string">"time"</span><span class="token punctuation">:</span><span class="token string">"10:30:45"</span><span class="token punctuation">,</span><span class="token string">"level"</span><span class="token punctuation">:</span><span class="token string">"Info"</span><span class="token punctuation">,</span><span class="token string">"source"</span><span class="token punctuation">:</span><span class="token string">"OrderService"</span><span class="token punctuation">,</span><span class="token string">"message"</span><span class="token punctuation">:</span><span class="token string">"Order #1234 placed successfully"</span><span class="token punctuation">}</span>
</code></pre><p>In the code above, there are some fields we should pay attention to:</p><ul><li><code>event</code>: Specifies the name of the event</li><li><code>data</code>: Is the content of the message</li><li><code>id</code>: Identifier used to perform a reconnection if needed</li></ul><h2 id="whats-new-in-.net-10-for-sse">What&rsquo;s New in .NET 10 for SSE</h2><p>The most important update in .NET 10 for working with SSE is that the ability to return a <code>ServerSentEvents</code> using the API <code>TypedResults.ServerSentEvents</code> has been implemented. This means that the method <code>TypedResults.ServerSentEvents&lt;T&gt;()</code> allows converting any <code>IAsyncEnumerable&lt;T&gt;</code> into a formatted SSE stream without needing to do anything else. Tasks like JSON serialization, HTTP headers, connection closing, etc. are handled automatically.</p><p>To better understand how it works, let&rsquo;s create a project using the SSE standard with ASP.NET 10.</p><h2 id="building-an-sse-project-using-asp.net-10">Building an SSE Project Using ASP.NET 10</h2><p>To practice the theoretical concepts covered so far, we&rsquo;ll create a page that shows a simulation of receiving events from backend services in real time. Using a Progress Telerik UI for <a target="_blank" href="https://www.telerik.com/blazor-ui/grid">Blazor Grid</a>, we&rsquo;ll perform tasks like filtering, grouping and analysis quickly.</p><h3 id="creating-and-configuring-the-project">Creating and Configuring the Project</h3><p>The first thing we&rsquo;ll do is create a project using the <strong>Blazor Web App</strong> template, selecting an <strong>Interactive render mode</strong> of <strong>Server</strong> and <strong>Interactivity location</strong> of <strong>Global</strong>. Next, we&rsquo;ll follow the official installation guide for <a target="_blank" href="https://www.telerik.com/blazor-ui">Telerik UI for Blazor</a> to configure the project and be able to use the Telerik components.</p><h3 id="creating-an-eventbroadcaster">Creating an EventBroadcaster</h3><p>For our project, we&rsquo;ll create an event broadcaster, which in simple terms will be a bus that SSE clients can connect to to consume events, while backend services will use it to publish events. First, we&rsquo;ll create a record that represents a system event:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">namespace</span> SSEDemo<span class="token punctuation">.</span>Services
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> record <span class="token function">AppEvent</span><span class="token punctuation">(</span><span class="token keyword">int</span> Id<span class="token punctuation">,</span> <span class="token keyword">string</span> Time<span class="token punctuation">,</span> <span class="token keyword">string</span> Level<span class="token punctuation">,</span> <span class="token keyword">string</span> Source<span class="token punctuation">,</span> <span class="token keyword">string</span> Message<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>Next, we will create the class <code>EventBroadcaster</code> which will have the following definition:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">EventBroadcaster</span>
<span class="token punctuation">{</span>
    <span class="token comment">//1.</span>
    <span class="token keyword">private</span> <span class="token keyword">readonly</span> Channel<span class="token operator">&lt;</span>AppEvent<span class="token operator">&gt;</span> _channel <span class="token operator">=</span> Channel<span class="token punctuation">.</span><span class="token generic-method function">CreateBounded<span class="token punctuation">&lt;</span>AppEvent<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span>
    <span class="token keyword">new</span> <span class="token class-name">BoundedChannelOptions</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> FullMode <span class="token operator">=</span> BoundedChannelFullMode<span class="token punctuation">.</span>DropOldest <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">int</span> _nextId<span class="token punctuation">;</span>

    <span class="token comment">// 2.</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">Publish</span><span class="token punctuation">(</span><span class="token keyword">string</span> level<span class="token punctuation">,</span> <span class="token keyword">string</span> source<span class="token punctuation">,</span> <span class="token keyword">string</span> message<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">var</span> id <span class="token operator">=</span> Interlocked<span class="token punctuation">.</span><span class="token function">Increment</span><span class="token punctuation">(</span><span class="token keyword">ref</span> _nextId<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">var</span> evt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AppEvent</span><span class="token punctuation">(</span>id<span class="token punctuation">,</span> DateTime<span class="token punctuation">.</span>Now<span class="token punctuation">.</span><span class="token function">ToString</span><span class="token punctuation">(</span><span class="token string">"HH:mm:ss"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> level<span class="token punctuation">,</span> source<span class="token punctuation">,</span> message<span class="token punctuation">)</span><span class="token punctuation">;</span>
        _channel<span class="token punctuation">.</span>Writer<span class="token punctuation">.</span><span class="token function">TryWrite</span><span class="token punctuation">(</span>evt<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">// 3.</span>
    <span class="token keyword">public</span> <span class="token keyword">async</span> IAsyncEnumerable<span class="token operator">&lt;</span>AppEvent<span class="token operator">&gt;</span> <span class="token function">Subscribe</span><span class="token punctuation">(</span>
        <span class="token punctuation">[</span>System<span class="token punctuation">.</span>Runtime<span class="token punctuation">.</span>CompilerServices<span class="token punctuation">.</span>EnumeratorCancellation<span class="token punctuation">]</span> CancellationToken ct<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>ct<span class="token punctuation">.</span>IsCancellationRequested<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">bool</span> hasData<span class="token punctuation">;</span>
            <span class="token keyword">try</span>
            <span class="token punctuation">{</span>
                hasData <span class="token operator">=</span> <span class="token keyword">await</span> _channel<span class="token punctuation">.</span>Reader<span class="token punctuation">.</span><span class="token function">WaitToReadAsync</span><span class="token punctuation">(</span>ct<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">OperationCanceledException</span><span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                <span class="token keyword">yield</span> <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>

            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>hasData<span class="token punctuation">)</span> <span class="token keyword">yield</span> <span class="token keyword">break</span><span class="token punctuation">;</span>

            <span class="token keyword">while</span> <span class="token punctuation">(</span>_channel<span class="token punctuation">.</span>Reader<span class="token punctuation">.</span><span class="token function">TryRead</span><span class="token punctuation">(</span><span class="token keyword">out</span> <span class="token keyword">var</span> evt<span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                <span class="token keyword">yield</span> <span class="token keyword">return</span> evt<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>In the code above, we have the following sections:</p><ol><li><p>Sets up the channel where events will be passed, with a queue limit of 100 messages. <code>FullMode = BoundedChannelFullMode.DropOldest</code> allows that if the queue fills up and a new message arrives, the oldest one is removed to make room for the new message.</p></li><li><p>The method <code>Publish</code> is the one that will be used to emit events. <code>Interlocked.Increment</code> allows generating sequential IDs in a safe manner, while <code>AppEvent</code> packages the received data together with the obtained id. Finally the method <code>TryWrite()</code> attempts to write the event to the channel asynchronously.</p></li><li><p>On the other hand, the method <code>Subscribe</code> returns a continuous stream of asynchronous data through the use of <code>IAsyncEnumerable&lt;AppEvent&gt;</code>. Inside its implementation an infinite loop is created that waits for data to be available in the channel. Once an event enters the channel, it is emitted to the consumer. This will happen until the <code>CancellationToken</code> called <code>ct</code> is canceled.</p></li></ol><h3 id="generating-test-events">Generating Test Events</h3><p>To test the bus defined above, we&rsquo;ll create a service that simulates the activity of multiple services:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">DemoEventGenerator</span><span class="token punctuation">(</span>EventBroadcaster broadcaster<span class="token punctuation">)</span> <span class="token punctuation">:</span> BackgroundService
<span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">readonly</span> <span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> Levels <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"Info"</span><span class="token punctuation">,</span> <span class="token string">"Warning"</span><span class="token punctuation">,</span> <span class="token string">"Error"</span><span class="token punctuation">,</span> <span class="token string">"Success"</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">readonly</span> <span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> Sources <span class="token operator">=</span>
        <span class="token punctuation">[</span><span class="token string">"OrderService"</span><span class="token punctuation">,</span> <span class="token string">"PaymentService"</span><span class="token punctuation">,</span> <span class="token string">"InventoryService"</span><span class="token punctuation">,</span> <span class="token string">"AuthService"</span><span class="token punctuation">,</span> <span class="token string">"ShippingService"</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">readonly</span> <span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> Messages <span class="token operator">=</span>
    <span class="token punctuation">[</span>
        <span class="token punctuation">[</span><span class="token string">"Order #{0} placed successfully"</span><span class="token punctuation">,</span> <span class="token string">"New customer registered"</span><span class="token punctuation">,</span> <span class="token string">"Product viewed: SKU-{0}"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
        <span class="token punctuation">[</span><span class="token string">"High latency detected: {0}ms"</span><span class="token punctuation">,</span> <span class="token string">"Retry attempt #{0}"</span><span class="token punctuation">,</span> <span class="token string">"Queue depth above threshold"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
        <span class="token punctuation">[</span><span class="token string">"Payment failed for order #{0}"</span><span class="token punctuation">,</span> <span class="token string">"Database timeout after {0}ms"</span><span class="token punctuation">,</span> <span class="token string">"Service unreachable"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
        <span class="token punctuation">[</span><span class="token string">"Deployment completed v2.{0}"</span><span class="token punctuation">,</span> <span class="token string">"Health check passed"</span><span class="token punctuation">,</span> <span class="token string">"Cache refreshed ({0} items)"</span><span class="token punctuation">]</span>
    <span class="token punctuation">]</span><span class="token punctuation">;</span>

    <span class="token keyword">protected</span> <span class="token keyword">override</span> <span class="token keyword">async</span> Task <span class="token function">ExecuteAsync</span><span class="token punctuation">(</span>CancellationToken stoppingToken<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">var</span> rng <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Random</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>stoppingToken<span class="token punctuation">.</span>IsCancellationRequested<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>            
            <span class="token keyword">await</span> Task<span class="token punctuation">.</span><span class="token function">Delay</span><span class="token punctuation">(</span>rng<span class="token punctuation">.</span><span class="token function">Next</span><span class="token punctuation">(</span><span class="token number">1500</span><span class="token punctuation">,</span> <span class="token number">4000</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stoppingToken<span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token keyword">var</span> levelIdx <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">Next</span><span class="token punctuation">(</span>Levels<span class="token punctuation">.</span>Length<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">var</span> level <span class="token operator">=</span> Levels<span class="token punctuation">[</span>levelIdx<span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token keyword">var</span> source <span class="token operator">=</span> Sources<span class="token punctuation">[</span>rng<span class="token punctuation">.</span><span class="token function">Next</span><span class="token punctuation">(</span>Sources<span class="token punctuation">.</span>Length<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token keyword">var</span> templates <span class="token operator">=</span> Messages<span class="token punctuation">[</span>levelIdx<span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token keyword">var</span> message <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">Format</span><span class="token punctuation">(</span>templates<span class="token punctuation">[</span>rng<span class="token punctuation">.</span><span class="token function">Next</span><span class="token punctuation">(</span>templates<span class="token punctuation">.</span>Length<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> rng<span class="token punctuation">.</span><span class="token function">Next</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">,</span> <span class="token number">9999</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            broadcaster<span class="token punctuation">.</span><span class="token function">Publish</span><span class="token punctuation">(</span>level<span class="token punctuation">,</span> source<span class="token punctuation">,</span> message<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The previous class is a random event generator, taking a random value from the arrays <code>Levels</code>, <code>Sources</code> and <code>Messages</code>. In addition, through the parameter <code>broadcaster</code>, the new event is published to the bus.</p><h3 id="creating-the-sse-endpoint">Creating the SSE Endpoint</h3><p>Now it&rsquo;s time to create the SSE endpoint, which will consume the shared <code>EventBroadcaster</code>, with the purpose of creating the Event Feed so clients can connect to receive events:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">SseEndpoints</span>
<span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">MapSseEndpoints</span><span class="token punctuation">(</span><span class="token keyword">this</span> WebApplication app<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>        
        app<span class="token punctuation">.</span><span class="token function">MapGet</span><span class="token punctuation">(</span><span class="token string">"/sse/events"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>EventBroadcaster broadcaster<span class="token punctuation">,</span> CancellationToken ct<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">&gt;</span>
            TypedResults<span class="token punctuation">.</span><span class="token function">ServerSentEvents</span><span class="token punctuation">(</span>broadcaster<span class="token punctuation">.</span><span class="token function">Subscribe</span><span class="token punctuation">(</span>ct<span class="token punctuation">)</span><span class="token punctuation">,</span> eventType<span class="token punctuation">:</span> <span class="token string">"app-event"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>In the code above you can notice how <code>EventBroadcaster</code> is injected as a parameter of <code>MapGet</code>. Likewise, <code>TypedResults.ServerSentEvent</code> is executed, which serializes the information and sends the correct SSE format to clients.</p><h3 id="registering-services-in-program.cs">Registering Services in Program.cs</h3><p>For everything to work as expected, we must register in <code>Program.cs</code> the different instances that will interact in the Blazor application. This means creating a singleton instance of <code>EventBroadcaster</code>, so that all systems have access to the same bus. Similarly, we will register <code>DemoEventGenerator</code> as a background service, through the method <code>AddHostedService</code>. This will allow simulated events to be generated in the background continuously:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">var</span> builder <span class="token operator">=</span> WebApplication<span class="token punctuation">.</span><span class="token function">CreateBuilder</span><span class="token punctuation">(</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
builder<span class="token punctuation">.</span>Services<span class="token punctuation">.</span><span class="token generic-method function">AddSingleton<span class="token punctuation">&lt;</span>EventBroadcaster<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
builder<span class="token punctuation">.</span>Services<span class="token punctuation">.</span><span class="token generic-method function">AddHostedService<span class="token punctuation">&lt;</span>DemoEventGenerator<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">var</span> app <span class="token operator">=</span> builder<span class="token punctuation">.</span><span class="token function">Build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

app<span class="token punctuation">.</span><span class="token function">MapSseEndpoints</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

app<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>In the previous code, in addition to registering the services, <code>MapSseEndpoints</code> is invoked to enable SSE communication in the project.</p><h3 id="creating-the-blazor-application">Creating the Blazor Application</h3><p>Once we have the application infrastructure ready, it&rsquo;s time to move on to the UI part. At this point, let&rsquo;s start by creating a JavaScript client, because the standard requires using the browser&rsquo;s <code>EventSource</code> API. Since the project is configured as <code>InteractiveServer</code>, we cannot add inline <code>script</code> tags. To work around this, I will add a new file inside the <code>wwwroot/js</code> folder called <code>sse-demos.js</code>:</p><pre class=" language-javascript"><code class="prism  language-javascript"><span class="token comment">//1.</span>
<span class="token keyword">let</span> eventFeedSource <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>

<span class="token number">2</span><span class="token punctuation">.</span>
<span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">start</span><span class="token punctuation">(</span>dotNetRef<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// 3.</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>eventFeedSource<span class="token punctuation">)</span> eventFeedSource<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//4.</span>
    <span class="token keyword">const</span> src <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">EventSource</span><span class="token punctuation">(</span><span class="token string">'/sse/events'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">// 5.</span>
    src<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'app-event'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        dotNetRef<span class="token punctuation">.</span><span class="token function">invokeMethodAsync</span><span class="token punctuation">(</span><span class="token string">'OnEventReceived'</span><span class="token punctuation">,</span> JSON<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">// 6.</span>
    src<span class="token punctuation">.</span><span class="token function-variable function">onopen</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> dotNetRef<span class="token punctuation">.</span><span class="token function">invokeMethodAsync</span><span class="token punctuation">(</span><span class="token string">'OnConnectionChanged'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
    src<span class="token punctuation">.</span><span class="token function-variable function">onerror</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> dotNetRef<span class="token punctuation">.</span><span class="token function">invokeMethodAsync</span><span class="token punctuation">(</span><span class="token string">'OnConnectionChanged'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>

    eventFeedSource <span class="token operator">=</span> src<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">//7.</span>
<span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>eventFeedSource<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        eventFeedSource<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        eventFeedSource <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>The previous code does the following:</p><ol><li>A variable <code>eventFeedSource</code> is created to keep information about whether there is an active connection with the server.</li><li>A function named <code>start</code> should be called from C# code when you want to start receiving information&hellip;</li><li>It checks whether there is an open connection, in which case it is closed.</li><li>It tells the browser to connect to <code>/sse/events</code> and to listen for all events that the server sends.</li><li>It filters events named <code>app-event</code>.</li><li>We subscribe to the events <code>onopen</code> and <code>onerror</code>. Each will notify the method <code>OnConnectionChanged</code> about a change in the connection, which will allow showing a different state in the Blazor UI.</li><li>The function <code>stop</code> should be invoked to clean up memory when we want to close the connection.</li></ol><p>With the JS functions ready, the next step is to create the Blazor component. In this new component we will use a <a target="_blank" href="https://www.telerik.com/blazor-ui/grid">Blazor Data Grid</a> type component, because it is a highly configurable component that has built-in options to filter, group, etc., ideal for quickly obtaining information about events in the different systems.</p><p>To do the above, we will create a component called <code>EventFeed.razor</code>, which looks as follows:</p><pre class=" language-xml"><code class="prism  language-xml">@page "/events"
@rendermode InteractiveServer
@inject IJSRuntime JS
@implements IAsyncDisposable

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>PageTitle</span><span class="token punctuation">&gt;</span></span>Live Event Feed<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>PageTitle</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>mb-4<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Live Event Feed<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>card shadow-sm<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>card-header d-flex align-items-center justify-content-between py-2<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>d-flex align-items-center gap-3<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            @if (isStreaming)
            {
                &lt;span class="badge rounded-pill @(isConnected ? "bg-success" : "bg-secondary") fs-6"&gt;
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me-1<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>⬤<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>@(isConnected ? "Connected" : "Disconnected")
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>
            }
            else
            {
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>badge rounded-pill bg-warning text-dark fs-6<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>me-1<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>⏸<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>Paused
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>
            }
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text-muted<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                Events received: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>strong</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text-dark<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>@totalEventsReceived<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>strong</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>d-flex gap-2<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TelerikButton</span> <span class="token attr-name">OnClick</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ToggleStreaming<span class="token punctuation">"</span></span>
                           <span class="token attr-name">ThemeColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@(isStreaming ? ThemeConstants.Button.ThemeColor.Primary : ThemeConstants.Button.ThemeColor.Success)<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                @(isStreaming ? "⏸ Pause" : "▶ Resume")
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>TelerikButton</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TelerikButton</span> <span class="token attr-name">OnClick</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ClearGrid<span class="token punctuation">"</span></span> <span class="token attr-name">ThemeColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@ThemeConstants.Button.ThemeColor.Light<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span> Clear<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>TelerikButton</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>card-body p-0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TelerikGrid</span> <span class="token attr-name">Data</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@events<span class="token punctuation">"</span></span>
                     <span class="token attr-name">Height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>560px<span class="token punctuation">"</span></span>
                     <span class="token attr-name">Sortable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>
                     <span class="token attr-name">Resizable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>
                     <span class="token attr-name">Reorderable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>
                     <span class="token attr-name">Groupable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>                     
                     <span class="token attr-name">ShowColumnMenu</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GridColumns</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GridColumn</span> <span class="token attr-name">Field</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@nameof(AppEvent.Time)<span class="token punctuation">"</span></span> <span class="token attr-name">Title</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Time<span class="token punctuation">"</span></span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>110px<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GridColumn</span> <span class="token attr-name">Field</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@nameof(AppEvent.Level)<span class="token punctuation">"</span></span> <span class="token attr-name">Title</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Level<span class="token punctuation">"</span></span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>120px<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Template</span><span class="token punctuation">&gt;</span></span>
                        @{
                            var item = (AppEvent)context;
                        }
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>badge rounded-pill @GetBadgeClass(item.Level) px-3 py-2<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>@item.Level<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Template</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>GridColumn</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GridColumn</span> <span class="token attr-name">Field</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@nameof(AppEvent.Source)<span class="token punctuation">"</span></span> <span class="token attr-name">Title</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Source<span class="token punctuation">"</span></span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>140px<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GridColumn</span> <span class="token attr-name">Field</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@nameof(AppEvent.Message)<span class="token punctuation">"</span></span> <span class="token attr-name">Title</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Message<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>GridColumns</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>TelerikGrid</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>

@code {
    private List<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>AppEvent</span><span class="token punctuation">&gt;</span></span> events = new();
    private bool isConnected;
    private bool isStreaming = true;
    private int totalEventsReceived;
    private DotNetObjectReference<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>EventFeed</span><span class="token punctuation">&gt;</span></span>? dotNetRef;
    private IJSObjectReference? jsModule;
    private bool _jsInitialized;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            dotNetRef = DotNetObjectReference.Create(this);
                       
            jsModule = await JS.InvokeAsync<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>IJSObjectReference</span><span class="token punctuation">&gt;</span></span>("import", "./js/sse-demos.js");
                        
            await jsModule.InvokeVoidAsync("start", dotNetRef);
            
            _jsInitialized = true;
        }
    }

    [JSInvokable]
    public void OnEventReceived(AppEvent appEvent)
    {
        totalEventsReceived++;
        var updated = new List<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>AppEvent</span><span class="token punctuation">&gt;</span></span>(events);
        updated.Insert(0, appEvent);
        if (updated.Count &gt; 50)
            updated.RemoveRange(50, updated.Count - 50);
        events = updated;
        InvokeAsync(StateHasChanged);
    }

    [JSInvokable]
    public void OnConnectionChanged(bool connected)
    {
        isConnected = connected;
        InvokeAsync(StateHasChanged);
    }

    private async Task ToggleStreaming()
    {
        isStreaming = !isStreaming;
        
        if (jsModule is not null)
        {
            if (isStreaming)
                await jsModule.InvokeVoidAsync("start", dotNetRef);
            else
                await jsModule.InvokeVoidAsync("stop");
        }
    }

    private void ClearGrid()
    {
        events = new List<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>AppEvent</span><span class="token punctuation">&gt;</span></span>();
        StateHasChanged();
    }

    private string GetBadgeClass(string level) =&gt; level switch
    {
        "Info" =&gt; "bg-info text-dark",
        "Warning" =&gt; "bg-warning text-dark",
        "Error" =&gt; "bg-danger",
        "Success" =&gt; "bg-success",
        _ =&gt; "bg-secondary"
    };

    public async ValueTask DisposeAsync()
    {
        if (_jsInitialized &amp;&amp; jsModule is not null)
        {
            try
            {                
                await jsModule.InvokeVoidAsync("stop");
                                
                await jsModule.DisposeAsync();
            }
            catch
            {                
            }
        }
        dotNetRef?.Dispose();
    }

    public class AppEvent
    {
        public int Id { get; set; }
        public string Time { get; set; } = string.Empty;
        public string Level { get; set; } = string.Empty;
        public string Source { get; set; } = string.Empty;
        public string Message { get; set; } = string.Empty;
    }
}
</code></pre><p>In the previous code, there are some points to highlight:</p><ul><li><code>jsModule</code> dynamically loads the JS module.</li><li>The variable <code>dotNetRef</code> wraps the instance of the Blazor component that we will use inside the JS code.</li><li>The method <code>InvokeVoidAsync</code> is used both to start and to stop the event streaming.</li><li>The method <code>OnEventReceived</code> is invoked from the JS code each time an event is received. This allows updating the list <code>events</code> to show the new information in <code>TelerikGrid</code>.</li><li>The <code>OnConnectionChanged</code> method receives a connection status from the JS code to update the UI according to any change in the connection.</li></ul><p>With the new component ready, we can test the application, which looks like the following:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/telerik-datagrid-sse-event-feed.gif?sfvrsn=58cc913a_2" alt="Telerik DataGrid receiving live SSE event feed" /></p><p>With this, we verify that everything works correctly. Also, thanks to the Blazor DataGrid capabilities, we can perform operations such as monitoring only those high-severity events:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-04/timeline-grouped-events-view.png?sfvrsn=5ae1f10_2" alt="Timeline view of events grouped by day" /></p><p>With this we have a nice event viewer that monitors the status of multiple fictitious systems.</p><h2 id="conclusion">Conclusion</h2><p>Throughout this article you have learned about the SSE standard. You have also seen how changes introduced in .NET 10 help simplify the creation of SSE endpoints, enabling the creation of applications that send real-time events to clients. Now it&rsquo;s your turn to explore when you might use this web standard in your own projects. See you in the next article!</p><hr /><p>Try all this yourself with a free 30-day trial of Telerik UI for Blazor.</p><p><a href="https://www.telerik.com/try/ui-for-blazor" target="_blank" class="Btn">Try Now</a></p>]]></content>
  </entry>
</feed>
