Skip to main content

telegram-export-md

Turn Telegram's unreadable result.json export into clean, searchable Markdown files.

License: MIT Python CI

🌐 Languages: English · فارسی

Telegram Desktop's built-in Export chat history gives you a giant result.json (plus folders full of media) — technically complete, practically unreadable. telegram-export-md converts it into one tidy Markdown file per chat, with formatting, replies, forwards, polls, and media all preserved.

Zero dependencies. Pure Python standard library.

Before → After

Before — raw export JSON:

{"id": 183, "type": "message", "date": "2021-01-01T10:00:00",
 "from": "Arian", "text": [{"type": "plain", "text": "hello "},
 {"type": "bold", "text": "everyone"}, {"type": "plain", "text": "?"}]}

After — rendered Markdown:

**2021-01-01 10:00 — Arian**

hello **everyone**?

---

**2021-01-02 18:30 — Arian**

![](media/Gaming Crew/photo_1.jpg)

*1920×1080*

Features

  • 📄 One Markdown file per chat, plus an index.md table of contents
  • 📡 fetch mode (optional extra) — pull chats straight from Telegram's servers, no desktop app needed
  • 🎨 Telegram formatting preserved — bold, italic, code, pre, strikethrough, underline, links
  • 💬 Replies resolved — quoted with sender and a snippet of the original message
  • ↩️ Forwards, edits, and polls rendered faithfully
  • 🖼 Media support — photos embed, everything else links; --copy-media makes the backup self-contained
  • 🔍 Filters — pick chats by name or id, slice by date range
  • 🧹 Service messages (joins, pins, calls) can be excluded
  • 🐍 No dependencies — works on Python 3.10+, Windows/macOS/Linux

Install

# from PyPI (once published)
pipx install telegram-export-md

# optional: fetch mode (pull chats from Telegram's servers via their API)
pipx install 'telegram-export-md[fetch]'

# or directly from this repo
uv tool install git+https://github.com/Retro-Zero/telegram-export-md.git
# or
pip install git+https://github.com/Retro-Zero/telegram-export-md.git

Usage

1. Export your data

In Telegram Desktop: Settings → Advanced → Export chat history. Tick JSON as the format and check Include photos and videos if you want media. This creates a folder containing result.json and media subfolders.

2. Convert

tg-export-md ~/Downloads/Telegram-Export -o ~/telegram-backup

Result:

telegram-backup/
├── index.md
├── Gaming Crew.md
├── Saved Messages.md
└── media/
    └── Gaming Crew/
        ├── photo_1.jpg
        └── video_1.mp4

Options

Option Description
export Path to the export folder (containing result.json) or to result.json itself
-o, --output Output directory (default: ./markdown)
--chat TEXT Only export chats whose name or id contains TEXT
--since YYYY-MM-DD Only messages on or after this date
--until YYYY-MM-DD Only messages on or before this date
--copy-media Copy media into the output folder (self-contained backup)
--no-media Omit media references entirely
--no-service Skip service messages (joins, pins, calls, …)
--quiet Only print errors

Examples

# One chat, as a searchable text archive
tg-export-md export/ -o backup --chat "Gaming Crew" --copy-media

# Everything from 2022, text only
tg-export-md export/ -o backup --since 2022-01-01 --no-media

# Point straight at the JSON file
tg-export-md export/result.json -o backup

Automatic backup with fetch

No desktop app? No problem. tg-export-md fetch pulls chats straight from Telegram's servers into the same result.json + media format the desktop export produces — so the converter above works unchanged, and you get backups you can schedule.

Setup (once)

  1. Get free API keys at my.telegram.orgAPI development tools

  2. Make the keys available — either:

    export TG_API_ID=123456
    export TG_API_HASH=yourhash
    

    or save them in ~/.config/telegram-export-md/config.ini:

    [telegram]
    api_id = 123456
    api_hash = yourhash
    
  3. Install with the extra: pipx install 'telegram-export-md[fetch]'

Run

Run without flags for an interactive picker: after login it lists your chats and lets you choose which ones to export, which media types to download (photo, video, voice, audio, document, sticker, animation), and optional limits — last N messages per chat, a per-file size cap, and a date range.

tg-export-md fetch -o ~/telegram-export

The first run asks for your phone number and a login code Telegram sends you — the session is saved, so later runs are automatic. Everything the picker asks is also available as a flag, so cron jobs stay hands-free:

tg-export-md fetch -o ~/telegram-export --chat "Family" --media-types photo,video --last 500 --max-size 100mb
tg-export-md ~/telegram-export -o ~/telegram-backup
Flag Description
--chat TEXT only fetch chats whose name or id contains TEXT
--since / --until YYYY-MM-DD date range
--last N (alias --limit) only the last N messages per chat (newest)
--media download all media types
--media-types TYPES which media to download: photo,video,voice,audio,document,sticker,animation
--max-size SIZE skip files larger than this (e.g. 50mb, 1gb)

Notes

  • Large exports — the whole result.json is loaded into memory; exports up to a few hundred MB work fine on a modern laptop. Streaming support is on the roadmap.
  • Media paths without --copy-media point back into your original export folder. Use --copy-media for a backup you can move or archive.
  • Export JSON is generated by Telegram Desktop (Windows/macOS/Linux). Exports from other clients may differ slightly — open an issue if something doesn't parse.

Roadmap

  • Streaming parse for huge exports
  • Support the HTML export format
  • Per-year splitting (--split)
  • --format obsidian for vault-friendly output

Contributing

Bug reports, feature requests, and PRs are welcome. Please open an issue first for anything beyond a small fix.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

telegram_export_md-0.3.0.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

telegram_export_md-0.3.0-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file telegram_export_md-0.3.0.tar.gz.

File metadata

  • Download URL: telegram_export_md-0.3.0.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for telegram_export_md-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4258ab66d5b5b6609f93a47e67b14c2c2af8866ca90d9dad34cbbc28463cbf97
MD5 b5c41d624f92aff8fdb6635b9ddaf94d
BLAKE2b-256 59e2df1c7661101978d9409e863bdf8586fc15b641b8effc0bb1f867af367d23

See more details on using hashes here.

File details

Details for the file telegram_export_md-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: telegram_export_md-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for telegram_export_md-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0cb94286496b197e569b473cc916bb6b711df1f4216db35bee3b9ad362e7f645
MD5 6ee8209ea08c0410f4d60b50c5ca3ba2
BLAKE2b-256 3a403034a0ca1b89eac8552a539b691a5e4bcbd9cb2c445543164ddaf88fc0d5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page