Config Examples
Copy-paste configs for common scenarios. All files go in .simple-ots/config.toml.
Minimal — no identity, no path disclosure
# Prove only that files existed at a point in time.
# No DID, no path. Maximum privacy.
dids = []
path_variants = ["null"]
include_no_did = trueEach file gets exactly one leaf. The leaf contains only content_sha256 and datetime.
Use this when you need "file existed at T" and nothing else.
Single identity, all path variants
# One DID, three path representations per file.
# Standard selective-disclosure setup.
dids = ["did:web:example.com"]
path_variants = ["null", "filename", "relative"]
include_no_did = trueLeaves per file: 3 path variants × 2 DID variants (null + 1 DID) = 6 leaves.
You can later reveal any of:
- Content-only (no path, no identity)
- Content + filename (no directory, no identity)
- Content + relative path (no identity)
- Content + DID (no path)
- Content + filename + DID
- Content + full path + DID
Dual identity — pseudonymous and real
# Two DIDs: one for public disclosure, one for verified identity.
dids = [
"did:web:bob.example.com", # pseudonymous / public handle
"did:web:yourname.com", # real identity
]
path_variants = ["null", "filename", "relative"]
include_no_did = trueLeaves per file: 3 × 3 = 9 leaves.
Selective disclosure lets you share, for example, the full-path + pseudonymous-DID proof to one party and the filename-only + real-DID proof to another — both provably in the same tree without cross-linking.
Maximum disclosure options
# Generate all combinations for maximum future flexibility.
dids = [
"did:web:identity-a.com",
"did:web:identity-b.com",
"did:web:identity-c.com",
]
path_variants = ["null", "filename", "relative"]
include_no_did = trueLeaves per file: 3 × 4 = 12 leaves.
For 100 files: 1200 leaves, ~38 KB of hashes. Merkle depth ≈ 11 levels.
Path-only disclosure, no identity
# Want to prove file paths but never reveal identity information.
dids = []
path_variants = ["filename", "relative"]
include_no_did = trueLeaves per file: 2 × 1 = 2 leaves (filename-null and relative-null).
Content-only + single DID, no path variants
# Simplest useful config with identity: content + DID, nothing else.
dids = ["did:web:mysite.com"]
path_variants = ["null"]
include_no_did = falseLeaves per file: 1 × 1 = 1 leaf.
Minimal overhead, proves "this file was in my tree at T".
CI / automated stamping config
# For CI pipelines: minimal overhead, record content hashes only.
# Stamp all source files on every commit via git ls-files | simple-ots.
dids = []
path_variants = ["relative"]
include_no_did = trueEvery tracked file gets one leaf containing its content hash and relative path. Rebuilding the tree from the same commit produces the same root hash.
Choosing your DID method
| DID Method | Example | Notes |
|---|---|---|
did:web | did:web:example.com | Resolves to example.com/.well-known/did.json; requires domain ownership |
did:key | did:key:z6Mk... | Self-contained; no server needed; tied to a keypair |
did:ion | did:ion:EiA... | Bitcoin-anchored; requires ION node or hosted resolver |
| Custom string | my-project-v2 | No DID standard; works fine as a label, just not resolvable |
Any non-empty string works as a did value — validation is not enforced.