| name | telegram-post |
| description | Create, preview, and send formatted Telegram posts from draft markdown files. Use when the user asks to draft a Telegram channel post, preview a draft before sending, or publish a draft from Channels/*/drafts/ to saved messages or a channel. Triggers on "post to Telegram", "send to saved messages", "publish draft", "telegram post". |
Telegram Post Skill
Create, preview, and send formatted Telegram posts from draft markdown files.
Script location: ~/.Codex/skills/telegram/scripts/telegram_fetch.py
(NOT scripts/post.py -- that file does not exist)
When to Use
Use this skill when:
- User asks to create a draft for a Telegram channel
- User asks to "post to Telegram" or "send to saved messages" from a draft file
- User wants to preview a draft before sending
- Draft files in
Channels/*/drafts/ need to be sent
Sending Drafts
To Saved Messages (preview)
Use the send command with --markdown flag to preserve formatting:
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py send \
--chat "@glebkalinin" \
--text "DRAFT_BODY_HERE" \
--markdown
With Image/File
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py send \
--chat "@glebkalinin" \
--file "/path/to/image.png" \
--text "CAPTION_TEXT" \
--markdown
IMPORTANT: Image caption limits
- Telegram captions are limited to 1024 characters
- If the draft body exceeds 1024 chars, split into: image + short caption, then follow-up text message(s)
- Always use
--markdown when sending draft content with formatting
To Channel (publish)
Use the publish command for channel posts -- it handles markdown conversion, footer, and post-publish automation. Works with any channel in Channels/.
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py publish \
--draft "20260413-delusional-spiraling" --dry-run
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py publish \
--draft "20260413-delusional-spiraling"
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py publish \
--draft "20260413-delusional-spiraling" --schedule "2026-04-16T09:00"
python3 ~/.Codex/skills/telegram/scripts/telegram_fetch.py publish \
--draft "Channels/klodkot/drafts/20260211-post.md"
The publish command automatically:
- Resolves channel from draft folder path or frontmatter
channel field
- Converts markdown to Telegram HTML
- Appends the correct channel footer if missing (reads from published posts)
- Sends with
parse_mode='html'
- Updates frontmatter (
published_date, telegram_message_id)
- Moves file from
drafts/ to published/
- Updates the channel's index file
Supported channels: Any folder in Channels/ with a {name}/{name}.md index file containing telegram_channel in frontmatter (klodkot, mental-health-tech, opytnym-putem, tool-building-ape, etc.)
Formatting Reference
--markdown flag (for send command)
Converts markdown to Telegram HTML before sending:
| Markdown | Telegram |
|---|
**bold** | bold |
_italic_ | italic |
[text](url) | clickable link |
## Header | bold |
* item / - item | arrow format |
Without --markdown: text is sent as-is (plain text). **bold** appears literally as **bold**.
publish command
Handles markdown conversion automatically -- no --markdown flag needed.
Draft Preparation Workflow
- Read the draft file from
Channels/{channel}/drafts/
- Strip YAML frontmatter (everything between
--- markers)
- Strip
![[image.png]] wikilink embeds (handle images separately via --file)
- Resolve media paths: check
Attachments/, Channels/{channel}/attachments/, Channels/{channel}/videos/, vault root
- Check text length:
- If <= 1024 chars and has image/video: send as single message with media + caption
- If > 1024 chars and has image/video: send media with short caption (title only), then rest as follow-up text
- If no media: send as text message(s), split at 4096 char limit
- Always use
--markdown flag for draft content
Post-Send Workflow (when user says "move to published" or similar)
After sending a draft to saved messages or channel:
- Move file from
Channels/{channel}/drafts/ to Channels/{channel}/published/
- Update frontmatter: change
type: draft to type: published and add published_date: '[[YYYYMMDD]]' (today's date)
- Both steps should be done automatically when the user requests moving to published
Draft File Format
---
created_date: '[[YYYYMMDD]]'
type: draft
channel: klodkot
status: draft
language: ru
topic: Topic description
source: https://example.com
---
![[optional-image.png]]
_Source attribution_
**Post Title**
Content with **bold** and _italic_ and [links](url).
#tag1@channel #tag2@channel
**[CHANNEL](https://t.me/channel)** -- footer
Common Pitfalls
- Do NOT send raw HTML via
send command -- it shows as literal <b>text</b>. Use --markdown instead.
- Do NOT manually construct HTML -- the
--markdown flag handles conversion.
- Image captions have a 1024 char limit in Telegram. Split long posts.
scripts/post.py does NOT exist. Always use ~/.Codex/skills/telegram/scripts/telegram_fetch.py.
Dependencies
- Uses
telegram skill credentials (~/.telegram_dl/)
- Python 3.10+, telethon, pyyaml