selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

yoink logo

Self-host yoink

2.2

All-in-one media downloader and converter powered by yt-dlp

ReleaseOpen SourceMIT
Updated2 weeks ago
LanguageGo
Setup difficultyAdvanced
MobilePWA
Stars
149
Port
3001 (HTTP server for web UI and API)
Requires
Ffmpeg, Yt-dlp
Install with Linux
yoink web interface showing download, convert, compress, trim, and transcribe features

What is yoink?

yoink is a self-hosted media downloader and processor built on yt-dlp, ffmpeg, and gallery-dl. It downloads videos and audio from over a thousand sites including YouTube, TikTok, Twitter, and Reddit, supports playlist downloads as ZIP files, converts between formats with different codecs, compresses videos to target file sizes for Discord, trims and crops videos, creates transcripts and subtitles with optional Whisper or OpenAI API, and auto-detects GIFs from Twitter/X. The frontend is a Svelte 5 progressive web app installable on mobile, and a Discord bot provides slash commands. The backend is a single Go binary serving both API and web UI on port 3001. Self-hosting requires Go, Node.js, yt-dlp, ffmpeg, and Deno, with optional Docker for routing YouTube through Mullvad VPN. No user authentication is built in; settings and queue persist in browser storage.

Should you self-host yoink?

yoink scores 45/100 on selfhost.directory (how scoring works) and ranks #98 of 142 in Media Management. It has 149 GitHub stars.

There was no stable release in the past 12 months, so check the repository's recent activity before you rely on it.

Setup is advanced: plan for several services and some ongoing maintenance. It is MIT-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is Sonarr (81/100, 17 472 stars). It scores higher overall, so compare the two before you pick. See yoink vs Sonarr side by side.

Features

  • Discord BotRequires separate bot binary and Discord token configuration
  • Format Conversion
  • GIF download
  • Image gallery download
  • Playlist Download
  • Progressive Web App
  • Quality selection
  • Transcription and subtitlesRequires optional Whisper or OpenAI API setup
  • Trim and crop
  • Video and audio download
  • Video compression
  • YouTube clips

yoink README

How to install yoink

Install yoink with Linux

Environment variables
PORT, YOINK_TEMP_DIR, BOT_SECRET, YOINK_ADMIN_TOKEN, REQUIRE_TEMP_MOUNT, YTDLP_BIN, EXTRACTOR_URL, COBALT_APIS, COBALT_API_KEY, WHISPER_SCRIPT, OPENAI_API_KEY, COOKIES_FILE, YOUTUBE_COOKIES_FILE, COOKIE_REFRESH_SCRIPT, SESSION_GENERATOR_URL, SESSION_TOKEN_REFRESH_MIN, YOUTUBE_POT_PROVIDER_URL, YOUTUBE_PLAYER_CLIENT, PROXY_HOST, PROXY_PORT, PROXY_SCHEME, PROXY_USER_PREFIX, PROXY_PASSWORD, PROXY_COUNT, DISCORD_TOKEN, DISCORD_APP_ID, YOINK_API_URL, YOINK_PUBLIC_URL, DISCORD_WEBHOOK_URL, DISCORD_PING_USER_ID

sudo apt update && sudo apt install -y git make ffmpeg python3 curl unzip golang-go curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash . "$HOME/.nvm/nvm.sh" && nvm install 24 sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp sudo chmod a+rx /usr/local/bin/yt-dlp curl -fsSL https://deno.land/install.sh | sh

Optional: sudo apt install -y gallery-dl

git clone https://github.com/coah80/yoink.git cd yoink cp .env.example .env make build ./yoink

Native Windows not tested; use WSL with Ubuntu

How to configure yoink

  • BOT_SECRETShared password for the Discord bot. Empty means the bot endpoints refuse every request.

    Shared password for the Discord bot. Empty means the bot endpoints refuse every request.

  • COBALT_API_KEYAPI key for Cobalt instances

    API key for Cobalt instances

  • COBALT_APISComma-separated list of Cobalt API instances for Instagram downloads

    Comma-separated list of Cobalt API instances for Instagram downloads

  • COOKIE_REFRESH_SCRIPT./refresh-cookies.shScript yoink runs to refresh cookies when YouTube flags a request

    Script yoink runs to refresh cookies when YouTube flags a request

  • COOKIES_FILE./cookies.txtFallback cookie file when the YouTube one does not exist

    Fallback cookie file when the YouTube one does not exist

  • DISCORD_APP_IDDiscord application ID

    Discord application ID

  • DISCORD_PING_USER_IDDiscord user ID to ping for alerts

    Discord user ID to ping for alerts

  • DISCORD_TOKENDiscord bot token

    Discord bot token

  • DISCORD_WEBHOOK_URLDiscord webhook URL for operational alerts

    Discord webhook URL for operational alerts

  • EXTRACTOR_URLhttp://localhost:3099Address of the TikTok/Instagram extractor service

    Address of the TikTok/Instagram extractor service

  • NODE_ENVdevelopmentRead but currently has no effect

    Read but currently has no effect

  • OPENAI_API_KEYOpenAI API key for cloud transcription (required for 'large' model)

    OpenAI API key for cloud transcription (required for 'large' model)

  • PORT3001Port the website and API listen on

    Port the website and API listen on

  • PROXY_COUNT0For providers with numbered users: above 0, yoink logs in as <prefix>-1 to <prefix>-<count>, picked at random

    For providers with numbered users: above 0, yoink logs in as <prefix>-1 to <prefix>-<count>, picked at random

  • PROXY_HOSTProxy host, or several separated by commas. yoink picks one at random per request.

    Proxy host, or several separated by commas. yoink picks one at random per request.

  • PROXY_PASSWORDProxy password

    Proxy password

  • PROXY_PORT1080, or 80 when PROXY_PASSWORD is setProxy port

    Proxy port

  • PROXY_SCHEMEsocks5h, or http when PROXY_PASSWORD is setProxy protocol

    Proxy protocol

  • PROXY_USER_PREFIXProxy username. Only used together with PROXY_PASSWORD.

    Proxy username. Only used together with PROXY_PASSWORD.

  • REQUIRE_TEMP_MOUNTfalseWhen true, yoink refuses to start unless YOINK_TEMP_DIR is its own mount point, for example an encrypted volume.

    When true, yoink refuses to start unless YOINK_TEMP_DIR is its own mount point, for example an encrypted volume.

    values: true, false

  • SESSION_GENERATOR_URLAddress of a yt-session-generator service for PO tokens

    Address of a yt-session-generator service for PO tokens

  • SESSION_TOKEN_REFRESH_MIN15Minutes between session token refreshes

    Minutes between session token refreshes

  • WGET_BINwgetwget program used for a few direct media downloads

    wget program used for a few direct media downloads

  • WHISPER_SCRIPTscripts/transcribe.pyPath to the transcription helper script

    Path to the transcription helper script

  • YOINK_ADMIN_TOKENToken for POST /api/admin/drain and /api/admin/resume, sent as Authorization: Bearer <token>. Empty turns both endpoints off.

    Token for POST /api/admin/drain and /api/admin/resume, sent as Authorization: Bearer <token>. Empty turns both endpoints off.

  • YOINK_API_URLhttp://localhost:3001API URL for the Discord bot

    API URL for the Discord bot

  • YOINK_PUBLIC_URLhttp://localhost:3001Public URL for the Discord bot

    Public URL for the Discord bot

  • YOINK_TEMP_DIR./tmpWhere downloads and conversions are stored while they run. Its subfolders are emptied on every start.

    Where downloads and conversions are stored while they run. Its subfolders are emptied on every start.

  • YOUTUBE_COOKIES_FILE./youtube-cookies.txtCookie file used for YouTube. Checked first.

    Cookie file used for YouTube. Checked first.

  • YOUTUBE_PLAYER_CLIENTYouTube player client to use

    YouTube player client to use

  • YOUTUBE_POT_PROVIDER_URLAddress of a PO token provider service

    Address of a PO token provider service

  • YTDLP_BINyt-dlpyt-dlp program to run. Set to scripts/mullvad-vpn/yt-dlp-vpn for the Mullvad Docker wrapper.

    yt-dlp program to run. Set to scripts/mullvad-vpn/yt-dlp-vpn for the Mullvad Docker wrapper.

More in Audio Processing

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…