<?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: Alexander Lukashov</title>
    <description>The latest articles on DEV Community by Alexander Lukashov (@alexander_lukashov).</description>
    <link>https://dev.to/alexander_lukashov</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3831763%2F19727016-0bfe-424e-a09d-393e871df06a.jpg</url>
      <title>DEV Community: Alexander Lukashov</title>
      <link>https://dev.to/alexander_lukashov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexander_lukashov"/>
    <language>en</language>
    <item>
      <title>Why I made my paid product fully free for personal use</title>
      <dc:creator>Alexander Lukashov</dc:creator>
      <pubDate>Tue, 19 May 2026 16:25:33 +0000</pubDate>
      <link>https://dev.to/alexander_lukashov/why-i-made-my-paid-product-fully-free-for-personal-use-5cie</link>
      <guid>https://dev.to/alexander_lukashov/why-i-made-my-paid-product-fully-free-for-personal-use-5cie</guid>
      <description>&lt;p&gt;I spent two months thinking about pricing before I let myself write the pricing page.&lt;/p&gt;

&lt;p&gt;That is not a humblebrag, it slowed everything down. The product was technically ready in March. By April it could have been on sale. But every time I sat down to define the free tier, something did not sit right, and I would close the tab and go fix a bug instead.&lt;/p&gt;

&lt;p&gt;What unstuck it was not a framework, a benchmark, or a YC essay. It was one question I could not answer to my own satisfaction. I want to write about it, because the question is generalizable and I think a lot of solo makers building tools quietly trip over it.&lt;/p&gt;

&lt;p&gt;A bit of context first. I have been a technical product manager at large tech companies for many years, always on B2B SaaS, always with a team, always for someone else's company. The product I was pricing is Notch, a screen recorder for Mac and Windows. It is the first desktop app I have shipped under my own name. So this was the first time I was personally on the line for a pricing decision, with my own money funding the development and my own name on the receiver.&lt;/p&gt;

&lt;h2&gt;
  
  
  The freemium playbook I almost ran
&lt;/h2&gt;

&lt;p&gt;When I sketched the pricing card the first time, it looked almost exactly like what every other screen recorder does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier with a 5-project cap, limited by 1080p output quality, and a watermark on exports&lt;/li&gt;
&lt;li&gt;Paid tier at $49 one-time that removes both&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the freemium playbook by default. The free tier is a trial in disguise. Generous enough to demo the product, restrictive enough that anyone using it seriously has to upgrade. Loom does it. Screen Studio does it. Camtasia does it. Tella does it. So did the spreadsheet I was modelling.&lt;/p&gt;

&lt;p&gt;The numbers added up. The conversion funnel made sense. I built the watermark into the export pipeline. I implemented the project counter and a "you've hit your limit" modal. I tested both. They worked.&lt;/p&gt;

&lt;p&gt;I just did not want to ship them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question I could not answer
&lt;/h2&gt;

&lt;p&gt;The discomfort was not moral. I had convinced myself the freemium model is honest enough, since the limits are visible upfront. The discomfort was about a specific user I kept picturing.&lt;/p&gt;

&lt;p&gt;That user is someone like me five or ten years ago: an engineer recording their first screencast tutorial for their blog, a student doing a class project, a hobbyist showing their indie game on Mastodon. Someone who is not going to make a dollar from the thing they are recording. Someone for whom $49, even one-time, is meaningful money.&lt;/p&gt;

&lt;p&gt;Why am I asking them to pay?&lt;/p&gt;

&lt;p&gt;I sat with that question for two weeks. Every answer felt thin.&lt;/p&gt;

&lt;p&gt;"Because the software costs me money to maintain."&lt;/p&gt;

&lt;p&gt;OK, true, but that user is not loading my support queue. They are not going to email me. They are using the product silently.&lt;/p&gt;

&lt;p&gt;"Because if I let them export for free, they will never upgrade."&lt;/p&gt;

&lt;p&gt;They were never going to upgrade. They do not have a use case for the Commercial license, they are not running paid work through it. The "upgrade" framing is a trick I would be playing on someone who could not fall for it.&lt;/p&gt;

&lt;p&gt;"Because it is the standard model in the category."&lt;/p&gt;

&lt;p&gt;The least convincing answer of all. "Everyone does it" has never been a strong reason to do anything.&lt;/p&gt;

&lt;p&gt;The honest version of the question kept reformulating itself in my head:&lt;/p&gt;

&lt;p&gt;Why should someone pay me if they are not making money from this themselves?&lt;/p&gt;

&lt;p&gt;I did not have a good answer. So I stopped trying to find one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I changed
&lt;/h2&gt;

&lt;p&gt;I removed the project cap. I removed the watermark. I removed all limits. The personal tier of Notch is fully free. No degraded export, no nag screens, no asterisks. You install the app, you hit record, you export your video. Done.&lt;/p&gt;

&lt;p&gt;The Commercial license is still there. It is $49 one-time, with team pricing for 3 and 10 seats. The split is not "free for limited use, paid for everything". It is "free for personal use, paid for revenue-generating use". The line is the purpose of the recording, not the feature set.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A student making a class project: free, forever, with full features.&lt;/li&gt;
&lt;li&gt;A bootcamp graduate recording tutorials for their portfolio: free.&lt;/li&gt;
&lt;li&gt;An OSS maintainer recording a feature demo for a GitHub issue: free.&lt;/li&gt;
&lt;li&gt;A teacher recording an async lesson for their students: free.&lt;/li&gt;
&lt;li&gt;A consultant making client deliverables: Commercial license.&lt;/li&gt;
&lt;li&gt;A SaaS team recording onboarding videos: Commercial license.&lt;/li&gt;
&lt;li&gt;A YouTuber monetizing their channel: Commercial license.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free tier and the Commercial tier are the same software. The license is what changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The objection I expected
&lt;/h2&gt;

&lt;p&gt;I had a draft of this post that opened with the predictable objection: "But how will you actually make money?"&lt;/p&gt;

&lt;p&gt;I cut it because I think it deserves a real answer, not a defensive setup. Here is the real answer.&lt;/p&gt;

&lt;p&gt;Most non-monetizing users were never going to pay anyway. Walking into a freemium model assuming they are conversion-able is wishful. The honest math: if 95% of free-tier users would never pay regardless of how much you crippled the free tier, your "free tier" was effectively gifting them a worse product than they could have had, and resenting them for not converting.&lt;/p&gt;

&lt;p&gt;Commercial users are different. They have a budget line for tools. They are comparing me to Loom at $18/user/month or Screen Studio at $108/year. A one-time $49, or $29/user for a 10-pack, is the cheapest thing in their procurement queue. They are going to pay.&lt;/p&gt;

&lt;p&gt;Goodwill compounds. The student who got Notch for free for a year, who graduates and goes to a SaaS company that needs internal training videos, that is the person who pitches Notch to their boss. Not because of switching costs, but because they already know it works and trust it. That kind of advocacy does not show up in a conversion funnel, is almost impossible to A/B test, and stacks over years.&lt;/p&gt;

&lt;p&gt;The "real free tier" is a marketing position. It is also a moat. Every competitor who runs the freemium-with-limits playbook is implicitly telling their non-monetizing users "we tolerate you, for now". That is not a feeling people seek out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deeper reason
&lt;/h2&gt;

&lt;p&gt;I will be honest about the part that is not a pricing argument.&lt;/p&gt;

&lt;p&gt;I went into product management years ago because I love watching the results of my work get used. Not "purchased". Used. The thing I find satisfying about shipping is people getting value. If I could only sell products and never see them in someone's hands, I would have stayed in e-commerce.&lt;/p&gt;

&lt;p&gt;Building "another commercial product", one more entry in a category, optimized for revenue capture, was not a strong enough reason for me to spend a year of my evenings on something. It is a thing I could have done with my day job's time instead. The reason I built Notch is that I kept wanting it to exist and nothing else delivered it. The reason I am shipping it is that I want other people to have it too.&lt;/p&gt;

&lt;p&gt;A pricing model that restricts the people most likely to enjoy the product, in order to maximize revenue from the people also most likely to enjoy the product, is solving for the wrong thing.&lt;/p&gt;

&lt;p&gt;The team and Commercial side will pay for itself. I would rather underearn from the model I chose than overcharge through one that fights my own reason for building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell another maker
&lt;/h2&gt;

&lt;p&gt;Three things, briefly.&lt;/p&gt;

&lt;p&gt;Pricing reveals what you actually think your product is for. If the only way the math works is by limiting the people who would love your product most, the math might be wrong.&lt;/p&gt;

&lt;p&gt;The freemium playbook is the default, not the answer. It works for some categories, usually ones with high marginal cost per user, strong network effects, or genuine paid value the free tier cannot replicate. Most maker tools are none of those.&lt;/p&gt;

&lt;p&gt;Trust your discomfort. I spent two months avoiding writing a pricing page because the model I was about to ship felt wrong. That feeling was data. I should have listened to it sooner.&lt;/p&gt;

&lt;p&gt;If you are curious what the product looks like with this pricing applied: &lt;a href="https://getnotch.co" rel="noopener noreferrer"&gt;Notch is on Mac and Windows&lt;/a&gt;, fully free for personal use, no account, no cloud, no nags. Commercial license is one-time, $49.&lt;/p&gt;

&lt;p&gt;I am happy to argue any of the above in the comments. I think I am right, but I have been wrong about pricing for a living. &lt;/p&gt;

&lt;p&gt;May the force be with you.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>showdev</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Evaluated Every AI Chat UI Library in 2026. Here's What I Found (and What I Built)</title>
      <dc:creator>Alexander Lukashov</dc:creator>
      <pubDate>Wed, 18 Mar 2026 18:00:24 +0000</pubDate>
      <link>https://dev.to/alexander_lukashov/i-evaluated-every-ai-chat-ui-library-in-2026-heres-what-i-found-and-what-i-built-4p10</link>
      <guid>https://dev.to/alexander_lukashov/i-evaluated-every-ai-chat-ui-library-in-2026-heres-what-i-found-and-what-i-built-4p10</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React stack → &lt;a href="https://github.com/assistant-ui/assistant-ui" rel="noopener noreferrer"&gt;assistant-ui&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full agent framework → &lt;a href="https://github.com/CopilotKit/CopilotKit" rel="noopener noreferrer"&gt;CopilotKit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Quick prototype or non-React → &lt;a href="https://github.com/OvidijusParsiunas/deep-chat" rel="noopener noreferrer"&gt;Deep Chat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Python backend → &lt;a href="https://github.com/Chainlit/chainlit" rel="noopener noreferrer"&gt;Chainlit&lt;/a&gt; (check project status first)&lt;/li&gt;
&lt;li&gt;Multi-framework + composable, early adopter → &lt;a href="https://github.com/loquix-dev/loquix" rel="noopener noreferrer"&gt;Loquix&lt;/a&gt; (no production deployments yet — read the limitations)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Conflict of interest:&lt;/strong&gt; I'm the author of Loquix, one of the libraries reviewed here. The independent reviews come first. Loquix gets its own clearly-labeled section at the end, written by me about my own work — treat it accordingly. If you want the quick take: for most teams, &lt;strong&gt;assistant-ui&lt;/strong&gt; (React) or &lt;strong&gt;Deep Chat&lt;/strong&gt; (everything else) is the more pragmatic answer.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Before the reviews: four types of lock-in
&lt;/h2&gt;

&lt;p&gt;After evaluating all of these libraries, the biggest insight wasn't about any specific tool — it was that "lock-in" isn't one thing. There are at least four distinct flavors, and understanding which one you're accepting changes how much it matters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;When it bites&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;assistant-ui (React-only)&lt;/td&gt;
&lt;td&gt;When you need to support other frameworks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture/runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CopilotKit&lt;/td&gt;
&lt;td&gt;When your agent infrastructure evolves independently of your frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vercel stack&lt;/td&gt;
&lt;td&gt;Creeps up over time; each layer pulls you deeper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API-surface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep Chat&lt;/td&gt;
&lt;td&gt;When your requirements outgrow the component's config options&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Framework lock-in is rarely a problem if your whole team is on React. Architecture lock-in hurts when backend and frontend evolve at different speeds. Ecosystem lock-in you feel slowly — you start with &lt;code&gt;useChat&lt;/code&gt;, six months later you're on Vercel hosting, each step made sense. API-surface lock-in only matters when your requirements outgrow the defaults.&lt;/p&gt;

&lt;p&gt;I'll reference these types throughout the reviews so you can calibrate the tradeoffs for your situation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "chat UI" actually requires
&lt;/h2&gt;

&lt;p&gt;"Messages going up, input at the bottom" — I thought the same thing. Then I started building. Here's the real scope:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core:&lt;/strong&gt; Token-by-token streaming without UI glitches, markdown + code blocks with syntax highlighting, a composer that auto-grows and handles Shift+Enter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interactive layer:&lt;/strong&gt; File attachments (drag-and-drop + clipboard paste), feedback buttons for RLHF, a stop-generating button (you'll add this at 2 AM after your agent writes a 4,000-word essay about semicolons), model selectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust layer:&lt;/strong&gt; Citations, reasoning traces, tool execution logs, cost estimates. Users increasingly expect to see &lt;em&gt;why&lt;/em&gt; the AI said what it said.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The invisible stuff:&lt;/strong&gt; Accessibility (WCAG, keyboard nav), theming that survives a designer, i18n.&lt;/p&gt;

&lt;p&gt;Build all of that from scratch: 2–4 weeks, before a single line of agent logic. That's why this market exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The libraries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  assistant-ui ⭐ ~7.9k — React, composable, headless — MIT
&lt;/h3&gt;

&lt;p&gt;YC-backed. The library that shows up in every "build a ChatGPT clone" thread.&lt;/p&gt;

&lt;p&gt;Follows the Radix headless pattern — unstyled primitives (&lt;code&gt;Thread&lt;/code&gt;, &lt;code&gt;Composer&lt;/code&gt;, &lt;code&gt;Message&lt;/code&gt;) you compose yourself. State management is thoughtful, streaming is first-class, Vercel AI SDK integration is tight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; React + Next.js teams that want maximum control without implementing the hard parts. If your whole stack is React, this is the safe default — mature ecosystem, responsive maintainers, well-designed composability model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; React-only (framework lock-in). Vue, Svelte, Angular, vanilla JS — not supported. "Headless" also means you do all the design work; getting a polished UI requires assembling many pieces and the learning curve is real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock-in type:&lt;/strong&gt; Framework.&lt;/p&gt;




&lt;h3&gt;
  
  
  CopilotKit ⭐ ~28.6k — React, agent framework with UI — commercial tiers available
&lt;/h3&gt;

&lt;p&gt;Not just a UI library — an agentic application framework that includes UI components. Drop in &lt;code&gt;&amp;lt;CopilotPortal /&amp;gt;&lt;/code&gt;, get a full copilot experience. Agents can read your app state, call your functions, generate UI dynamically. They co-created AG-UI and partnered with Google on A2UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Greenfield projects where you're buying into their whole architecture. If you need deep agent-app state sync and generative UI, nothing else comes close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; If all you need is a good chat interface, this is a flamethrower for a candle. More importantly: it's not just framework lock-in, it's &lt;em&gt;architecture&lt;/em&gt; lock-in. You're adopting their agent execution model, state sync, action system — not just swapping in components. On brownfield projects with existing agent infrastructure, that means rethinking things you've already built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock-in type:&lt;/strong&gt; Architecture/runtime (the heaviest kind).&lt;/p&gt;




&lt;h3&gt;
  
  
  Vercel AI SDK + AI Elements — React, hooks + growing component layer — MIT
&lt;/h3&gt;

&lt;p&gt;The AI SDK is everywhere: model-provider abstraction with &lt;code&gt;useChat&lt;/code&gt; / &lt;code&gt;useCompletion&lt;/code&gt; hooks. Not a UI library at its core, but Vercel has been expanding into actual components with &lt;strong&gt;AI Elements&lt;/strong&gt; — composable React components on top of the SDK.&lt;/p&gt;

&lt;p&gt;Worth mentioning separately: the &lt;strong&gt;Vercel AI Chatbot&lt;/strong&gt; is the official open-source reference implementation built on this stack. Many teams use it as a starting point or benchmark for what a production chat UI looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Anyone already in the Vercel ecosystem. AI Elements is worth evaluating alongside assistant-ui if you're on Next.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; The Vercel stack has gravitational pull. You start with &lt;code&gt;useChat&lt;/code&gt;. Six months later you're on Vercel hosting. Each step made sense individually — the cumulative effect is ecosystem lock-in that's softer than CopilotKit's but real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock-in type:&lt;/strong&gt; Ecosystem.&lt;/p&gt;




&lt;h3&gt;
  
  
  TanStack AI — alpha, framework-agnostic hooks — MIT
&lt;/h3&gt;

&lt;p&gt;TanStack — the team behind React Query, React Router, React Table — launched their AI toolkit. Framework-agnostic core, adapters for React, Solid, vanilla JS. Headless, type-safe.&lt;/p&gt;

&lt;p&gt;Important context: this is alpha from a team with a strong track record of shipping production-grade, widely-adopted tools. That's different from "alpha from unknowns." If it matures the way React Query did, this will be a serious foundation layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Nobody in production yet. Watch this space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; No pre-built UI components — hooks and utilities, not a chat interface. Vue and Angular adapters aren't there. Not ready for production today.&lt;/p&gt;




&lt;h3&gt;
  
  
  Google A2UI — declarative format for agent-generated UI
&lt;/h3&gt;

&lt;p&gt;Agents send JSON describing which components to render; your frontend renders them from a trusted catalog. No executable code from the agent — no XSS nightmares. Framework-agnostic by design. Ships initial renderers for Lit, Angular, Flutter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Teams building agent-generated dynamic UIs. The CopilotKit integration is worth watching, and this is one of the more interesting directions for generative UI / RSC-style patterns outside the React ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; It's an infrastructure layer, not a component library. Not something you'd drop into a project and ship today.&lt;/p&gt;




&lt;h3&gt;
  
  
  Deep Chat ⭐ ~3.3k — Web Component, framework-agnostic — MIT
&lt;/h3&gt;

&lt;p&gt;The one that made me sit up. A single Web Component for AI chat — framework-agnostic, built-in connections to OpenAI, HuggingFace, Cohere, Azure, Stability AI, AssemblyAI out of the box. Ships with speech-to-text, text-to-speech, file uploads, image handling.&lt;/p&gt;

&lt;p&gt;Time-to-working-chat: under 10 minutes. No backend glue required to get started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Prototypes, internal tools, non-React projects, or anywhere chat is a feature rather than the core experience. Best option when you need something working fast that doesn't care about your frontend framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it hurts:&lt;/strong&gt; One component with configuration options, not a composable system. When you need to restructure layout, inject custom UI between messages, or add domain-specific controls — you're working within what the property API can express. Same tradeoff as any "convention over composition" approach: faster start, less flexibility when requirements diverge from defaults.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock-in type:&lt;/strong&gt; API-surface.&lt;/p&gt;




&lt;h3&gt;
  
  
  Chainlit ⭐ ~11.4k — Python-first, full-stack
&lt;/h3&gt;

&lt;p&gt;The go-to for Python developers who wanted a chat UI without touching JavaScript. Write your agent in Python, get a polished web UI with reasoning steps, file uploads, markdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caveat:&lt;/strong&gt; The original team stepped back from active development in May 2025. Community maintainers have picked it up. Worth verifying current project status before building on it.&lt;/p&gt;




&lt;h2&gt;
  
  
  One more thing: "Chat UI" is becoming "Agent UI"
&lt;/h2&gt;

&lt;p&gt;Streaming is solved. Every library handles it well now — it's no longer a differentiator.&lt;/p&gt;

&lt;p&gt;What's not solved is composition for agent-specific UI patterns: approval flows, reasoning traces, tool execution displays, cost transparency. These are becoming table stakes, not features. Libraries that only solve the messaging problem will feel incomplete within a year.&lt;/p&gt;

&lt;p&gt;Generative UI (agents that emit UI, not just text) is the next frontier — watch A2UI + CopilotKit here, and the RSC patterns in the Vercel ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Loquix — what I built, and why you probably shouldn't use it yet
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Repeat disclosure:&lt;/strong&gt; this is my library. Everything below is me describing my own work. The same "where it hurts" standard I applied above applies here too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;None of the options above fit my specific situation: a product where the customer's frontend framework isn't fixed, and I wanted composable building blocks rather than a monolithic widget or agent runtime.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/loquix-dev/loquix" rel="noopener noreferrer"&gt;Loquix&lt;/a&gt; — a Web Components library on Lit, specifically for AI chat interfaces. (&lt;code&gt;npm install @loquix/core&lt;/code&gt;)&lt;/p&gt;

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

&lt;h3&gt;
  
  
  The approach
&lt;/h3&gt;

&lt;p&gt;35 individual Web Components that compose like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;loquix-chat-container&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;loquix-chat-header&lt;/span&gt; &lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loquix-model-selector&lt;/span&gt; &lt;span class="na"&gt;slot=&lt;/span&gt;&lt;span class="s"&gt;"actions"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/loquix-chat-header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;loquix-message-list&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loquix-message-item&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"assistant"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;loquix-message-content&lt;/span&gt; &lt;span class="na"&gt;streaming&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;loquix-message-actions&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;loquix-action-copy&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;loquix-action-feedback&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/loquix-message-actions&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/loquix-message-item&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/loquix-message-list&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;loquix-chat-composer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loquix-prompt-input&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loquix-drop-zone&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/loquix-chat-composer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/loquix-chat-container&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verbose, yes. But when your designer says "move feedback above the message" — you move the component. No prop drilling, no checking if &lt;code&gt;feedbackPosition&lt;/code&gt; is a valid prop value.&lt;/p&gt;

&lt;p&gt;Backend integration is a type-only interface with no runtime dependency on any specific provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AgentProvider&lt;/span&gt; &lt;span class="p"&gt;{&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;messages&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;options&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;SendOptions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReadableStream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;Works in React, Vue, Svelte, Angular, vanilla JS. &lt;code&gt;@loquix/react&lt;/code&gt; ships with proper wrappers for React's synthetic event system. Vue/Svelte dedicated packages are planned, not shipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lock-in type:&lt;/strong&gt; Platform (Web Components/Shadow DOM model, Lit if you extend components deeply) — just at the browser standards level rather than the library level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it hurts — same standard as above
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No production deployments.&lt;/strong&gt; I can't point you to a production app using Loquix. That's a significant unknown that none of the other libraries in this review share.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small community.&lt;/strong&gt; No Stack Overflow answers. You'll be reading source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incomplete roadmap.&lt;/strong&gt; Reasoning traces, citations, cost estimates — Phase 4 and 5 — still in development. If you need those today, build them yourself or wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lit learning curve.&lt;/strong&gt; Consuming is easy. Deep customization requires understanding Lit's reactive model and Shadow DOM. React developers find this counterintuitive at first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No built-in provider integrations.&lt;/strong&gt; Deep Chat connects to OpenAI in 10 minutes. assistant-ui integrates with Vercel AI SDK out of the box. Loquix gives you a TypeScript interface and says "implement it." Better for experienced teams; more friction for everyone else — the same critique I'd apply to any library that takes this approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete example where assistant-ui wins:&lt;/strong&gt; chat UI integrating with Vercel AI SDK's &lt;code&gt;useChat&lt;/code&gt;, rendering generative UI streamed from server, thread persistence, all in Next.js. With assistant-ui: well-documented, battle-tested. With Loquix: you'd be wiring streaming yourself, no RSC integration (Web Components and React Server Components don't mix naturally), and you'd be the first person to try this combination in production. Hard to justify.&lt;/p&gt;

&lt;p&gt;If your situation is specifically "multi-framework team that wants composable components and is willing to be an early adopter" — evaluate it. Otherwise, the options above are more pragmatic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The decision table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Maturity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React + Next.js&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;assistant-ui&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full agent framework, generative UI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CopilotKit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider abstraction + React&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vercel AI SDK + AI Elements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick prototype, non-React, embedded widget&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deep Chat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python-first backend&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Chainlit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Check project status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-framework + composable, early adopter&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/loquix-dev/loquix" rel="noopener noreferrer"&gt;Loquix&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🚧 No production deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent-generated dynamic UI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A2UI + CopilotKit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;👀 Watch this space&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Greenfield vs. brownfield:&lt;/strong&gt; heavier frameworks (CopilotKit, Vercel full stack) accelerate you on greenfield when you're choosing everything fresh. Thinner UI layers (assistant-ui, Deep Chat, Loquix) cause less friction on brownfield where the architecture already exists.&lt;/p&gt;




&lt;p&gt;The days of spending weeks building chat UI from scratch are over. Pick a library, commit, and spend your engineering time on the thing that actually differentiates your product.&lt;/p&gt;

&lt;p&gt;If I missed a library you've used in production, drop it in the comments.&lt;/p&gt;

&lt;p&gt;Unless you enjoy writing auto-scroll logic at 2 AM. In which case, I have a &lt;code&gt;useEffect&lt;/code&gt; cleanup function I'd like to sell you.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>webcomponents</category>
    </item>
  </channel>
</rss>
