Changelog
The release history of Scrubkit — offline text + metadata extraction for .NET. Every version, and what changed in extraction, opt-in redaction, packaging, and tests.
V1.4.0
2026-07-20
STABLEOutput, diagnostics, and content hashing
A capability release: turn the scrubbed table into CSV, JSON, or Parquet; watch the run through a diagnostics hook; and hash file content.
OUTPUT: CSV / JSON / PARQUET
CSV and JSON writers in the core. The zero-dependency TableWriter serializes the record table — TableWriter.ToCsv(table) / ToJson(table). CSV is a flat, RFC 4180-quoted summary; JSON carries the full record including text, metadata, redaction counts, warnings, and content hash.
Timestamps default to UTC, with an opt-in for local time. Modified is written in UTC (trailing Z). Pass utc: false to emit machine-local time with an explicit offset (e.g. 2026-07-19T15:30:00+05:30) so it stays unambiguous.
New package: Scrubkit.Parquet. Writes the table to Apache Parquet via Parquet.Net (ParquetTableWriter) for data-lake / analytics ingestion. net8.0-only; the core stays zero-dependency. Parquet always stores Modified as a UTC instant.
DIAGNOSTICS & ILOGGER
Per-file diagnostics hook. ReadOptions.OnDiagnostic is a dependency-free Action<ScrubDiagnostic> the core fires per file — a read event on success, or a warning code (extract-failed, skipped-content, text-clipped, stat-failed, hash-failed) on a problem. AddScrubkit bridges it to ILogger, so the core takes no logging dependency.
CONTENT HASHING
Opt-in SHA-256 per file. ReadOptions.ComputeContentHash populates FileRecord.ContentHash with the file's lower-case hex SHA-256, bounded by MaxBytesPerFile (default lowered to 10 MB; oversized files are stat-skipped and never read).
bug_report BUG FIXES
- check Redaction no longer drops a valid match that overlaps a higher-priority span — claimed characters are masked in a working copy so a looser later pattern can't reach into them.
build MAINTENANCE
- check CI coverage floor raised to 99% (actual ~99.8%); added a Privacy & disclaimer section to the site and READMEs.
V1.3.0
2026-07-19
STABLEMore add-ons, DI, and a throughput number
Two more add-on packages, a dependency-injection integration, and a published benchmark figure.
NEW PACKAGE: SCRUBKIT.EPUB
Reads .epub e-books. The OPF Title / Author / Subject become metadata and the XHTML spine (tags stripped, entities decoded) becomes text, in reading order. Zero dependencies beyond Scrubkit.Abstractions; .epub files come back as Document rows.
NEW PACKAGE: SCRUBKIT.EXTENSIONS.DEPENDENCYINJECTION
First-class DI integration. services.AddScrubkit(…) registers a configured FolderScrubber as a singleton for ASP.NET Core and worker hosts. Configure recursion, limits, add-on extractors, and an optional redactor via a ReadOptions hook (with an IServiceProvider overload for DI-resolved dependencies).
BENCHMARKS
Published throughput number. A BenchmarkDotNet harness extracts on the order of ~12,000 files/sec (4-way parallel; ~4,900 sequential) over a mixed text-file corpus.
bug_report BUG FIXES
-
check
.epubfiles now report TypeBucket = "Document" —Buckets.Fordidn't map the extension, so they bucketed asOther.
V1.2.0
2026-07-18
STABLEFirst add-on packages
Introduces the first add-on packages — exercising the IFileExtractor
extension seam end to end. Both reference only Scrubkit.Abstractions,
so they pull in no PDF or image libraries.
NEW PACKAGE: SCRUBKIT.EMAIL
Reads .eml (MIME) email. The From / To / Cc / Subject / Date headers become metadata and the message body becomes text.
Understands real email. Multipart messages, base64 and quoted-printable encodings, common charsets, and RFC 2047 encoded-word headers — preferring text/plain, falling back to text/html. Attachments are skipped. Comes back as a TypeBucket = "Email" row.
NEW PACKAGE: SCRUBKIT.OPENDOCUMENT
Reads OpenDocument files. Text documents (.odt), spreadsheets (.ods), and presentations (.odp) from LibreOffice / OpenOffice — body text becomes Text and the Title / Author / Subject properties become metadata.
Zero-dependency, like the built-ins. ODF is a zip of XML, read with the BCL — the same technique the built-in Office extractor uses. Files route to their natural buckets: Document / Spreadsheet / Presentation.
V1.1.0
2026-07-17
STABLEOffline extraction, opt-in redaction
Repositioned the package around offline text + metadata extraction. Redaction is now opt-in instead of applied by default.
priority_high BEHAVIOR CHANGE
Redaction is opt-in and caller-driven. The core extracts and
returns text + metadata exactly as read, and redacts only when you supply an
IRedactor via ReadOptions.Redactor (or set a Redaction level).
1.0.0 redacted by default — if you relied on that, set a redactor
or level explicitly after upgrading.
POSITIONING & DOCS
Leads with extraction. The package Title, description, tags, and both READMEs were rewritten around offline text + metadata extraction for .NET.
Neutral extraction demo. The playground was refreshed into an extraction view with an updated screenshot (synthetic sample data only).
Clarified text-family formats. RTF / HTML / XML are read as raw text — markup is not stripped.
TESTS & TOOLING
Offline-guarantee test. The build fails if either shipping assembly ever references a networking assembly.
netstandard2.0 runtime test project. Runs the netstandard2.0 build — its PolySharp polyfills and GetValueOrDefault shim — on the .NET 8 host, so the polyfilled paths are exercised at runtime, not just compiled.
Expanded coverage. Extraction, extension filtering, record fields, opt-in and custom redaction, and edge cases (empty folders, uncapped limits, corrupt Office files, a stat-failed guard). CI now publishes a test-status summary on every run.
bug_report BUG FIXES
-
check
.htmfiles now report TypeBucket = "Text".Buckets.Formapped.htmlbut not.htm, so.htmfiles extracted correctly yet were bucketedOther.
V1.0.0
2026-07-15
STABLEFirst stable release
Promoted from the preview to a stable release — the same engine and API, with a cleaner first impression and clearer wording throughout. The public API is stable under SemVer from here on. No new features and no bug fixes.
DOCUMENTATION
Redesigned NuGet pages. A scannable highlights list, separate Install and Quick-start sections, a supported-formats table, and clearer dividers — plus a focused Scrubkit.Abstractions page.
Added a "Prepare a folder for RAG" recipe and a short guide to writing a custom IFileExtractor or IRedactor.
PACKAGING & UNDER THE HOOD
Enabled package validation. The build checks that the net8.0 and netstandard2.0 API surfaces stay compatible within each package.
Sharpened discoverability. Rewrote the description to lead with the problem it solves and refreshed the search tags.
edit_note WORDING & ACCURACY
- check Reworded the scrubbing docs to plain, neutral language and softened absolute claims — the redactor is clearly described as best-effort.
- check Removed references to add-on packages that aren't shipped yet, so the docs describe only what's available today.
V0.1.0-PREVIEW.1
2026-07-13
PRE-RELEASEFirst public release
The first public release — everything Scrubkit does today shipped here.
FEATURES
Point it at a folder, get a clean table back. FolderScrubber walks a directory and returns one row per file — its text, metadata, and warnings — fully offline. Unreadable files never crash the run.
Reads the common formats. PDF, Word / Excel / PowerPoint (docx / xlsx / pptx), plain-text files (txt, md, csv, log, json, xml, html), and the camera/software info in image EXIF.
Handles big folders. Stream results as they're produced (ReadStreamAsync) and process several files at once (MaxDegreeOfParallelism), with output order preserved.
Extend it without forking. Plug in your own formats (IFileExtractor) or redaction (IRedactor); add-ons only need the tiny Scrubkit.Abstractions package.
info UNDER THE HOOD
- check Runs on .NET 8 and .NET Standard 2.0.
- check Reproducible, source-linked builds with symbol packages; automated tests and publishing.