Skip to content

Architecture

Attestia.App (WinUI 3)
Dashboard - Intents - Proofs - Reconciliation
Compliance - Events - Settings
Attestia.ViewModels (CommunityToolkit.Mvvm)
Attestia.Client | Attestia.Sidecar
HTTP SDK | Node.js process manager
Attestia.Core
Domain models - Enums - Shared types
PackageDescription
Attestia.CoreDomain models — Intent, MerkleProof, ReconciliationReport, Money, ComplianceFramework, DomainEvent, and more
Attestia.ClientHTTP client SDK with eight typed sub-clients: Intents, Proofs, Reconciliation, Compliance, Events, Verify, Export, and Public
Attestia.SidecarNode.js process manager — port discovery, health polling, auto-restart, clean teardown

The AttestiaClient facade exposes eight sub-clients:

Sub-clientPurpose
IntentsDeclare, approve, reject, execute, verify intents; list and get by ID
ProofsMerkle root info, attestation proof packages, proof verification
ReconciliationThree-way reconciliation, attestation records
ComplianceFramework listing, scored compliance reports
EventsGlobal event stream and per-stream event queries (paginated)
VerifyGlobal state hash computation and replay verification
ExportNDJSON event export and full state export
PublicPublic verification endpoints — state bundles, verifier reports, consensus, public proof verification, compliance summaries

All HTTP calls use envelope-based responses (AttestiaResponse<T>), automatic retry with exponential backoff on 5xx errors, and CancellationToken support.

ViewModels inherit from ViewModelBase, which provides:

  • IsBusy / ErrorMessage / IsEngineOffline observable properties
  • RunBusyAsync wrapper that catches exceptions and sets human-readable error messages
  • Automatic detection of connection failures (sets IsEngineOffline for UI indicators)

The Sidecar manages the Node.js backend as a child process:

  • Finds a free port automatically (or uses a configured fixed port)
  • Sets PORT and NODE_ENV=production environment variables
  • Polls /health at a configurable interval (default 5 seconds)
  • Auto-restarts if the process dies (configurable via AutoRestart)
  • Kills the entire process tree on dispose
  • Emits StatusChanged events: Stopped, Starting, Running, Degraded, Crashed, Stopping, Error
await using var sidecar = new NodeSidecar(options, locator, logger);
await sidecar.StartAsync();
Console.WriteLine($"Backend ready at {sidecar.BaseUrl}");

The NodeBundleLocator searches for node.exe in three locations: a configured path, the bundled assets/node/ directory, then the system PATH.