QwkNet 1.3.0
dotnet add package QwkNet --version 1.3.0
NuGet\Install-Package QwkNet -Version 1.3.0
<PackageReference Include="QwkNet" Version="1.3.0" />
<PackageVersion Include="QwkNet" Version="1.3.0" />
<PackageReference Include="QwkNet" />
paket add QwkNet --version 1.3.0
#r "nuget: QwkNet, 1.3.0"
#:package QwkNet@1.3.0
#addin nuget:?package=QwkNet&version=1.3.0
#tool nuget:?package=QwkNet&version=1.3.0
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,.NDXindex 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 | Versions 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. |
-
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.
QWK, REP, and QWKE packet support for .NET 10.