Send a link. Get the file back.

A lightweight Telegram bot that downloads media from 1000+ platforms with yt-dlp and uploads it straight back to your chat. Pure utility โ€” no AI, no accounts, runs on your own box.

Platforms 1000+ โ€” YouTube, TikTok, SoundCloud, Instagram, Reddit, and more
Upload limit Up to 2 GB via bundled local Bot API server
Stack Python 3.11+ ยท aiogram 3.x ยท yt-dlp ยท ffmpeg ยท Docker

Features

Small, focused, and self-hosted. Everything runs in two containers on your hardware.

๐ŸŒ

1000+ platforms

YouTube, SoundCloud, TikTok, Instagram, Reddit, Twitch, Vimeo, X โ€” anything yt-dlp supports. Drop in a cookies.txt for authenticated sources.

๐Ÿ“ฆ

Uploads up to 2 GB

Bundled local Telegram Bot API server lifts the 50 MB cap to 2 GB. One docker compose up.

๐ŸŽต

Tagged MP3 audio

/audio mode returns a clean MP3 with embedded cover art, album-art thumbnail, and title/artist tags.

๐ŸŽฌ

Inline-playable video

Non-MP4 sources are transcoded to streamable H.264/AAC so Telegram plays them inline, not as a download.

๐Ÿ”’

Allowlist access

Gate the bot to specific user IDs โ€” works in DMs and groups they activate. Per-user rate limiting and a global concurrency cap built in.

๐Ÿงน

Cleans up after itself

Temp files are removed after every upload. Optional rotating log keeps a durable download history.

Quick start

Docker Compose brings up the bot and the local Bot API server for 2 GB uploads.

Get your Telegram credentials

A bot token from @BotFather, plus an API ID + hash from my.telegram.org/apps (needed by the local API server).

Configure

cp .env.example .env
# set BOT_TOKEN, TELEGRAM_API_ID, TELEGRAM_API_HASH, ALLOWED_USERS

Run

docker compose up -d
docker compose logs -f bot

Pulls the prebuilt ghcr.io/antlis/tg-media-bot image โ€” no local build. Then message your bot a URL. That's it.

Other ways to install: Arch users โ€” paru -S tg-media-bot (AUR, ships a systemd service). Bare Python and systemd setup are in the installation guide.

Commands

Send any media URL (up to 3 per message) and it downloads in your active mode.

CommandWhat it does
/audioSwitch to audio-only โ€” downloads become tagged MP3s
/videoSwitch to video mode (default)
/formats <url>Tap-to-pick a download quality (Best / 1080p / 720p / 480p / Audio)
/statusShow your queued/active downloads and task IDs
/cancel <id>Cancel an active download โ€” actually stops it mid-flight
/helpShow help and the supported-platforms list
Python 3.11+ aiogram 3.x yt-dlp ffmpeg Docker MIT licensed