<h1 align="center"ytdlp-go</h1
<p align="center" <strongA native, Python-free media downloader and embeddable Go library.</strong </p
<p align="center" <a href="#project-status"<img src="https://img.shields.io/badge/status-alpha-f59e0b" alt="Project status: alpha"</a <a href="go.mod"<img src="https://img.shields.io/badge/Go-1.25.12-00ADD8?logo=go&logoColor=white" alt="Go 1.25.12"</a <a href="#python-free-by-design"<img src="https://img.shields.io/badge/Python-free-16a34a" alt="Python-free"</a <a href="LICENSE"<img src="https://img.shields.io/badge/license-Apache--2.0-2563eb" alt="Apache License 2.0"</a </p
<p align="center" <a href="#quick-start"Quick start</a · <a href="docs/SUPPORTEDSITES.md"Supported sites</a · <a href="docs/README.md"Documentation</a · <a href="docs/EMBEDDING.md"Go API</a · <a href="CONTRIBUTING.md"Contributing</a </p
---
ytdlp-go is an independent Go implementation informed by the observable behavior of yt-dlp. Extraction, networking, playlists, media protocols, compatibility languages, plugins, and the public API are implemented in Go. Python is not used as a runtime, build, test, plugin, or fallback dependency.
The project aims for practical yt-dlp feature parity through native, evidence-backed implementations. It does not claim blanket parity: supported behavior is bounded by checked-in conformance fixtures, and every known gap remains explicit.
[!CAUTION] This is alpha software, not yet a drop-in replacement for yt-dlp. The repository currently has 44 representative native extractors and broad downloader infrastructure, but not yt-dlp's thousands of sites or complete option language. Check the supported-site catalog and capability manifest before relying on a particular workflow.
This project is not affiliated with, endorsed by, or sponsored by yt-dlp, GitHub, Google/YouTube, or any supported service. Product and service names identify compatibility targets only.
Project status
| Area | Evidence-backed scope today | | --- | --- | | Runtime | Native Go binaries; no Python execution or interpreter fallback | | Extractors | 44 representative extractors across simple, shared-backend, playlist, live, authenticated, regional, anti-bot, manifest, and JavaScript-heavy families | | Media | Direct HTTP(S), HLS, DASH, and ISM/Smooth Streaming | | Playlists | Lazy reusable sequences, bounded continuations, item/range selection, reverse selection, and flat-playlist mode | | Formats | Bounded selector AST, sorting and filtering, video+audio merging, fallbacks, and multi-output plans | | Post-processing | Typed ffmpeg/ffprobe operations, subtitle conversion/embedding, metadata, chapters, remuxing, audio extraction, concat, and safe moves | | Compatibility | Output/progress templates, match filters, metadata transforms, configuration files, aliases, cache, and download archive | | Extensions | Versioned native RPC and constrained WASM plugins, signed packs, catalogs, and updater transactions | | Public API | Versioned v1alpha1 Go API with context cancellation, categorized errors, events, playlists, metadata, and artifacts |
The capability manifest records 75 capabilities: 72 compatible within their declared corpora, 2 partial, and 1 intentional deviation. “Compatible” means the linked deterministic evidence passes; it does not mean unbounded equivalence with every upstream behavior.
The repository implementation for Phases 0–3 exists, while Gate G3 remains blocked on real deployment evidence. G3 is currently backburnered rather than an active development target; synthetic fixtures are not presented as production traffic, canary, regional, account, or Windows evidence.
Why ytdlp-go?
| Principle | What it provides | | --- | --- | | Native deployment | A portable Go program and library without a Python environment | | Explicit compatibility | Claims point to fixtures, tests, provenance, and known deviations | | Safe composition | Bounded resources, confined output, cancellation, categorized errors, and structured events | | Auditable boundaries | JavaScript, cookies, credentials, ffmpeg, plugins, and update trust are visible interfaces | | No hidden fallback | Unsupported behavior fails explicitly instead of invoking Python |
Quick start
Go 1.25.12 or newer is required.
git clone https://github.com/tejasa97/youtube_dlp.git
cd youtube_dlp
mkdir -p bin
CGO_ENABLED=0 go build -trimpath -o bin/ytdlp-go ./cmd/ytdlp-go
CGO_ENABLED=0 go build -trimpath -o bin/ytdlp-js-helper ./cmd/ytdlp-js-helper
./bin/ytdlp-go --version
./bin/ytdlp-go --help