Mixtapes

Mixtapes


A modern, Linux-first YouTube Music player built with GTK4 and Libadwaita.
formerly known as Muse

License: GPL v3 GitHub stars GitHub issues AUR Flatpak CI Windows Build Windows Download

Note

This software is in alpha. Expect bugs and missing features. It is not affiliated with, funded, authorized, endorsed, or in any way associated with YouTube, Google LLC or any of their affiliates and subsidiaries. Help is always appreciated through donations or contributions - feel free to open an issue or a pull request!


ko-fi GitHub Sponsors





Table of Contents

Features

Installation

This is the recommended way to install Mixtapes on Linux, as it avoids issues with your distribution's packaging.

Add the automated repository and install:

flatpak remote-add --user --if-not-exists mixtapes https://m-obeid.github.io/Mixtapes/mixtapes.flatpakrepo
flatpak install --user mixtapes com.pocoguy.Muse
Note

If you previously installed under the old "Muse" repository name, remove the old remote first: flatpak remote-delete --user muse

Offline bundle install

Download the latest artifact from GitHub Actions, then:

unzip Mixtapes-x86_64-flatpak.zip
flatpak install --user ./Mixtapes-x86_64.flatpak

Both x86_64 and aarch64 builds are available.

Windows

Get the installer from the latest Windows build, or the portable folder from the same CI run. The installer adds the Microsoft Edge WebView2 Runtime, which the sign-in page needs, where Windows lacks it (Windows 10 LTSC, for one).

AUR (Arch Linux)
yay -S mixtapes-git
Warning

If you are using CachyOS, you will also need to reinstall webkitgtk-6.0 from the Arch 'extra' repo, not the CachyOS repo: sudo pacman -S extra/webkitgtk-6.0

Nix
Warning

This is not extensively tested, if there are any issues to fix, please open a PR!

nix run github:m-obeid/Mixtapes       # run directly from GitHub
nix run                               # run from local checkout
nix develop                           # enter dev shell
From Source
Note

Mixtapes is written in Rust. The original Python app was retired once the port reached feature parity. ARCHITECTURE.md describes how it is put together.

Install dependencies for your distro

Arch Linux:

sudo pacman -S git rust gtk4 libadwaita webkitgtk-6.0 sqlite gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad yt-dlp yt-dlp-ejs nodejs ffmpeg

Fedora:

sudo dnf install git cargo gtk4-devel libadwaita-devel webkitgtk6.0-devel sqlite-devel gstreamer1-devel gstreamer1-plugins-base-devel gstreamer1-plugins-good gstreamer1-plugins-bad-free yt-dlp nodejs ffmpeg-free

Debian/Ubuntu:

sudo apt install git cargo libgtk-4-dev libadwaita-1-dev libwebkitgtk-6.0-dev libsqlite3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-bad yt-dlp nodejs ffmpeg

The build needs Rust 1.85 or newer, GTK 4.18, libadwaita 1.8 and GStreamer 1.24. On Debian/Ubuntu, consider the Flatpak to avoid outdated packages.

git clone https://github.com/m-obeid/Mixtapes.git
cd Mixtapes
cargo build --release
./target/release/mixtapes
Note

What the helper programs are for. Most songs play through YouTube's player endpoint directly and need none of them. yt-dlp (with nodejs) is the fallback for what that endpoint declines, such as your uploaded songs, and it does the downloads, with ffmpeg converting formats. The tokens uploads need are minted inside the app (the rustypipe-botguard crate, which runs YouTube's BotGuard in an embedded V8). A clean build downloads a prebuilt V8 library of about 28 MB from GitHub once. If that download stalls, fetch the file yourself and point the build at it:

curl -LO https://github.com/denoland/rusty_v8/releases/download/v130.0.7/librusty_v8_release_x86_64-unknown-linux-gnu.a.gz
RUSTY_V8_ARCHIVE=$PWD/librusty_v8_release_x86_64-unknown-linux-gnu.a.gz cargo build --release
Build with flatpak-builder
flatpak install flathub org.gnome.Platform//50 org.gnome.Sdk//50 org.freedesktop.Sdk.Extension.node24//25.08 org.freedesktop.Sdk.Extension.rust-stable//25.08
git clone https://github.com/m-obeid/Mixtapes.git && cd Mixtapes
flatpak-builder --user --install --force-clean build-dir com.pocoguy.Muse.yaml
flatpak run com.pocoguy.Muse
Prerequisites
DependencyPurpose
Rust 1.85+Builds the app
GTK 4.18 + libadwaita 1.8UI toolkit
WebKitGTK 6.0Embedded browser for sign-in
GStreamer + plugins (base, good, bad)Audio playback
SQLiteDownload library and listening history
yt-dlp, yt-dlp-ejs, Node.jsFallback stream resolver (uploads) and downloads
ffmpegAudio conversion for downloads
Last.fm API Credentials

Nothing to do here for a normal build. This section explains where the key comes from.

Last.fm requires every client to ship its own API key. ListenBrainz needs no app credentials and works out of the box.

The key and secret live in EMBEDDED_LASTFM_API_KEY and EMBEDDED_LASTFM_API_SECRET at the top of src/scrobbler.rs, and they are committed on purpose. The AUR package builds from a git clone on the user's own machine, and a Flathub build runs on Flathub's infrastructure, so neither one receives a secret from CI. A credential shipped inside a desktop client is extractable from the binary no matter how it got there, so injecting it at build time would protect nothing while leaving AUR and Flathub users without Last.fm.

To build against your own Last.fm app, register one at last.fm/api/account/create, then either replace the two constants or set these before launching:

export MIXTAPES_LASTFM_API_KEY=your_key
export MIXTAPES_LASTFM_API_SECRET=your_secret
Important

The environment variables are read when the app starts, not when it is compiled. Exporting them during makepkg or flatpak-builder has no effect on the resulting package.

With no credentials the Last.fm row in Preferences stays disabled and says so. ListenBrainz is unaffected.

Authentication

Mixtapes asks on first launch whether to sign in. The sign-in window is Google's own page. Once you are signed in, Mixtapes keeps its own copy of the session and clears the window's cookies.

The session is stored in headers_auth.json in the data folder (~/.local/share/muse, or ~/.var/app/com.pocoguy.Muse/data/muse for the Flatpak). Treat it like a password.

Mixtapes opens YouTube and YouTube Music links. Songs play, and playlists, albums and artists open their page.

To open YouTube Music pages from your browser, install the Open in Mixtapes userscript with Violentmonkey or Tampermonkey. A song, playlist, album or artist page you open in the browser goes straight to Mixtapes. Browsing within the site stays in the browser, and an "Open in Mixtapes" button hands over the page you are on. The script's menu switches the automatic handover off. The browser asks once before it lets a page open Mixtapes.

Your desktop sends every https:// link to the browser and has no way to hand one site to another app, so links clicked outside the browser still open there first.

Roadmap

StatusFeatureDetails
AuthenticationBuilt-in Google sign-in page — Optional: skip it and use the app without an account, Brand account channels
LibraryPlaylists, Liked songs, Artists, Albums, Uploads (browse, upload, delete), Playlists and likes on this device when signed out
SearchSongs, videos, albums, artists, playlists and podcasts, plus offline search of downloads
ExplorationHome page with Quick picks, New Releases, Moods & Moments, Genres, Trending, Charts
Artist PageBasic info, Related artists, Top tracks, Albums, Singles/EPs, Videos, Play, Shuffle, Subscribe/Unsubscribe
Playlist PageInfo, Tracks, Play, Shuffle, Order, Multi-Selection Editing, Cover Change, Change Visibility, Change Description, Change Name, Create and delete playlists
Album PageBasic info, Tracks, Play, Shuffle
PlayerPlay/Pause, Seeking, Volume, Queue (Previous/Next, Reorder, Shuffle, Repeat modes), Gapless playback, Visualizer
PodcastsShows, episodes and Episodes for Later
Live StationsLive radio streams play; needs more testing
HistoryView history, Share history with Google account, Delete songs from history
Offline ModeDownloaded songs, cached playlists, library and covers work without a connection
CachingCache data to reduce latency
Responsive DesignAdaptive layout from desktop down to phones, tested on postmarketOS
MPRIS SupportControl playback from system media controls
Download SupportDownload tracks for offline playback, even as local files
Radio / MixesStart a radio station from a song, album, playlist, or artist
Link HandlingOpen YouTube Music links from the search field, the command line, mixtapes:// links or the browser userscript
Dedicated Data DirectoryCookies, cache, etc. in a dedicated directory
Background PlaybackMusic keeps playing when the window is closed
Setup & Release NotesFirst-run setup wizard and a What's New dialog after updates
SettingsGeneral, Appearance, Lyrics, Services and Advanced pages
Cover Art TintTint Libadwaita to match cover art, kinda like Material You, with an optional blurred cover background
ScrobblingSubmit plays to Last.fm and ListenBrainz — Now Playing, Offline backlog with retries
Discord RPCShow your current track on Discord — Linux, Windows
LyricsSynchronized lyrics using a bunch of providers (Apple Music, BetterLyrics, BiniLyrics, NetEase, LRCLIB, native YT Music) — Reorderable provider search queue, Second line: romanization, translation or background vocals, Word-level karaoke timing with duration-aware fades
Rust RewriteRewritten in Rust for speed and memory use; the Python app is retired
AURAvailable as mixtapes-git
FlatpakFlatpak build (x86_64 and aarch64), App icon, Flathub release (planned)
NixFlake builds; not extensively tested
WindowsInstaller and portable builds from CI, with media controls, tray and sign-in
macOSCan build it for macOS, just need to test, there's a PR for auto-builds.
GNOME CircleStill considering it, might not happen

Have an idea or found a bug? Open an issue!

Contributing

Contributions are welcome! Feel free to open issues for bug reports or feature requests, and submit pull requests.

Star History

Star History Chart

Contributors

The app icon was sketched by Jakub Steiner and rendered by gnoman.

License

This project is licensed under the GNU General Public License v3.0 or later.

This page is the project's README, rendered here. Last read from GitHub on 18 October 2026 at 14:02 UTC.


press play, loud breakcore enjoyer hand coded