Skip to content

rahulpsdev/unsaid-chat-analyzer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

431 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
Unsaid landing page โ€” dark hero with the tagline 'Read between the lines of every conversation' and a WhatsApp chat upload area

Unsaid

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

See the full landing page

Unsaid landing page, full-scroll view โ€” hero, sample report preview, features, privacy section, and footer


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.

How it works

  1. Export a chat from WhatsApp โ€” Chat โ†’ โ‹ฎ โ†’ More โ†’ Export chat โ†’ Without media.
  2. Drop the .txt or .zip into the app (see Run locally below).
  3. Pick whose behaviour you want analysed.
  4. 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.

Features

  • 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 .txt and .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

Tech stack

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
PDF html2canvas + jsPDF
Zip jszip (client-side)

Run locally (recommended โ€” no Supabase required)

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) together

Visit 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).

Pick an LLM provider

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 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.

Run frontend and server separately

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.

Self-hosting

Option A: Single-box deploy (Node + static frontend)

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:server

Put the API behind HTTPS (Caddy, Nginx, Cloudflare Tunnel, or your platform's built-in TLS). Lock down RATE_LIMIT / RATE_WINDOW_MS to taste.

Option B: Supabase Edge Function (hosted path)

1. Create a Supabase project

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

2. Deploy the Edge Function

# 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-chat

3. Set the API key secret

The 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_here

To use a different provider, edit supabase/functions/analyze-chat/index.ts โ€” change the endpoint URL, model, and env-var name.

4. Deploy the frontend

npm run build
# Deploy dist/ to Vercel, Netlify, Cloudflare Pages, or any static host

Swap the AI model

For 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.

Project structure

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)

Contributing

PRs welcome. See CONTRIBUTING.md and the Code of Conduct.

Quick guide:

  1. Fork โ†’ branch โ†’ npm run dev
  2. Click through the full upload โ†’ report flow before opening a PR
  3. 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.

FAQ

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.

Privacy

  • 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.

License

MIT โ€” ยฉ Rahul PS

About the author

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

About

Free, open-source WhatsApp chat analyzer. Upload a chat export, get an AI report on dynamics, patterns, and red flags. Nothing stored

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages