Kiyub
Self-hostable AI chat app that runs on one API key
Personal projectOpen sourceSoonCurrently developing it to be open source friendly since this was originally an app I planned to close source only



1 / 3
Overview
A full-stack AI chat app that runs on one API key. Web client, native mobile client, and a real-time backend, all built around a single LLM gateway so a self-hoster can clone, set one env var, and have their own ChatGPT-alternative running in minutes.
Kiyub is an open-source chat product with productivity surfaces beyond plain conversation: Projects (scoped workspaces with their own files and system prompts), Canvas (a drag-and-drop card graph for non-linear thinking), and Tests (auto-generated quizzes from uploaded documents). No accounts, no analytics vendor, just the app.
Features
- Streaming chat with multi-step reasoning display and inline citations.
- Native web search via OpenRouter's :online suffix, no separate search key.
- Multimodal attachments (images, PDFs, Word docs, audio) processed through OpenRouter.
- Projects: system-prompt-scoped workspaces with per-project files and instructions.
- Canvas: drag-and-drop card graph with typed connections for spatial conversations.
- Test generation: upload a document, get a graded quiz with score tracking.
- Highlight-to-chat: select any text to open a contextual quick-question popup.
- Usage dashboard: token spend, cost, and breakdown by model and usage type.
- Native mobile app (iOS and Android) sharing types and chat pipeline with the web.
Highlights
- One API key, every feature: consolidated five external services into a single OpenRouter gateway, with routing decisions handled server-side in one provider abstraction.
- Refactored from multi-tenant SaaS to single-tenant OSS in a single coordinated pass: ~90 files touched, schema migrated, build kept green throughout.
- Real-time-reactive by default: Convex subscriptions keep conversations, canvas cards, usage metrics, and test progress live without websocket plumbing.
- Shared types across web, mobile, and server, so a schema change triggers compile errors everywhere instead of silent drift.
Built with
WebNext.js 16, React 19, TypeScript, Tailwind CSS, shadcn/ui, Framer Motion, dnd-kit
MobileExpo SDK 54, React Native 0.81, Expo Router, Reanimated
BackendConvex
AI / LLMVercel AI SDK v5, OpenRouter
Infra & Toolingnpm workspaces, Vercel, EAS Build, Convex Cloud