Teardown: Chatbot UI, the Most-Cloned AI Chat App, Has 623 Findings and a JWT in a Committed Migration - VibeDoctor 
← All Articles 🔬 Teardowns Critical

Teardown: Chatbot UI, the Most-Cloned AI Chat App, Has 623 Findings and a JWT in a Committed Migration

We scanned mckaywrigley/chatbot-ui: a token in a Supabase migration, a critical form-data CVE, and await-in-map slowing every file upload.

PERF-001 FE-010

Quick Answer

We ran a full VibeDoctor code scan of mckaywrigley/chatbot-ui, the open-source AI chat app with tens of thousands of GitHub stars that countless hosted "ChatGPT for X" products started from. The report: 623 findings (2 critical, 109 high, 400 medium, 112 low), overall score 63/100. The two criticals: a JSON Web Token committed inside a Supabase migration file, and CVE-2025-7783 in form-data 4.0.0. The most expensive finding is quieter: await inside Array.map() on the file-ingestion path, which processes uploads sequentially when it could run them in parallel.

Why This Repo Matters

Chatbot UI is one of the most-forked AI applications on GitHub. When the AI boom hit, it was the fastest way to stand up a ChatGPT-style interface with your own keys - which means its patterns now live inside a very large number of commercial products. It is also a genuinely impressive solo-built codebase shipped at speed. That speed is visible in the report, and the point of this teardown is not the repo - it is what the thousands of products built on top of it inherited.

The Scan

One VibeDoctor codebase scan, run on 2026-06-12. Every number below comes from that report.

MetricResult
Overall score63 / 100
Total findings623
Critical2
High109
Medium400
Low112
Launch verdictNot safe to launch yet - 2 critical issues must be fixed before you ship

Finding 1: A JWT Inside a Committed Database Migration (Critical)

Where: supabase/migrations/20240108234540_setup.sql, line 54.

Secret detection found a JSON Web Token sitting inside a committed SQL migration. Migrations are the worst place for a token to live: they are committed forever, copied into every fork, and replayed against every new environment. Even when the original token is a local-dev artifact, every clone inherits the pattern - and migration files are exactly where nobody ever looks during a code review.

Finding 2: CVE-2025-7783 in form-data (Critical)

The dependency tree pins form-data 4.0.0, which carries a critical 2025 CVE. This is the template-rot problem: the repo predates the advisory, and every product that forked it inherits the vulnerable version until someone runs an audit. If your product started as a chatbot-ui fork, check your lockfile today.

Finding 3: Sequential Awaits on the Upload Hot Path (High)

Where: app/api/retrieval/process/route.ts line 127, app/api/retrieval/process/docx/route.ts line 74, and components/chat/chat-ui.tsx line 85.

await inside Array.map() does not do what it looks like it does: each item waits for the previous one, so a ten-chunk document embeds ten times slower than it should. This sits on the retrieval-ingestion path - the exact feature users judge an AI chat product by. Three occurrences, all on hot paths, all fixable with Promise.all.

The Wall of Highs: Accessibility Debt

The bulk of the 109 high-severity findings is accessibility: interactive divs with no keyboard handlers, non-interactive elements with tab indexes, clickable messages with no key events, SVG icons without titles - across the chat sidebar, file pickers, and message components. This is the signature of UI built at AI-assisted speed: it works perfectly with a mouse and is invisible to a keyboard or screen reader. For anyone selling into companies with accessibility requirements, this is not polish - it is a sales blocker.

The Rest of the Report

Also in the highs: five known advisories in the pinned [email protected], an advisory in serialize-javascript 4.0.0, no React error boundary for an app this size, and a near-zero test ratio for a codebase with hundreds of components. The 400 mediums are the long tail: empty interface declarations and empty destructuring patterns repeated across dozens of components, implicit anys on the API routes, and config hygiene.

The Takeaway

623 findings sounds like noise until you sort it the way a senior engineer would: two criticals you fix today (rotate the token, bump form-data), one performance bug your users feel on every upload, and an accessibility debt you budget for. That sorting - impact first, not raw count - is the whole point of an audit. A fork of this repo that fixed those four things before launch would be ahead of most of its commercial siblings.

Shipping an AI product built on a fork?

A Launch Audit runs this exact report against your app: secrets in places nobody reviews, inherited CVEs, hot-path performance bugs, and a plain-language launch verdict. One-time, per app - no subscription.

GET MY LAUNCH AUDIT →

Diagnose your codebase - free

VibeDoctor checks for PERF-001, FE-010 and 128 other issues across 15 diagnostic areas - security, performance, code quality, and more.

SCAN MY APP →
← Back to all articles View all 129+ checks →