use-stick-to-bottom
Zero-dependency React hook and component that keeps AI chat scrolled to the bottom as content streams in.
Repository Health
Technical Analysis
use-stick-to-bottom is a lightweight, zero-dependency React hook and companion component designed for AI chat interfaces, where new messages and streamed tokens continuously grow the message list. It automatically keeps the scroll container pinned to the bottom and smoothly animates content into place, while letting users escape the lock the moment they scroll up.
Built on the modern ResizeObserver API rather than CSS overflow-anchor, it works consistently across browsers (including Safari), handles content that both grows and shrinks, and correctly manages scroll anchoring so off-screen resizes don’t cause visible jumps. A custom velocity-based spring animation makes streaming content feel natural instead of relying on fixed-duration easing.
What You Get
- A useStickToBottom hook that returns scrollRef and contentRef to wire up any existing scroll container
- A ready-made StickToBottom component with a Content subcomponent and React context so children can read isAtBottom and call scrollToBottom
- A custom velocity-based spring scrolling animation with configurable damping, stiffness, and mass
- Automatic user-escape detection that cancels stickiness when the user scrolls up, without debouncing
- Correct scroll-anchoring behavior so content resizing above the viewport doesn’t cause visible jumps
Common Use Cases
- Keeping an AI chatbot conversation pinned to the latest streamed tokens
- Auto-scrolling a live log or terminal output view as new lines arrive
- Maintaining bottom position in a real-time messaging or comments feed
- Adding a scroll-to-bottom button that appears only when the user has scrolled away
Under The Hood
Architecture
The package is split into three source files under src/: useStickToBottom.ts holds the core logic, StickToBottom.tsx wraps it in a component plus React context, and index.ts re-exports both. The hook manages a rich mutable StickToBottomState (scrollTop, targetScrollTop, velocity, escapedFromLock, isAtBottom, and a live ResizeObserver) held in refs to avoid re-renders, and drives a custom animation loop via requestAnimationFrame. A ResizeObserver on the content element detects growth and shrinkage, recomputes the target scroll position, and either snaps or spring-animates toward it; scrollToBottom returns a Promise<boolean> that resolves true on success or false if the scroll is cancelled by the user scrolling up.
Tech Stack
Written in TypeScript (~97% of the codebase) with zero runtime dependencies and a single peer dependency on React (^16.8 through ^19). It builds to ESM with tsc -b and vite-plugin-dts for type declarations, uses Biome for linting/formatting, and ships a Vite + Tailwind demo app. It relies only on standard browser APIs (ResizeObserver, requestAnimationFrame) rather than CSS overflow-anchor.
Code Quality
The code is strongly typed with exported interfaces for state, options, spring parameters, and the context, and uses an isomorphic layout-effect guard for SSR safety. Logic is dense but well-commented, with documented defaults for the spring animation. There is no automated test suite in the repository; correctness is exercised through the interactive demo app rather than unit tests, which is the main quality gap.
API Design
The public surface is deliberately small and ergonomic: a hook returning refs for full control, or a drop-in StickToBottom/StickToBottom.Content component pair plus a useStickToBottomContext hook for children. Options like resize, initial, and per-call scroll behavior are consistently named, and JSDoc on options documents defaults inline, making it approachable for common chat use cases with minimal boilerplate.
Used by 27 apps in this directory
Llama Coder
AI Development · Low Code Platforms
Generate multi-file web apps from a single prompt using open-source LLMs — an open-source alternative to Claude Artifacts.
Markdrop
Note Taking
Visual drag-and-drop markdown editor with GitHub-specific blocks, cloud sync, and offline PWA support
Mastra Code
AI Code Assistants
"A coding agent that never compacts" — a terminal-based AI coding agent built on the Mastra framework, with Observational Memory instead of context compaction, multi-model support, and OAuth login for Claude Max or ChatGPT Plus.
Midday
Invoicing Finance · Productivity
All-in-one AI-powered business operations platform for freelancers and solo entrepreneurs to manage invoicing, time tracking, banking, and financial intelligence.
nao
AI Development · Analytics
Build and deploy an open-source analytics agent that understands your data warehouse and answers business questions in plain English.
Novu
Developer Tools
Open-source communication infrastructure that connects your products and AI agents to every channel your users live on — Inbox, Email, SMS, Push, Chat, and more.
Onlook
AI Design Tools · Design Tools
An open-source, AI-first visual editor that lets designers and developers build, style, and deploy React apps directly in code — no handoff required.
Open Scouts
AI Agents · Automation
Create automated AI scouts that continuously search the web and send email alerts when they find what you're looking for.
OpenPanel
Analytics
Open-source Mixpanel alternative with session replay, MCP integration, and privacy-first product analytics you fully control.