Free open-source WhatsApp chat analyzer by Rahul PS
Read between the lines of every conversation โ see the dynamics, patterns, and red flags in any chat.
MIT licensed ยท nothing stored ยท unsaidbyrahulps.lovable.app
Upload a WhatsApp chat export. Pick whose behaviour to analyse. Get a calm, structured 4-minute read โ covering the dynamic, patterns, power balance, red flags, insecurities, and what they're not saying out loud.
No accounts. No stored chats. The text goes to an AI model, the report comes back, and that's it.
- Export a chat from WhatsApp โ Chat โ โฎ โ More โ Export chat โ Without media.
- Drop the
.txtor.zipinto the app (see Run locally below). - Pick whose behaviour you want analysed.
- Read the report. Export as PDF if you want to keep it.
The file is parsed entirely in your browser. Only the truncated text (โค 500K characters) is sent to the AI model for the single inference call. Nothing is stored.
- 10 fixed report sections โ Core Insight โ Dominant Pattern โ Power Dynamic โ Likely Trajectory โ One Thing Not To Do โ Red Flags โ Green Flags โ Personality โ Their Insecurity โ What They're Hiding
- WhatsApp export parser โ supports
.txtand.zip, all locales, iOS and Android formats - PDF export โ download and keep your report
- Sample report at
/sampleโ preview before uploading - Privacy-first โ zero server-side persistence, MIT-licensed, auditable
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite 5, TypeScript, Tailwind CSS v3, Framer Motion, shadcn/ui |
| Backend | Local Node + Express (self-hosted) or Supabase Edge Functions (Deno, hosted) |
| AI | Bring-your-own โ OpenAI, Anthropic, Google Gemini, OpenRouter, or local Ollama |
| html2canvas + jsPDF | |
| Zip | jszip (client-side) |
You run Unsaid entirely on your own machine and plug in whichever LLM you want.
git clone https://github.com/rahulpsdev/unsaid_analyse-your-chat
cd unsaid_analyse-your-chat
npm install
cp .env.example .env # see below โ pick ONE provider and add its key
npm run dev:all # runs the frontend (:8080) + local API (:8787) togetherVisit http://localhost:8080, drop in your WhatsApp export, and read your report.
The frontend, the Express API, the WhatsApp parser, and the PDF renderer all run on your machine. The only thing that leaves your computer is the chat text being POSTed to the LLM provider you chose (or nothing at all if you pick Ollama).
Edit .env and set LLM_PROVIDER to one of the following, plus the matching key:
| Provider | LLM_PROVIDER |
Required env vars | Notes |
|---|---|---|---|
| OpenAI | openai |
OPENAI_API_KEY |
Default. Override the endpoint with OPENAI_BASE_URL for Azure / proxies. |
| Anthropic | anthropic |
ANTHROPIC_API_KEY |
Claude 3.5 Sonnet by default. |
google |
GOOGLE_API_KEY |
Gemini via AI Studio. | |
| OpenRouter | openrouter |
OPENROUTER_API_KEY |
One key, any model on the OpenRouter catalog. |
| Ollama | ollama |
(none) | 100% local. Install ollama.com, then ollama pull llama3.1. |
Optionally set LLM_MODEL to override the per-provider default โ for example
LLM_MODEL=gpt-4o or LLM_MODEL=mistral (for Ollama).
Check it's working at http://localhost:8787/api/health.
npm run dev # Vite on :8080
npm run dev:server # Express on :8787 (hot reload)The dev server proxies /api/* to http://localhost:8787, so the frontend just
calls /api/analyze-chat โ no CORS, no extra config.
The simplest production setup. Build the frontend, serve dist/ from any static
host (Vercel, Netlify, Cloudflare Pages, Nginx, S3+CloudFront), and run
npm run start:server on a small Node host (Fly.io, Render, Railway, a VPS, even
a Raspberry Pi). Point the static frontend at the API by setting
VITE_API_BASE=https://your-api.example.com at build time.
VITE_API_BASE=https://api.example.com npm run build
# upload dist/ to your static host
# on the API box:
LLM_PROVIDER=openai OPENAI_API_KEY=sk-... npm run start:serverPut the API behind HTTPS (Caddy, Nginx, Cloudflare Tunnel, or your platform's
built-in TLS). Lock down RATE_LIMIT / RATE_WINDOW_MS to taste.
Go to supabase.com โ New project. Copy your Project URL and anon key into .env:
VITE_SUPABASE_URL=https://YOUR_PROJECT_ID.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=your_anon_key_here
VITE_SUPABASE_PROJECT_ID=your_project_id_here
# Install Supabase CLI if you haven't
npm install -g supabase
# Link your project
supabase link --project-ref YOUR_PROJECT_ID
# Deploy
supabase functions deploy analyze-chatThe Edge Function calls OpenRouter using a key that must never be in your .env (it's server-side only).
supabase secrets set OPENROUTER_API_KEY=your_openrouter_key_hereTo use a different provider, edit supabase/functions/analyze-chat/index.ts โ change the endpoint URL, model, and env-var name.
npm run build
# Deploy dist/ to Vercel, Netlify, Cloudflare Pages, or any static hostFor the local server, just change LLM_PROVIDER / LLM_MODEL in .env and restart โ
no code edits needed. To add an entirely new provider, drop a file into
server/llm/ that implements the LLMProvider interface in server/llm/types.ts
and register it in server/llm/index.ts.
src/
pages/
Index.tsx Landing page
Sample.tsx Hard-coded sample report
Report.tsx Live report (reads AnalysisContext)
NotFound.tsx 404
components/
HeroSection.tsx Upload flow
ParticipantSelector.tsx Who to analyse dialog
report/
ReportShell.tsx Report layout + PDF export
ReportHero.tsx Report header
ReportTOC.tsx Sticky scroll-spy TOC
ReportSection.tsx Individual section card
PDFReportContent.tsx Off-screen PDF render target
hooks/
useChatUpload.ts Upload โ parse โ analyse pipeline
context/
AnalysisContext.tsx In-memory result store
lib/
parseReport.ts Splits model output into 10 sections
constants.ts APP_NAME, GITHUB_URL, tagline
data/
sampleReport.ts Hard-coded "Sam" sample
server/
index.ts Express app โ /api/analyze-chat + /api/health
systemPrompt.ts The analyzer prompt
llm/
types.ts LLMProvider interface
index.ts Provider router (reads LLM_PROVIDER)
openaiCompatible.ts OpenAI / OpenRouter (any OpenAI-compatible endpoint)
anthropic.ts Claude
google.ts Gemini (AI Studio)
ollama.ts Local Ollama
supabase/
functions/
analyze-chat/
index.ts Edge Function (rate limiting, retry, validation)
PRs welcome. See CONTRIBUTING.md and the Code of Conduct.
Quick guide:
- Fork โ branch โ
npm run dev - Click through the full upload โ report flow before opening a PR
- Keep PRs focused. If it's non-trivial, open an issue first.
What we welcome: Better parsers (iMessage, Telegram, Signal), sharper prompts, accessibility improvements, bug fixes.
What we won't merge: Anything that stores user chats server-side, user tracking, analytics that identify users.
What is Unsaid?
Unsaid is a free, open-source WhatsApp chat analyzer. Upload a WhatsApp chat export and get a structured 10-section AI report on the dynamic, patterns, power balance, red flags, and what's left unsaid.
Is my WhatsApp chat private?
Yes. Your chat file is parsed entirely in your browser. Only the text payload is sent to the AI model for the single inference call. Nothing is stored.
Who made Unsaid?
Built by Rahul PS (@rahulpsdev).
How does the WhatsApp chat analyzer work?
Export a chat from WhatsApp (Chat โ โฎ โ More โ Export chat โ Without media), drop the .txt or .zip into Unsaid, pick whose behaviour to analyse, and read the AI-generated report. You can export the report as a PDF.
Is Unsaid free?
Yes โ 100% free and MIT-licensed. You can also self-host it with your own AI provider key.
- Chat files are parsed entirely in the browser. Nothing is read server-side before analysis.
- The text payload sent to the Edge Function is held in memory only for the single inference call โ never written to a database, never logged.
- No user accounts. No cookies beyond what the hosting provider sets. No analytics on chat content.
- Source is public (MIT). You can verify everything yourself.
Built and maintained by Rahul PS โ @rahulpsdev on GitHub. If Unsaid is useful, a โญ on the repo helps others find it.
Keywords: WhatsApp chat analyzer ยท chat analyzer ยท WhatsApp analyzer ยท free chat analyzer ยท open source WhatsApp analyzer ยท AI chat analysis ยท relationship analysis ยท conversation analyzer ยท WhatsApp chat analyzer GitHub ยท Rahul PS
