Openquote 0.3.0

dotnet add package Openquote --version 0.3.0
                    
NuGet\Install-Package Openquote -Version 0.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="Openquote" Version="0.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Openquote" Version="0.3.0" />
                    
Directory.Packages.props
<PackageReference Include="Openquote" />
                    
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 Openquote --version 0.3.0
                    
#r "nuget: Openquote, 0.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 Openquote@0.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=Openquote&version=0.3.0
                    
Install as a Cake Addin
#tool nuget:?package=Openquote&version=0.3.0
                    
Install as a Cake Tool

Openquote

A domain-neutral engine for ongoing records kept as immutable change files.

Openquote reads a folder of records — a vault — where every edit is a new file and no file is ever rewritten. From those files it rebuilds the current state of each record, keeps concurrent edits from several devices side by side instead of losing one, carries classified values across revisions of a classification scheme, and produces statistics whose every count traces back to the records behind it.

It knows nothing about any particular field. What a record means, which schemes classify it, and which report or export forms exist are data in the vault, supplied by the applications and packs built on top of it.

Status: early development. The vault format is at version 0.

What it does

  • Reads a vault (VaultReader.Read) — change files, classification schemes and their crosswalks, report and export forms, and kept report runs. A file it cannot use is listed as unreadable — with why, and what it was for as read from its path (VaultFileKind) — rather than stopping the read; a vault declared in a newer or unknown format is refused as a whole.
  • Merges changes into records (EntityMerger.Merge) — replays each record's change history, and keeps conflicting edits made on different devices as named heads until one is chosen.
  • Carries classified values across scheme versions (SchemeCatalog) — one-to-one and many-to-one links are followed automatically; a value whose category was split waits for a person instead of being guessed.
  • Runs reports (ReportRunner) — counts records by a classified field for a period, with the records behind each cell and the number of different people they concern, and compares two runs of the same form (ReportDiff).
  • Lays records out for other systems (ExportRunner) — one row per record in a period, with columns taken from fields, classified values, referenced records and the people involved.
  • Layers packs (VaultContent.CheckPacks, LabelCatalog, FieldCatalog) — data packs build on each other: a later pack adds schemes, forms and fields, narrows fields of the packs it builds on, and relabels items, fields and forms per locale — with other names a field goes by for taking data in — without ever changing a code or what is counted. Run an export with content.FieldCatalog() and fields declared as written content are left out of every column.
  • Writes changes (VaultWriter) — every write is a new file; nothing existing is modified.

The engine only ever sees plaintext. A host that keeps its vault encrypted decrypts each file before handing it over.

Example

using Openquote.Records;
using Openquote.Reports;
using Openquote.Vault;

var content = VaultReader.Read(VaultFiles.FromDirectory("path/to/vault"));
var records = EntityMerger.Merge(content.Changes);

var form = content.Reports.Single(r => r.Name == "monthly-topic" && r.Version == 2);
var run = ReportRunner.RunMonth(form, 2026, 4, records.Values, content.Catalog());

Getting it

It targets .NET 10.

dotnet add package Openquote

To build and test the engine itself: dotnet test --solution Openquote.slnx.

Documentation

  • Concepts — records and changes, classification versions and crosswalks, reports and exports
  • Vault format — the files, their JSON, and the rules for reading and writing them

License

MIT

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
0.3.0 0 9/30/2026
0.2.1 35 9/29/2026