<?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: CometChat</title>
    <description>The latest articles on DEV Community by CometChat (cometchat_official_account).</description>
    <link>https://dev.to/cometchat_official_account</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12057%2F8ba5d68b-ad56-4862-94c6-779e8577b80d.png</url>
      <title>DEV Community: CometChat</title>
      <link>https://dev.to/cometchat_official_account</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cometchat_official_account"/>
    <language>en</language>
    <item>
      <title>Ordering, Receipts and Reconnects: The Chat Client Problems That Only Appear on a Bad Network</title>
      <dc:creator>Vishal Singh</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:25:31 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/ordering-receipts-and-reconnects-the-chat-client-problems-that-only-appear-on-a-bad-network-2oo3</link>
      <guid>https://dev.to/cometchat_official_account/ordering-receipts-and-reconnects-the-chat-client-problems-that-only-appear-on-a-bad-network-2oo3</guid>
      <description>&lt;h1&gt;
  
  
  Ordering, Receipts and Reconnects: The Chat Client Problems That Only Appear on a Bad Network
&lt;/h1&gt;

&lt;p&gt;A chat feature demoed on office wifi is a solved problem. The same feature on a train is a different piece of software. Messages arrive out of order, the same message arrives twice, a send appears to fail and then succeeds, and the unread count disagrees with the thread.&lt;/p&gt;

&lt;p&gt;Working on real-time messaging at CometChat, the failures I see reported are rarely ""the socket did not connect"". They are subtler: a message that sits in a sending state forever, an ordering that differs between two devices, a duplicate after a tunnel. All four have the same root cause - the client trusted something it should not have.&lt;/p&gt;

&lt;p&gt;Here are the four assumptions worth removing from your chat client.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Do not order by client timestamp
&lt;/h2&gt;

&lt;p&gt;The obvious sort key is the sender's clock, and it is wrong. Device clocks drift, users travel across time zones, and a phone that has been asleep can be several seconds off. Sorting by &lt;code&gt;Date.now()&lt;/code&gt; at the sender produces a thread that reads differently on different devices.&lt;/p&gt;

&lt;p&gt;Order by a value the server assigns. A monotonically increasing per-conversation sequence number is the most useful shape, because it gives you three things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a total order that every client agrees on&lt;/li&gt;
&lt;li&gt;gap detection - if you hold 41 and 43, you know 42 exists and you are missing it&lt;/li&gt;
&lt;li&gt;a cursor for pagination that does not break when two messages share a millisecond&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the sender's timestamp, and display it. Just do not sort by it. And when you render an optimistic message that has no sequence number yet, pin it to the end of the list rather than trying to guess its position.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Every send needs a client-generated identifier
&lt;/h2&gt;

&lt;p&gt;An optimistic UI shows the message immediately. Then the network does something ambiguous: the request times out, or the socket closes before the acknowledgement arrives. The client does not know whether the server accepted it.&lt;/p&gt;

&lt;p&gt;If the client retries and the server has no way to recognise the retry, the user has posted twice. This is the single most common duplicate-message bug, and the fix is small: generate an identifier on the client before sending, send it with the message, and have the server treat a repeat of that identifier as the same message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// state: queued -&amp;gt; sent -&amp;gt; delivered | failed&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;conversationId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The acknowledgement returns the server identifier and sequence number; the client reconciles by &lt;code&gt;clientId&lt;/code&gt; and replaces the optimistic entry in place. Two properties follow, and both matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrying is safe, so you can retry automatically&lt;/li&gt;
&lt;li&gt;the same message arriving over the real-time channel and in the acknowledgement collapses into one row, because both carry the same client identifier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the outbox durable. If the app is killed with three queued messages, they should still be there on relaunch, in order, with their state visible. A message that silently disappears is worse than one marked failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reconnection is a sync, not a resubscribe
&lt;/h2&gt;

&lt;p&gt;The instinct after a dropped socket is to reconnect and carry on listening. That leaves a hole: everything sent while you were away.&lt;/p&gt;

&lt;p&gt;Reconnection needs three steps, in this order.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Reconnect the transport with jittered exponential backoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Fetch what was missed, per conversation, from the last sequence number you hold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Only then apply live events, buffering anything that arrives during step 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Getting this order wrong produces the classic artefact: live messages appear, then older messages arrive and shuffle in above them, and the list jumps under the user's thumb. Buffer live events during the catch-up fetch, then apply the buffer, deduplicating by identifier.&lt;/p&gt;

&lt;p&gt;Backoff needs jitter for a reason that only shows up at scale. If a regional network blip disconnects a large number of clients at once, unjittered backoff reconnects them all in the same instant, and your infrastructure receives the thundering herd twice - once for the sockets and once for the catch-up queries.&lt;/p&gt;

&lt;p&gt;Also treat ""the socket is open"" as insufficient evidence of health. Captive portals and dead middleboxes hold connections open that carry nothing. An application-level heartbeat with a response deadline is what actually tells you the connection works.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Receipts and presence are aggregate signals, not events
&lt;/h2&gt;

&lt;p&gt;Delivery receipts, read receipts, and typing indicators are, per message, low-value and high-volume. In a busy group they can easily exceed the message traffic itself.&lt;/p&gt;

&lt;p&gt;Treat them differently from messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read state as a watermark.&lt;/strong&gt; Store ""user X has read up to sequence 84"" rather than a receipt per message. One value per participant per conversation replaces hundreds of rows, and the unread count becomes arithmetic instead of a query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typing as a short-lived signal.&lt;/strong&gt; Send a start on first keystroke, throttle repeats, and let the receiver expire it after a few seconds rather than relying on a stop event that a dropped connection will eat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presence as debounced state.&lt;/strong&gt; A user switching networks should not produce an offline-then-online flicker. A short grace period before broadcasting offline removes most of the noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receipts are lossy by design.&lt;/strong&gt; Never let a missing receipt block message delivery, and never retry receipts as aggressively as messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The watermark model has a useful side effect: it makes unread counts consistent across devices without any extra synchronisation, because there is only one number to agree on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The invariants I would put in a test suite
&lt;/h2&gt;

&lt;p&gt;If I were writing the tests for a chat client from scratch, these are the ones that would catch the real bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending the same message twice with the same client identifier results in one message in the conversation.&lt;/li&gt;
&lt;li&gt;After a disconnect of arbitrary length, the client's message list matches the server's for that conversation, with no gaps and no duplicates.&lt;/li&gt;
&lt;li&gt;Two clients that received the same messages in different arrival orders render the same order.&lt;/li&gt;
&lt;li&gt;An unread count derived from a read watermark never goes negative and never exceeds the number of messages after that watermark.&lt;/li&gt;
&lt;li&gt;A queued message survives an app restart and reports its state accurately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these require an exotic test harness. They require the ability to drop and delay the connection deliberately, which is worth building early. A network-condition toggle in your debug build will find more real bugs than any amount of testing on a good connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSocket" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/WebSocket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cometchat.com/docs" rel="noopener noreferrer"&gt;https://www.cometchat.com/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>architecture</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Theming a Drop-In UI Kit Without Forcing a Fork</title>
      <dc:creator>Vishal Singh</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:24:16 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/theming-a-drop-in-ui-kit-without-forcing-a-fork-2lda</link>
      <guid>https://dev.to/cometchat_official_account/theming-a-drop-in-ui-kit-without-forcing-a-fork-2lda</guid>
      <description>&lt;h1&gt;
  
  
  Theming a Drop-In UI Kit Without Forcing a Fork
&lt;/h1&gt;

&lt;p&gt;Every prebuilt UI component library eventually meets a design system it was not built for. At that point the integrating developer makes one of three choices: accept the defaults, override with increasingly specific CSS, or copy the source into their repository and stop taking updates.&lt;/p&gt;

&lt;p&gt;The third outcome is the expensive one. It looks like success in the sprint it happens and becomes a maintenance liability for years, because the fork no longer receives fixes, accessibility corrections, or new platform behaviour.&lt;/p&gt;

&lt;p&gt;I work on developer-facing UI Kits at CometChat, where the whole value proposition is that a team drops in a conversation interface instead of building one. That makes forking a product failure, not a customer mistake. It has forced me to think about customisation as an API with a compatibility contract, rather than as a styling convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layered model
&lt;/h2&gt;

&lt;p&gt;Customisation requests are not one thing. They arrive at four different depths, and each needs its own mechanism.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Depth&lt;/th&gt;
&lt;th&gt;What the developer wants&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tokens&lt;/td&gt;
&lt;td&gt;Brand colours, radius, type scale, spacing&lt;/td&gt;
&lt;td&gt;CSS custom properties&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component styling&lt;/td&gt;
&lt;td&gt;This one button looks wrong in our layout&lt;/td&gt;
&lt;td&gt;Documented class or style hooks per component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Composition&lt;/td&gt;
&lt;td&gt;Add a field, reorder the header, remove an action&lt;/td&gt;
&lt;td&gt;Slots and render props&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behaviour&lt;/td&gt;
&lt;td&gt;Different data source, different send pipeline&lt;/td&gt;
&lt;td&gt;Headless core with the UI as an optional layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The failure mode is offering only the first and the last: a colour variable and ""you can build it yourself"". The middle two are where real integrations live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens are the contract you will never be able to change
&lt;/h2&gt;

&lt;p&gt;CSS custom properties are the right substrate for the token layer because they cascade, they can be scoped per subtree, and they cost nothing at runtime. They also become a public API the moment you document them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.my-app-chat&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="py"&gt;--cc-color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2b6cb0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="py"&gt;--cc-color-surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="py"&gt;--cc-radius-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="py"&gt;--cc-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="n"&gt;Inter&lt;/span&gt;&lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two decisions matter more than the names:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic, not literal.&lt;/strong&gt; &lt;code&gt;--cc-color-primary&lt;/code&gt; survives a redesign; &lt;code&gt;--cc-color-blue-500&lt;/code&gt; does not. Literal names force you to either lie or rename, and renaming is a breaking change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every internal value resolves through a token.&lt;/strong&gt; The moment one component hardcodes a hex value, the theme has a hole in it, and the developer who finds that hole reaches for &lt;code&gt;!important&lt;/code&gt;. That is the first step towards the fork.&lt;/p&gt;

&lt;p&gt;Support dark mode by redefining tokens under both a &lt;code&gt;prefers-color-scheme&lt;/code&gt; query and an explicit attribute selector, so a host application that has its own theme toggle can drive yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slots are what stop the fork
&lt;/h2&gt;

&lt;p&gt;Most ""we had to fork it"" stories are not about colour. They are about structure: the team needed an extra action in the message header, a custom empty state, a badge next to a name, their own attachment picker.&lt;/p&gt;

&lt;p&gt;If your components accept slots for their meaningful regions, those requests are satisfied without touching your internals:&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MessageList&lt;/span&gt;
 &lt;span class="na"&gt;renderHeader&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OurHeader&lt;/span&gt; &lt;span class="na"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;conversation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
 &lt;span class="na"&gt;renderMessage&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&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;Default&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="dl"&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;OrderCard&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Default&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="si"&gt;}&lt;/span&gt;
 &lt;span class="na"&gt;renderEmptyState&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OurOnboardingPrompt&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the second argument in &lt;code&gt;renderMessage&lt;/code&gt;. Passing the default renderer back into the override is a small thing that changes the economics: developers can special-case one message type without reimplementing the other fifteen. Overrides that require all-or-nothing replacement get used all-or-nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escape hatches, deliberately placed
&lt;/h2&gt;

&lt;p&gt;You will not anticipate every requirement, so plan the exit. A headless layer - hooks or plain functions that expose state and actions without markup - lets a team keep your data handling and connection management while writing their own UI. That is a customer who still gets your bug fixes.&lt;/p&gt;

&lt;p&gt;The rule I try to hold to: any escape hatch should degrade one layer at a time. Wanting custom markup for the composer should not mean giving up presence handling, and wanting a different send pipeline should not mean giving up the message list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning: the part that decides whether upgrades happen
&lt;/h2&gt;

&lt;p&gt;A UI Kit has a wider public surface than a normal library, and much of it is not in the type definitions. Class names people style, token names they set, DOM structure they select against, slot signatures, default visual behaviour - all of it is API in practice.&lt;/p&gt;

&lt;p&gt;So the policy has to be explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documented tokens, slots, and class hooks follow semver. Renaming one is a major version.&lt;/li&gt;
&lt;li&gt;Internal class names are namespaced and documented as unstable, and the docs say what to use instead.&lt;/li&gt;
&lt;li&gt;Visual changes that alter layout dimensions get called out in release notes even when no code changed, because they can break a host page's surrounding layout.&lt;/li&gt;
&lt;li&gt;Deprecate in two steps: keep the old name working alongside the new one with a console warning, then remove it in the next major. A deprecation that ships and removes in the same release is just a break with extra words.&lt;/li&gt;
&lt;li&gt;Ship a migration note with a code example per breaking change. Upgrade friction is why people stay on old majors, and people on old majors file bugs you already fixed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Accessibility is not a customisation option
&lt;/h2&gt;

&lt;p&gt;One asymmetry is worth stating: theming should not be able to break keyboard navigation, focus visibility, roles, or contrast. Tokens that control colour should ship with documented contrast expectations, and focus indicators should not be removable through the theme layer alone.&lt;/p&gt;

&lt;p&gt;If a developer has to choose between matching their brand and keeping the component accessible, the design of the theming layer is at fault, not the developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test I apply
&lt;/h2&gt;

&lt;p&gt;Before shipping a customisation feature, I ask: does this let someone satisfy the request without reading our source? If the answer is no, they will read the source, and once they have read it, copying it is a short step.&lt;/p&gt;

&lt;p&gt;A UI Kit is measured by how many teams are still on a recent version a year later. Every customisation mechanism above exists to make that number higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;https://semver.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/ARIA/apg/" rel="noopener noreferrer"&gt;https://www.w3.org/WAI/ARIA/apg/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cometchat.com/docs/ui-kit" rel="noopener noreferrer"&gt;https://www.cometchat.com/docs/ui-kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>react</category>
      <category>css</category>
    </item>
    <item>
      <title>The buyer-seller conversation nobody owns</title>
      <dc:creator>Nivedita Bharathy</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:12:47 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/the-buyer-seller-conversation-nobody-owns-50pb</link>
      <guid>https://dev.to/cometchat_official_account/the-buyer-seller-conversation-nobody-owns-50pb</guid>
      <description>&lt;p&gt;Buyer-seller chat sounds simple.&lt;/p&gt;

&lt;p&gt;Until someone sends their phone number and suddenly the conversation is happening outside your marketplace.&lt;/p&gt;

&lt;p&gt;That’s where things get interesting.&lt;/p&gt;

&lt;p&gt;You’re not just building a chat UI anymore. You’re dealing with contact sharing, message history, disputes, moderation, deleted messages, and giving support teams enough context to figure out what actually happened.&lt;/p&gt;

&lt;p&gt;And there’s a bigger question underneath all of it:&lt;/p&gt;

&lt;p&gt;Who actually owns the conversation?&lt;/p&gt;

&lt;p&gt;If the chat is part of the transaction, it probably needs to be treated as more than just another messaging feature.&lt;/p&gt;

&lt;p&gt;We got into some of the engineering problems around this here ↓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/blog/the-buyer-seller-conversation-nobody-owns" rel="noopener noreferrer"&gt;https://www.cometchat.com/blog/the-buyer-seller-conversation-nobody-owns&lt;/a&gt;&lt;/p&gt;

</description>
      <category>developer</category>
      <category>ai</category>
      <category>developertools</category>
      <category>ui</category>
    </item>
    <item>
      <title>Classroom chat is a moderation problem</title>
      <dc:creator>Nivedita Bharathy</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:06:21 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/classroom-chat-is-a-moderation-problem-1hef</link>
      <guid>https://dev.to/cometchat_official_account/classroom-chat-is-a-moderation-problem-1hef</guid>
      <description>&lt;p&gt;Classroom chat is a UX problem until you have to moderate it.&lt;/p&gt;

&lt;p&gt;Then the engineering questions start piling up.&lt;/p&gt;

&lt;p&gt;Who can message whom?&lt;br&gt;
What happens when a student sends something inappropriate?&lt;br&gt;
Do teachers see every message?&lt;br&gt;
What gets flagged automatically?&lt;br&gt;
What happens across different roles, channels, and age groups?&lt;/p&gt;

&lt;p&gt;The chat UI is the easy part.&lt;/p&gt;

&lt;p&gt;The hard part is building the moderation layer underneath it without turning the experience into a maze of restrictions.&lt;/p&gt;

&lt;p&gt;We dug into what that actually looks like when you're building chat for classrooms ↓&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/blog/the-classroom-chat-is-a-moderation-problem-wearing-a-ux-costume" rel="noopener noreferrer"&gt;https://www.cometchat.com/blog/the-classroom-chat-is-a-moderation-problem-wearing-a-ux-costume&lt;/a&gt;&lt;/p&gt;

</description>
      <category>developers</category>
      <category>ux</category>
      <category>chatapp</category>
      <category>ai</category>
    </item>
    <item>
      <title>Third-Party Scripts Are the Real Performance Budget on a CMS-Driven Site</title>
      <dc:creator>Vishal Singh</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:50:45 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/third-party-scripts-are-the-real-performance-budget-on-a-cms-driven-site-4hah</link>
      <guid>https://dev.to/cometchat_official_account/third-party-scripts-are-the-real-performance-budget-on-a-cms-driven-site-4hah</guid>
      <description>&lt;p&gt;A developer-facing marketing site has an awkward property: the people who publish to it every day are not the people who own its performance. Content editors add a demo embed, a webinar form, a chat widget, a heatmap tool. Each addition is reasonable on its own. The page is measurably worse a quarter later, and no single commit caused it.&lt;/p&gt;

&lt;p&gt;I run into this on the CometChat website, which is built on a headless CMS with components that marketing composes freely. Our own product is an embeddable SDK, so the problem is not abstract to me: we ship a script that other people put on their pages, and we host pages that carry other people's scripts. Both sides of that trade have the same lesson.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, measure what the user experiences, not what your laptop does
&lt;/h2&gt;

&lt;p&gt;Lab tools tell you whether a page can be fast. Field data tells you whether it is. On a CMS site the gap is usually caused by content, not code: a hero image an editor uploaded at full resolution, an embed added to one template, a font swapped on a single landing page.&lt;/p&gt;

&lt;p&gt;The three metrics worth arguing about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LCP&lt;/strong&gt; is nearly always an image or a web font on marketing pages. It is a content problem more often than a delivery problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INP&lt;/strong&gt; is where third-party JavaScript shows up. A tag manager that evaluates on the main thread during page load competes with your own hydration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLS&lt;/strong&gt; is where late-loading embeds and consent banners live. Anything that inserts DOM after first paint needs reserved space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segment field data by template, not just by URL. "Our blog is fine and our pricing page is not" is an actionable sentence. "The site scores 74" is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit that actually changes behaviour
&lt;/h2&gt;

&lt;p&gt;Rather than a one-off cleanup, produce an inventory that a non-engineer can read. For every third-party script:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Why it decides the outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who asked for it, and for what decision?&lt;/td&gt;
&lt;td&gt;Half of them are answering a question nobody asks any more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does it cost in transferred bytes and main-thread time?&lt;/td&gt;
&lt;td&gt;Bytes are cheap to quote; main-thread time is what users feel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does it need to run before interaction?&lt;/td&gt;
&lt;td&gt;Almost nothing does, except consent and A/B testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does it insert DOM?&lt;/td&gt;
&lt;td&gt;If yes, it needs reserved layout space&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What happens if it fails?&lt;/td&gt;
&lt;td&gt;It must be able to time out without blocking anything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I have never run this inventory without finding at least one script still loading for a campaign that ended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails beat cleanups
&lt;/h2&gt;

&lt;p&gt;A cleanup lasts until the next campaign. Guardrails last longer, and they belong in the CMS layer where the content is composed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No raw HTML embed field.&lt;/strong&gt; If editors can paste a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag into a rich-text field, your performance budget is advisory. Replace it with typed components: a video component, a form component, a code-sample component. Each one is implemented once, lazily, correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media handled by the pipeline, not the uploader.&lt;/strong&gt; Resize, compress and serve modern formats at the component boundary. Give images explicit dimensions from the CMS asset metadata so layout is stable before the bytes arrive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defer everything that is not needed for first interaction.&lt;/strong&gt; Chat widgets, heatmaps, and video players load on interaction or on viewport entry. A chat launcher is a button; the widget itself can arrive after the click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budgets in CI, on templates.&lt;/strong&gt; Fail the build when a template's script weight or estimated main-thread time crosses a line. The failure message should name the component that grew.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single owner for the tag list.&lt;/strong&gt; Tags added directly through a tag manager bypass every check above. That is the hole in most otherwise-good setups.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Point 3 is where the largest wins are, and it is also the one that most often gets reversed by a stakeholder who wants their widget "available immediately". Have the number ready: what interaction latency costs in conversion is a more persuasive argument than what it costs in milliseconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other side: shipping a script other people embed
&lt;/h2&gt;

&lt;p&gt;Building an embeddable product changes how you read your own audit. If your SDK is on someone's landing page, you are the third-party script in their inventory, and they will run exactly the questions above against you.&lt;/p&gt;

&lt;p&gt;What that implies, in the order the questions get asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ship a small loader and fetch the rest on demand. A launcher button does not need the full conversation runtime.&lt;/li&gt;
&lt;li&gt;Do your initialisation work off the critical path, and never block first interaction on a network round trip.&lt;/li&gt;
&lt;li&gt;Reserve your own space. If your widget mounts into a fixed-position container with known dimensions, you contribute nothing to CLS.&lt;/li&gt;
&lt;li&gt;Fail invisibly. If your API is unreachable, the host page must still be fully usable.&lt;/li&gt;
&lt;li&gt;Publish your weight. Teams that are auditing scripts will pick the vendor whose numbers are documented over the one whose numbers require a WebPageTest run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the same constraints, viewed from the other end. The audit you run on your own site is the audit your customers run on you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do first
&lt;/h2&gt;

&lt;p&gt;If you inherit a slow CMS-driven site, resist the rewrite. Do this instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull field data, grouped by template.&lt;/li&gt;
&lt;li&gt;Inventory third parties with owners named.&lt;/li&gt;
&lt;li&gt;Delete the ones nobody defends.&lt;/li&gt;
&lt;li&gt;Convert the remaining critical-path scripts to interaction-loaded.&lt;/li&gt;
&lt;li&gt;Replace the raw HTML field with typed components so the problem stops regenerating.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 1 to 4 recover most of the loss. Step 5 is the one that keeps it recovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;https://web.dev/articles/vitals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/articles/inp" rel="noopener noreferrer"&gt;https://web.dev/articles/inp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/articles/optimize-lcp" rel="noopener noreferrer"&gt;https://web.dev/articles/optimize-lcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Performance" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.storyblok.com/docs" rel="noopener noreferrer"&gt;https://www.storyblok.com/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>frontend</category>
      <category>storyblokchallenge</category>
    </item>
    <item>
      <title>Weekly news roundup: The moat moved off the model, onto everything around it.</title>
      <dc:creator>Shrinithi V</dc:creator>
      <pubDate>Mon, 21 Sep 2026 08:12:02 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/weekly-news-roundup-the-moat-moved-off-the-model-onto-everything-around-it-18k7</link>
      <guid>https://dev.to/cometchat_official_account/weekly-news-roundup-the-moat-moved-off-the-model-onto-everything-around-it-18k7</guid>
      <description>&lt;h2&gt;
  
  
  TSMC bets $31 billion on AI's future
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
TSMC is dropping $31.4B on three new Taiwan fabs for sub-1.4nm chips with AI data centers now making up two-thirds of its revenue, up from smartphones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
More advanced silicon means more horsepower for AI. But the first fab won't ship until ~2030, so the compute crunch everyone's feeling isn't easing anytime soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we see this at CometChat&lt;/strong&gt;&lt;br&gt;
Every AI agent including the ones answering support chats and moderating conversations runs on this silicon. The smarter agents get, the hungrier they are for compute. Worth watching who's actually building the supply.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI lead just changed hands
&lt;/h2&gt;

&lt;p&gt;What's going on?&lt;br&gt;
 Anthropic is weighing a new model launch after OpenAI's GPT-6 Astra pulled ahead in enterprise spend - days after Anthropic's CEO publicly urged the whole industry to slow down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
A two-and-a-half-year lead just cracked. When frontier labs sprint, the models under your apps get smarter and cheaper faster than your roadmap can react.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we see this at CometChat&lt;/strong&gt;&lt;br&gt;
 ‘Slow down’ one week, ‘maybe ship’ the next - the tension is real. But if you're building AI agents into your product, model churn is the actual story. Pick an abstraction layer that survives whichever lab wins the month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cancer-detecting AI is now free
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Alibaba open-sourced Damo Radar - a model that spots nearly 150 abdominal diseases, including cancers, from CT scans, and it beat 23 of 26 radiologists in testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
A smaller hospital with no in-house AI team can now run expert-level diagnostics for free. When radiologists used it as an assistant, missed diagnoses dropped 10% and reads got 30% faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we see this at CometChat&lt;/strong&gt;&lt;br&gt;
The pattern that makes this work - pairing images with clinical reports so the model actually understands context is the same reason AI agents are getting good at conversations. Context is everything. A model that reads the whole picture beats one guessing from fragments, whether it's a CT scan or a support thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  One config file to rule them all
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Claude Code now reads AGENTS.md - the open instruction format already used by Cursor, Codex, and 60,000+ repos so you stop maintaining a separate file for every AI coding tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
Fewer redundant configs, fewer symlink hacks. One markdown file tells every agent your build commands, test rules, and code style. Small change, real relief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we see this at CometChat&lt;/strong&gt;&lt;br&gt;
Standards winning over walled gardens is always the good ending. The same instinct applies to how AI agents plug into your product - shared, portable, boring-in-the-best-way conventions beat bespoke glue code that only one tool understands. Interoperability isn't glamorous. It's just what keeps things working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Voice AI just got 13x cheaper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Google launched Gemini 3.8 Live - voice models that talk, see, switch across 97 languages mid-sentence, and run background tasks while chatting. Extended Thinking topped OpenAI's GPT-Live-1 on quality, at roughly 1/13th the cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
Real-time voice agents just went from ‘nice demo, wild bill’ to something you can actually run in production. Price was the wall. That wall's coming down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we see this at CometChat&lt;/strong&gt;&lt;br&gt;
‘Let me check that…’ while the agent works in the background - that's not a model detail, that's conversation design. Voice agents live or die on whether the interaction feels human under real latency. The model's getting cheap. Making it feel good is still the hard part.&lt;/p&gt;

</description>
      <category>news</category>
      <category>ai</category>
      <category>webdev</category>
      <category>cometchat</category>
    </item>
    <item>
      <title>Enterprise Chat Architecture in 2026: How In-App Chat is Actually Built at Scale</title>
      <dc:creator>Shrinithi V</dc:creator>
      <pubDate>Sun, 20 Sep 2026 06:34:38 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/enterprise-chat-architecture-in-2026-how-in-app-chat-is-actually-built-at-scale-4m30</link>
      <guid>https://dev.to/cometchat_official_account/enterprise-chat-architecture-in-2026-how-in-app-chat-is-actually-built-at-scale-4m30</guid>
      <description>&lt;p&gt;Enterprise chat architecture is the set of backend systems that move messages between users reliably, in order, and fast: a real-time connection layer for live clients, a durable event pipeline for ordering and delivery, tiered storage for history and media, and a presence layer for who's online. To keep this concrete, the examples here come from a real system instead of a generic diagram: CometChat's architecture, which runs across 113,000+ apps in 163 countries at a 99.999% uptime SLA. CometChat is a chat and messaging platform for developers, and working from an actual stack means naming real databases and real numbers, not vague claims about ‘scalable infrastructure.’&lt;/p&gt;

&lt;p&gt;Get those four systems right and chat feels instant. Get one wrong and it feels instant right up until real load arrives. This is the engineering piece, not the buyer piece: if you're an architect or senior engineer deciding whether to build in-app chat or buy it, here's how the system actually works under the hood, and the parts most teams underestimate until they're debugging them at 2am&lt;/p&gt;

&lt;h2&gt;
  
  
  The four systems chat actually is
&lt;/h2&gt;

&lt;p&gt;In-app chat is four coupled systems wearing one trench coat. Each has its own failure mode, and they fail on different nights.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connection layer:&lt;/strong&gt; persistent WebSocket connections, one per active client, carrying events in both directions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Event pipeline:&lt;/strong&gt; the durable log that decides ordering, guarantees delivery, and fans each message out to recipients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt; where message history, metadata, and media live, each with a different access pattern.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Presence:&lt;/strong&gt; who's online, typing, idle, or gone, updated in real time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build any one of these badly and you don't find out on launch day. You find out at scale, in production, in front of users who are not impressed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Message delivery guarantees: what ‘delivered’ has to mean
&lt;/h2&gt;

&lt;p&gt;A message delivery guarantee is the contract for whether a message can be lost, duplicated, or reordered when something fails. There are three flavors: at-most-once (fast, drops messages), at-least-once (safe, duplicates messages), and exactly-once (the one everyone wants on the whiteboard and nobody gets for free).&lt;/p&gt;

&lt;p&gt;Real chat backends aim for effectively-once: idempotent producers, automatic retries, offline queuing, and sync across devices, so a flaky network produces one message on every device - not zero, and not three. CometChat's pipeline is built on exactly this set: effectively-once semantics using idempotent producers, retry logic, offline message queuing, and synchronization across a user's devices.&lt;/p&gt;

&lt;p&gt;The happy path is not the problem. The problem is the client that dropped into a tunnel mid-send, reconnected four minutes later, and expects its message to land once, in the right order, on the phone and the laptop and the web tab it forgot to close. Ordering and deduplication under failure are the actual product. Everything else is UI.&lt;/p&gt;

&lt;p&gt;This is why serious stacks put a real commit log in the middle. CometChat uses Apache Kafka as the event backbone: guaranteed message ordering, no message loss, sub-second latency, and configurable retention. The log is what lets you make promises about ordering that survive a retry without one, ‘in order’ is a hope, not a guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Presence: the feature that lies to you
&lt;/h2&gt;

&lt;p&gt;Presence is the system that tracks who's online, typing, or idle, in real time, across every device. It sounds simple. It is not, and it tends to prove that in front of users.&lt;/p&gt;

&lt;p&gt;Presence is high-frequency, low-value, and unbounded - the worst combination in distributed systems. Every keystroke can fire a typing event. Every reconnect can fire an online event. Open a group with 3,000 members and, done naively, you've signed up to push 3,000 presence updates to every one of them, continuously. That's not a chat feature. That's a self-inflicted DDoS with a green dot on it.&lt;/p&gt;

&lt;p&gt;The fixes are unglamorous and mandatory: debounce typing events, batch presence changes, scope presence to the conversations a user is actually looking at, and treat ‘last seen’ as eventually consistent instead of real-time. CometChat handles presence and typing indicators over its WebSocket Gateway - persistent bi-directional connections with automatic reconnection and session recovery and exposes WebSocket-level control so you can define custom presence logic instead of accepting "is the socket open" as the answer. Because "is the socket open" is almost never the question you actually mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fan-out at scale: where the math stops being cute
&lt;/h2&gt;

&lt;p&gt;Fan-out is the work of turning one sent message into delivery events for every recipient's active connections. For 1:1 chat it's trivial. For a 10,000-member group where 3,000 people are online, each on two devices, one message becomes 6,000 delivery events (3,000 × 2) and something has to route all of them without tipping over.&lt;/p&gt;

&lt;p&gt;Two things keep this sane. First, a connection layer that scales horizontally: CometChat runs on a stateless service design, so you add capacity by adding compute, not by re-architecting or migrating data. Second, the event log in the middle. With Kafka handling routing and ordering centrally, delivery is guaranteed once - not renegotiated per connection while 6,000 sockets wait.&lt;/p&gt;

&lt;p&gt;Concrete numbers, since ‘highly scalable’ is a phrase and not a fact: CometChat's Docker Swarm tier is built for up to ~200,000 monthly active users and ~20,000 peak concurrent connections, at sub-100ms message latency. Past that - 200k+ MAU or multi-region - the deployment moves to Kubernetes. The whole platform is engineered from 10,000 to 250,000+ MAU with linear scaling. Those are the kind of numbers you want in a capacity plan, not adjectives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage: one database is a lie you tell yourself early
&lt;/h2&gt;

&lt;p&gt;Chat storage is polyglot by necessity. No single database is good at hot reads, durable history, media blobs, and rate-limit counters at the same time, and the classic early mistake is making one try. It works beautifully in staging and falls over the first quarter you have real history to query.&lt;/p&gt;

&lt;p&gt;Here's how CometChat's on-premise stack splits the job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it stores&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Why this one&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distributed SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Messages, conversations, users — the source of truth&lt;/td&gt;
&lt;td&gt;TiDB (PD + TiKV with Raft, MySQL-compatible SQL layer)&lt;/td&gt;
&lt;td&gt;ACID transactions, automatic sharding, multi-region replication, strong consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Document store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderation policies, custom metadata, webhook config, audit logs&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;Flexible schema, native JSON, rich queries on semi-structured data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In-memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cache, sessions, auth tokens, rate-limit counters&lt;/td&gt;
&lt;td&gt;Redis clusters (cache + session/rate-limit)&lt;/td&gt;
&lt;td&gt;Sub-millisecond latency for the highest-frequency operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Object storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Files, images, large binary attachments&lt;/td&gt;
&lt;td&gt;S3-compatible (S3, MinIO, Ceph, GCS)&lt;/td&gt;
&lt;td&gt;Lifecycle policies, versioning, encryption at rest, tiered cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Event log&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ordering and delivery backbone&lt;/td&gt;
&lt;td&gt;Apache Kafka&lt;/td&gt;
&lt;td&gt;Guaranteed ordering, no message loss, configurable retention&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The part people miss: message history grows forever and gets queried constantly. The database that felt fine at 10 million messages is a different animal at 10 billion, and by then you're not choosing a database - you're migrating one, live, while people are talking. Distributed SQL with automatic sharding exists so that day never arrives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data residency: the requirement that rewrites your topology
&lt;/h2&gt;

&lt;p&gt;Data residency is the rule that a user's data must be stored and processed inside a specific legal jurisdiction. It is not a settings toggle. It's an architectural constraint that shows up before you write a line of code, because it dictates where your databases physically sit and how your regions replicate.&lt;/p&gt;

&lt;p&gt;If you serve regulated industries or the EU, this decides your deployment model, not the other way around. CometChat supports the full range: managed cloud, private cloud in a specific region, hybrid, and fully air-gapped on-premise where data never leaves your infrastructure. It's built to meet GDPR, HIPAA, SOC 2, ISO 27001, CCPA, and PIPEDA, with encryption at rest, configurable key management, and secure WebSocket connections. Multi-tenancy gives you logical isolation with per-tenant configuration, rate limits, and quotas, which matters the moment one deployment serves several business units that legal insists cannot see each other's data.&lt;/p&gt;

&lt;p&gt;The reframe worth keeping: residency isn't a feature you bolt on later. Retrofitting jurisdiction into a single-region system is a rebuild, not a config change. Decide it first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it breaks at 2am
&lt;/h2&gt;

&lt;p&gt;The four systems are the easy part to name and the hard part to keep alive. The failures that actually page you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconnection storms.&lt;/strong&gt; A region blips, thousands of clients reconnect at once, and your connection layer plus session store take the full spike simultaneously. Without session recovery and stateless gateways, this cascades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Presence fan-out.&lt;/strong&gt; The green dot that felt free in testing becomes the single largest source of traffic in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Group fan-out.&lt;/strong&gt; Big groups turn one message into thousands of writes and pushes. Linear-looking code, quadratic-feeling bill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ordering under retry.&lt;/strong&gt; Messages arrive, but out of order or twice, because the retry path didn't go through the log. Users notice instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;History queries.&lt;/strong&gt; The read that was instant at launch times out once there's real backlog to scan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-region replication lag.&lt;/strong&gt; Two users, two regions, one conversation, and a few seconds of disagreement about what was said.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these show up in a demo. All of them show up at scale. That's the whole reframe of operating chat instead of shipping it: the work isn't the feature, it's the years the feature has to keep working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build vs buy, without the sales pitch
&lt;/h2&gt;

&lt;p&gt;Building this in-house is entirely possible - it's also months of work before your first message, and years of the failures above before it's boring. If chat is your core product and your differentiator, build it. If chat is a feature your product needs to have and keep working, the math usually points the other way.&lt;/p&gt;

&lt;p&gt;Either way, now you know what the system is actually made of, and which parts to interrogate before you commit. If any of this resonated, that's the part worth getting right first.&lt;/p&gt;

&lt;h2&gt;
  
  
  CometChat's enterprise chat infrastructure, in one place
&lt;/h2&gt;

&lt;p&gt;CometChat's enterprise infrastructure is the four systems above, already built and already surviving the 2am failures - a stateless WebSocket Gateway for connections and presence, an Apache Kafka backbone for ordered, no-loss delivery, polyglot storage (TiDB, Redis, MongoDB, S3-compatible object store) tuned per access pattern, and multi-tenancy with per-tenant isolation, rate limits, and quotas.&lt;/p&gt;

&lt;p&gt;It runs where your compliance team needs it to: managed cloud, region-pinned private cloud, hybrid, or fully air-gapped on-premise where data never leaves your infrastructure - built to meet GDPR, HIPAA, SOC 2, ISO 27001, CCPA, and PIPEDA, with encryption at rest, configurable key management, and secure WebSocket connections. It scales linearly from 10,000 to 250,000+ monthly active users at sub-100ms message latency, on Docker Swarm up to ~200k MAU and Kubernetes beyond that.&lt;/p&gt;

&lt;p&gt;The point isn't the feature list. It's that presence fan-out, ordering under retry, reconnection storms, and residency-driven topology are already handled - so your team ships the product and skips the years of learning which of these breaks first. Speed becomes sustainability. Shipping becomes operating. That's the whole trade.&lt;/p&gt;

&lt;p&gt;Want to see the stack instead of read about it? Start for free and build against it, or contact sales if you're sizing a deployment for real load, data residency, or an on-premise rollout. &lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is enterprise chat architecture?&lt;/strong&gt; It's the backend that delivers messages reliably, in order, and fast at scale - a real-time connection layer, a durable event pipeline for ordering and delivery, polyglot storage for history and media, and a presence layer. Enterprise adds data residency, compliance, and multi-tenancy on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What message delivery guarantee does chat need?&lt;/strong&gt; Effectively-once: one message on every device, even after a dropped connection and retry. Pure exactly-once is expensive and rare, so real stacks combine idempotent producers, automatic retries, and offline queuing to reach effectively-once in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many concurrent connections can a chat backend handle?&lt;/strong&gt; It depends on architecture, not vibes. CometChat's Docker Swarm deployment targets ~20,000 peak concurrent connections and ~200,000 MAU at sub-100ms latency; beyond that, Kubernetes handles 200k+ MAU and multi-region, scaling linearly to 250,000+ MAU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What database should I use for chat?&lt;/strong&gt; More than one. Distributed SQL (like TiDB) for the message source of truth, Redis for hot cache and sessions, a document store for metadata and audit logs, object storage for media, and a log like Kafka for ordering. No single database does all of that well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need Kafka for chat?&lt;/strong&gt; You need a durable, ordered event log; Kafka is the common choice. It's what lets you guarantee ordering and no message loss centrally, so those promises survive retries and reconnects instead of being renegotiated per connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I meet data residency requirements for chat?&lt;/strong&gt; Decide the deployment model before you build. Options are managed cloud, region-pinned private cloud, hybrid, and air-gapped on-premise. CometChat supports all four and is built to meet GDPR, HIPAA, SOC 2, ISO 27001, CCPA, and PIPEDA. Retrofitting residency into a single-region system is a rebuild, so choose first.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Streaming an AI Agent Into a Chat UI: The Parts That Are Not the Model</title>
      <dc:creator>Vishal Singh</dc:creator>
      <pubDate>Wed, 16 Sep 2026 08:24:22 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/streaming-an-ai-agent-into-a-chat-ui-the-parts-that-are-not-the-model-4fj1</link>
      <guid>https://dev.to/cometchat_official_account/streaming-an-ai-agent-into-a-chat-ui-the-parts-that-are-not-the-model-4fj1</guid>
      <description>&lt;p&gt;Streaming an AI Agent Into a Chat UI: The Parts That Are Not the Model&lt;/p&gt;

&lt;p&gt;Most write-ups about putting an AI agent in a chat product stop at the prompt. In practice, the model is the part you change least. The parts that break are message identity, tool-call rendering, thread context, and what the client does when a stream dies halfway through a sentence.&lt;/p&gt;

&lt;p&gt;I work on messaging infrastructure at CometChat, where AI assistants and bots sit in the same conversation as human participants. That constraint is the interesting one: an agent reply is not a separate UI mode, it is a message in a thread that also has read receipts, reactions, threads, moderation, and history sync. Anything you invent for the agent has to survive contact with all of that.&lt;/p&gt;

&lt;p&gt;Here is what I would insist on before wiring an agent into a chat surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A streaming reply is one message with many revisions
&lt;/h2&gt;

&lt;p&gt;The naive implementation appends a message per chunk. It looks fine in a demo and falls apart the moment a second device is open, because now that device receives forty messages instead of one.&lt;/p&gt;

&lt;p&gt;Model the reply as a single message with a stable identifier created at the moment the request is accepted, and a mutable body plus a state field:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pending&lt;/code&gt; - accepted, nothing generated yet&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;streaming&lt;/code&gt; - partial content, safe to render&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;complete&lt;/code&gt; - final content, safe to cache and index&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;failed&lt;/code&gt; - render the partial content plus an explicit error affordance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The client that started the request updates optimistically from the token stream. Every other client learns about the message through the same real-time channel it uses for human messages, and reconciles by identifier. In CometChat terms this is the difference between sending many messages and updating one message repeatedly, and it decides whether your history stays readable a week later.&lt;/p&gt;

&lt;p&gt;Practical detail: throttle the update you broadcast. Rendering every token locally is cheap; fanning out every token to all participants and persisting each revision is not. Local stream at token granularity, remote update on an interval or on sentence boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tool calls are message parts, not log lines
&lt;/h2&gt;

&lt;p&gt;An agent that searches a knowledge base, files a ticket, or looks up an order produces intermediate steps. If you flatten those into prose, users cannot tell what actually happened, and you cannot audit it afterwards.&lt;/p&gt;

&lt;p&gt;Give the message structured parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;id&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;msg_&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="err"&gt;H...&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;state&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;streaming&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;parts&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;Checking&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;invoice.&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;tool_use&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;name&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;lookup_invoice&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;args&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;id&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;status&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;running&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;type&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""""&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things fall out of this for free. The UI can collapse tool activity behind a disclosure instead of interleaving it with the answer. And moderation, analytics, and export can treat &lt;code&gt;tool_use&lt;/code&gt; differently from &lt;code&gt;text&lt;/code&gt;, which matters when the tool arguments contain customer data you do not want in a search index.&lt;/p&gt;

&lt;p&gt;The metadata field on a chat message is usually the right place to carry this. Keep the human-readable summary in the message body so that clients you have not updated yet still show something sensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Thread context is a retrieval problem, not a window problem
&lt;/h2&gt;

&lt;p&gt;""Send the last N messages"" is the default and it is wrong in both directions. In a support conversation, N=50 can be six months of small talk; in a fast group chat, N=50 is four minutes.&lt;/p&gt;

&lt;p&gt;What has worked better as a starting policy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;always include the last few turns verbatim, because coreference lives there (""no, the other one"")&lt;/li&gt;
&lt;li&gt;include a rolling summary of the conversation, regenerated on a cadence rather than per message&lt;/li&gt;
&lt;li&gt;retrieve by relevance from the rest of the thread and from your own docs, and label retrieved content as reference material, not as conversation&lt;/li&gt;
&lt;li&gt;carry participant and channel facts explicitly (locale, plan, entitlement) instead of hoping they appear in the transcript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And treat everything from the thread as untrusted input. A message in a group chat can contain instructions aimed at your agent. If your agent has tools that write - refunds, escalations, invites - then a user-authored message is an attacker-authored message. Authorise tool calls against the requesting user's own permissions, not the agent's.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Failure states need a design, not a spinner
&lt;/h2&gt;

&lt;p&gt;Streams break: the socket drops, the model provider rate-limits you, generation is cut mid-token. Decide in advance what each one looks like.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Socket drops mid-stream&lt;/td&gt;
&lt;td&gt;Keep the partial message, mark it interrupted, resume or offer retry by message id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider error before any token&lt;/td&gt;
&lt;td&gt;Move message to &lt;code&gt;failed&lt;/code&gt;, show retry, do not leave an empty bubble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timeout with no response&lt;/td&gt;
&lt;td&gt;Read back the message state before retrying; a missing response does not prove nothing was generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry after partial output&lt;/td&gt;
&lt;td&gt;Replace the body of the same message id, never append a second reply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the one teams get wrong. Retries must be idempotent at the message level, keyed on the request identifier the client generated. Otherwise every flaky connection produces duplicate assistant replies, and the transcript stops being a record of what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The agent is a participant, so give it an identity
&lt;/h2&gt;

&lt;p&gt;If the agent posts as a bot user with its own identifier, everything downstream works: mentions, per-conversation muting, permissions, rate limits, moderation rules, and analytics that can separate human from generated volume. If it posts as a magic side channel, you will re-implement each of those badly.&lt;/p&gt;

&lt;p&gt;This is also how you keep the door open for more than one agent. A triage bot and a summariser bot in the same channel are just two participants with different tool scopes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than prompt tuning
&lt;/h2&gt;

&lt;p&gt;You can swap models in an afternoon. You cannot easily change the shape of a million stored messages. The decisions that age well are the boring ones: stable message identity, structured parts, explicit states, idempotent retries, and an agent that lives inside your existing permission model rather than beside it.&lt;/p&gt;

&lt;p&gt;If you are adding an assistant to a product that already has real conversations in it, design the message first and the prompt second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cometchat.com/docs" rel="noopener noreferrer"&gt;https://www.cometchat.com/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Streams_API" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Streams_API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;https://modelcontextprotocol.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>javascript</category>
    </item>
    <item>
      <title>News Roundup: Compute got scarce. Efficiency stopped being optional.</title>
      <dc:creator>Shrinithi V</dc:creator>
      <pubDate>Mon, 07 Sep 2026 15:51:37 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/news-roundup-compute-got-scarce-efficiency-stopped-being-optional-1edm</link>
      <guid>https://dev.to/cometchat_official_account/news-roundup-compute-got-scarce-efficiency-stopped-being-optional-1edm</guid>
      <description>&lt;h2&gt;
  
  
  AI That Finds Its Own Zero-Days
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt; &lt;br&gt;
OpenAI launched GPT-6 Astra - the first model that can independently discover and exploit unknown software vulnerabilities, and it's pairing that with $1B for cyber defenders.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
 Attackers get frontier tools the day they ship. Now defenders do too but only if they move first. The gap between ‘we should patch that’ and ‘someone already did’ just got shorter.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
Same story we know well: capability without accountability breaks things at scale. Powerful AI agents - in security or in chat need guardrails built in, not bolted on later. Ship fast, but ship safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Samsung and Arm Build 2nm AI Chip
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt; &lt;br&gt;
Samsung and Arm kicked off a custom 2nm chip built to run AI directly on your device with OpenAI rumored to be the end customer.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
On-device AI means less round-tripping to the cloud. Lower latency, less dependence on someone else's servers, and inference that happens where your users actually are.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
The whole industry is quietly moving intelligence closer to the edge. For chat and AI agents, that's the good direction - faster responses, private by default. The interesting part isn't the silicon. It's what you build on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chip Gear Spending Hits Record $40B
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Semiconductor equipment billings hit a record $40.53B last quarter - the second record in a row as chipmakers race to build capacity for AI.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
Memory is booked solid through 2027, and new capacity won't land before 2028. Translation: the compute powering your AI features is getting pricier and scarcer, not cheaper.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
When infrastructure is this constrained, efficiency stops being optional. For AI agents and chat at scale, every wasted call costs real money. The teams that win won't be the ones with the most compute - they'll be the ones who waste the least.&lt;/p&gt;

&lt;h2&gt;
  
  
  $3.5B Bet on Humanoid Robots
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Nscale is committing $3.5B in compute (scaling to $6B+) to power Figure's humanoid robots 100,000 Nvidia GPUs, plus an equity stake in the robotics startup.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
Physical AI is getting real money and real infrastructure. Robots that learn, adapt, and operate in the world all run on the same thing your software does: massive, expensive compute.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
The line between ‘AI in an app’ and ‘AI in a body’ is thinner than it looks. Both need the same foundation - models that respond fast and reliably. Whether it's a robot in a warehouse or an agent in a chat, the hard part was never the demo. It's making it work every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xiaomi Debuts Its Own 3nm Chips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Xiaomi unveiled three in-house chips at IFA - a 3nm flagship phone SoC, an edge AI accelerator, and an autonomous driving chip reducing its reliance on Qualcomm and MediaTek.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
 When a company owns its silicon, it controls the whole stack - performance, power, and how AI runs on-device. That's tighter integration and less waiting on someone else's roadmap.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
The edge AI chip is the one to watch - 330 tokens per second, running inference right on the device. As more intelligence moves on-device, chat and AI agents get faster and more private by default. The demo is easy. Owning the whole pipeline is the hard, smart part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Recycles Old Chips to Survive
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Google is pulling DDR4 memory from retired servers and adapting it for new AI machines - a stopgap as the memory shortage bites and prices climb up to 90% in a quarter.&lt;br&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt;&lt;br&gt;
 Even the biggest players can't buy their way out of this. Memory now eats ~30% of hyperscaler budgets, up from 8% two years ago. The cost of running AI is being reshaped by a shortage that lasts through 2030.&lt;br&gt;
&lt;strong&gt;What we think at CometChat&lt;/strong&gt;&lt;br&gt;
Efficiency just became a survival skill. When compute and memory are this scarce, the winners aren't the ones spending the most - they're the ones getting more out of less. For AI agents and chat at scale, lean beats lavish. Every wasted call has a price now.&lt;/p&gt;

</description>
      <category>news</category>
      <category>cometchat</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>News Roundup: The frontier moved from "can it?" to "can you trust it?"</title>
      <dc:creator>Shrinithi V</dc:creator>
      <pubDate>Thu, 03 Sep 2026 08:32:49 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/news-roundup-the-frontier-moved-from-can-it-to-can-you-trust-it-2cel</link>
      <guid>https://dev.to/cometchat_official_account/news-roundup-the-frontier-moved-from-can-it-to-can-you-trust-it-2cel</guid>
      <description>&lt;h2&gt;
  
  
  Gemini Now Runs Your Tasks Solo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Google gave Gemini Live an agentic upgrade - you speak a goal out loud, and it runs multi-step tasks across Docs, Sheets, Gmail, and Drive on its own.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
Voice stops being just Q&amp;amp;A. Assistants now remember your intent and act on it for days - no app-switching, no babysitting the workflow.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat&lt;/strong&gt;&lt;br&gt;
This is where conversation becomes the interface. The hard part isn't making an agent talk, it's making it act reliably across a real product. Agents are only as good as the messaging layer they run on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nvidia's Robots Just Hit $10 Billion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
NVIDIA's physical AI arm - chips for robots, self-driving cars, and drones now pulls in ~$10B a year, with China shipping 97% of the world's humanoid robots.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
The ‘ChatGPT moment’ for robots isn't coming - Huang says it already passed. Physical AI is scaling from demos to factory floors, fast.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat:&lt;/strong&gt;&lt;br&gt;
A robot that moves is impressive. A robot you can actually talk to, that understands context and responds in real time - that's the harder problem. Intelligence in hardware still needs a conversation layer that doesn't fall over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta's New Agent Shops, Books, and DJs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Meta is testing ‘Project Hatch’ - a personal AI agent with its own computer that books restaurants, orders food, buys gifts, and even runs your Spotify, all in the background.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
Agents are moving from answering questions to taking actions across your real apps and accounts - email, calendar, OpenTable, DoorDash. The interface is becoming a delegate.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat&lt;/strong&gt;&lt;br&gt;
Handing an agent your calendar is easy. Handing it your conversations is where trust gets real. When agents start acting on your behalf, the messaging layer has to be reliable, secure, and legible because ‘it booked the wrong thing’ is a much bigger problem in production than in a demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google's AI Video Now Directs, Not Just Generates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Gemini Omni 1.1 Flash adds 4K upscaling, keyframe transitions, and scene extension up to 40 seconds giving AI video an actual beginning, middle, and end.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
The pitch shifts from ‘generate a clip’ to ‘direct a scene.’ Cheap 360p drafts, polished 4K finals - a workflow real production teams can actually use.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat&lt;/strong&gt;&lt;br&gt;
Every leap in AI-generated content raises the same question: how do people talk about it, react to it, share it? Richer media only matters if the room around it - comments, threads, live reactions can keep up. The content gets better; the conversation layer has to too.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Guides World-First Brain Tumour Surgery
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Surgeons in London removed a brain tumour using real-time AI that colour-coded critical vessels and nerves on a live video feed - saving a 48-year-old's eyesight.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
AI as an ‘expert second pair of eyes,’ trained on more operations than a surgeon sees in a lifetime. Not replacing the human rather assisting the highest-stakes decisions in real time.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat&lt;/strong&gt;&lt;br&gt;
The surgeons kept full control the whole way - the AI advised, humans decided. That's the model that works. Whether it's an operating theatre or a support chat, the best AI doesn't take over the conversation. It gives people better information at the moment they need it, and lets them make the call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyundai Bets Big on Self-Driving by 2028
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's going on?&lt;/strong&gt;&lt;br&gt;
Hyundai and NVIDIA are teaming up to put Level 2+ self-driving in mass-market cars by 2028, backed by a 50,000-GPU data centre and an in-house AI system.&lt;br&gt;
&lt;strong&gt;Why it matters?&lt;/strong&gt;&lt;br&gt;
 Self-driving stops being a luxury demo. When 12 of every 20 new cars in China already ship with Level 2+, autonomy becomes a standard feature buyers expect, not a moonshot.&lt;br&gt;
&lt;strong&gt;How we see it at CometChat&lt;/strong&gt;&lt;br&gt;
Hyundai's whole bet is the ‘data flywheel’ - collect, train, deploy, repeat. Same logic applies to how products talk to users: every conversation is a signal. The teams that win aren't just shipping AI features, they're building the feedback loop that makes each interaction smarter than the last.&lt;/p&gt;

</description>
      <category>news</category>
      <category>cometchat</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CometChat Cards</title>
      <dc:creator>CometChat</dc:creator>
      <pubDate>Thu, 03 Sep 2026 08:15:47 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/cometchat-cards-36fp</link>
      <guid>https://dev.to/cometchat_official_account/cometchat-cards-36fp</guid>
      <description>&lt;p&gt;Most of what people send each other in a chat isn't really a sentence. Someone shares an event, and the date, location, and RSVP link should travel together. A group admin posts an announcement that deserves more than a wall of text. A friend drops a link that needs a clear next step attached, not just a bare URL. In a 1:1 or group conversation, all of that gets squeezed into plain text, because there's never been a way to send something more structured than a message bubble.&lt;/p&gt;

&lt;p&gt;CometChat Cards fixes that. A card carries a block and renders natively, as images, buttons, and layouts, right inside the same 1:1 or group chat window a text message would appear in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this matter to me as a developer building chat experiences?
&lt;/h2&gt;

&lt;p&gt;Every custom message type you've ever built for a chat app followed the same path: design the payload, write a renderer for it, wire up the actions, repeat for the next one. It doesn't scale past the first few designs, and every platform you support means doing it again.&lt;/p&gt;

&lt;p&gt;CometChat Cards take that off your plate. Design a card once, visually, in the CometChat Dashboard, and every UI Kit that supports the format renders it the same way, no custom parsing required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key features and capabilities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Card Builder, a visual editor in the Dashboard.&lt;/strong&gt;&lt;br&gt;
Build cards from 20 elements across four groups: content (text, markdown, image, icon, avatar, badge, chip, code block), layout (row, column, grid, accordion, tabs, divider, spacer), interactive (button, icon button, link), and data (table, progress bar). Four elements, button, icon button, link, and chip, can carry an action, and there are nine kinds to choose from: open a URL, start a chat with a user or group, send a message, copy to clipboard, download a file, initiate a call, hit an API, or run a custom callback in your app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nine starter components.&lt;/strong&gt;&lt;br&gt;
Product Card, Order Confirmation, Order Tracking, Event Card, Announcement, Quick Reply Buttons, Feedback, Data Table, and Carousel come pre-assembled, so you're editing instead of building from a blank canvas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Variables&lt;/strong&gt;&lt;br&gt;
Insert placeholders like {{user.name}} anywhere in a card's text or URL fields, and CometChat fills them in per recipient when the card sends.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built into every UI Kit.&lt;/strong&gt;&lt;br&gt;
Card messages are rendered automatically across all CometChat UI Kits. When a card message appears in a conversation, the UI Kit detects it and displays the appropriate card interface without any additional setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No wiring required&lt;/strong&gt;&lt;br&gt;
Card messages are handled internally by the UI Kit, so they work out of the box in CometChatMessageList and other standard conversation views across all supported platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fallback text&lt;/strong&gt;&lt;br&gt;
Every card includes fallback text. If the card JSON is malformed or a client doesn't support cards yet, the UI Kit falls back to that text instead of showing nothing, so the message still says something.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where this shows up
&lt;/h2&gt;

&lt;p&gt;CometChat already builds for these industries. Card Builder's starter components map onto what's already happening in each one's 1:1 and group chats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketplace&lt;/strong&gt;&lt;br&gt;
A buyer and seller are already negotiating a listing in 1:1 chat. A Product Card carries the photo, price, and condition inline instead of the buyer switching to a listing page, and an Order Confirmation card closes the loop once they agree.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;On-demand services&lt;/strong&gt;&lt;br&gt;
Customer and provider are coordinating a job in real time. An Order Tracking card shows live status and ETA right in the thread, the same conversation where they're already discussing pickup details or a delivery photo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Education&lt;/strong&gt;&lt;br&gt;
A teacher posts to a class group chat. An Announcement or Event Card carries a session time, a join link, and an RSVP button, instead of the group scrolling past three separate messages to piece it together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gaming&lt;/strong&gt;&lt;br&gt;
A clan or guild group chat gets patch notes, a Data Table of leaderboard standings, or a Carousel of upcoming tournaments, laid out the way a status update actually reads instead of a wall of patch numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketplace&lt;/strong&gt;&lt;br&gt;
A buyer and seller are already negotiating a listing in 1:1 chat. A Product Card carries the photo, price, and condition inline instead of the buyer switching to a listing page, and an Order Confirmation card closes the loop once they agree.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;On-demand services.&lt;/strong&gt;&lt;br&gt;
Customer and provider are coordinating a job in real time. An Order Tracking card shows live status and ETA right in the thread, the same conversation where they're already discussing pickup details or a delivery photo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Education&lt;/strong&gt;&lt;br&gt;
A teacher posts to a class group chat. An Announcement or Event Card carries a session time, a join link, and an RSVP button, instead of the group scrolling past three separate messages to piece it together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gaming&lt;/strong&gt;&lt;br&gt;
A clan or guild group chat gets patch notes, a Data Table of leaderboard standings, or a Carousel of upcoming tournaments, laid out the way a status update actually reads instead of a wall of patch numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Healthcare&lt;/strong&gt;&lt;br&gt;
A patient and provider are messaging 1:1. An Event Card carries an appointment time with a reschedule button attached, or a Feedback card collects a quick check-in after a visit, without either side leaving the thread.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dating&lt;/strong&gt;&lt;br&gt;
Two matches are talking. Quick Reply Buttons turn a common question into a tap instead of a typed reply, and a Carousel can surface shared interests or icebreaker prompts inline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community and social.&lt;/strong&gt;&lt;br&gt;
A group admin drops an Event Card for a meetup with an RSVP action, or an Announcement card for a rule change, so it reads as distinct from the conversation instead of getting lost in it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SaaS businesses&lt;/strong&gt;&lt;br&gt;
A workspace or support channel gets a Data Table showing open ticket status, or an Announcement card for a new feature, sent to a group the same way any other message would be, just structured.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reference links
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/docs/ui-kit/react/components/card-bubble" rel="noopener noreferrer"&gt;Card Bubble component docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/docs/card-builder/overview" rel="noopener noreferrer"&gt;CometChat Card Builder overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/docs/card-builder/elements" rel="noopener noreferrer"&gt;Elements and actions reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cometchat.com/docs/sdk/javascript/card-messages" rel="noopener noreferrer"&gt;Card messages in the JavaScript SDK&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>news</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>CometChat Support Services: Built to support you at every stage</title>
      <dc:creator>CometChat</dc:creator>
      <pubDate>Tue, 07 Apr 2026 07:59:34 +0000</pubDate>
      <link>https://dev.to/cometchat_official_account/cometchat-support-services-built-to-support-you-at-every-stage-5cek</link>
      <guid>https://dev.to/cometchat_official_account/cometchat-support-services-built-to-support-you-at-every-stage-5cek</guid>
      <description>&lt;p&gt;When you add real-time communication to your product, be it chat, calls, or AI-driven conversations, reliability becomes critical. Your users expect conversations to work instantly and consistently.&lt;/p&gt;

&lt;p&gt;That’s why support at CometChat is designed to go beyond troubleshooting. It combines immediate assistance, self-serve resources, proactive guidance, and enterprise-grade guarantees to help teams build, launch, and scale confidently.&lt;/p&gt;

&lt;p&gt;Here’s a closer look at the support services available.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Always-On Assistance
&lt;/h2&gt;

&lt;p&gt;When something breaks or a question blocks progress, you need help quickly. CometChat provides multiple ways for teams to get real-time assistance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;24/5 Live Chat Support for instant help with urgent questions&lt;/li&gt;
&lt;li&gt;24/5 Email Support for technical queries and troubleshooting&lt;/li&gt;
&lt;li&gt;Ticket Support for structured issue tracking&lt;/li&gt;
&lt;li&gt;24/7 Emergency Ticket Support for critical incidents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These channels ensure developers and product teams can reach support when they need it, whether during development, testing, or production incidents.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Knowledge &amp;amp; Self-Serve Resources
&lt;/h2&gt;

&lt;p&gt;Many teams prefer to move quickly without waiting for assistance. To support this, CometChat provides a comprehensive set of learning resources.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation with detailed implementation instructions&lt;/li&gt;
&lt;li&gt;Help Center for quick answers to common questions&lt;/li&gt;
&lt;li&gt;Tutorials &amp;amp; Guides to walk through integrations step-by-step&lt;/li&gt;
&lt;li&gt;Community Forum for peer discussions and shared solutions&lt;/li&gt;
&lt;li&gt;Status Page to monitor system availability and incidents&lt;/li&gt;
&lt;li&gt;Feature Request Page to submit product feedback and ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These resources help teams integrate features like in-app messaging, moderation workflows, and communication infrastructure without friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Dedicated Access
&lt;/h2&gt;

&lt;p&gt;For teams operating at scale or building complex communication experiences, direct collaboration with experts can make a major difference.&lt;/p&gt;

&lt;p&gt;CometChat offers several options for closer engagement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated Slack channel for real-time collaboration with support engineers&lt;/li&gt;
&lt;li&gt;Dedicated Customer Success Manager to guide product adoption and strategy&lt;/li&gt;
&lt;li&gt;Dedicated Technical Support Engineer for deep technical troubleshooting&lt;/li&gt;
&lt;li&gt;Annual Technical Health Check to review architecture, performance, and best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This level of access ensures teams always have an expert who understands their implementation and can help optimize it over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Implementation Guidance
&lt;/h2&gt;

&lt;p&gt;Launching a real-time communication feature can involve architectural decisions, integration challenges, and product design considerations. CometChat helps teams navigate this process through hands-on guidance.&lt;/p&gt;

&lt;p&gt;Support includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch call with an Implementation Manager to review setup and deployment&lt;/li&gt;
&lt;li&gt;Dedicated Implementation Engineer for complex integrations&lt;/li&gt;
&lt;li&gt;Dedicated Slack channel during implementation for quick coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guidance helps teams avoid common mistakes and get their messaging or calling features live faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Reliability &amp;amp; Escalation Support
&lt;/h2&gt;

&lt;p&gt;For organizations running mission-critical communication systems, additional escalation paths are available.&lt;/p&gt;

&lt;p&gt;These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uptime SLA guarantees (up to 99.999%)&lt;/li&gt;
&lt;li&gt;24/7 emergency phone support&lt;/li&gt;
&lt;li&gt;24/7 priority email support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These options ensure rapid response and stronger reliability commitments when communication features are central to the product experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Advanced Technical Support &amp;amp; Optimization
&lt;/h2&gt;

&lt;p&gt;As products evolve, teams often need deeper assistance with scaling, customization, or infrastructure changes.&lt;/p&gt;

&lt;p&gt;CometChat provides advanced technical support such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migration assistance when moving from another provider or legacy system&lt;/li&gt;
&lt;li&gt;Integration reviews to validate architecture and configuration&lt;/li&gt;
&lt;li&gt;Weekly check-ins for ongoing guidance and optimization&lt;/li&gt;
&lt;li&gt;UI Kit integration and bespoke customization support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This support ensures teams can fully leverage the platform while maintaining performance and scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Live Monitoring &amp;amp; Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Some use cases such as live events, launches, or high-traffic community moments require active oversight.&lt;/p&gt;

&lt;p&gt;To support these scenarios, CometChat offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtual event live monitoring and support&lt;/li&gt;
&lt;li&gt;Real-time troubleshooting during critical events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having engineers actively monitor systems during important moments reduces risk and ensures rapid issue resolution if anything unexpected occurs.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Support Prioritization &amp;amp; Response Guarantees
&lt;/h2&gt;

&lt;p&gt;As your product grows, so does the need for faster, more predictable support. CometChat’s support tiers ensure your most critical issues are handled with the urgency they deserve with defined response times and priority-based escalation.&lt;/p&gt;

&lt;p&gt;Support plans include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guaranteed ticket first response times&lt;/li&gt;
&lt;li&gt;Priority Support&lt;/li&gt;
&lt;li&gt;Highest Priority Support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tiers ensure that as your product scales, your support experience scales with it with faster response times, quicker escalations, and greater attention to critical issues when it matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built to support you at every stage
&lt;/h2&gt;

&lt;p&gt;Adding communication features to your product introduces new complexity from infrastructure and scaling to moderation and reliability.&lt;/p&gt;

&lt;p&gt;CometChat’s support services are designed to help teams navigate this complexity with confidence, combining immediate assistance, expert guidance, and enterprise-level reliability.&lt;/p&gt;

&lt;p&gt;Whether you’re launching your first in-app messaging experience or operating communication features at global scale, the right support ensures your conversations never stop.&lt;/p&gt;

</description>
      <category>cometchat</category>
      <category>architecture</category>
      <category>startup</category>
      <category>community</category>
    </item>
  </channel>
</rss>
