Audit Trail
Every edit in Chronicle is recorded in an immutable, verifiable audit trail powered by vest-node. This provides cryptographic proof of who changed what, when.How It Works
- Every CRDT operation passes through the relay
- The relay forwards a signed copy to vest-node
- vest-node appends the operation to a hash chain (each entry references the previous hash)
- The resulting ledger is queryable and exportable
Querying the Audit Trail
By Document
By User
By Time Range
Audit Entry Structure
Each audit entry contains:Verification
The hash chain can be verified independently:valid returns false with details about the first corrupted entry.
Compliance Export
For regulatory or legal requirements, export the full audit trail:Integration with Timeline
The audit trail is the data source for Chronicle’s timeline navigation feature. When a user scrubs through the timeline, the editor:- Queries the audit trail for the target timestamp
- Reconstructs document state by replaying operations up to that point
- Renders the historical state in read-only mode
Retention & Storage
| Setting | Default | Description |
|---|---|---|
retention.days | unlimited | How long to keep audit entries |
compaction.enabled | false | Whether to compact old entries |
compaction.threshold | 10000 | Entries before compaction triggers |
storage.backend | postgres | Storage backend (postgres, s3) |
Storage considerations
Storage considerations
The audit trail grows proportionally to edit volume. For a document with 100 edits per day:
- ~3,000 entries per month
- ~36,000 entries per year
- ~2MB of storage per year (without payloads)
- Enabling compaction to merge old entries
- Using S3 backend for cold storage
- Setting a retention policy for non-compliance documents
Best Practices
- Never disable the audit trail in production — it’s the foundation of Chronicle’s trust model
- Export regularly for compliance-sensitive documents
- Verify periodically — run
audit.verify()as part of your health checks - Monitor storage — audit data grows linearly; plan capacity accordingly
- Use time-range queries instead of full history for UI responsiveness