From tlg
user wants to archive, dump, or back up an entire Telegram channel or chat history to NDJSON with all media files downloaded. Full history.
How this skill is triggered — by the user, by Claude, or both
Slash command
/tlg:dump-channelThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Archive a complete Telegram channel/group/chat to NDJSON + downloaded media files.
Archive a complete Telegram channel/group/chat to NDJSON + downloaded media files.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
~/.local/share/gramjs/<profile>.session
/tlg:setup first/usr/bin/env bash << 'EOF'
SCRIPT="${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/cc-skills/plugins/tlg}/scripts/tg-cli.ts"
# Full dump: NDJSON + all media (photos, videos, documents)
bun "$SCRIPT" dump @ChannelName ./output/ChannelName
# NDJSON only (skip media downloads — much faster)
bun "$SCRIPT" dump @ChannelName ./output/ChannelName --no-media
# Dump by numeric chat ID
bun "$SCRIPT" dump -1001234567890 ./output/MyChannel
# Use a different profile
bun "$SCRIPT" -p missterryli dump @ChannelName ./output/ChannelName
EOF
| Parameter | Type | Description |
|---|---|---|
| chat | string/int | Channel username (@name) or numeric chat ID |
| output | path | Output directory (messages.ndjson + media/ created inside) |
--no-media | flag | Skip media downloads, produce NDJSON only |
output/ChannelName/
├── messages.ndjson ← one JSON object per line, chronological (oldest first)
└── media/
├── 6.jpg ← named by message ID for cross-referencing
├── 12.png
├── 45.mp4
└── ...
Each line is a JSON object with these fields:
| Field | Type | Description |
|---|---|---|
id | int | Telegram message ID |
date | string | ISO 8601 timestamp with timezone |
text | string/null | Full message text (no truncation) |
has_media | bool | Whether message contains media |
media_type | string/null | GramJS class name (MessageMediaPhoto, etc.) |
media_file | string/null | Filename in media/ dir (e.g., "6.jpg") |
views | int/null | View count (channels only) |
forwards | int/null | Forward count |
reply_to_msg_id | int/null | Parent message ID if reply |
grouped_id | int/null | Album group ID (shared across album messages) |
edit_date | string/null | ISO 8601 timestamp of last edit |
sender.id | int | Sender's Telegram user/channel ID |
sender.name | string | Display name (channel title or user first name) |
sender.username | string/null | @username if set |
Re-running the same command skips already-downloaded media files (checks dest.exists()). The NDJSON is fully rewritten each run. This makes it safe to resume interrupted downloads.
# jq: find all GOLD BUY signals with chart screenshots
jq 'select(.text != null and (.text | test("GOLD.*BUY")) and .media_file != null)' messages.ndjson
# DuckDB: aggregate by date
duckdb -c "SELECT date::DATE as day, count(*) FROM read_ndjson('messages.ndjson') GROUP BY day ORDER BY day"
# Python/Polars
import polars as pl
df = pl.read_ndjson("messages.ndjson")
Server closed the connection) — GramJS auto-reconnectsFor git-tracked projects, gitignore the media folder:
# data/telegram/.gitignore
*/media/
This keeps the NDJSON (metadata) in version control while keeping large media files local-only.
After this skill completes, check before closing:
Only update if the issue is real and reproducible — not speculative.
npx claudepluginhub terrylica/cc-skills --plugin tlgDownloads, exports, converts, and filters Telegram chats via the telegram-download-chat CLI. Supports message download, JSON-to-TXT/HTML/PDF conversion, date/user/keyword filtering, media download, and subchat extraction.
Use when user wants to download, save, or extract media files such as photos, videos, and documents from Telegram messages.
Fetches posts and comments from public/private Telegram channels via MTProto (Pyrogram/Telethon). Useful for monitoring, summarizing, or comparing channel content.