QwkNet 1.3.0

dotnet add package QwkNet --version 1.3.0
                    
NuGet\Install-Package QwkNet -Version 1.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="QwkNet" Version="1.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="QwkNet" Version="1.3.0" />
                    
Directory.Packages.props
<PackageReference Include="QwkNet" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add QwkNet --version 1.3.0
                    
#r "nuget: QwkNet, 1.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package QwkNet@1.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=QwkNet&version=1.3.0
                    
Install as a Cake Addin
#tool nuget:?package=QwkNet&version=1.3.0
                    
Install as a Cake Tool

QWK.NET Library

QWK.NET is a preservation-grade C# library for reading, writing, and validating QWK, REP, and QWKE offline message packets used by bulletin board systems (BBS) from the 1980s and 1990s. The library provides byte-accurate parsing and generation whilst maintaining compatibility with historical BBS software implementations.

Purpose and Scope

The library supports:

  • QWK packets - Standard offline mail packets (CONTROL.DAT, MESSAGES.DAT, .NDX index files)
  • REP packets - Reply packets generated by offline readers
  • QWKE extensions - Extended format features (TOREADER.EXT, TODOOR.EXT, long headers, kludges)

Main Entry Points and Workflow

Typical workflow: Open → Inspect → Validate → Read optional files.

using QwkNet;

// Open packet
using QwkPacket packet = QwkPacket.Open("DEMO1.QWK");

// Inspect contents
Console.WriteLine($"BBS: {packet.Control.BbsName}");
foreach (Message message in packet.Messages)
{
  Console.WriteLine($"{message.From} → {message.To}: {message.Subject}");
}

// Validate
ValidationReport report = packet.Validate();
if (!report.IsValid)
{
  Console.WriteLine($"Errors: {report.Errors.Count}");
}

Validation Modes

Three modes control handling of malformed packets:

Strict - Fails on any specification violation:

QwkPacket packet = QwkPacket.Open("packet.qwk", ValidationMode.Strict);

Lenient (default) - Logs warnings, continues parsing:

QwkPacket packet = QwkPacket.Open("packet.qwk", ValidationMode.Lenient);

Salvage - Best-effort recovery from damaged packets:

QwkPacket packet = QwkPacket.Open("damaged.qwk", ValidationMode.Salvage);

Byte Fidelity and Preservation

QWK.NET prioritises byte-accurate preservation:

  • CP437 encoding preserved (no UTF-8 conversion)
  • MSBIN floats maintained in index files
  • 128-byte records with space padding preserved
  • 0xE3 line terminators maintained
  • Round-trip fidelity (QWK → REP → QWK preserves all bytes)

The library treats QWK specifications as historical artifacts to preserve, not modernise.

Extension Points

Archive format support is extensible via IArchiveExtension:

using QwkNet.Archive;
using QwkNet.Archive.Extensions;

ArchiveFactory.RegisterExtension(new MyArchiveExtension());

Important: Extensions must be explicitly registered. No auto-discovery or assembly scanning. Only ZIP (1991+) format is built-in.

Documentation

  • docs/ - Library documentation (building, architecture, API overview, compatibility)
  • wiki/ - Deep dives, format notes, troubleshooting, and extended examples

Licence

MIT License - see LICENSE for details.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.

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.3.0 88 2/19/2026
1.2.0 89 2/18/2026
1.1.0 93 2/10/2026
1.0.0 93 1/19/2026

QWK, REP, and QWKE packet support for .NET 10.