Y
You
Give me the React for a chat thread with a typing indicator.
Five components cover the whole surface. None of them ships a dependency, and most render on the server.
A typing indicator that announces itself once instead of on every token, and auto-scroll that sticks to the bottom only while the reader is already there. Push tokens onto the last message; the thread does the rest.
Fenced blocks with a filename header, a copy button whose accessible name never changes, and horizontal scroll a keyboard user can actually reach. Bring your own highlighter through one render prop.
Six SVG chart types at a separate subpath. Drop a BarChart into a message and it renders as part of the answer — no canvas, no d3, no second package.
Every colour, radius and font is a CSS variable. The emerald on this page is four declarations. Dark mode is one attribute on <html>, and it survives JavaScript being switched off.
Each turn is an <article> so screen readers can step message by message. Charts ship a hidden table of the real numbers. Nothing encodes meaning in colour alone.
One install, one CSS import, no config file, no CLI copying files into your repo. 27 kB gzipped for the whole library, and components render on the server without a client boundary.
There is no config file, no CLI and no code generation step. Three commands and you are rendering messages.
Twenty-odd lines, two components and your own ask(). Nothing has been elided.
'use client'
import { useState } from 'react'
import { ChatThread, ChatInput } from '@the_viveksingh/vivek-ui'
export function Demo() {
const [messages, setMessages] = useState([])
const [pending, setPending] = useState(false)
async function send(text: string) {
setMessages((m) => [...m, { id: crypto.randomUUID(), role: 'user', content: text }])
setPending(true)
const reply = await ask(text) // your backend
setPending(false)
setMessages((m) => [...m, { id: crypto.randomUUID(), role: 'assistant', content: reply }])
}
return (
<>
<ChatThread messages={messages} loading={pending} />
<ChatInput onSubmit={send} placeholder="Ask anything…" />
</>
)
}npm i @the_viveksingh/vivek-uiBoth figures below are inline SVG from @the_viveksingh/vivek-ui/charts — no canvas, no d3, and a hidden data table behind each one so screen readers get the real values.
Twelve weeks across every template built on these components.
| Week | Messages |
|---|---|
| W1 | 18.4K |
| W2 | 24.9K |
| W3 | 31.2K |
| W4 | 29.7K |
| W5 | 42.1K |
| W6 | 55.8K |
| W7 | 61.3K |
| W8 | 78.6K |
| W9 | 92.4K |
| W10 | 88.9K |
| W11 | 104.2K |
| W12 | 126.5K |
Peak week 126,500 messages — rendered, not fetched.
Server-safe components, so most of the tree never depends on hydration succeeding.
27 kB gzipped of CSS for the whole library, 2 kB more for all six charts. React is the only peer.
There is nothing to buy. The second column exists so you can see what the Pricing component does with two plans.
The template, the library, and every component on this page.
There is no Pro tier. This column exists so you can see what the Pricing component does with a second plan.
I had a working assistant UI in front of our inference endpoint in an afternoon. The bit I had budgeted three days for — code blocks, copy buttons, scroll behaviour — was already done.
A chart rendering inside a chat bubble, from the same package as the chat bubble, with no charting dependency. I did not think that was on the menu.
Our audit flagged nine components in the previous stack. This one came back clean — articles per turn, a real table behind every chart, focus you can actually see.
Yes. ChatterBox is UI only — there is no model, no SDK and no API key anywhere in it. The components take messages in and render them, so they sit in front of whatever you already run: Anthropic, OpenAI, Mistral, or an open-weights model on your own hardware. Wire ChatInput’s onSubmit to a server action or a route handler and append tokens to the last message as they arrive.
Yes. VivekUI declares no runtime dependencies at all — only React as a peer. No Tailwind, no styled-components, no icon package, no charting library, no CLI that copies files into your repository. The whole library is 27 kB gzipped of CSS plus the components you actually import, and most of them render on the server with no client boundary.
Yes, and it is worth seeing. Open the demo and type “show me a chart”: the assistant answers with a real SVG BarChart inside the message bubble. Because a message’s content is a React node rather than a markdown string, any component can live inside a turn — and the chart comes from the same zero-dependency package as the thread around it.
Yes. Both the template and VivekUI are MIT licensed, with no attribution requirement, no seat limits and nothing to buy. The footer credit is there because it helps the project; you are free to remove it. A star on GitHub is appreciated.
ChatterBox is a public repository, not a paywalled starter. Nothing is stripped out of the free version, because there is no other version.
Public, MIT licensed, and yours to rename. No build step to configure and no environment variables to set.
git clone https://github.com/intellectwithvivek/chatterbox.gitBuilt by Vivek Kumar Singh to show what VivekUI can do.
MIT licensed. No email capture, no trial, no dashboard to sign up for.