Nullcast is a lightweight, client-side Windows video player built around the Nullcast bookmarks service. It plays local files, direct URLs, and YouTube videos, and syncs playlists, bookmarks, and playback position against your Nullcast workspaces.
Windows only. This is a native WPF desktop application and depends on Windows-specific frameworks (WPF, Windows Forms, DWM, virtual-desktop COM interop). It does not run on macOS or Linux — see Is it easy for you to fix below.
This repo contains two implementations of the player. They are independent .NET solutions:
| Folder | Status | Video engine | Notes |
|---|---|---|---|
app-flyleaf/ |
Active — current development | FlyleafLib + FFmpeg | This is the app to build, run, and contribute to. |
app-wpf/ |
Legacy — archived for reference | LibVLCSharp + libVLC | Kept in-tree as a reference implementation. Not maintained. Do not build new features here. |
installer/ |
Release packaging | Inno Setup | Builds the shippable nullcast-setup-<version>.exe. |
New work goes in
app-flyleaf/.app-wpf/is retained only so the earlier LibVLC-based approach stays available for comparison. Treat it as read-only history.
- Play local files, direct media URLs, and YouTube videos (YouTube resolution via yt-dlp, fetched automatically on first run).
- Selectable YouTube quality (up to 4K / 2160p).
- Playlist / bookmarks sync against the Sygnal Playlist service — workspaces, YouTube bookmarks, and resume-where-you-left-off playback position.
- Local playback history.
- Fullscreen (F11), drag-and-drop to open, mouse-wheel volume, right-click "copy video URL".
- Pin to all virtual desktops and always-on-top support.
- Remote control API — a local HTTP + Server-Sent-Events interface so other apps
(voice agents, a control panel, scripts) can play/pause, change volume, start specific
items, and read live playback state. See
VIDEO-PLAYER-API.md. - Indigo Slate visual theme with bundled Instrument Sans font.
Grab nullcast-setup-<version>.exe from the
releases page and run it. The installer is
self-contained — no .NET runtime to install first — and asks whether to install for all
users or just you. Nothing else is required; yt-dlp and its JS runtime are fetched on
first launch.
The installer is currently unsigned, so SmartScreen will warn on first run.
Needs Inno Setup 6 or 7 alongside the .NET SDK:
.\installer\build.ps1Output lands in installer\Output\. See
app-flyleaf/DEPLOY.md for the full release process.
- Windows 10/11
- .NET 8 SDK (
net8.0-windows) - A code editor / IDE: Visual Studio 2022, JetBrains Rider, or VS Code with the C# Dev Kit.
From the app-flyleaf directory:
dotnet run # Debug
dotnet run -c Release # ReleaseOr from your IDE:
- F5 — build + run with debugger
- Ctrl+F5 — build + run without debugger
- Ctrl+Shift+B — build only
A release build produces bin/Release/net8.0-windows/VideoPlayer.exe.
FlyleafLib requires the FFmpeg 8.0 shared libraries. They live in
app-flyleaf/FFmpeg/ and are copied into the build
output automatically. The Flyleaf.FFmpeg.Bindings package version (8.0.1)
must match the FFmpeg DLL major version (8.0) — do not upgrade one without the
other.
This is a Win32/WPF application by design. Porting to macOS or Linux would require replacing the entire UI layer (WPF → e.g. Avalonia or MAUI), the Windows-native interop, and revisiting the video backend. It is effectively a rewrite, not a configuration change.
The project is MIT-licensed (see LICENSE) and open for the team to evolve. When contributing:
- Do all new work in
app-flyleaf/. Leaveapp-wpf/alone. - Keep the FFmpeg binding/DLL versions in lockstep (see above).
- Follow the existing project conventions in
AGENTS.md/CLAUDE.md.
The original source code in this repository is released under the MIT License.
This application links against and/or redistributes third-party components that carry their own licenses. The MIT license on our code does not relicense these — they remain under their respective terms, and those terms are preserved here. Because the video engines are linked dynamically (LGPL), MIT licensing of our own code is compatible.
app-flyleaf/ (active):
| Component | Version | License |
|---|---|---|
| FlyleafLib | 3.10.2 | LGPL-3.0-or-later |
| FlyleafLib.Controls.WPF | 1.6.2 | LGPL-3.0-or-later |
| Flyleaf.FFmpeg.Bindings | 8.0.1 | LGPL-3.0-or-later |
FFmpeg (shared libs, redistributed in FFmpeg/) |
8.0 | LGPL-2.1-or-later |
| yt-dlp (downloaded at runtime) | latest | The Unlicense (public domain) |
| Instrument Sans (bundled font) | — | SIL Open Font License 1.1 — see app-flyleaf/Fonts/OFL.txt |
app-wpf/ (legacy):
| Component | Version | License |
|---|---|---|
| LibVLCSharp.WPF | 3.9.5 | LGPL-2.1-or-later |
| VideoLAN.LibVLC.Windows (libVLC) | 3.0.23 | LGPL-2.1-or-later |
If you redistribute builds of this application, ensure the corresponding license texts for the LGPL components (FlyleafLib, FFmpeg, libVLC) and the Instrument Sans OFL license are included alongside the binaries, per those licenses' requirements.