Whirl is an MIT-licensed, full-stack AI chat application built on Next.js and Convex, for anyone who wants to run their own multi-model chat interface — whether for personal use, self-hosting, or contributing to an open-source project.
What it is
Whirl is the complete source behind whirl.chat: a full-stack AI chat app written in TypeScript and published in full under the MIT license. It is built on Next.js 16 and React 19 for the web app, Convex for the database, functions, streaming, and crons, Clerk for authentication, and OpenRouter — used through the AI SDK — to route model requests. Bun workspaces tie the tooling together, and the repository also ships an admin console built with Vite, an Expo-based native app, and a package containing the Convex backend schema, functions, and AI pipeline.
The concrete problem it addresses is that a capable chat interface normally means assembling and maintaining many separate pieces: model routing, persistent memory, document editing, tool integrations, search, and privacy controls. Whirl brings these into one application, replacing a collection of standalone utilities with a single interface where every top model sits in one conversation with adjustable thinking levels, memory carries across chats, and artifacts such as documents, charts, and interactive pages remain editable and shareable.
Key capabilities
- Routes every top model through OpenRouter in a single conversation, with adjustable thinking levels.
- Produces living artifacts — documents, charts, and full interactive pages — that stay editable in a side panel and can be shared by link.
- Connects to your own tools over MCP, with OAuth included, and supports installable skills that teach the app new behaviour.
- Maintains long-term memory that carries preferences and projects across chats, powered by Supermemory when enabled.
- Performs live web search and page reading for answers grounded in the current web, using Exa when configured.
- Offers locked chats encrypted on your device with a password the server never sees, answered only by zero-retention models, alongside an incognito mode.
- Includes message queueing, voice input, image generation, file attachments, folders, sharing, light and dark mode, accent colours, and an installable mobile web app.
Who uses it and how
- Developers self-hosting the app locally and in production, following the repository's self-hosting guide, which covers the Clerk JWT template Convex requires.
- Operators who enable only the integrations they need, adding their own keys for billing (Autumn), search (Exa), memory (Supermemory), analytics (PostHog, Axiom), tracing (Braintrust), email (Resend), and the support agent (Median), with Whirl hiding any features left unconfigured.
- Contributors working across a monorepo that separates the production Next.js app in
apps/v2, an admin console in apps/console, a native app in apps/mobile, and the Convex backend in packages/backend.
- Users who want a mobile experience without a separate install, running Whirl as an installable mobile web app with light and dark mode.
Getting started
Clone the repository, run bun install, create a Convex deployment with bunx convex dev from packages/backend, set the CLERK_JWT_ISSUER_DOMAIN and OPENROUTER_API_KEY secrets, fill in .env.local under apps/v2, and start everything from the repo root with bun run dev to open localhost:3000.
How it compares
No list of paid products this project replaces is given, and the registry names no comparable tools alongside it, so Whirl stands alone here as a self-hosted, MIT-licensed chat application.
When to use it — and when not
A self-hoster must operate a Convex deployment, a Clerk application, and an OpenRouter API key at minimum, and switches on each optional capability — billing, search, memory, analytics, tracing, email, support — separately with its own credentials, so this is not a single-binary install. It suits people comfortable with a Bun, Next.js, and Convex stack who want control over their data and configuration; anyone wanting a zero-setup hosted chat client should look elsewhere. Note also that apps/legacy, the previous web app, is kept only for reference and is not maintained.
project readme (upstream, from github) — read inline

Whirl
The AI chat app that sweats the details. Every top model, real memory,
living documents, and your own tools, in one fast and friendly place.
whirl.chat ·
Self-hosting ·
Architecture ·
Contributing
Whirl is a full-stack AI chat app built on Next.js and Convex. It's the code
behind whirl.chat, published in full under the MIT
license. Read it, run your own, or help make it better.
Features
- Every top model in one conversation, routed through
OpenRouter, with adjustable thinking levels.
- Living artifacts: documents, charts, and full interactive pages that
stay editable in a side panel and can be shared by link.
- Integrations with your own tools over MCP (OAuth included), plus
installable skills that teach Whirl new tricks.
- Long-term memory that carries preferences and projects across chats.
- Live web search and page reading for answers grounded in today's web.
- Locked chats, encrypted on your device with a password the server never
sees, answered only by zero-retention models.
- Incognito mode, message queueing, voice input, image generation, file
attachments, folders, sharing, and a lot of care around motion and polish.
- Light and dark mode, accent colors, and an installable mobile web app.
Tech stack
Everything beyond Convex, Clerk, and OpenRouter is optional and switches
on with its own keys: billing (Autumn), web search (Exa), memory
(Supermemory), analytics (PostHog, Axiom), tracing (Braintrust), email
(Resend), and the support agent (Median). Leave them out and Whirl hides the
features they power. See docs/configuration.md.
Quick start
You'll need Bun, a free Convex
account, a Clerk application, and an
OpenRouter API key.
git clone https://github.com/whirlchat/whirl.git
cd whirl
bun install
# 1. Create a Convex dev deployment and push the backend.
cd packages/backend
bunx convex dev # first run walks you through creating a project
# 2. In another terminal, give the backend its secrets.
bunx convex env set CLERK_JWT_ISSUER_DOMAIN https://your-instance.clerk.accounts.dev
bunx convex env set OPENROUTER_API_KEY sk-or-v1-...
# 3. Point the web app at Convex and Clerk.
cd ../../apps/v2
cp .env.example .env.local # then fill in the four required values
# 4. Run everything from the repo root.
cd ../..
bun run dev
Open localhost:3000 and say hi. The
self-hosting guide covers each step in detail,
including the Clerk JWT template Convex needs and how to deploy to
production.
Repository layout
apps/
v2/ The web app (Next.js). This is the one in production.
console/ Admin console for models, integrations, and skills (Vite)
mobile/ Native app (Expo)
waitlist/ Standalone waitlist page
remotion/ Promo video compositions
legacy/ The previous web app, kept for reference. Not maintained.
packages/
backend/ Convex backend: schema, functions, and the AI pipeline
docs/ Guides for self-hosting, configuration, and architecture
brand/ Logo, colors, banners, and app icons
Documentation
Contributing
Bug reports, ideas, and pull requests are all welcome. Start with
CONTRIBUTING.md, and please follow the
code of conduct. Found a security issue? See
SECURITY.md.
License
MIT © Anterra