yoinks: 6 of 8 URLs, +48.7 s per file, and a picker that says mp4 when the file is AVI
Published
A terminal wrapper around yt-dlp, measured on 8 URLs from a clean profile. 6 downloaded, 2 failed on the platform. Every file was byte-identical to bare yt-dlp with the same format flag.
yoinks 0.3.1 is a 59 KB npm package and, honestly, a picker in front of yt-dlp. It brings 70 MB of node_modules, 44 MB of that ffmpeg-static, plus a 35.4 MB yt-dlp binary it fetches on first run. Its README claims YouTube, X, Threads, Instagram, TikTok and "1,800+ other sites".
We ran 8 URLs through it on a clean profile with no cookies and no logins. Then we ran the same yt-dlp binary, the one yoinks fetched, on the same URL with the same format flag. All numbers below come from that pair, on MacBook Pro M1, 8 GiB, macOS 26.3, 2026-10-06.
1.Result: 6 of 8 URLs, same 6 as bare yt-dlp
| URL | yoinks | Probe s | Download s | Total s | Bare yt-dlp s | Delta | Bytes |
|---|---|---|---|---|---|---|---|
| YouTube (Blender, CC-BY) | ok | 41.1 | 37.5 | 80.6 | 30.0 | +50.6 | 25,581,772 |
| archive.org (public domain) | ok | 38.6 | 96.0 | 137.4 | 81.4 | +56.0 | 332,243,668 |
| X / Twitter | ok | 37.8 | 34.4 | 74.1 | 29.1 | +45.0 | 1,756,786 |
| Instagram (reel) | ok | 37.1 | 34.0 | 73.0 | 28.3 | +44.7 | 63,867 |
| Reddit (r/aww video) | ok | 41.2 | 39.5 | 82.7 | 31.5 | +51.2 | 3,763,840 |
| TikTok | ok | 36.9 | 33.8 | 72.6 | 27.9 | +44.7 | 1,707,091 |
| Vimeo | fail: login | 36.4 | — | 38.0 | 27.7 | both fail | — |
| Threads | fail: no extractor | 39.1 | — | 40.9 | 30.0 | both fail | — |
Smallest time the wrapper adds
+44.7
Over the six downloads: wrapper total minus bare yt-dlp on the same URL and flag
Largest time the wrapper adds
+56.0
archive.org, public domain: 137.4 s against 81.4 s bare on the identical format flag
Bytes that landed as AVI
332,243,668
From archive.org while the picker row said mp4; mpeg4 inside, not H.264
Both failures are the platform, not the wrapper. Vimeo answers "The web client only works when logged-in". The bundled yt-dlp 2026.08.19 has no Threads extractor at all ("Unsupported URL"). Bare yt-dlp failed on exactly the same two URLs with the same messages.
Where it worked, the wrapper added nothing to the file: all 6 outputs were byte-identical (sha256) to the same yt-dlp run. What it added was time: +44.7 to +56.0 s per file, +48.7 s on average. Of that, 36.9–41.2 s is the probe that must finish before the menu appears.
2.The picker says mp4; the files say AVI, AV1 and HEVC
| Picker label | Container | Codec | Resolution | Menu said | On disk |
|---|---|---|---|---|---|
| 360p · mp4 · ~9.8 MB (YouTube) | mp4 | av1 | 640x360 | ~9.8 MB | 25,581,772 (2.6x) |
| best available · mp4 (archive.org) | avi | mpeg4 | 1280x720 | — | 332,243,668 |
| 1024p · mp4 (TikTok) | mp4 | hevc | 576x1024 | ~3.1 MB | 1,707,091 |
| 270p · mp4 (X) | mp4 | h264 | 480x270 | — | 1,756,786 |
| 840p · mp4 (Instagram) | mp4 | h264 | 472x840 | no size shown | 63,867 |
| 480p · mp4 (Reddit) | mp4 | h264 | 270x480 | — | 3,763,840, no audio stream |
"mp4" is a merge target, not a codec. Of the 6 files: 3 were h264, one AV1 (YouTube), one HEVC (TikTok). archive.org came back as a 332 MB AVI with mpeg4 inside. The size estimate is yt-dlp metadata. On YouTube it was 2.6x below the file that landed.
3.What it fetches on its own, and from where
- First run: 37,146,048 bytes to ~/.yoinks/bin/yt-dlp, fetched from github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos, which 302s to release-assets.githubusercontent.com. No mirror, no third-party host in the chain.
- npm install: 59 KB package, 70 MB node_modules, 44 MB of that ffmpeg-static. On this machine /usr/local/bin/ffmpeg 8.1.1 is found first, so the bundled 44 MB is never used here.
- The "1,800+ sites" number belongs to yt-dlp, not yoinks. The bundled yt-dlp lists 1,731 sites and 1,752 extractor names in its own supportedsites.md. yoinks hard-codes 9 platform labels in its source. 6 of those 9 are usable here.
- It calls yt-dlp twice per file: once with -J to build the menu, then once with -f bv*[height=N]+ba/b --merge-output-format mp4 and --load-info-json <tmp> to download. The tmp info-json is left in $TMPDIR.
4.Claims we checked
| Claim | Measured | Verdict |
|---|---|---|
| "YouTube, X/Twitter, Instagram, Threads, TikTok" | 4 of those 5 worked; Threads has no extractor behind the menu label | Did not hold for Threads |
| "Everything else (yt-dlp, ffmpeg) is fetched or bundled automatically" | 37.1 MB fetched on first run + 44 MB bundled ffmpeg; no Python needed | Held |
| "no sketchy redirects" | binary chain is github.com then release-assets.githubusercontent.com; the URL goes straight to yt-dlp | Held (as far as this can be checked) |
| "1,800+ other sites" | the bundled yt-dlp documents 1,731 sites | yt-dlp's count, not yoinks's |
| "pick a resolution" | codec/container differed from the label in 3 of 6 files | Partly |
5.What we did not measure
- Logged-in platforms: no cookies were used, so Vimeo and Threads were only tested to the failure. The README says the same thing, "downloading content may violate a platform's terms of service".
- n=1 per URL on one machine, one day. Platforms change: TikTok answered 403 on an earlier attempt minutes before the run in this table, then worked.
- Formats below the ones shown: the menu caps at 8 video rows, so "lowest" in our runs means the last row of that menu, not the lowest stream the site offers.
- Wall clock on the first run includes the 35.4 MB binary fetch, but only once. The rows above were measured with that binary cached.
- Every downloaded file was deleted after ffprobe read its container, codec, size and duration. We kept the numbers, not the video.
Raw rows, both engines, every ffprobe read-back: docs/analysis/2026-10-06-yoinks-vs-yt-dlp-on-the-same-urls.jsonl. This page measures the tool; it is not a score for it.
Decision
- Skip it for one known URL
- The wrapper adds +48.7 s per file and nothing else: same bytes, same file.
- Mean +48.7 s per file over the six downloads
- All 6 outputs were byte-identical to bare yt-dlp (sha256)
- Worth it to browse formats
- The menu shows resolutions and estimated sizes before anything downloads, and 6 of 8 URLs worked here with zero setup.
- No Python, no cookies and no config file were needed
- Resolutions and estimated sizes appear before anything is fetched
- Do not trust the label
- Read the file, not the picker. The menu said mp4 while one file landed as AVI; two more were AV1 and HEVC rather than H.264, and one size estimate was 2.6x low.
- AVI: archive.org, 332,243,668 bytes with mpeg4 inside
- AV1 on YouTube, HEVC on TikTok, H.264 on the other three
- The YouTube size estimate was 2.6x below the file that landed
- What would change this
- A non-interactive mode (still on their roadmap) or cookies for Vimeo/Threads: both failures here are the platform's, not the wrapper's.
- A non-interactive mode is still on their roadmap
- Vimeo and Threads failed for the platform, not for the wrapper