An example WinUI 3 application demonstrating how to read and download content from Usenet (NNTP) newsgroups.
RadioObtainer connects to a Usenet provider via NNTP, scans newsgroup headers, and downloads yEnc-encoded binary posts. It serves as a reference implementation for working with the NNTP protocol, yEnc decoding, and header caching in a .NET desktop application.
- NNTP client — Connects to Usenet providers over TCP/SSL, authenticates, and retrieves article headers and bodies using standard NNTP commands (XOVER, BODY, GROUP, LIST).
- Header caching — Caches scanned headers locally in compressed (gzip) JSON files for incremental scanning.
- yEnc decoding — Decodes yEnc-encoded binary attachments and assembles multi-part posts into complete files.
- Library tracking — Scans a local folder to identify which posts have already been downloaded, avoiding duplicates.
- Newsgroup browsing — Discover and subscribe to newsgroups from the server's full group list.
- .NET 8
- Windows 10 (19041) or later
- Windows App SDK / WinUI 3
dotnet build
On first launch, go to Settings to configure:
- Usenet provider — Host, port, SSL, and credentials for your NNTP server.
- Newsgroups — The newsgroups to scan for content.
- Library folder — Where downloaded files are stored.
Settings are saved to %LocalAppData%\RadioObtainer\config.json.
Services/
NntpClient.cs — Low-level NNTP protocol implementation
DownloadService.cs — High-level scan and download orchestration
HeaderCache.cs — Compressed header cache persistence
YencDecoder.cs — yEnc binary decoding and multi-part assembly
LibraryScanner.cs — Local file library scanning
ConfigService.cs — JSON configuration persistence
Models/
AppConfig.cs — Configuration and provider models
RadioShow.cs — Domain models (ArticleHeader, PostGroup, etc.)
Pages/
BrowsePage.xaml.cs — Scan headers and download posts
GroupBrowserPage.xaml.cs — Discover newsgroups
LibraryPage.xaml.cs — View downloaded content
SettingsPage.xaml.cs — Configure provider and preferences
This project is provided as an example for educational purposes.