May 18, 2026 · 7 min read
What's inside msgstore.db
msgstore.db is the SQLite database WhatsApp Android keeps your chats in. The exported .txt file is what's left after WhatsApp strips out everything that wouldn't fit. A tour of the schema and the cost of working from the export.
msgstore.dbwhatsapp databasesqliteschema
Once you decrypt a Crypt15 backup, the file inside is msgstore.db — a SQLite database with around 70 tables on a modern WhatsApp install. Most of what makes a chat useful long-term is in tables you've never seen.
The tables that matter for an archive
| Table | What it holds | Why it matters |
|---|---|---|
| message | One row per message: sender JID, timestamp, body, key_id, status | The conversation itself |
| message_media | Media metadata: file path, MIME, caption, size | Attaches files to messages |
| message_quoted | Quoted-reply context | Reply threading |
| receipt_user | Per-recipient delivered/read/played timestamps | Per-recipient receipts in groups |
| chat | Per-conversation summary, mute state, archived flag | Chat list rendering |
| jid | Phone-number ↔ @lid mapping table | Identity resolution |
| group_participant_user | Group membership history | Who was in the group when |
| message_revoked | Sender-deleted messages, marked | Deletion markers |
| message_add_on_reaction (modern) / message_reactions (legacy) | Emoji reactions per message per sender | Reactions in the archive |
What WhatsApp's native export drops
- Receipts and per-recipient timestamps: gone.
- Sender JID: reduced to display name only.
- Group participant history: gone; the export only shows current members.
- Reactions: typically gone.
- Deletion markers: gone.
- Calls (audio/video/missed): gone.
- System messages (group renamed, member added): gone.
- Capped at 10,000 messages with media or 40,000 without.
Why archiving from msgstore.db is a different job
Chat Hoarding doesn't render the export — it renders the decrypted msgstore.db directly. Every field WhatsApp stored is available to the renderer, including the ones the official export discards. That's the difference between a chat copy and a chat archive.
Inspect it yourself
A .tarc bundle is a macOS package: right-click → Show Package Contents and you'll see msgstore.db. Open it with any SQLite browser (DB Browser for SQLite is free) to confirm the schema. Chat Hoarding's renderer is transparent about its source.
WhatsApp's schema is not stable
WhatsApp's developers add and rename tables between major versions. msgstore.db from 2020 looks meaningfully different from msgstore.db in 2026 — which is why Chat Hoarding writes a .tarc with its own stable manifest rather than relying on you to keep a WhatsApp from 2020 to open a 2020 backup.
FAQ
Can I just open msgstore.db with a SQLite browser instead of buying Chat Hoarding?
You can. You'll see the raw tables; you won't see voice notes rendered, messages threaded, receipts decoded into icons, contacts mapped to names, or @mentions resolved. The price gap covers the rendering layer plus the .tarc archive format plus auto-update + license + support — not the SQLite read itself.
Why is the database called msgstore.db and not whatsapp.db?
Historical: WhatsApp split the message store (msgstore.db) and the contact store (wa.db) very early. Only msgstore.db is written to the user-accessible backup folder as Crypt15; wa.db lives in the app's private /data/data/com.whatsapp directory and is unreachable without root. Chat Hoarding resolves contacts via your phone's address book (exported as vCard by the Android companion) and manual mappings, not wa.db.