See social media posts right in the Telegram Messenger.
- Media downloading
- TikTok
- YouTube Shorts
- Twitter (X)
- Soundcloud
- Unified
/downloadcommand for direct downloads
- Add @UMMRobot to the group chat
- Send any supported social media post link to the chat
- Type
@UMMRobotin any chat and paste a supported social media post link - Press "Share post"
- Add @UMMRobot to the group chat
- Use
/download linkor just/downloadin reply to the message containing a link - Or mention the bot in that reply to trigger the same download flow without the slash command
- Install Deno 2
- Install
yt-dlpif you want the yt-dlp fallback outside the app container - Install
ffmpegif you want collage generation outside the app container - Start the bot with
deno task start - Run checks with
deno task check - Format with
deno task fmt - Run lint with
deno task lint - Run the full verification pass with
deno task verify - Run the existing migration with
deno task migrate:add-chat-settings - Runtime tasks load local variables from
.envvia Deno's--env-file
Set WARP_PROXY=socks5://127.0.0.1:1080 in .env, then deno task dev:local starts
the WARP sidecar and the bot together (and stops the sidecar on exit). Or run the
pieces yourself with deno task warp + deno task dev, or the full container setup
with docker compose up.
- Resolved in-process by postfetch (zero-dependency, remuxes the DASH/HLS splits itself), with
yt-dlpas the fallback - Fetched through a Cloudflare WARP sidecar (
warp/, a self-built userspace-WireGuard image — no privileges, no host tweaks), so the datacenter egress IP becomes a Cloudflare consumer IP — what gets YouTube past its datacenter-IP bot gate WARP_PROXYpoints the bot at the WARP SOCKS5 proxy; leave it empty to fetch directly (fine on a residential IP, gated on a datacenter one)- WARP hands out a stable consumer IP (pinned to the nearest Cloudflare colo); the sidecar re-registers a fresh account every
WARP_ROTATE_MINUTES(compose.ymldefault30,0disables) to roll the egress IP, and any container restart rolls it too. The next account is registered before the running proxy is swapped, and the bot waits out the brief swap rather than failing a download (and never falls back to the unproxied IP)