| π§ Multi-Model Up to 20 AI models simultaneously |
β‘ Real-time SSE Token-by-token streaming |
π 100% Free 24 models, zero API key needed |
π Encrypted AES-256-GCM key storage |
π Live DemoβΒ·ββ‘ Quick StartβΒ·βπ‘ API DocsβΒ·βπ€ Contribute
MirraSync is an open-source multi-AI chat platform that lets you fire one prompt at up to 20 AI models simultaneously and watch their answers stream in side-by-side β no API keys required, no cost, no limits. Built for developers, researchers, and curious minds who want to see how different AI models think.
| π§ Multi-Model | β‘ Real-time | π Free |
|---|---|---|
| Up to 20 models at once | Token-by-token SSE streaming | 24 models, no key needed |
π€ Core AI Experience
- Multi-model parallel chat β Fire 1β20 AI models simultaneously on the same prompt, responses stream independently
- Real-time SSE streaming β Token-by-token streaming into isolated columns, zero latency feel
- 32+ models across 8 providers β 24 free-to-use + 8 Pro models unlockable with your own API key
- Single model mode β Falls back to a clean classic chat UI when one model is active
- Context window control β Tune how much conversation history each model receives
ποΈ Smart Input
- File & image attachments β Drag-drop JPG, PNG, WEBP, GIF, PDF, TXT, MD, CSV, DOCX (max 10MB / 5 files)
- Voice input β Web Speech API with live transcription overlay
- Prompt Cleaner β One click: AI rewrites your prompt for clarity and shows a visual diff
- Markdown rendering β Full GitHub-Flavored Markdown with syntax-highlighted code blocks
π Authentication
- Email + password with 6-digit OTP email verification
- Google OAuth one-click sign-in
- Forgot / reset password via branded email link
- Guest access β unlimited messages with rate limiting, zero sign-up required
πΎ User & Conversation Management
- Full chat history stored in MySQL, grouped by date in sidebar
- Rename, pin, archive, and delete conversations
- Bring-your-own API keys β stored AES-256-GCM encrypted at rest
- Unlock Pro models just by adding your own valid provider API key
- User preferences: default models, context size, model order, theme, language
π Homepage
- RAG Chatbot β AI assistant trained on project knowledge (Groq-powered)
- Animated model marquee with provider SVG logos
- Compare Plans pricing table
- Framer Motion animated feature showcase cards
- Scroll-to-top button
π¨ Design System
- Dark mode default, full light mode toggle (homepage always dark)
- 100% custom UI β no shadcn, no Tailwind, pure CSS variables
- Fully responsive β 300px to 4K, mobile-first
- Custom scrollbars, dropdowns, modals, toasts, toggles
- Framer Motion micro-animations throughout
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | React 18 + React Router v6 | SPA routing & UI |
| Styling | CSS Custom Properties | Design token system |
| Animations | Framer Motion | Page & component transitions |
| State | Zustand | Lightweight global stores |
| Backend | Express.js (Node.js) | REST API + SSE server |
| ORM | Prisma | Type-safe DB access |
| Database | MySQL | Persistent storage |
| Auth | JWT + bcryptjs | Session & password security |
| OAuth | Google Identity Services | Social sign-in |
| Nodemailer (Gmail SMTP) | OTP & reset emails | |
| File Storage | Cloudinary | Image & document hosting |
| AI Streaming | Server-Sent Events (SSE) | Real-time token delivery |
| Encryption | Node.js crypto AES-256-GCM |
API key at-rest encryption |
| Markdown | react-markdown + remark-gfm | Rich response rendering |
| Highlighting | react-syntax-highlighter | Code block theming |
All 24 free models work out of the box β no API key required. Add your own key to unlock Pro tier.
π GitHub Models
| Model | ID | ποΈ Vision | π§ Reasoning |
|---|---|---|---|
| GPT-5 | openai/gpt-5 |
β | β |
| Grok 3 | xai/grok-3 |
β | β |
| DeepSeek R1 0528 | deepseek/deepseek-r1-0528 |
β | β |
π΅ Google AI Studio
| Model | ID | ποΈ Vision | π§ Reasoning |
|---|---|---|---|
| Gemini 2.5 Flash | gemini-2.5-flash |
β | β |
| Gemini 3 Flash | gemini-3-flash |
β | β |
| Gemini 3.1 Flash Lite | gemini-3.1-flash-lite |
β | β |
β‘ Groq
| Model | ID | ποΈ Vision | π§ Reasoning |
|---|---|---|---|
| Kimi K2 Instruct | moonshotai/kimi-k2-instruct |
β | β |
| Llama 4 Scout | meta-llama/llama-4-scout-17b-16e-instruct |
β | β |
| Qwen3-32B | qwen/qwen3-32b |
β | β |
π§ Cerebras Β· Cohere Β· Mistral Β· OpenRouter Β· Cloudflare Workers AI
Cerebras
| Model | ID | Note |
|---|---|---|
| GPT-OSS 120B | gpt-oss-120b |
Fastest inference anywhere |
| Llama 3.1 8B | llama3.1-8b |
Near-instant responses |
Cohere
| Model | ID | Note |
|---|---|---|
| Command A Reasoning | command-a-reasoning-08-2025 |
Exclusive reasoning model |
| Command A Vision | command-a-vision-07-2025 |
Exclusive vision model |
| Aya Expanse 32B | c4ai-aya-expanse-32b |
23+ languages |
Mistral
| Model | ID | ποΈ |
|---|---|---|
| Mistral Small 3.1 | mistral-small-2503 |
β |
| Mistral Large | mistral-large-latest |
β |
| Codestral | codestral-latest |
β |
OpenRouter
| Model | ID | Note |
|---|---|---|
| Hermes 3 Llama 405B | nousresearch/hermes-3-llama-3.1-405b |
Largest open-source LLM |
| Step 3.5 Flash | stepfun/step-3.5-flash |
Exclusive provider |
| Qwen3 Coder | qwen/qwen3-coder |
Coding specialist |
Cloudflare Workers AI
| Model | ID | Note |
|---|---|---|
| IBM Granite 3 8B | @ibm/granite-3-8b-instruct |
Enterprise-grade IBM |
| Qwen QwQ 32B | @cf/qwen/qwq-32b |
Reasoning specialist |
| GLM 4.7 Flash | @cf/zhipuai/glm-4-32b-0520 |
Chinese frontier AI |
| Feature | π€ Guest | π Free | β Pro (Soon) |
|---|---|---|---|
| Messages | Unlimited (10/min) | Unlimited (20/min) | Unlimited (highest) |
| Available models | 10 | 24 | 32+ |
| Active models at once | 3 | 10 | 20 |
| Chat history | β | β | β |
| File uploads | β | β | β |
| Custom API keys | β | β | β |
| Pro model unlock (own key) | β | β | Included |
- Node.js 18+
- MySQL 8+ (local or cloud)
- npm / yarn
git clone https://github.com/Misrilal-Sah/MirraSync.git
cd MirraSync
# Backend
cd backend && npm install
# Frontend
cd ../frontend && npm install# Backend
cd backend
cp .env.example .env
# Frontend
cd ../frontend
cp .env.example .envπ Full backend .env reference
# βββ App βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NODE_ENV=development
PORT=5000
FRONTEND_URL=http://localhost:3000
# βββ JWT βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
JWT_SECRET=your_random_32_char_secret_here
JWT_EXPIRES_IN=7d
# βββ Encryption ββββββββββββββββββββββββββββββββββββββββββββββββ
# Generate: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
ENCRYPTION_KEY=your_64_char_hex_key_here
# βββ Database ββββββββββββββββββββββββββββββββββββββββββββββββββ
DATABASE_URL=mysql://root:password@localhost:3306/mirrasync
# βββ Google OAuth ββββββββββββββββββββββββββββββββββββββββββββββ
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
# βββ Email (Gmail) βββββββββββββββββββββββββββββββββββββββββββββ
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_EMAIL=[email protected]
SMTP_PASSWORD=your_gmail_app_password
SMTP_FROM_NAME=MirraSync
# βββ Cloudinary ββββββββββββββββββββββββββββββββββββββββββββββββ
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
# βββ AI Providers ββββββββββββββββββββββββββββββββββββββββββββββ
GITHUB_MODELS_API_KEY=github_pat_xxxxxxxxxxxx
GITHUB_MODELS_BASE_URL=https://models.github.ai/inference
GOOGLE_AI_API_KEY=AIzaSy_xxxxxxxxxxxx
GOOGLE_AI_BASE_URL=https://generativelanguage.googleapis.com/v1beta
GROQ_API_KEY=gsk_xxxxxxxxxxxx
GROQ_BASE_URL=https://api.groq.com/openai/v1
CEREBRAS_API_KEY=csk-xxxxxxxxxxxx
CEREBRAS_BASE_URL=https://api.cerebras.ai/v1
COHERE_API_KEY=your_cohere_key
COHERE_BASE_URL=https://api.cohere.com/v2
MISTRAL_API_KEY=your_mistral_key
MISTRAL_BASE_URL=https://api.mistral.ai/v1
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxx
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
CLOUDFLARE_API_KEY=your_cloudflare_api_key
CLOUDFLARE_ACCOUNT_ID=your_account_id
CLOUDFLARE_BASE_URL=https://api.cloudflare.com/client/v4/accountsπ Frontend .env reference
REACT_APP_API_URL=http://localhost:5000/api
REACT_APP_GOOGLE_CLIENT_ID=your_google_client_id_herecd backend
# Create all tables from Prisma schema
npx prisma db push
# (Optional) Open the visual DB browser
npx prisma studio# Terminal 1 β Backend (http://localhost:5000)
cd backend && npm run dev
# Terminal 2 β Frontend (http://localhost:3000)
cd frontend && npm startOpen http://localhost:3000 β you're live. π
| Table | Description |
|---|---|
User |
Account info, theme, language preferences |
OtpToken |
Email verification & password-reset tokens |
ApiKey |
AES-256-GCM encrypted user-provided keys |
Conversation |
Chat threads with associated model list |
Message |
User turns + per-model AI responses |
UserPreferences |
Default models, context size, column order |
npx prisma db push # Apply schema (dev)
npx prisma generate # Regenerate client after changes
npx prisma studio # Visual DB browser
npx prisma migrate dev # Create versioned migration
npx prisma migrate reset # β οΈ Wipe & reseed (destructive)Base URL:
/apiβ all endpoints prefixed.
π Authentication
| Method | Endpoint | Description | Auth |
|---|---|---|---|
POST |
/auth/signup |
Register with email + password | β |
POST |
/auth/login |
Login β JWT | β |
POST |
/auth/verify-email |
Verify 6-digit OTP | β |
POST |
/auth/resend-otp |
Re-send OTP email | β |
POST |
/auth/forgot-password |
Send reset link | β |
POST |
/auth/reset-password |
Set new password | β |
GET |
/auth/verify-reset-token/:token |
Validate reset token | β |
POST |
/auth/google |
Google ID token β JWT | β |
π€ User & Preferences
| Method | Endpoint | Description |
|---|---|---|
GET |
/user/me |
Get profile |
PATCH |
/user/me |
Update name / theme / language |
PATCH |
/user/me/avatar |
Update avatar URL |
PATCH |
/user/me/password |
Change password |
DELETE |
/user/me |
Delete account |
GET |
/user/me/preferences |
Get AI preferences |
PUT |
/user/me/preferences |
Save AI preferences |
π¬ Chat & Conversations
| Method | Endpoint | Description |
|---|---|---|
POST |
/chat/stream |
SSE β stream AI response |
POST |
/chat/save-user-message |
Persist user message |
GET |
/conversations |
List all conversations |
POST |
/conversations |
Create conversation |
GET |
/conversations/:id |
Fetch conversation + messages |
PATCH |
/conversations/:id |
Rename / pin / update models |
DELETE |
/conversations/:id |
Delete conversation |
DELETE |
/conversations |
Bulk delete { ids: [] } |
π§ API Keys & Utilities
| Method | Endpoint | Description |
|---|---|---|
GET |
/api-keys |
List provider keys (masked) |
PUT |
/api-keys/:provider |
Save / update key |
POST |
/api-keys/:provider/test |
Validate key live |
DELETE |
/api-keys/:provider |
Remove key |
POST |
/upload |
Upload file β Cloudinary |
POST |
/prompt-cleaner |
AI prompt rewrite |
POST |
/chatbot |
RAG chatbot query |
GET |
/messages/registry/all |
Full model registry |
GET |
/health |
Server health check |
π‘ SSE Stream Event Format
event: start
data: {"modelId":"github-gpt-5","model":"GPT-5"}
event: token
data: {"token":"Hello","modelId":"github-gpt-5"}
event: done
data: {"modelId":"github-gpt-5","responseTimeMs":1234,"totalLength":450}
event: error
data: {"modelId":"github-gpt-5","code":"RATE_LIMIT","message":"Rate limit reached..."}
Email + Password Flow
- Register with name, email, password
- A 6-digit OTP is emailed (expires in 10 min)
- Enter OTP on the verify-email page
- JWT issued β valid for 7 days
Passwords hashed with bcrypt (12 salt rounds).
Google OAuth Setup
- Go to console.cloud.google.com β New project
- Enable Google Identity API
- Create OAuth 2.0 Web Application credentials
- Add origin:
http://localhost:3000 - Add redirect URI:
http://localhost:3000 - Copy Client ID β
GOOGLE_CLIENT_IDin both.envfiles
Gmail SMTP App Password
- Google Account β Security β 2-Step Verification β On
- Search "App Passwords" β Generate for "Mail"
- Use the 16-char password as
SMTP_PASSWORD - Use your Gmail address as
SMTP_EMAIL
mirrasync/
βββ backend/
β βββ prisma/
β β βββ schema.prisma # DB schema
β βββ src/
β βββ server.js # Express entry point
β βββ routes/ # auth Β· user Β· chat Β· conversations Β· apiKeys Β· upload
β βββ providers/
β β βββ adapters.js # 8-provider AI adapter layer
β βββ models/
β β βββ registry.js # 32+ model definitions
β βββ middleware/
β β βββ auth.js # JWT guard
β βββ services/
β β βββ email.js # Nodemailer templates
β βββ knowledge/
β β βββ project_knowledge.txt # RAG source document
β βββ utils/
β βββ prisma.js Β· jwt.js Β· encryption.js
β
βββ frontend/
βββ src/
βββ App.js + index.js
βββ pages/ # ChatPage Β· AuthPages Β· LandingPage Β· LogsPage
βββ components/
β βββ chat/ # ModelColumn Β· PromptInput Β· AddModelModal
β βββ layout/ # Sidebar
β βββ settings/ # SettingsModal
β βββ ui/ # Shared UI primitives
β βββ ChatbotWidget.js
βββ stores/ # authStore Β· chatStore Β· uiStore (Zustand)
βββ lib/ # api.js Β· modelRegistry.js
βββ styles/
βββ globals.css # Full design token system
Contributions are welcome! Here's how to get started:
- Fork this repository
- Create a feature branch:
git checkout -b feat/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to the branch:
git push origin feat/amazing-feature - Open a Pull Request
Please keep PRs focused β one feature or fix per PR.
Distributed under the MIT License β free to use, modify, and distribute.
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
MirraSync β Sync Every Mind. One Prompt.
Made with π by Misrilal Sah