Melon Video Player

August 8, 2025

Over one and a half years ago, I started working on Melon, my own video streaming client.
I made the last change on the project over two months ago, but it’s been over a year since the last release.
Now I’ve decided to stop development indefinitely, but not without saying goodbye to it.

Origin

Melon was born from me wanting to daily drive postmarketOS on my OnePlus 6T and feeling that the only thing missing for my setup was a proper, mobile-friendly YouTube client that was as feature-rich as NewPipe.

For me, a video client not only has to have a home feed that shows the most recent uploads by the creator I follow and allow me to search videos and channels.
But also provide a means of playing back videos and playlists and store my playback position.

I explored other options such as Pipeline, using the Invidious web app directly, or following channels using their RSS feed.
But none of these provide the features I need or come close to my NewPipe experience.

What is Melon

Melon Banner. On the left, the symbolic melon icon is shown. On the right it has the title “Melon” under which the melon tagline is shown

As you probably have guessed by now, Melon tries to achieve all of these goals by basically replicating exactly what NewPipe does on Android.

It is a video streaming client built using GTK4 and libadwaita and written in Python.
It supports searching for videos, channels, and playlists from multiple different services (including Invidious); managing playlists and subscriptions (local only); and playing back videos and playlists using the built-in video player.

Support for different streaming services is provided by plugins (also referred to as servers).
During its life cycle, Melon only ever officially supported Invidious, PeerTube and Nebula. Although Nebula requires login details, it was thus disabled by default.
The design of the plugin system was heavily inspired by the Komikku plugin model, from which I took a lot of code.

Features & UI

The UI is made to resemble NewPipe in terms of layout, as my brain is very used to how things work and the flow of interactions and gestures.

Melon home screen, showing newly uploaded videos by day, as well as the last refresh timestamp and a refresh button.

I’m so used to the gestures that I even wrote my own media player UI, with support for brightness and volume swipe gestures, as I can’t live without them.

Video playback screen, showing a quality selector and the video playing on top

With the support for multiple streaming services also comes a global search feature, which allows searching for content across all streaming services at once.

Global search UI, showing a search bar at the top and results grouped by streaming service. All but one result group are closed.

When browsing for content, you have the option to select the streaming service you would like to browse.

Server list, showing the three available streaming services as PreferenceRows

If you select a streaming service, you then have the option to either search for content.

Invidous search results showing a list of videos and channels

Or you can browse server feeds, which depend on the streaming provider.

The Nebula Originals tab selected whilst browsing the Nebula straming service. The results are channels for every Nebula Original

Subscribing to a channel is as easy as flipping the follow switch, which is also how you bookmark external playlists.

Channel browse screen, showing a placeholder avatar, the subscribe button and a selector for the specific channel feed. Below the about group is a list of videos.

Of course, you can also create your own local playlists and add videos to it.
I personally use this to keep track of videos I plan on watching later or to bookmark DIY videos.
You can even collect videos from different streaming services in the same playlist.

External Playlist screen, which looks very similar to the channel screen, but it also contains a play button at the top

Both local and external playlists allow automatic playlist playback, where the player continues with the next video once the current video has finished playing.

Playlist player, which looks like the normal video playback UI, but with additional playlist focused controls like previous and next buttons

Video playback tracking is one of the many features that were added later, once I added the custom video player, which I mentioned earlier.
Besides being used for playlist playback, it also allows keeping proper track of the playback history and allows you to continue watching the video you last watched if you haven’t finished watching it yet.

Problems

Initially, Melon only supported Invidious, with Nebula and PeerTube support being added not short after.
Relying on Invidious is one of the strengths of Melon if you don’t want to query YouTube directly; however, it is also its greatest weakness.
Over the last months and years, YouTube has been cracking down on third-party YouTube proxies, like Invidious, which is why most public instances no longer work, breaking YouTube support for Melon.

In an attempt to fix this, I started working on a Piped backend. Which I abandoned after a couple of hours because most Piped instances don’t work properly for me either, and the API kept rate limiting me if I even managed to find an exposed API server. Not to mention their API docs.

Following this, I began implementing a youtube-dlp backend, which, while slow, should work fine as long as youtube-dlp is updated (and keeps their API stable).
However, with almost no time to work on Melon for the last three months, this sat on ice for quite a while, and some parts of the implementation no longer work - already.

I’ve been planning on sunsetting Melon for a couple of months now; while I really like the idea and design of it, I just don’t have the time for it, nor a use.
And that is ignoring the messy python codebase.

Only a couple of months after starting the work on Melon, I migrated back from postmarketOS to Android because I just have to use some Android apps that don’t make sense to run in a sandbox (if possible at all).
Making things worse is that my Chromebook (which I use for on-the-go development) is unable to properly play videos because of some Mesa issues.

Saying Goodbye

Working on Melon has been amazing; seeing something come to life, something I actually like is soo cool.
For example, the volume and brightness gestures. I use them every time just because it is so much more intuitive on a touchscreen.

Sadly, most things won’t last forever, and the bugs and maintenance work just outgrew the time I have available.
If you are still looking for a YouTube client for Linux, check out Pipeline, which gained an inbuilt video player this year.

Future

Sometimes I think about starting Melon from scratch, and while I certainly don’t have time to do so right now, I would love to implement some new ideas.

Most importantly, separating data scraping from video playback.
As this would allow you to discover videos using Invidious, but get the stream details using youtube-dlp, which would significantly improve search speed while still giving you the best streaming experience.
It would also be more resistant against proxy services shutting down, as you can just play the video using a different supported streaming backend.

But for now, I’ve archived the Melon repository1 and would like to thank everyone who contributed feedback or translations for their work.


  1. You can still download the source, but I don’t plan on publishing updates for the time being. Issues and PRs have also been disabled. ↩︎