<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: khiem nguyen</title>
    <description>The latest articles on DEV Community by khiem nguyen (@khiem_nguyen_cb052493dab2).</description>
    <link>https://dev.to/khiem_nguyen_cb052493dab2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1939780%2Fcbad836e-c9b9-4a65-922f-15a20d759dcf.png</url>
      <title>DEV Community: khiem nguyen</title>
      <link>https://dev.to/khiem_nguyen_cb052493dab2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khiem_nguyen_cb052493dab2"/>
    <language>en</language>
    <item>
      <title>8 Agent UI Patterns</title>
      <dc:creator>khiem nguyen</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:44:26 +0000</pubDate>
      <link>https://dev.to/khiem_nguyen_cb052493dab2/8-agent-ui-patterns-52d</link>
      <guid>https://dev.to/khiem_nguyen_cb052493dab2/8-agent-ui-patterns-52d</guid>
      <description>&lt;p&gt;A chatbot answers. An agent acts: it searches, calls APIs, edits files, sends emails. That changes what the interface has to do. The user is no longer reading a reply; they are supervising a worker they can't see.&lt;/p&gt;

&lt;p&gt;After building a lot of agent interfaces, I keep coming back to the same eight patterns. None of them are about looking clever. They are about one thing: letting the user trust what the agent is doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A thinking state that isn't a spinner
&lt;/h2&gt;

&lt;p&gt;The gap between "send" and the first token is where users decide whether the app is broken. A generic spinner says "loading". A thinking state says "working on your thing".&lt;/p&gt;

&lt;p&gt;Keep it calm: slow motion, a short label that can change ("Searching the web…", "Reading 3 files…"), and respect &lt;code&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5vd3a84xckbvdr1dhe2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5vd3a84xckbvdr1dhe2.gif" alt=" " width="502" height="194"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;em&gt;Example: &lt;a href="https://nextui.dev/components/thinking-wave" rel="noopener noreferrer"&gt;Thinking wave&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Streaming text without layout shift
&lt;/h2&gt;

&lt;p&gt;Streaming is table stakes, but jumping layouts are not. Reserve space for the message, render markdown incrementally, and don't re-flow code blocks on every token.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Tool calls the user can read
&lt;/h2&gt;

&lt;p&gt;When the agent calls a tool, show it: the tool name, the arguments as they stream in, a running state, then the result. Collapse finished calls so a long turn doesn't become a wall.&lt;/p&gt;

&lt;p&gt;This is the single biggest trust win. Users stop wondering "what is it doing?" because they can see it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22ey7zusf66qp7ugdmh9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22ey7zusf66qp7ugdmh9.gif" alt=" " width="800" height="619"&gt;&lt;/a&gt;  Example: &lt;a href="https://nextui.dev/components/tool-call" rel="noopener noreferrer"&gt;Tool call&lt;/a&gt;. It takes a Vercel AI SDK tool part directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ToolCall&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;part&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;)}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Approval before side effects
&lt;/h2&gt;

&lt;p&gt;Anything hard to undo (sending, paying, deleting, publishing) should stop and ask. Show the exact arguments, not a summary: who gets the email, what the subject is, which file is attached. Two buttons, clear outcome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3gh5n1260qrqovh2bdn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm3gh5n1260qrqovh2bdn.gif" alt=" " width="799" height="508"&gt;&lt;/a&gt;  &lt;em&gt;Example: &lt;a href="https://nextui.dev/components/tool-approval" rel="noopener noreferrer"&gt;Tool approval&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A plan with live progress
&lt;/h2&gt;

&lt;p&gt;For multi-step work, show the plan first, then tick steps off as they finish. It sets expectations ("4 steps") and makes long runs feel shorter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fym220npyp7hx5s067dqh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fym220npyp7hx5s067dqh.gif" alt=" " width="759" height="356"&gt;&lt;/a&gt;  &lt;em&gt;Example: &lt;a href="https://nextui.dev/components/task-checklist" rel="noopener noreferrer"&gt;Task checklist&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Sources and inline citations
&lt;/h2&gt;

&lt;p&gt;If the agent read something, show where. Inline citation chips next to the claim, and a sources list the user can open. Uncited answers from an agent that clearly browsed feel like it is hiding something.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. An artifact panel
&lt;/h2&gt;

&lt;p&gt;When the output is a thing (a document, a chart, code), put it in its own panel next to the chat, with versions. Chat is for talking about the artifact, not for scrolling through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Voice that shows it's listening
&lt;/h2&gt;

&lt;p&gt;Voice agents need a visible state machine: idle, listening, thinking, speaking. One orb or ring that changes motion per state beats four different icons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxm2rqhcxu247b9ra5lj3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxm2rqhcxu247b9ra5lj3.gif" alt=" " width="560" height="660"&gt;&lt;/a&gt;  &lt;em&gt;Example: &lt;a href="https://nextui.dev/components/voice-agent" rel="noopener noreferrer"&gt;Voice agent&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern behind the patterns
&lt;/h2&gt;

&lt;p&gt;Every one of these answers a question the user would otherwise ask out loud: Is it working? What is it doing? Is it about to do something I didn't want? Where did that come from? Answer those in the UI and the agent feels trustworthy, even when it is wrong sometimes.&lt;/p&gt;

&lt;p&gt;I'm collecting these as copy-paste React + Tailwind components at &lt;a href="https://nextui.dev/component" rel="noopener noreferrer"&gt;nextui.dev&lt;/a&gt;. The code lands in your repo, no runtime package. I'd love to hear which agent UI pattern you find hardest to get right. Tell me in the comments.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>design</category>
      <category>ux</category>
    </item>
    <item>
      <title>Hook NextUI Into Your Stack: The Modern Way to Build AI Interfaces</title>
      <dc:creator>khiem nguyen</dc:creator>
      <pubDate>Thu, 29 Oct 2026 04:22:48 +0000</pubDate>
      <link>https://dev.to/khiem_nguyen_cb052493dab2/hook-nextui-into-your-stack-the-modern-way-to-build-ai-interfaces-4hb7</link>
      <guid>https://dev.to/khiem_nguyen_cb052493dab2/hook-nextui-into-your-stack-the-modern-way-to-build-ai-interfaces-4hb7</guid>
      <description>&lt;h2&gt;
  
  
  1. Why Modern UI Blocks Change the Game
&lt;/h2&gt;

&lt;p&gt;When building AI-native apps, chat interfaces, and modern dashboards with React, Tailwind CSS, and TypeScript, traditional monolithic UI libraries slow you down. They lock you into rigid designs, inflate bundle sizes, and fight your custom themes.&lt;/p&gt;

&lt;p&gt;NextUI (&lt;a href="https://nextui.dev" rel="noopener noreferrer"&gt;nextui.dev&lt;/a&gt;) takes a pragmatic, developer-first approach: clean component architecture, copy-paste registry blocks, and zero runtime overhead built for modern web and AI applications. When you hook NextUI into your workflow, you stop rebuilding basic primitives and focus entirely on your core product logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Quick Setup &amp;amp; Integration
&lt;/h2&gt;

&lt;p&gt;Unlike traditional npm libraries, &lt;a href="https://nextui.dev" rel="noopener noreferrer"&gt;nextui.dev&lt;/a&gt; focuses on direct component integration and modular blocks that live right inside your codebase.&lt;br&gt;
&lt;strong&gt;1. Set up nextui&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; npx create nextui 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Install and use a component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; npx shadcn@latest add @nextui/icon-buttons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is now your own file, so import it like any local component and edit it freely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Button01&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/nextui/icon-buttons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button01&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out &lt;a href="https://nextui.dev" rel="noopener noreferrer"&gt;nextui.dev&lt;/a&gt; for the full component registry and docs.&lt;/p&gt;

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

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

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

&lt;p&gt;Try it in your next build and feel the difference.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
