My Google Summer of Code 2025 Journey with VideoLAN
This summer I had the awesome opportunity to work with VideoLAN through Google Summer of Code 2025 to contribute to readying the macOS interface of VLC Media Player for the upcoming version 4.0.
VLC is a project I’ve admired for years: a free, open-source media player that ‘just works’ across almost every platform and cheerfully plays whatever media format you throw at it. Knowing that my work would end up in a project used by millions worldwide made this one of the most rewarding experiences I’ve had as a computer science student.
In this post, I’ll walk through:
- the work I contributed to VLC’s macOS interface,
- the technical and personal challenges I faced,
- how mentorship and community shaped my experience,
- and the lessons I’ll carry forward from this journey.
Why VLC and Why GSoC?
When I applied for GSoC, I wanted a project where I could make tangible contributions to software that people use every day. VLC was the perfect fit: it’s widely used, technically challenging, and has a vibrant open-source community.
Working on VLC also meant stepping outside my comfort zone. I had experience with macOS development (mostly Swift and SwiftUI), but VLC’s macOS interface is written in Objective-C and AppKit. Diving into this ecosystem was both daunting and exciting.
Getting Started
Before I could write a single line of code, I had to set up the VLC build system. This turned out to be quite the experience.
-
Dependencies: VLC builds its own dependencies required to build itself from source. While sounding good on paper, at one point I couldn’t build the project at all because CMake itself was failing to compile. The error logs were almost comical — Apple’s system headers were colliding with CMake’s bundled zlib sources, leading to preprocessor redefinitions. Instead of just running
build.sh
and moving on, I had to pause to pause for a moment to figure out why the tool that was supposed to help me build VLC wasn’t building. -
A massive codebase: VLC is a large, multi-layered codebase with abstractions that connect the UI, libVLC, and countless modules. Understanding where to plug in my changes was initially overwhelming.
-
Development environment: I use VSCode as my editor, but getting clangd LSP support working with such a complex build proved non-trivial. I had to tailor a
compile_flags.txt
file for clangd to parse the Objective-C code. Took a bit off looking around, but once configured the payoff was huge: I got proper navigation, autocompletion, and refactoring support. -
Reflection: Looking back, wrestling with these build issues was less about fixing one-off errors and more about learning to think like a maintainer in a sense. It taught me persistence and helped to slowly build a the mental model of the codebase.
The Work I Did
To make my contributions clearer, I’ll group them into themes.
1. Playback Experience: Making VLC More Reliable
Playback is at the heart of VLC. I focused on fixing inconsistencies and adding polish:
- Precise seek on the progress bar: Previously, clicking the slider could feel inaccurate. I rewired the seek logic so clicks now land exactly at the intended timestamp. This makes media navigation far smoother.
- Spacebar toggling for audio playback: The Spacebar hotkey didn’t reliably toggle playback for audio-only media. I fixed this by centralizing hotkey handling in VLC’s main singleton, ensuring consistent behavior across audio and video.
- Picture-in-Picture (PiP) fixes:
- Fixed a bug where the PiP window could show a gray background instead of the video.
- Fixes for PiP window behavior for audio-only media
- In-progress: Progress slider preview window: I prototyped a hover window that shows a thumbnail and timestamp when hovering over the progress bar. This involved building a lightweight AppKit window, integrating blurred previews, and caching thumbnails for performance. It’s still in review, but it’s one of the more visible and exciting changes.
2. Media Library: Eliminating Crashes
The media library is a core part of the macOS interface. Fixes include:
- Crash when adding/removing items from groups: The collection view update logic caused mismatches between data and UI throwing exceptions
- Bookmarks assertion failure: Clicking outside the bookmarks table triggered an invalid selection and caused an exception. Fixed by adding checks before updating selection state.
- NSRangeException in updates: Fixed an out-of-bounds bug that occurred when the library model updated in certain edge cases.
- Preserving disclosure views: The little detail view in grouped collections (like star ratings) used to collapse after updates. I made sure it stays visible.
- Arrow positioning: The arrow indicator in grouped views now correctly points to the newly selected item.
3. UI Responsiveness and Small Touches
Polish matters. I worked on several small changes that add up:
- Async image loading: Moved image loading to a background thread in the streams section where previously artwork was loaded on the main thread, causing scroll freezes on slow networks.
- Hover feedback on star ratings: Added hover effects to make ratings more discoverable.
- Detached audio window fixes: Fixed issues with mute and seek buttons.
- Menus reflecting the correct state: Visualization and stereo mode menus now show the correct checkmarks.
- Menu bar playback icon: Fixed the menubar app to accurately reflect playback state.
Mentorship and Collaboration
One of the highlights of GSoC was working with the VideoLAN community.
My mentors and reviewers were responsive, providing feedback that wasn’t just about “fixing this line of code” but also about better ways to think about the problem. Their guidance made me feel supported even when the codebase felt overwhelming.
Contributing to VLC never felt like working in isolation. It felt collaborative and iterative — every merge request was a conversation that improved both the code and my skills.
Impact for VLC Users
So, what does all of this mean for VLC users on macOS?
- More reliable playback: Seeking is precise, and PiP behaves correctly.
- Fewer crashes: Media library operations that previously caused exceptions are now stable.
- Smoother UI: No more scroll hangs when loading network-heavy sections in the streams section.
- Future-facing: Features like the hover preview window pave the way for VLC to feel at home in a modern macOS environment.
What’s Next
I plan to keep contributing to VLC beyond GSoC. Immediate areas of focus include:
- Finishing and merging the progress slider preview window.
Lessons Learned
Looking back, GSoC 2025 was about much more than the code I wrote:
- I learned how to navigate and contribute to a large, mature open-source project.
- I learned how to work with tools and workflows outside my comfort zone (autotools, clangd, Objective-C).
- I experienced the value of mentorship and community, and how feedback accelerates learning.
- Most importantly, I gained confidence that I can tackle large engineering challenges and leave a meaningful impact.
Gratitude
I want to thank:
- Google Summer of Code for making this opportunity possible.
- VideoLAN and the VLC team for welcoming me and reviewing my work.
- My mentors, who were patient, responsive, and insightful throughout the summer.
It’s hard to describe the feeling of knowing that my code will ship to millions of VLC users around the world. It’s both humbling and motivating and it makes me excited to keep contributing.
Appendix: Merge Requests
Here’s a list of the merge requests I worked on during GSoC 2025:
- !7387 – Seek on progress slider
- !7412 – Spacebar toggles audio
- !7418 – Menubar playback icon
- !7422 – Fix NSRangeException in library model
- !7423, !7429 – Detached audio window fixes
- !7432 – Hoverable star ratings
- !7434 – Preserve detail disclosure view during updates
- !7446 – PiP gray background fix
- !7444 – iCarousel horizontal scroll fix
- !7456, !7470 – Audio visualization fixes
- !7493 – Progress slider preview window (WIP)
- !7635 – Streams scroll hang fix
- !7633 – Bookmarks assertion fix
- !7649 – Group crash fix on add/remove
- !7655 – Arrow positioning fix in grouped items