ZwiftPacketMonitor 1.2.9

.NET 5.0
Install-Package ZwiftPacketMonitor -Version 1.2.9
dotnet add package ZwiftPacketMonitor --version 1.2.9
<PackageReference Include="ZwiftPacketMonitor" Version="1.2.9" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ZwiftPacketMonitor --version 1.2.9
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ZwiftPacketMonitor, 1.2.9"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install ZwiftPacketMonitor as a Cake Addin
#addin nuget:?package=ZwiftPacketMonitor&version=1.2.9

// Install ZwiftPacketMonitor as a Cake Tool
#tool nuget:?package=ZwiftPacketMonitor&version=1.2.9
The NuGet Team does not provide support for this client. Please contact its maintainers for support.


This project implements a TCP and UDP packet monitor for the Zwift cycling simulator. It listens for packets on a specific port of a local network adapter, and when found, deserializes the payload and dispatches events that can be consumed by the caller.

NOTE: Because this utilizes a network packet capture to intercept the UDP packets, your system may require this code to run using elevated privileges.


  • Packet capture relies on SharpPcap and requires the installation of libpcap (Linux), Npcap (Windows) or similar packet capture library.


See the included ZwiftPacketMonitor.Demo project for a complete working example.

    var serviceCollection = new ServiceCollection();

    var serviceProvider = serviceCollection.BuildServiceProvider(); 
    var logger = serviceProvider.GetService<ILogger<Program>>();
    var monitor = serviceProvider.GetService<Monitor>();

    monitor.IncomingPlayerEvent += (s, e) => {
        logger.LogInformation($"INCOMING: {e.PlayerState}");
    monitor.OutgoingPlayerEvent += (s, e) => {
        logger.LogInformation($"OUTGOING: {e.PlayerState}");
    monitor.IncomingChatMessageEvent += (s, e) => {
        logger.LogInformation($"CHAT: {e.Message}");
    monitor.IncomingPlayerEnteredWorldEvent += (s, e) => {
        logger.LogInformation($"WORLD: {e.PlayerUpdate}");
    monitor.IncomingRideOnGivenEvent += (s, e) => {
        logger.LogInformation($"RIDEON: {e.RideOn}");

    // network interface name or IP address
    // This won't get called until the above Wait finishes


This project is a .NET port of the zwift-packet-monitor project and borrows heavily from its packet handling and protobuf implementation.

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.9 224 7/30/2021
1.2.8 192 3/31/2021
1.2.7 152 2/12/2021
1.2.6 158 2/4/2021
1.2.5 147 1/26/2021
1.2.4 150 1/24/2021
1.2.3 191 1/22/2021
1.2.2 174 1/19/2021
1.2.1 208 1/16/2021
1.2.0 196 1/16/2021
1.1.0 218 1/9/2021
1.0.0 174 1/5/2021

Added support for SharpPcap 6.0 after breaking changes.  Changed TargetFramework to net5.0