Sitemap

Google Summer of Code 2026: Create the watchOS app for VLC

5 min readAug 23, 2026

--

Hello and welcome to my summer journey at Google Summer of Code 2026! I’m David Neacsu, a student at the Faculty of Automatic Control and Computer Science, UNSTPB, Bucharest, Romania!

The beginning of everything

Since I was young, I’ve been a user of VideoLAN products, especially the Windows app. During my short YouTube career, I would use it to stream NCS music when I was live streaming as I didn’t know how to play songs in my recording app.

Fast forward, at my faculty, a few teachers organized a conference where they presented the Google Summer of Code program. I decided to browse the organizations and found VideoLAN listed. When I saw it, the nostalgia hit me. Seeing they listed the new watchOS app and the idea of people interacting daily with an app and an interface created by me was thrilling.

The Project

The goal of the project is to create a new watchOS app using SwiftUI. The app would allow users to play media directly on their Apple Watch. The minimum deployment version of the app is watchOS 10.

My work centered on three core areas:

  • Designing and implementing the new UI;
  • Developing the Media Player;
  • Developing the Radio Player Service.

My entire work is bundled into one MR: !1954.

The MR is merged and the code can be found in the watchOS folder.

The UI

The new watchOS app features a modern UI with Liquid Glass support.

The homepage presents to the user four buttons: Tracks, Artists, Albums and Radio. The first three buttons take the user to their respective view to play their track of choice. (VLCWatchOSApp.swift)

The Radio button takes the user to a new view where they can choose from listening to recently played stations, its favorites or to discover new stations. (RadioView.swift)

The player

Get David Neacsu’s stories in your inbox

Join Medium for free to get updates from this writer.

The player allows the user to control any track playing at the moment, including radio stations. It follows the MVVM pattern.

The core of the player resides in ControlPlayerViewController.swift. The controller is a delegate of the Playback Service. It handles the automatic updates received from the Playback Service and updates the view accordingly. It creates the bridge between all the buttons the user interacts with and calls the service accordingly. All the methods with public access have been documented.

The player features the three media control buttons (previous, pause/resume and next). The fourth button takes the user to the extra controls (ExtrasControlPlayerView.swift) where they can set the repeat mode and enable shuffle. If a radio station is playing, a third button would appear which allows the user to set the station as favorite. Below these buttons, the tracks next in queue are displayed. The queue updates in real time as the playback service advances in queue. The user can tap a track displayed and it would be played.

The radio

The radio player is a feature that enables the user to listen to radio stations. At the moment of writing this blog, this feature is a prototype. Due to the VLCKit limitations, network streaming is restricted on watchOS. Therefore, a radio station cannot be played at the moment.

The radio view presents the user with three options to choose from: Recents, Favorites and Discover.

The Recents view displays the last stations played (default: last 10 stations). The Favorites view displays all stations added to favorites. Both lists are persistent and they are stored locally. For obtaining the persistent state, a few custom structures have been created. (RadioStation.swift)

One of the main attractions of this feature is the Discover option. This allows the user to discover stations based on a countries list. The user selects the country and all the stations associated with the selected country will be displayed. The logic behind stands inside the Radio Controller. The controller calls the discoverer and starts searching for all the countries. When a country is selected, the discoverer loads the stations and then it’s stopped to reduce resource consumption.

The core of this feature resides in the RadioController.swift. The radio controller creates the bridge between all the views and features the user has access to and the playback service and radio discoverer service. All the methods with public access have been documented.

My experience

Google Summer of Code 2026 gave me the opportunity to work inside a large and complex project. It created for me a place to learn, test and gain new experience as I have not worked before in a project maintained and updated by multiple contributors. This summer has taught me how to work with other developers, how to write code that could be maintained later by others, how to adjust and implement solutions based on what others have developed. It wasn’t as easy as I believed it would be. I have learned what it really means to push commits without any issues and how easy a bug or an error can be found even though I believed the code was clean.

Left to do

At the moment of writing this blog post, VLCKit has restricted network access when it comes to network streaming. The radio player feature has been tested with real radio stations. When this issue is fixed, this feature requires testing.

Ending

As Google Summer of Code 2026 came to an end, I want to thank my mentors Felix and Diogo for coaching me during this program and checking my numerous versions of code I have pushed to my MR. It was a pleasure working with my mentors and contributing to VideoLAN. Personally, this is an experience I will never forget and I am happy that I have been one of the VideoLAN contributors. I am looking forward to this app to be released on Apple Watch and see my work come to life on my watch.

--

--