yoinks: a thin yt-dlp wrapper, a hardcoded output folder, and a picker you cannot skip
yoink any video from your terminal. no shady ads.
At a glance
- What is it?
- A terminal downloader that puts an Ink interface in front of yt-dlp and an ffmpeg fallback behind it. The interface takes over the terminal and gives the scrollback back, the site coverage belongs entirely to the backend, and the flags that would make it scriptable are still unchecked boxes on a roadmap.
- Who is it for?
- Use yoinks if you want a keyboard-driven picker instead of a page full of fake download buttons, and only for material you have the right to keep, because the project's own note says downloading may violate a platform's terms of service and that warning sits near the bottom of its documentation rather than the top. Two limits are worth knowing before you rely on it.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 80 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 5, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The terms of service warning is three lines, and it sits after the roadmap
The legal position is stated plainly and briefly. yoinks is described as a personal-archiving tool, the documentation says downloading content may violate a platform's terms of service, and the instruction is to download only what you have the right to keep and to be excellent to creators. That is the entire statement. It appears after the feature list, the install instructions, the development section and the roadmap, which means the reader meets the pitch first. Nothing in the code is presented as a way around a restriction: the work is delegated to a general purpose downloader, the interface only chooses a format, and the disclaimer frames the whole tool as an archiving aid rather than a distribution channel.
The interface takes the terminal over and gives the scrollback back
Running the tool with a url goes straight to the format picker, and running it with no argument prompts for one. The picker is full-screen and centered, and the documentation makes a point of saying the scrollback is restored on exit, which is the difference between this and a program that leaves your shell history scrolled away. Selection takes the arrow keys, or j and k, or number keys, with enter to confirm, escape to go back and control-c to quit. The mouse works too: the main button, the format list and the footer hints are all clickable, and clicking the logo returns to the home screen. Files land in ~/Downloads and the full path is printed to the terminal when the job finishes, which matters because the interface itself is gone by then.
The auto theme reads the terminal's own colours, and the override lasts one session
Three palettes ship: auto, light and dark. Auto is the default and works by using the terminal's own foreground and background rather than guessing, so it follows whatever theme the terminal is already set to. The other two are overrides. You can switch during a run with control-t or by clicking the theme control in the footer, and that choice applies to the current session, so the next launch comes back to auto. To set the starting palette for one launch instead, the flag is `--theme auto`, `--theme light` or `--theme dark`. The split between the two mechanisms is the detail to remember: the flag decides where a session starts, the keypress decides where it goes, and neither writes a configuration file.
The yt-dlp binary is downloaded into your home directory and nothing updates it
Extraction is not implemented here. On first run the tool downloads the standalone yt-dlp binary into ~/.yoinks/bin, which is what lets it claim no Python is required, and if a yt-dlp is already installed it uses that one instead. So there are two backends in play and the choice is made silently at startup. The consequence shows up over time rather than on day one: self-update for the bundled binary, implemented as a call to yt-dlp -U, is an unchecked item on the roadmap. Nothing in the documentation describes a way to keep that binary current, so a user who never installed yt-dlp themselves is running a backend whose version the project does not track.
ffmpeg comes from your PATH, with a pinned static build behind it
Two jobs need an external encoder: merging separate high-resolution streams, and extracting audio as mp3. ffmpeg is looked up on the PATH first, and ffmpeg-static is the fallback that ships with the package, pinned in the dependency list at a 5.x range. That ordering is sensible, since a system ffmpeg is usually newer than a bundled one, and it means the tool works on a machine that has ffmpeg installed and still works on one that does not. The version difference is the part to keep in mind: the fallback is frozen at whatever the dependency range resolves to and is not managed by the application, so a machine without a system ffmpeg silently runs an older encoder than a machine with one, with no message saying so.
The 1,800 sites belong to the backend, and so does every fix that lands after release
The claim of 1,800 or more sites is a description of what yt-dlp supports, not a measurement of this package. The same is true of format coverage, of which resolutions appear in the picker, and of every site that stops working when a platform changes: the fix arrives upstream, gets folded into a new yt-dlp release, and reaches a yoinks user only if that binary is updated. What this package actually adds is a small amount of code and four runtime dependencies, the three Ink components for the picker and the spinner, React itself, and the ffmpeg fallback. Read that way, the tool is an interface decision rather than a capability claim, and its long-term behaviour is coupled to a project it does not release alongside.
Output is hardcoded to Downloads, and the picker cannot be skipped
The roadmap is the most informative part of the documentation, because the checked and unchecked boxes describe the current state exactly. One box is checked: publishing to npm. Everything else is open, including a --best flag and an --mp3 flag to skip the picker for scriptable use, an -o flag to choose the output folder, playlist and thread support, clipboard detection to auto-suggest a copied url, self-update for the bundled binary, and a curl piped installer. Two consequences follow today. There is no way to choose a destination directory, so files always land in ~/Downloads, and there is no non-interactive mode, so every invocation ends at a picker, which is what these three invocations show:
$ yoinks https://youtu.be/dQw4w9WgXcQ # straight to the format picker
$ yoinks # prompts for a url
$ yoinks --theme light # force the light paletteFor a person at a keyboard that is fine; for a script it is a wall.
Node 18 is the runtime floor while the type definitions target a much newer toolchain
The engines field and the documentation agree on the floor, requiring Node 18 or newer. The development dependencies do not stay in the same era: the type definitions for Node are on a 26.x line and the React types on a 19.x line, with TypeScript on a 7.x line, tsup in the 8.x range and tsx in the 4.x range. That gap is normal for a package supporting a wide runtime range while developing on a current one, but it means the type layer is not evidence about what runs on 18. Release discipline is the other thing worth noting: the version in the package file is 0.3.1 and the install paths are the npm package and npx, while the repository itself carries no release tags at all. Publishing runs tests, typecheck and build before anything goes out, and only the dist directory is published.
Editorial conclusion
Use yoinks if you want a keyboard-driven picker instead of a page full of fake download buttons, and only for material you have the right to keep, because the project's own note says downloading may violate a platform's terms of service and that warning sits near the bottom of its documentation rather than the top. Two limits are worth knowing before you rely on it. It is not scriptable yet, since the flags that skip the picker and choose an output directory are both open roadmap items, and output is hardcoded to your Downloads folder. And the part that actually fetches video is a separate binary downloaded on first run into your home directory, with updating that binary also an open item, so the tool you depend on is maintained somewhere else. For a one-off personal archive it is a pleasant interface over a familiar backend; for anything automated, wait for the picker to become optional.
Frequently asked questions
What are yoinks?
A terminal downloader that puts an Ink interface in front of yt-dlp. You paste a url, pick a resolution or an audio-only mp3 from a full-screen picker, and the file is saved to your Downloads folder with the path printed when it finishes. The project describes it as a personal-archiving tool and notes that downloading may violate a platform's terms of service.
Does yoinks need Python or ffmpeg installed?
No Python. On first run it downloads the standalone yt-dlp binary into ~/.yoinks/bin, and it uses an existing yt-dlp installation if you already have one. ffmpeg is needed for merging high-resolution streams and for mp3 extraction; it is taken from your PATH, with ffmpeg-static as a bundled fallback.
Can yoinks run without the interactive format picker?
Not yet. Flags to skip the picker, --best and --mp3, are unchecked items on the roadmap, as is an -o flag to choose an output folder. Every run ends at the picker today, and files always go to ~/Downloads.
Where does yoinks save files?
To ~/Downloads, with the resulting file path printed to the terminal when the download finishes, since the full-screen interface has already exited by then. Choosing a different directory is an open roadmap item rather than a current option.
Is there a release of yoinks on GitHub?
No releases are published on the repository. The package version in the package file is 0.3.1, and the supported install paths are npm install -g yoinks and npx yoinks. Publishing to npm is the single completed item on the roadmap.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/pablostanley-yoinks)