Install
One line
curl -fsSL https://raw.githubusercontent.com/anas1412/ytmgo/main/install.sh | bashThe script works out what your system needs:
- Arch Linux installs
ytmgo-binfrom the AUR throughparuoryay— the same prebuilt binary, so nothing is compiled. If either package is already installed it updates that one instead, so an update never swaps out the package you chose. With no AUR helper at all it just fetches the binary. - Every other distribution downloads the release binary for your architecture, verifies its checksum, and installs it.
On Linux it also installs a desktop entry and icon, so ytmgo appears in your applications menu, and offers to install the dependencies below with your package manager.
Where it installs
/usr/local/bin when sudo is available, the same place a package would put it, so the command works in the terminal you ran the installer from. Without sudo it falls back to ~/.local/bin and adds that to your shell's PATH.
Override it with YTMGO_INSTALL_DIR=/opt/bin curl ... | bash.
Windows
ytmgo on Windows is a desktop app, not the terminal one: the same library, queue, downloads, lyrics and Last.fm, in a window. Download ytmgo-gui-setup.exe from the latest release and run it.
- It installs for you alone, with no administrator prompt, into
%LOCALAPPDATA%\Programs\ytmgo, with a Start menu entry and an uninstaller in Settings → Apps. - yt-dlp comes with it. ffmpeg, which downloads need, is fetched the first time you download something.
- It needs Windows 10 or 11, 64-bit. The installer adds Microsoft's WebView2 runtime if your system lacks it; Windows 11 has it already.
SmartScreen
The installer is not signed yet, so Windows warns about an unknown publisher. Choose More info, then Run anyway. Check the download against the .sha256 file beside it on the release first if you want to be sure it is the one published here.
Your library, downloads and settings live in %LOCALAPPDATA%\ytmgo; uninstalling leaves them there.
Arch Linux
The one-liner handles this, but both packages are on the AUR directly:
paru -S ytmgo # builds from source
paru -S ytmgo-bin # the released binaryytmgo compiles from source, which pulls in the Go toolchain — 226 MB installed, if you do not already have it. ytmgo-bin installs the same static binary the GitHub release publishes, so there is nothing to build. They provide the same program and conflict with each other, so install whichever you prefer.
Already have ytmgo and want the prebuilt one? Updates leave your choice alone, so the swap is yours to make:
paru -R ytmgo && paru -S ytmgo-binRolling build
Every push to main publishes a prerelease on the latest tag. It is the newest code rather than a release, so expect it to break occasionally:
YTMGO_VERSION=latest curl -fsSL https://raw.githubusercontent.com/anas1412/ytmgo/main/install.sh | bashIt names itself after the last release and the commit it was built from — v1.2.2-8-g3c10e7b — so a bug report says exactly what ran.
This cannot reach you by accident
The installer resolves versions through the newest release, and a prerelease is not one. Only asking for YTMGO_VERSION=latest gets you this build; running the installer again without it puts you back on a released version.
From source
Go 1.25 or newer:
git clone https://github.com/anas1412/ytmgo
cd ytmgo
go build -o ytmgo .
./ytmgoSupported systems
| Linux, any distribution | x86_64 and arm64 |
| macOS | Not supported |
| Windows 10 and 11 | x86_64, as a desktop app (above) |
Any distribution is meant literally: the binary is built with cgo off, so it is statically linked and depends on no system C library. It runs the same on glibc and on musl — Alpine included — and needs nothing backported.
Media keys and the desktop media widget work over MPRIS, which needs a D-Bus session bus. The spectrum needs cava to find a monitor of your audio output, which PipeWire and PulseAudio both provide automatically; on a bare ALSA setup cava needs a loopback configured by hand. Nothing else cares which audio stack you run: playback goes through mpv, which picks its own output — PipeWire, PulseAudio, ALSA, JACK or sndio.
The terminal app is Linux only. Windows gets the desktop app instead, built on the same code: there, a cancelled download's whole process tree goes with it through a Job Object, Windows' own equivalent of a process group.
Requirements
ytmgo drives a few external programs rather than reimplementing them. The installer offers to fetch these for you.
| Program | Used for | Required |
|---|---|---|
mpv | Playback | Yes |
yt-dlp | Downloading, and resolving streams for playback | Yes, installed from upstream |
ffmpeg | Converting audio and embedding album art | Yes |
cava | The audio visualizer | Yes |
Debian, Ubuntu and Mint:
sudo apt install mpv ffmpeg cavaFedora:
sudo dnf install mpv ffmpeg cavayt-dlp comes from upstream, not your package manager
yt-dlp is the one dependency a distro package actively breaks. YouTube changes, yt-dlp patches within days, and a frozen archive does not follow — Debian and Ubuntu still carry builds from 2023 and 2025 alongside the current one. An out-of-date yt-dlp cannot open a single track, which looks like ytmgo skipping through the whole queue in silence.
So the installer fetches yt-dlp from its own releases, next to the ytmgo binary. That copy self-updates with yt-dlp -U; a packaged one refuses to.
You do not have to do anything about a yt-dlp you already have. ytmgo runs its own copy by absolute path and tells mpv's stream hook to use the same one, so whatever your PATH order is, the current yt-dlp wins.
The installer does this for you. To do it by hand, or to give a system-wide yt-dlp the same treatment:
curl -fsSL https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux \
-o ~/.local/bin/yt-dlp && chmod +x ~/.local/bin/yt-dlpUse yt-dlp_linux_aarch64 on arm64. From then on yt-dlp -U updates it in place.
Updating
Press U inside the app to check for a new version and install it. On Arch that runs your AUR helper; elsewhere it re-runs the installer.
Or just run the one-liner again; it replaces the existing install.
Where your data lives
Everything ytmgo keeps between runs sits in one directory:
| Platform | Directory |
|---|---|
| Linux | $XDG_DATA_HOME/ytmgo, or ~/.local/share/ytmgo |
It holds ytmgo.db — settings, favourites, play history and the saved queue — plus downloads/ and a log.
Before v1 the database was in ~/.config/ytmgo. It moves itself the first time a v1 build starts; nothing to do, and nothing is lost.
Backing it up
Copy ytmgo.db while ytmgo is closed. A clean exit leaves no -wal file beside it; if you see one, the app is still running or did not exit cleanly, and copying the database alone would miss recent writes.
When something does not work
Start with Troubleshooting — nothing plays, no sound, no visualizer, no album art, media keys, lyrics.
Uninstalling
curl -fsSL https://raw.githubusercontent.com/anas1412/ytmgo/main/uninstall.sh | bashIt asks before each step, so you can remove the binary and the desktop entry while keeping your settings, favourites and play history. Pass --keep-user-data to skip that question entirely.