"Spotify Wrapped, but for your group chat."
Chat Vibe is a full-stack web app that transforms a raw WhatsApp .txt export into a beautiful, animated analytics dashboard β complete with activity heatmaps, emoji leaderboards, and 8 hilariously accurate "Hall of Shame" awards.
| Feature | Description |
|---|---|
| Dashboard | Animated counters, heatmap, area chart, donut chart, word cloud |
| Hall of Shame | 8 trading-card style awards (Ghost, Novelist, Spammer, etc.) |
| Member Deep Dive | Per-user radar chart, hourly bar chart, monthly line chart |
| Drag & Drop Upload | Animated file drop zone with progress bar |
| Responsive Design | Bento-box grid on desktop, single column on mobile |
| Cream/Periwinkle/Mint | "Digital Soft Pop" design system |
chat-vibe/
βββ backend/
β βββ main.py # FastAPI server β upload endpoint
β βββ parser.py # WhatsApp .txt β pandas DataFrame
β βββ analyzer.py # All stats calculations
β βββ requirements.txt
β
βββ frontend/
β βββ index.html
β βββ vite.config.js # Dev proxy: /api β localhost:8000
β βββ tailwind.config.js
β βββ src/
β β βββ App.jsx # Root: state, navbar, routing
β β βββ index.css # Global styles + Tailwind
β β βββ components/
β β βββ LandingScreen.jsx # Pre-upload hero
β β βββ UploadModal.jsx # Drag-and-drop modal
β β βββ Dashboard.jsx # Main analytics grid
β β βββ HallOfShame.jsx # 8 award cards
β β βββ MemberAnalysis.jsx # Individual user view
β βββ package.json
β
βββ README.md
| Library | Purpose |
|---|---|
| FastAPI | HTTP API framework (async, fast, auto-docs) |
| pandas | Data manipulation β groupby, aggregations, etc. |
| emoji | Emoji extraction and counting from message text |
| uvicorn | ASGI server to run FastAPI |
| python-multipart | Required for UploadFile in FastAPI |
| Library | Purpose |
|---|---|
| React 18 | Component-based UI |
| Vite | Lightning-fast dev server + bundler |
| Tailwind CSS | Utility-first CSS (cream/periwinkle theme) |
| Framer Motion | Page transitions, card hovers, count animations |
| Recharts | Responsive charts (Bar, Area, Radar, Pie, Line) |
| Lucide React | Icon set |
| Axios | HTTP client for API calls |
Make sure you have these installed before starting:
- Python 3.10+ β
python --version - Node.js 18+ β
node --version - npm 9+ β
npm --version
# If you have git:
git clone <your-repo-url> chat-vibe
cd chat-vibe
# Or just unzip the downloaded folder and cd into it
cd chat-vibe# Navigate to the backend folder
cd backend
# Create a virtual environment named "venv"
python -m venv venvThis creates a folder backend/venv/ that contains an isolated Python environment.
Nothing is installed globally β everything stays inside venv/.
# On macOS / Linux:
source venv/bin/activate
# On Windows (Command Prompt):
venv\Scripts\activate.bat
# On Windows (PowerShell):
venv\Scripts\Activate.ps1You'll know it's active when you see (venv) at the start of your terminal prompt.
pip install -r requirements.txtThis installs: fastapi, uvicorn, pandas, emoji, python-multipart.
uvicorn main:app --reload --port 8000| Flag | Meaning |
|---|---|
main:app |
Run the app object from main.py |
--reload |
Auto-restart when you edit Python files |
--port 8000 |
Listen on port 8000 |
β You should see:
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process
You can verify the API is alive by visiting: http://localhost:8000/api/health
Leave this terminal running and open a new terminal for the frontend.
# From the project root:
cd frontendnpm installThis reads package.json and installs React, Vite, Tailwind, Framer Motion, Recharts, etc. into node_modules/.
npm run devβ You should see:
VITE v5.x.x ready in 300ms
β Local: http://localhost:5173/
β Network: http://192.168.x.x:5173/
Go to http://localhost:5173 in your browser.
How the proxy works: Vite is configured (in
vite.config.js) to forward any request starting with/apitohttp://localhost:8000. This means when the frontend calls/api/upload, it actually hits your FastAPI server β no CORS issues during development.
- Open the group chat in WhatsApp
- Tap the group name at the top
- Scroll down β tap "Export Chat"
- Select "Without Media"
- Save the
.txtfile to your device and transfer to your computer
- Open the group chat
- Tap the group name at the top
- Scroll down β tap "Export Chat"
- Select "Without Media"
- Use AirDrop, email, or iCloud Drive to get the
.txtfile to your computer
Note: The parser handles both Android and iOS export formats, including 12-hour and 24-hour timestamp styles.
The parser couldn't recognize your file's timestamp format.
Fix: Open your .txt file in a text editor and check the first few lines. Common formats:
[12/25/2023, 3:45:00 PM] Alice: Helloβ bracketed iOS25/12/2023, 15:45 - Alice: Helloβ Android dash format
If your format is different (e.g., MM/DD/YY vs DD/MM/YY), the parser's _parse_timestamp function in parser.py tries many combinations automatically. If it still fails, check the date order in your file and adjust date_formats in parser.py.
pip install emoji --upgrade- Make sure FastAPI is running on port 8000:
curl http://localhost:8000/api/health - Make sure you started frontend with
npm run dev(notnpm run build) - The Vite proxy only works in development mode
Run this once to allow script execution:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser# For backend (kills whatever is on port 8000):
lsof -ti:8000 | xargs kill -9 # macOS/Linux
netstat -ano | findstr :8000 # Windows β then: taskkill /PID <PID> /F
# Change the backend port:
uvicorn main:app --reload --port 8001
# Then update vite.config.js proxy target to http://localhost:8001FastAPI automatically generates interactive docs at: http://localhost:8000/docs
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Liveness check |
POST |
/api/upload |
Upload + analyze a .txt file |
GET |
/api/member?name=Alice |
Member deep-dive (requires prior upload) |
{
"success": true,
"filename": "WhatsApp Chat.txt",
"global_stats": { "total_messages": 12500, ... },
"heatmap": [{ "day": "Mon", "hour": 14, "count": 42 }, ...],
"day_of_week": [{ "day": "Mon", "messages": 1200 }, ...],
"monthly_timeline": [{ "month": "Jan 2024", "messages": 800 }, ...],
"message_breakdown": [{ "name": "Text", "value": 11000 }, ...],
"top_emojis": [{ "emoji": "π", "count": 450 }, ...],
"leaderboard": [{ "name": "Alice", "messages": 3500, "percentage": 28.0, "rank": 1 }, ...],
"word_cloud": [{ "text": "bro", "value": 85 }, ...],
"hall_of_shame": { "ghost": { "winner": "Bob", ... }, ... },
"members": ["Alice", "Bob", "Charlie"]
}# In each terminal:
CTRL + CTo deactivate the Python virtual environment:
deactivate- Your chat data is processed entirely on your own machine
- Nothing is sent to any external server
- The backend holds parsed data in memory only (cleared when the server restarts)
- No database, no logging of message content
MIT β do whatever you want with it.