# invio

salix@host:~/projects/invio

invio is my personal YouTube client, built around Invidious instances. Watch what you want without the ads, the tracking or the Google account. It’s really three pieces:

  • core: a shared Rust library that handles Invidious requests, feeds, stream resolving, SponsorBlock, Return YouTube Dislike, and all the storage, import/export and sync logic
  • android: an Android app built with Compose, Media3 and WorkManager
  • adwaita: a GNOME app using GTK, GStreamer, WebKitGTK and the same Rust core

That shared core is the point: one place where the logic lives, two native apps on top instead of some web wrapper. When I fix a bug in stream resolving or add a feature like SponsorBlock skipping, both apps get it, the apps themselves stay thin and only do UI and playback for their platform.

Subscriptions live in the app, not in some account somewhere, and you can import and export them, so moving between devices or away from invio entirely is your choice, not mine. There’s also basic sync between the apps through the shared core, still simple, but it means my phone and laptop mostly agree on what I follow.

A small honest note about Invidious: you depend on public instances, and those come and go. invio lets you pick your instance and switch when one gets slow or dies, which in practice you will do sometimes. That’s the deal with not talking to Google directly.

It’s a personal project, mostly built for my own use, and the code is source available rather than open source licensed: you’re welcome to read it and learn from it, but reusing or redistributing it isn’t granted by default. Have a look around on the forge if you’re curious.

~$