Preview WhatsApp chat exports (
.txtand.zip) directly in your browser β rendered in a WhatsApp Webβstyle interface, with media attachments, light/dark mode, and English/Turkish UI. Nothing is uploaded; everything runs client-side.
A privacy-first viewer that reads the chat history WhatsApp gives you when you tap Export chat on your phone, and displays it the way you remember it from WhatsApp Web β bubbles, dates, avatars, the doodle wallpaper, the lot. Works with both the Without Media (.txt) and Include Media (.zip) export options.
TΓΌrkΓ§e:
.txtveya.zipformatΔ±nda dΔ±Εa aktardΔ±ΔΔ±n WhatsApp sohbetini tarayΔ±cΔ±ya bΔ±rak β WhatsApp Web gΓΆrΓΌnΓΌmΓΌnde ΓΆnizleme yapsΔ±n. Dosyalar yΓΌklenmez, hepsi tarayΔ±cΔ±nda iΕlenir.
- Features
- Screenshots
- Quick start
- How it works
- Supported export formats
- Tech stack
- Project structure
- Configuration
- Privacy
- Roadmap
- Contributing
- License
- Acknowledgments
- Drag-and-drop import β drop a
.txt(without media) or.zip(with media) export onto the page. - WhatsApp Webβstyle UI β sidebar, chat panel, message bubbles with tails, date separators, read ticks, the official doodle wallpaper.
- Media rendering β photos, videos, voice notes, stickers (
.webp), GIFs, and document attachments inflated from the ZIP and shown inline. - Click-to-zoom lightbox β images, videos, and stickers open in an in-page modal (no new tab); navigate between media with
β/β, close withEsc. - Light & dark mode β full WhatsApp Web color palette, with the official chat wallpaper rendered in both light and dark variants.
- Multilingual UI β English and Turkish, with locale-aware date separators (Today / BugΓΌn, Yesterday / DΓΌn, weekday names).
- Smart "me" detection β the most active participant is highlighted as outgoing (green bubbles) by default; switch it from the sidebar.
- Group chat support β sender names and color-tagged identities for group exports.
- Auto-linkified URLs, multi-line messages, system messages (encryption notice, joins/leaves), date pills with Today / Yesterday / weekday formatting.
- Persistent preferences β language and theme choices saved to
localStorage. - Responsive layout β full-width sidebar + chat on desktop, single-pane chat with a hamburger menu on mobile.
- Pure client-side β your chat never leaves the browser; the app has no backend.
| Light | Dark |
|---|---|
![]() |
![]() |
Deployment URL goes here. Until you ship it, run the dev server locally and open
http://localhost:3000.
Requirements: Node.js 18.17+ (Node 20+ recommended) and npm.
git clone https://github.com/<your-username>/whatsapp-chat-export-viewer.git
cd whatsapp-chat-export-viewer
npm install
npm run devOpen http://localhost:3000 and drop in a WhatsApp export.
Don't have an export handy? Drop
docs/sample-chat.txtonto the Without media (.txt) tab to see the viewer in action.
npm run build
npm run startThe build is fully static β every page is prerendered. You can also deploy the output to any static host (Vercel, Netlify, GitHub Pages with a static export, Cloudflare Pages, etc.).
- Open the chat in WhatsApp on your phone.
- Tap the chat name (or the three-dot menu) β More β Export chat.
- Choose Without Media (produces a
.txt) or Include Media (produces a.zip). - Send the file to yourself (email, AirDrop, cloud) and drop it onto this viewer.
βββββββββββββββββββ ββββββββββββββββββββββ βββββββββββββββββββββββ
β File dropped β β β Parsed in-memory β β β Rendered as chat β
β (.txt / .zip) β β (no network I/O) β β (React + Tailwind) β
βββββββββββββββββββ ββββββββββββββββββββββ βββββββββββββββββββββββ
- For
.txt: the file is read withFileReader, thenlib/parseWhatsApp.tswalks each line, detects timestamps (iOS bracketed and Android dash-separated formats), splits sender/message, and stitches multi-line messages back together. - For
.zip: JSZip opens the archive in memory, the chat.txtis located inside, and every media file becomes aBlobβURL.createObjectURL(...). Filenames mentioned in attachment markers are matched to those blob URLs (case-insensitive, with basename fallback) and rendered inline as<img>,<video>,<audio>, sticker, or document download link.
All object URLs are revoked when you load a different chat, so memory doesn't leak.
WhatsApp's export format is locale- and platform-dependent. This parser recognises the common variants:
| Platform | Example header line |
|---|---|
| iOS (most locales) | [12.05.2025 14:23:45] AyΕe: Selam |
| iOS (US/EN) | [5/12/25, 2:23:45 PM] John: Hi |
| Android (TR) | 12.05.2025 14:23 - AyΕe: Selam |
| Android (EN) | 5/12/25, 14:23 - John: Hi |
Attachment markers detected:
| Marker | Source |
|---|---|
<attached: filename.jpg> |
iOS (English) |
<filename.jpg eklendi> |
iOS (Turkish) β verb after filename |
<filename.jpg adjuntado> / joint / angehΓ€ngt / etc. |
iOS (ES / FR / DE / IT / JA / KO / RU) |
filename.jpg (file attached) |
Android (English) |
filename.jpg (dosya eklendi) |
Android (Turkish) |
<Media omitted> / <Medya dahil edilmedi> / image omitted |
Text-only exports (placeholder shown) |
Bidi/RTL formatting marks WhatsApp sprinkles into export lines (LRM, RLM, FSI, PDI, etc.) are stripped before regex matching.
- Next.js 14 App Router (React 18, TypeScript)
- Tailwind CSS 3 with CSS-variable color tokens for theming
- JSZip for in-browser
.zipparsing - No backend, no analytics, no telemetry
.
βββ app/
β βββ icon.svg # auto-detected favicon (WhatsApp app icon)
β βββ layout.tsx # root layout: theme init script, providers
β βββ page.tsx # client page: holds chat state, swaps Dropzone β ChatView
β βββ globals.css # Tailwind base + light/dark CSS variables
βββ components/
β βββ Avatar.tsx # initials avatar with color hashed from name
β βββ ChatView.tsx # WA Web layout: sidebar + chat panel + lightbox host
β βββ Dropzone.tsx # landing screen with TXT/ZIP tabs + drag-drop
β βββ I18nProvider.tsx # locale context + dictionary lookup
β βββ LanguageSwitcher.tsx
β βββ Lightbox.tsx # in-page image/video viewer with keyboard nav
β βββ MessageBubble.tsx # single message: bubble, attachment, timestamp
β βββ ThemeProvider.tsx # light/dark + FOUC-safe init script
β βββ ThemeSwitcher.tsx
βββ lib/
β βββ format.ts # date/time/avatar helpers
β βββ i18n.ts # TR + EN dictionaries
β βββ loadChat.ts # file β parsed chat (txt or zip)
β βββ parseWhatsApp.ts # the regex parser
β βββ types.ts # Message / ParsedChat / Attachment types
βββ public/
β βββ wa-chat-bg.svg # WhatsApp Web doodle wallpaper (light)
β βββ wa-chat-bg-dark.svg # same pattern, baked for dark mode
βββ tailwind.config.ts
| Setting | Where | Default |
|---|---|---|
| Default UI language | components/I18nProvider.tsx (useState<Locale>(...)) |
en |
| Default theme | components/ThemeProvider.tsx |
light |
localStorage keys |
wa-preview-locale, wa-preview-theme |
β |
| WA chat background | public/wa-chat-bg.svg, public/wa-chat-bg-dark.svg |
WhatsApp Web doodle |
To clear your saved preferences: open DevTools β Application β Local Storage β delete wa-preview-locale and wa-preview-theme.
This is the whole privacy story: your chat export never leaves your browser tab.
- No backend, no API routes, no server-side parsing.
FileReader+JSZipoperate entirely in-memory.- Media files become
blob:URLs scoped to the current document. - Blob URLs are revoked when you load a different file or close the tab.
- No analytics, no third-party scripts, no cookies set by the app.
You can verify this by running the app offline (DevTools β Network β "Offline") after the initial page load β everything keeps working.
Ideas for future versions; PRs welcome.
- Search within the loaded chat.
- Export the rendered view to PDF / a self-contained HTML file.
- Render reply quotations (current exports include the quoted text inline; structured display would be nicer).
- Voice note waveform + duration display.
- Reaction parsing for newer export formats that include them.
- More UI languages (the parser already handles most locales).
Contributions are very welcome. The codebase is small and approachable:
- Fork β create a branch β make your change.
npm run buildshould pass (TypeScript + Next.js production build).- Open a pull request describing what changed and why.
If you have a WhatsApp export in a locale the parser doesn't recognise, please open an issue with one or two anonymised lines (the header + an attachment line is usually enough) β I'll add the variant.
MIT β do whatever you want, just keep the notice.
- The chat background pattern is WhatsApp's official asset from
static.whatsapp.net. WhatsApp is a trademark of Meta Platforms, Inc. This project is an unaffiliated, non-commercial viewer for personal chat exports and is not endorsed by WhatsApp or Meta. - JSZip for the in-browser ZIP reader.
- Tailwind CSS and Next.js for the foundation.
Keywords: WhatsApp chat export viewer, WhatsApp Web preview, WhatsApp .txt parser, WhatsApp .zip import, view WhatsApp chat history in browser, WhatsApp export reader, Next.js WhatsApp viewer, WhatsApp Sohbet GΓΆrΓΌntΓΌleyici, WhatsApp dΔ±Εa aktarΔ±m ΓΆnizleme.

