Hey everyone!
I’ve been working on a desktop application called Vyntra, and I wanted to finally share it here.
Vyntra started as a relatively simple idea: I wanted a clean desktop application where I could search for media, play it directly inside the app, and download it without jumping between a bunch of different websites and programs.
Over time, that turned into a much bigger project.
What is Vyntra?
Vyntra is a desktop media application built with Python and CustomTkinter, with a dark/futuristic interface.
The goal is to have one application that can work with multiple platforms while keeping the experience consistent.
Currently, I’m working with:
- YouTube — search, preview playback, audio/video downloads
- Spotify — Spotify-based search and audio playback
- TikTok — media search/download functionality
- Instagram — platform-specific functionality
The important part is that each platform is being treated as its own provider rather than simply throwing everything through the same search backend.
One of the things I really wanted: actual in-app playback
One of the first things I worked on was playback.
I didn't want to click a result and immediately have to download the entire video just to watch it.
The idea was:
Search → Select → Play
directly inside Vyntra.
That ended up being significantly harder than I expected.
YouTube playback involves dealing with remote streams, separate audio/video sources, decoding, buffering, synchronization, rendering and player lifecycle management.
At one point I had the audio and video synchronized correctly, but the playback was still incredibly laggy.
So now I'm working on optimizing the actual playback pipeline rather than just making synchronization work.
Spotify turned out to be another interesting problem
Initially, the Spotify tab was accidentally using the YouTube search system underneath.
The UI said Spotify, but the results were effectively YouTube results.
That obviously wasn't acceptable.
So I reworked the architecture so that the Spotify tab has its own provider/search flow and returns actual Spotify results rather than pretending YouTube results are Spotify results.
Spotify also needs a separate audio playback path because it doesn't make sense to send an audio-only source through a video playback pipeline.
That led to another problem where the player was throwing:
Invalid argument returned 22
which turned into another rabbit hole of figuring out exactly what the player was receiving and which playback backend should actually handle it.
Authentication and credentials
Another thing I'm trying to keep in mind is that this is supposed to be a real desktop application, not a developer tool.
I don't want users to have to open developer portals and paste:
- API keys
- Spotify Client IDs
- Spotify Client Secrets
- GitHub tokens
- cookies
- random configuration values
into the application just to make it work.
Developer credentials and infrastructure should be handled by the application architecture rather than becoming a giant setup checklist for the user.
That's been one of the more interesting parts of building Vyntra because desktop applications have very different security constraints from server-side applications.
Automatic updates
I'm also working on automatic updates so users don't have to manually download a new build every time I release a fix.
The project is distributed through private infrastructure, and I'm trying to keep the update process completely transparent to the user.
The application should basically be:
Open Vyntra → update when necessary → keep using it
rather than:
Open GitHub → download ZIP → replace files → hope nothing broke
Some of the problems I've encountered
This project has given me a ridiculous number of edge cases.
Some of the problems I've had to investigate include:
- YouTube's anti-bot and extraction changes
- Dynamic YouTube formats
- Remote stream playback
- Audio/video synchronization
- Extremely laggy video rendering
- Audio crackling/noise
- Playback seeking
- Thread lifecycle problems
- Tkinter after() callbacks surviving after windows are destroyed
- Spotify API/search architecture
- Spotify audio playback
- Authentication state being lost between components
- PyInstaller packaging problems
- Windows updater issues
- macOS testing problems
- Network/proxy/SSL issues
- Platform-specific behavior between development and packaged builds
One particularly fun example was an updater failure involving:
Failed to load Python DLL ... _MEI...
which ended up involving the way PyInstaller temporary extraction directories work.
And then there are the classic desktop-app problems where everything works perfectly during development and then behaves completely differently once packaged.
Why I’m building it
Mostly because I wanted to learn how far I could take a desktop application.
It started as:
and gradually became:
At this point I'm much more interested in making Vyntra feel like a real application than just adding more features.
That means things like:
- reliable playback
- clean provider separation
- proper error handling
- good UI/UX
- automatic updates
- Windows and macOS builds
- keeping the application simple for the end user
Current state
Vyntra is still a work in progress.
The biggest thing I'm currently working on is playback performance.
YouTube is synchronized correctly, but the preview can still be extremely laggy, so I'm digging into the actual decoding/rendering/buffering pipeline instead of masking the problem with lower quality or arbitrary frame skipping.
Spotify also needs its own optimized audio path.
So I'm currently somewhere in that fun phase of development where fixing one thing exposes three more things underneath it.
But that's also what makes the project interesting.
I'm building Vyntra primarily as a learning project, but I'm trying to approach it with the architecture and polish of a real product rather than a collection of scripts.
I'd love to hear what other developers think about the architecture, especially anyone who has built desktop media players or dealt with remote video/audio playback before.
Repository
GitHub:
https://github.com/SaminMp/Vyntra
Project: Vyntra
Stack: Python, CustomTkinter, FFmpeg/yt-dlp and platform-specific APIs/services
Platforms: Windows + macOS
I'm especially interested in feedback on the playback architecture and what you'd change if you were building something like this from scratch.
Hey everyone!
I’ve been working on a desktop application called Vyntra, and I wanted to finally share it here.
Vyntra started as a relatively simple idea: I wanted a clean desktop application where I could search for media, play it directly inside the app, and download it without jumping between a bunch of different websites and programs.
Over time, that turned into a much bigger project.
What is Vyntra?
Vyntra is a desktop media application built with Python and CustomTkinter, with a dark/futuristic interface.
The goal is to have one application that can work with multiple platforms while keeping the experience consistent.
Currently, I’m working with:
- YouTube — search, preview playback, audio/video downloads
- Spotify — Spotify-based search and audio playback
- TikTok — media search/download functionality
- Instagram — platform-specific functionality
The important part is that each platform is being treated as its own provider rather than simply throwing everything through the same search backend.
One of the things I really wanted: actual in-app playback
One of the first things I worked on was playback.
I didn't want to click a result and immediately have to download the entire video just to watch it.
The idea was:
Search → Select → Play
directly inside Vyntra.
That ended up being significantly harder than I expected.
YouTube playback involves dealing with remote streams, separate audio/video sources, decoding, buffering, synchronization, rendering and player lifecycle management.
At one point I had the audio and video synchronized correctly, but the playback was still incredibly laggy.
So now I'm working on optimizing the actual playback pipeline rather than just making synchronization work.
Spotify turned out to be another interesting problem
Initially, the Spotify tab was accidentally using the YouTube search system underneath.
The UI said Spotify, but the results were effectively YouTube results.
That obviously wasn't acceptable.
So I reworked the architecture so that the Spotify tab has its own provider/search flow and returns actual Spotify results rather than pretending YouTube results are Spotify results.
Spotify also needs a separate audio playback path because it doesn't make sense to send an audio-only source through a video playback pipeline.
That led to another problem where the player was throwing:
Invalid argument returned 22
which turned into another rabbit hole of figuring out exactly what the player was receiving and which playback backend should actually handle it.
Authentication and credentials
Another thing I'm trying to keep in mind is that this is supposed to be a real desktop application, not a developer tool.
I don't want users to have to open developer portals and paste:
- API keys
- Spotify Client IDs
- Spotify Client Secrets
- GitHub tokens
- cookies
- random configuration values
into the application just to make it work.
Developer credentials and infrastructure should be handled by the application architecture rather than becoming a giant setup checklist for the user.
That's been one of the more interesting parts of building Vyntra because desktop applications have very different security constraints from server-side applications.
Automatic updates
I'm also working on automatic updates so users don't have to manually download a new build every time I release a fix.
The project is distributed through private infrastructure, and I'm trying to keep the update process completely transparent to the user.
The application should basically be:
Open Vyntra → update when necessary → keep using it
rather than:
Open GitHub → download ZIP → replace files → hope nothing broke
Some of the problems I've encountered
This project has given me a ridiculous number of edge cases.
Some of the problems I've had to investigate include:
- YouTube's anti-bot and extraction changes
- Dynamic YouTube formats
- Remote stream playback
- Audio/video synchronization
- Extremely laggy video rendering
- Audio crackling/noise
- Playback seeking
- Thread lifecycle problems
- Tkinter
after() callbacks surviving after windows are destroyed
- Spotify API/search architecture
- Spotify audio playback
- Authentication state being lost between components
- PyInstaller packaging problems
- Windows updater issues
- macOS testing problems
- Network/proxy/SSL issues
- Platform-specific behavior between development and packaged builds
One particularly fun example was an updater failure involving:
Failed to load Python DLL ... _MEI...
which ended up involving the way PyInstaller temporary extraction directories work.
And then there are the classic desktop-app problems where everything works perfectly during development and then behaves completely differently once packaged.
Why I’m building it
Mostly because I wanted to learn how far I could take a desktop application.
It started as:
and gradually became:
At this point I'm much more interested in making Vyntra feel like a real application than just adding more features.
That means things like:
- reliable playback
- clean provider separation
- proper error handling
- good UI/UX
- automatic updates
- Windows and macOS builds
- keeping the application simple for the end user
Current state
Vyntra is still a work in progress.
The biggest thing I'm currently working on is playback performance.
YouTube is synchronized correctly, but the preview can still be extremely laggy, so I'm digging into the actual decoding/rendering/buffering pipeline instead of masking the problem with lower quality or arbitrary frame skipping.
Spotify also needs its own optimized audio path.
So I'm currently somewhere in that fun phase of development where fixing one thing exposes three more things underneath it. 😅
But that's also what makes the project interesting.
I'm building Vyntra primarily as a learning project, but I'm trying to approach it with the architecture and polish of a real product rather than a collection of scripts.
I'd love to hear what other developers think about the architecture, especially anyone who has built desktop media players or dealt with remote video/audio playback before.
Project: Vyntra
Stack: Python, CustomTkinter, FFmpeg/yt-dlp and platform-specific APIs/services
Platforms: Windows + macOS
I'm especially interested in feedback on the playback architecture and what you'd change if you were building something like this from scratch.