English version → README_EN.md
Консольный инструмент для конвертации экспорта Telegram-канала в Markdown-статьи.
Превращает result.json из экспорта Telegram в отдельные .md файлы, готовые для Astro или любого другого SSG. Удобно для переноса контента в Obsidian, Logseq и другие Markdown-first инструменты.
npx tg2md <путь-к-result.json># С указанием выходной папки:
npx tg2md ./ChatExport/result.json -o ./src/content/blog
# Перезаписать существующие файлы:
npx tg2md ./ChatExport/result.json --rewrite
# Полная очистка выходной папки перед конвертацией:
npx tg2md ./ChatExport/result.json --cleanМожно запускать без установки через npx, или установить глобально:
npm install -g tg2md- Откройте Telegram Desktop (не Telegram для macOS)
- Зайдите в нужный канал
- Нажмите ⋮ → Экспорт истории чата
- Выберите формат: JSON
- Включите загрузку фото
- Нажмите Экспортировать
В папке экспорта появится файл result.json и папка photos/.
Имя файла формируется автоматически:
YYYY-MM-DD-транслит-заголовка.md
Например: 2026-02-22-vsyo-chto-nuzhno-znat-pro-litij-ionnye-akkumulyatory.md
---
title: 'Всё, что нужно знать про литий-ионные аккумуляторы'
description: 'Я сейчас катаюсь в горах за полярным кругом и тут холодно...'
pubDate: 'Feb 22 2026'
heroImage: '/images/photo_278@22-02-2026.jpg'
---| Поле | Откуда берётся |
|---|---|
title |
Первый bold-текст поста. Если нет — первое предложение |
description |
Первый абзац текста (без заголовка), обрезается до ~160 символов |
pubDate |
Дата публикации поста |
heroImage |
Путь к фото (только если пост содержит фото) |
| Telegram | Markdown |
|---|---|
| Жирный | **жирный** |
| Курсив | *курсив* |
~~зачёркнутый~~ |
|
| Подчёркнутый | <u>подчёркнутый</u> |
| Спойлер | <span class="spoiler">текст</span> |
| Цитата | > текст |
| Код | `код` |
| Блок кода | ```код``` |
| Ссылка | [текст](url) |
Команда /start |
`/start` |
| Кастомный эмодзи 🤌 | Стандартный эмодзи (fallback) |
Фото копируются в images/ внутри выходной директории. Путь в frontmatter: /images/имя_файла.jpg
Важно: фотографии должны быть в папке экспорта. При экспорте убедитесь, что включен экспорт фото.
- Репосты (forwarded) — не конвертируются
- Видео — текст сохраняется, файл не копируется
- Реакции — не включаются
- Ответы (
reply_to) — контекст ответа не добавляется
output/
├── images/
│ ├── photo_272@06-02-2026_22-06-23.jpg
│ └── photo_273@10-02-2026_13-32-02.jpg
├── 2026-02-02-vstrechajte-gejmifikaciyu-v-kommentah.md
├── 2026-02-04-ya-lyublyu-halyavu.md
└── 2026-02-22-pro-akkumulyatory.md
Скопируйте содержимое output/ в проект Astro:
src/content/blog/ ← md-файлы
public/images/ ← изображения
Убедитесь, что в src/content/config.ts описана коллекция blog:
const blog = defineCollection({
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
heroImage: z.string().optional(),
}),
});| Флаг | Описание | По умолчанию |
|---|---|---|
--output, -o |
Выходная папка | ./output |
--rewrite, -r |
Перезаписать существующие файлы | — |
--clean, -c |
Полностью очистить выходную папку перед конвертацией | — |
--help, -h |
Показать справку | — |
Примечание: по умолчанию существующие файлы не перезаписываются — они пропускаются, а в конце выводится подсказка.
npx vitest run # один раз
npx vitest # watch-режимПодробнее о тестах → src/__tests__/README.md
src/
├── index.ts # Точка входа CLI
├── cli.ts # CLI-логика: parseArgs, uniqueFilename, main
├── parser.ts # Парсинг JSON-экспорта
├── converter.ts # Сборка Markdown-файла
├── extractors.ts # Извлечение заголовка и описания
├── formatting.ts # Форматирование entity → Markdown
├── slugify.ts # Транслитерация и slug
└── types.ts # Типы данных
Evgeny Cherkasov — Telegram-канал 📬
MIT