← Talekeep

Talekeep Import Format v0 (draft)

Published June 2026 · Status: draft — may change until in-app import ships

Talekeep's goal is that your conversations — from any messenger or AI service — live in one encrypted archive you own. We can't build every connector at once, so we're doing the next best thing: documenting a simple import format now, so you (or your scripts, or your favorite AI) can convert any export into it today.

Built into Talekeep 1.0. In the app: sidebar ➕ → Import archive…, pick your .jsonl, done — the source appears in your sidebar, message text encrypted at rest like everything else. Imported sources are namespaced (import-…) and kept separate from live-synced sources, so when an official connector for your service arrives, both coexist — nothing needs migrating. Re-importing a file with the same source.id updates instead of duplicating.

Export your chats

Every service lets you export your own data. Get the file out first — then bring it in. Native importers for these are landing in an upcoming release (drop the export straight in); until then, convert to the format below. Either way everything stays on your Mac.

AppHow to exportFile
WhatsAppOpen the chat → Export ChatWithout Media_chat.txt
LINEOpen the chat → menu → Export chat history.txt
DiscordNo built-in export — use DiscordChatExporter to save a channel or DM as JSON.json
ChatGPTSettings → Data controlsExport data, then unzip the emailed fileconversations.json
ClaudeSettings → PrivacyExport data, then unzip (rename .dms.zip)conversations.json
GeminiGoogle Takeout → deselect all → My ActivityGemini Apps (not the “Gemini” option — that's Gems, not your chats).json
SlackA workspace admin exports the data, then unzip itexport folder

Most services export text only — WhatsApp and LINE don't include photos or videos in the text export (their limitation, not ours).

The format

A single UTF-8 JSON Lines file (.talekeep.jsonl): one JSON object per line. The first line declares the file; the rest are conversations and messages, in any order (a message's conversation should appear before it).

{"type":"talekeep-import","version":0,"source":{"id":"whatsapp-jane","name":"WhatsApp (Jane's iPhone)"}}
{"type":"conversation","id":"family-group","title":"Family group","kind":"group"}
{"type":"message","conversationId":"family-group","id":"1001","date":"2023-04-01T12:30:00Z","sender":"Mum","text":"Dinner at 7?"}
{"type":"message","conversationId":"family-group","id":"1002","date":"2023-04-01T12:31:12Z","sender":"me","text":"On my way!"}
{"type":"message","conversationId":"family-group","id":"1003","date":"2023-04-01T12:35:00Z","sender":"Mum","text":"Photo of the table","media":{"path":"media/table.jpg","kind":"photo"}}

Records

talekeep-import (first line, required)

fieldtypenotes
versionint0
source.idstringstable, unique per imported account/source — re-importing the same id updates rather than duplicates
source.namestringshown in the sidebar, e.g. "ChatGPT (export 2026-06)"

conversation

fieldtypenotes
idstringunique within the source
titlestring
kindstringoptional: direct · group · channel · ai (default direct)

message

fieldtypenotes
conversationIdstringmust match a conversation record
idstringunique within the conversation
datestring | intISO-8601 (2023-04-01T12:30:00Z) or unix seconds
senderstringdisplay name; use "me" for yourself (right-aligned bubbles)
textstringmessage body (encrypted at rest on import)
mediaobjectoptional: {"path": "relative/to/jsonl.jpg", "kind": "photo|video|audio|document"} — files are copied into the archive

Notes for converter authors

← Back to Talekeep