Skip to content

Repository files navigation

ChatViewer

ChatViewer

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.

CI Release License: MIT Platform

Download · Getting your export · Building from source · Русский


Screenshots

ChatViewer, dark theme ChatViewer, light theme ChatViewer, group chat

Dark and light themes, and a Telegram group chat. Fake conversations — no real chat data.

Why

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.

Features

  • Two formats. Telegram result.json and WhatsApp .txt. Each import becomes its own chat in the sidebar, tagged T or W.
  • 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. .tgs files 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/RU button 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.

Download

Grab the latest installer from the Releases pageChatViewer_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.

Getting your export

Telegram

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

WhatsApp

Open the chat → MoreExport chatWith 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.

Where your data lives

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.

Known limitations

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_id from result.json — it looks like user123456789 — to move your own messages to the right.
  • WhatsApp exports are locale-dependent. dd.mm.yyyy (RU/EU) and mm/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.

Building from source

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 installer

The finished installer lands in src-tauri/target/release/bundle/nsis/.

UI-only preview, without Rust

npm run preview

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

Building via GitHub Actions

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.

How it works

┌─────────────────────────────────────────┐
│  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

Contributing

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.

License

MIT © GhostCorp


Built by GhostCorp — a small development studio.

About

Offline Windows viewer for Telegram and WhatsApp chat exports — renders result.json and .txt archives as a real messenger timeline with media, search and dark mode. No account, no network, no telemetry.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages