terrylica/cc-skills/dump-channel

Claude Code and agent skill by terrylica/cc-skills

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

user wants to archive, dump, or back up an entire Telegram channel or chat history to NDJSON with all media files downloaded. Full history.

Install

npx vskill@latest install terrylica/cc-skills/dump-channel

SKILL.md

Dump Telegram Channel History

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.

Preflight

  1. Session must exist: ~/.local/share/gramjs/<profile>.session
  • If missing, run /tlg:setup first
  1. User must be subscribed to (or a member of) the target channel/chat

Usage

bash
/usr/bin/env bash << 'EOF'
ROOT="$(cc-plugin-root tlg)"
SCRIPT="$ROOT/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 personal dump @ChannelName ./output/ChannelName
EOF

Parameters

ParameterTypeDescription
chatstring/intChannel username (@name) or numeric chat ID
outputpathOutput directory (messages.ndjson + media/ created inside)
--no-mediaflagSkip media downloads, produce NDJSON only

Output Structure

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
└── ...

NDJSON Record Schema

Each line is a JSON object with these fields:

FieldTypeDescription
idintTelegram message ID
datestringISO 8601 timestamp with timezone
textstring/nullFull message text (no truncation)
has_mediaboolWhether message contains media
media_typestring/nullGramJS class name (MessageMediaPhoto, etc.)
media_filestring/nullFilename in media/ dir (e.g., "6.jpg")
viewsint/nullView count (channels only)
forwardsint/nullForward count
reply_to_msg_idint/nullParent message ID if reply
grouped_idint/nullAlbum group ID (shared across album messages)
edit_datestring/nullISO 8601 timestamp of last edit
sender.idintSender's Telegram user/channel ID
sender.namestringDisplay name (channel title or user first name)
sender.usernamestring/null@username if set

Resume Support

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.

Querying the Output

bash
# 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")

Performance Notes

  • ~3000 messages + 1700 media files takes ~3-5 minutes
  • Telegram may briefly disconnect mid-download (Server closed the connection) — GramJS auto-reconnects
  • For very large channels (10k+ messages), expect 10-15 minutes with media

Recommended Storage Pattern

For git-tracked projects, gitignore the media folder:

gitignore
# data/telegram/.gitignore
*/media/

This keeps the NDJSON (metadata) in version control while keeping large media files local-only.

Anti-Patterns

  • Don't dump channels you're not subscribed to — GramJS needs access via your account
  • Don't run multiple dumps concurrently on the same profile — session file contention

Post-Execution Reflection

After this skill completes, check before closing:

  1. Did the command succeed? — If not, fix the instruction or error table that caused the failure.
  2. Did parameters or output change? — If tg-cli.ts's interface drifted, update Usage examples and Parameters table to match.
  3. Was a workaround needed? — If you had to improvise (different flags, extra steps), update this SKILL.md so the next invocation doesn't need the same workaround.

Only update if the issue is real and reproducible — not speculative.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
21

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/terrylica/cc-skills/dump-channel/badge)](https://verified-skill.com/skills/terrylica/cc-skills/dump-channel)

Something wrong with this skill or its page? Tell us.