Read your Telegram and WhatsApp exports the way they were meant to be read.
A small, offline Windows app that turns a raw chat export back into an actual conversation — bubbles, photos, voice messages, search, dark mode. No account, no server, no telemetry.
Download · Getting your export · Building from source · Русский
When you export a chat from Telegram you get result.json — a wall of machine-readable noise. WhatsApp gives you a flat .txt file where every message is a line prefixed with a timestamp, and media is a pile of loose files next to it. Both are perfectly good archives and both are miserable to actually read.
ChatViewer parses those exports into a local SQLite database and renders them as a normal messenger timeline. It never uploads anything, never phones home, and never copies your media — it just reads it off disk.
- Two formats. Telegram
result.jsonand WhatsApp.txt. Each import becomes its own chat in the sidebar, taggedTorW. - Actually looks like a chat. Consecutive messages from the same person are grouped, the sender's name appears once at the top of a group, and a date separator marks each new day — "Today", "Yesterday", or a full date.
- Media inline. Photos, videos, video notes, voice messages (
audio/ogg) and stickers render in place. Photos and videos open in a lightbox on click. - Animated stickers.
.tgsfiles are gunzipped in the Rust backend and played back as Lottie animations. - Search. By chat name in the sidebar, by message text inside an open conversation.
- Light and dark themes.
- English and Russian interface. Picks your system language on first run; the
EN/RUbutton in the header switches it at any time. - Clean timeline. Service messages — joins, leaves, topic changes — are filtered out automatically.
- Forwarded messages are labelled, with the original author where the export provides it.
- Local edits. Right-click a message to hide it, or a chat to remove it. This touches only the local database; your export files are never modified.
- 24-hour timestamps, no AM/PM.
Grab the latest installer from the Releases page — ChatViewer_x.y.z_x64-setup.exe. Run it, and you're done.
Requires Windows 10 or 11. WebView2 ships with Windows 11 and recent Windows 10; on older installs the setup will prompt for it.
A note on SmartScreen. The installer isn't code-signed, so Windows will show a blue "unrecognised app" dialog on first run. Click More info → Run anyway. Code signing certificates cost more than this project makes, which is nothing.
Telegram Desktop → Settings → Advanced → Export Telegram data. Pick the chats you want, set the format to JSON (not HTML), and enable photos, videos and voice messages.
You'll get a folder containing result.json alongside photos/, videos/, voice_messages/ and friends. Point ChatViewer at the result.json.
Open the chat → ⋮ → More → Export chat → With media. WhatsApp emails you a .zip. Unpack it — inside is WhatsApp Chat with X.txt plus the media files — and point ChatViewer at the .txt. Media in the same folder is picked up automatically.
Keep the export folder where it is. ChatViewer stores paths to your media rather than copying gigabytes of it into its own database. If you move or delete the export folder after importing, the text survives but the media stops loading.
| What | Where |
|---|---|
| Parsed messages | %LOCALAPPDATA%\chat-viewer\archive.sqlite3 |
| Media files | Left in place, in your export folder |
| Anything on a server | Nothing. The app makes no network requests. |
Uninstalling doesn't delete the database. To wipe imported data, delete %LOCALAPPDATA%\chat-viewer\ yourself.
Stated up front, because they're the kind of thing you'd otherwise discover halfway through reading an archive.
- Telegram direct messages infer direction from the chat name: the author matching the chat name is incoming, everyone else is outgoing. Reliable for one-to-one chats.
- Telegram group chats are detected automatically (more than two distinct senders), and every message defaults to the left side, because the export doesn't say which participant is you. Use "Set my ID" in the chat header and paste your
from_idfromresult.json— it looks likeuser123456789— to move your own messages to the right. - WhatsApp exports are locale-dependent.
dd.mm.yyyy(RU/EU) andmm/dd/yyyy(US) are supported, in both 12- and 24-hour form. Lines in other formats are skipped rather than guessed at. - Forwarded WhatsApp messages come through as plain
Forwarded: ...text, so the label can't name the original author. That's a WhatsApp limitation, not ours. - Windows only for now. The stack is cross-platform; nobody has done the macOS and Linux bundling work.
Prerequisites: Node 18+, the Rust toolchain, and the Tauri v1 Windows prerequisites (Visual Studio C++ Build Tools + WebView2).
git clone https://github.com/GhostCorpTech/chat-viewer.git
cd chat-viewer
npm install
npm run tauri dev # run in development
npm run tauri build # produce the installerThe finished installer lands in src-tauri/target/release/bundle/nsis/.
npm run previewStarts Vite with MOCK=1, which swaps the Tauri API for src/mocks/tauri.js and serves fixture data in your browser. Good for styling work; import, deletion and .tgs decoding won't function, since those live in the Rust backend.
If you'd rather not install anything: fork the repo, push a tag like v0.2.0, and the Release workflow builds the installer on a Windows runner and attaches it to a GitHub release. The CI workflow does the same build on every push to main without publishing.
┌─────────────────────────────────────────┐
│ React frontend (Vite) │
│ Sidebar · ChatView · MessageBubble │
└───────────────┬─────────────────────────┘
│ Tauri IPC
┌───────────────▼─────────────────────────┐
│ Rust backend │
│ parser.rs Telegram JSON │
│ parser_whatsapp.rs WhatsApp text │
│ db.rs SQLite │
└───────────────┬─────────────────────────┘
│
%LOCALAPPDATA%\chat-viewer\archive.sqlite3
(+ media read in place from your export folder)
Both parsers normalise to the same message shape — direction, sender, text, media type, media path, Unix timestamp — so the database and the entire frontend are format-agnostic. Adding a third export format means writing one parser module and one import entry; see CONTRIBUTING.md.
Stack: Tauri 1 · Rust · React 18 · Vite 5 · SQLite (rusqlite, bundled) · lottie-web
Bug reports and pull requests are welcome — see CONTRIBUTING.md. One hard rule: never attach real chat exports or screenshots of private conversations to an issue. Use hand-made fake data to demonstrate parsing bugs.
Security and privacy questions are covered in SECURITY.md.
MIT © GhostCorp
Built by GhostCorp — a small development studio.


