Domino Compass Β· deterministic key runtime

Generate keys you can reproduce
from physical reality.

A Domino Compass recipe turns deterministic physical entropy into reproducible identity and Bitcoin key hierarchies β€” without trusting a cloud account, custodial wallet, hosted password database, or opaque recovery service.

🎲
Physical entropy
8Γ—7 domino card
β†’
πŸ“œ
Recipe
deterministic grammar
β†’
πŸ”‘
Root
S_root Β· secret
β†’
🧭
Identity lane
Nostr Β· Kapnet
β†’
β‚Ώ
Bitcoin lane
BIP-86 Β· descriptors
β†’
πŸͺͺ
Capabilities
scoped Β· revocable
β†’
πŸ›Ÿ
Recovery
reconstruct from card

The recipe does not contain the secret. The physical card is the root of authority.

01How it works

Domino Compass is a deterministic secret-generation and key-runtime system. It is not a seed-phrase generator, a wallet, a password manager, or a key vault β€” it is the thing that produces those from physical reality.

The four things to understand

1 Β· The physical material is the root of authority

An 8Γ—7 domino card β€” two passes of all 28 tiles β€” is the source. It is read, canonicalized, and hashed. Nothing else is the root.

2 Β· The recipe describes how material becomes entropy

A recipe is an explicit deterministic program: which ceremony, which ordering, which normalization, which lane. It is not the secret.

3 Β· The runtime derives multiple independent key lanes

From one root, domain-separated derivation produces an identity lane and a Bitcoin lane as siblings β€” never one as the child of the other.

4 Β· Operational material can be replaced, delegated, recovered, stored

Capabilities, descriptors, and encrypted operational state can be rotated, revoked, and persisted β€” without ever exposing the root.

DOMINO Β· COMPASS

DOMINO β€” physical entropy / discrete state

The domino set is a finite, observable physical system. Its state β€” the ordered arrangement and orientation of 28 tiles across two passes β€” is the entropy source. The physical object is not magic; the deterministic encoding rules are what make it reproducible.

COMPASS β€” deterministic navigation through a derivation space

The compass is the navigation metaphor: from the root, a recipe steers through a derivation space to reach specific keys. Doubles carry a compass quadrant (NE/SE/SW/NW) β€” 2 bits of entropy each β€” because the quadrant is an independent, observable post-spin state.

The recipe does not contain the secret. A recipe may be backed up or stored without revealing the root secret. It is a graded secret (it reveals purpose, scope, and lane context) but it is not root-equivalent.

The conceptual stack

physical entropy β†’ deterministic recipe β†’ root secret (S_root) β†’ domain-separated derivation runtime β†’ identity keys + Bitcoin keys β†’ capabilities / delegation / revocation β†’ encrypted operational material β†’ optional dStor persistence

02Physical entropy

The physical object is not magic. The deterministic encoding rules are what allow reproducibility.

Random physical entropy vs. deterministically encoded physical state

There are two distinct things, and the site keeps them separate:

Random physical entropyDeterministically encoded physical state
What it isThe unpredictable outcome of a physical process (a shuffle, a spin, a toss).The recorded state of that outcome, written down under fixed rules so it can be reproduced exactly.
RoleSupplies the uncertainty.Makes the uncertainty reproducible β€” the same state always yields the same bytes.
ExampleShuffling 28 dominoes into a random order.Reading that order as 56 canonical tokens, in a fixed pass structure, with doubles carrying a compass quadrant.
Why this matters: if the encoding rules were ambiguous, the same physical card could be read two ways and produce two different keys. Canonicalization before hashing means formatting ambiguity can never become accidental entropy or a collision.

From physical object to entropy input

physical object β†’ observed state β†’ canonical representation β†’ entropy input

For the Domino Compass ceremony specifically:

8Γ—7 domino card (two passes of 28 tiles) β†’ 56 canonical tokens β†’ 56 canonical bytes (1 byte per token) β†’ SHA-256 β†’ 256-bit secret S_root

Entropy accounting β€” honest numbers

One pass of 28 tiles contributes:

28! (ordered tile permutation) β‰ˆ 97.94 bits 2Β²ΒΉ (non-double orientations) = 21 bits 4⁷ (double compass outcomes) = 14 bits ──────────────────────────────────────────── one pass β‰ˆ 132.94 bits

Two independent passes:

(28! Γ— 2Β²ΒΉ Γ— 4⁷)Β² β‰ˆ 265.89 bits

265.89 > 256 β€” two full sortitions exceed the 256-bit target. This is why the ceremony requires exactly two passes.

Do not use the naive model. The tile-token alphabet has 70 types, so a tempting shortcut is 56 Γ— log2(70) β‰ˆ 343 bits. This is wrong: each pass uses every tile exactly once (a permutation, not independent draws), and the canonical byte encoding is a bijection onto the true sample space (28!Β·2Β²ΒΉΒ·4⁷)Β².
SHA-256 does not add entropy. It deterministically compresses a ~265.9-bit sample space onto 256 bits. Because 265.9 > 256, essentially no entropy is lost β€” the hash uniformizes and compresses, it does not create.

What must remain secret, what may be public

MaterialStatusWhy
The 8Γ—7 domino card / transcript / canonical bytesSECRETIt is the root. Anyone with it can regenerate every key.
The recipeGRADEDNot root-equivalent, but reveals purpose, scope, lane context, and the commitment. Protect it.
Public fingerprintsPUBLICVerification handles. They prove regeneration without revealing the secret.
Capability recordsPUBLICDelegation statements. They can be shared with service peers.
Watch-only descriptors / xpubPUBLICTrack funds without signing authority.

03Recipes

A recipe is an explicit deterministic program β€” a transformation description β€” not vague "instructions." It describes how physical material becomes deterministic entropy and which lanes to derive.

Recipe β‰  root secret

The recipe is a versioned structured object. Its canonical serialization hashes to its identifier:

recipe_id = SHA-256(canonical_recipe_bytes)

The recipe must not contain S_root, the canonical transcript bytes, or any value from which S_root is recoverable. It may be backed up or stored without necessarily revealing the root secret.

Recipe fields

FieldMeaning
recipe_versione.g. dc-recipe-v1
ceremony_profilewhich physical ceremony, e.g. dc-v1-8x7
domain_taghigh-level namespace, e.g. pluronymous
entropy_card_commitmentnon-revealing commitment to the physical card
purposeNostr identity, Kapnet actor, service-peer access, trustee recovery, decoy…
scoperead-only, sign events, publish to channel, spend up to limit…
service_namespacewhich service the key is for
actor_namespacewhich actor / identity
identity_laneNostr, Kapnet, KNU, Pluronymous, delegation, recovery, revocation
bitcoin_lanekey paths, descriptors, watch-only, payment, claim, recovery, decoy
time_authorizationwall-clock and/or Bitcoin-native
revocation_lanewhich revocation path applies
child_indexper-recipe child index
networkmainnet / testnet / regtest / KNU
output_typensec, private key, BIP-39, BIP-85 child, descriptor…
checksumintegrity of the recipe itself
signaturerecipe signature by an authority

Non-revealing entropy-card commitment

The commitment is a one-way hash that is not equal to S_root and does not reveal it:

entropy_card_commitment = SHA-256(canonical_transcript_bytes || "dc-commit-v1")

The domain tag "dc-commit-v1" makes the commitment input different from the KDF input (canonical_transcript_bytes alone), so the commitment is a distinct hash. An attacker who obtains the recipe gets a one-way hash of the transcript, not the root secret. The commitment is used for verification and binding, never as a derivation input.

Hiding is computational, not absolute. A plain SHA-256 commitment is hiding only to the extent the underlying transcript space is large enough to resist enumeration. With the full ceremony (~265.9 bits) that holds. But if the secret space shrinks β€” through partial physical disclosure, a weaker ceremony, or a low-entropy construction β€” the commitment becomes enumerable and leaks. Treat the commitment as a graded secret, not a zero-knowledge proof.

Recipe authentication

The recipe must be signed by an authority, and the signature must be over the canonical recipe bytes. A recipe without a valid signature from a trusted authority must be rejected β€” otherwise an attacker could substitute a malicious recipe with bitcoin_lane: spend-capable for a watch-only recipe, and the user would derive spend keys they never intended.

Mandatory fingerprint verification: the runtime must verify the public fingerprint against the expected value before honoring any derived key. A recipe that produces a different fingerprint must be rejected. This detects recipe substitution even if the signature is compromised.

Recipe builder

Build a recipe and inspect its exact serialized form. The builder shows the canonical JSON and the resulting recipe_id.

recipe_id
The entropy_card_commitment is filled from the current transcript in the simulator. Changing any field changes recipe_id β€” and therefore every derived key.

04Derivation

From the root secret, a domain-separated runtime derives parallel, independent key lanes. The Bitcoin tree is a sibling of the identity key β€” never a child.

The derivation pipeline

physical entropy card (8Γ—7 transcript) β†’ canonical_bytes (56 bytes) β†’ S_root = SHA-256(canonical_bytes) β†’ entropy_card_commitment = SHA-256(canonical_bytes || "dc-commit-v1") β†’ recipe β†’ recipe_id = SHA-256(recipe_bytes) β†’ derivation_transcript (length-delimited, binds lane_tag) β†’ identity_seed = HKDF-SHA256(ikm=S_root, salt=recipe_id, info=identity_transcript) β†’ bitcoin_seed = HKDF-SHA256(ikm=S_root, salt=recipe_id, info=bitcoin_transcript) β†’ identity_master = BIP32_FromSeed(identity_seed) [sibling domain] β†’ bitcoin_master = BIP32_FromSeed(bitcoin_seed) [sibling domain] β†’ identity_key = identity_master / identity_path β†’ bitcoin_tree = bitcoin_master / bitcoin_path β†’ public_fingerprint = SHA-256(pubkey || recipe_id || lane_tag)
Root model preserved: S_root = SHA-256(canonical_transcript_bytes) is the ceremony root and is unchanged. HKDF is a post-root lane expander, not the root derivation. It never replaces S_root; it domain-separates it into per-lane seeds. Because the derivation transcript binds lane_tag, each lane produces a distinct lane seed and therefore a distinct BIP32 master. Identity and Bitcoin are sibling domains under S_root β€” not sibling children of a single master.

Domain separation

Two derivations are distinct if any bound field differs:

  • Lane separation: identity vs bitcoin lanes use different lane_tag values, so the same recipe yields distinct keys per lane.
  • Recipe separation: different recipes (different recipe_id salt) yield distinct keys even for the same lane.
  • Child separation: different child_index values yield distinct keys.
  • Field binding: changing any field (e.g. scope) changes the transcript bytes and therefore the derived secret.

Canonical derivation transcript (byte-level)

The info input to HKDF is a length-delimited binary transcript. Each field is serialized as 1-byte tag || 2-byte big-endian length || field bytes, in a fixed order. No field may be omitted, reordered, or padded.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ version β”‚ source β”‚ profile β”‚ parameters β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ tag 0x01 domain_tag (UTF-8) tag 0x02 recipe_version (UTF-8) tag 0x03 lane_tag (UTF-8: identity/bitcoin/recovery/decoy) tag 0x04 purpose (UTF-8) tag 0x05 scope (UTF-8) tag 0x06 time_authorization (UTF-8) tag 0x07 revocation_lane (UTF-8) tag 0x08 child_index (4-byte big-endian) tag 0x09 network (UTF-8) tag 0x0A entropy_card_commitment (32 raw bytes)
Why length-delimited and not JSON: canonical JSON is delimiter-based and has canonicalization pitfalls (number forms, unicode normalization, key ordering) that can produce the same semantic object with different bytes β€” a collision risk. Length-prefixing makes the byte representation unambiguous.
What is NOT bound: the public fingerprint. It is a post-derivation verification handle, not a pre-derivation input. Binding it would create a circular dependency.

Derivation visualizer

Root Secret branches into sibling runtime lanes β€” parallel domain-separated derivations, not one lane as the child of the other.

Root Secret (S_root) β”œβ”€β”€ identity domain HKDF(identity transcript) β†’ identity master β†’ m/220'/0'/0' β”‚ β”œβ”€β”€ primary identity β”‚ β”œβ”€β”€ delegated identity β”‚ └── application-specific identity └── bitcoin domain HKDF(bitcoin transcript) β†’ bitcoin master β†’ m/86'/0'/0'/0/0 (BIP-86) Β· m/84'/0'/0'/0/0 (BIP-84) β”œβ”€β”€ account β”œβ”€β”€ descriptor β”œβ”€β”€ signing key └── watch-only projection

Each lane has its own BIP32 master from its own lane seed. Changing the derivation profile (e.g. BIP-86 vs BIP-84) visibly produces a different subtree.

05Identity + Bitcoin dual runtime

Identity and Bitcoin keys originate from the same deterministic root while remaining cryptographically domain separated.

Same root, distinct lanes

same physical root β†’ same deterministic root secret (S_root) then: root + identity domain β†’ identity keys root + Bitcoin domain β†’ Bitcoin keys

Explicitly:

identity secret β‰  Bitcoin secret identity key β‰  Bitcoin key identity fingerprint β‰  Bitcoin fingerprint

This is a core Domino Compass property. The two lanes are derived from the same root secret via domain-separated HKDF, each producing its own lane seed and its own BIP32 master β€” sibling domains under S_root, never one as the child of the other.

Why sibling domains, not one master

If the Bitcoin tree were a child of the identity key, then identity compromise would equal funds compromise. Because each lane derives its own BIP32 master from its own lane seed (both under S_root), a leaked identity key does not reveal the Bitcoin lane β€” and a leaked identity master does not reveal the Bitcoin master either. The separation is stronger than sibling children of a single master: the two lanes share only S_root and the recipe, never a master or a chain code.

Honest authority note: identity and Bitcoin lanes share one root secret, one physical card, and one air-gapped signer device. A compromise of the root, the card, or the signer falls both lanes. The separation is at the derivation level, not the authority level. For true separation (e.g. funds vs. identity), use separate physical cards β€” one per authority domain.

Bitcoin-lane posture

The Bitcoin lane is not a single spend capability; it is a namespace whose spend posture is set by the profile:

PostureMeaning
spend-capablethe lane derives spend keys
watch-onlythe lane derives descriptors / xpub only, no private spend keys
claim-onlythe lane derives claim keys for a specific claim
service-payment-onlythe lane derives payment keys for a specific service
recovery-onlythe lane derives recovery-branch keys
decoythe lane derives decoy keys

A spend-capable lane is an explicit, deliberate choice, never the default.

06Capabilities

You should not need to expose or repeatedly use your root key. Capabilities express operational access as scoped, time-bounded, revocable delegation statements.

The progression

Root authority β†’ operational key β†’ scoped capability β†’ delegated capability β†’ revoked capability

Capability record fields

FieldMeaning
capability_idcontent hash of the record
issuer_public_keywho issued (the authority)
derived_public_keythe key being delegated
purposewhat it is for
scopewhat it may do
valid_from / valid_untiltime bounds
block_context_limitsBitcoin-native bounds
service_namespacewhich service honors it
revocation_lanewhich revocation path applies
recipe_idwhich recipe produced it
entropy_card_fingerprintthe commitment
signaturebare secp256k1 by the issuer

Signed β‰  admitted

A signed capability is a claim, not a grant. Access is granted by the service's admission decision (its accepted-key set). The lifecycle:

signed β†’ admitted β†’ active β†’ revoked
  • signed: the issuer has signed the capability (a claim of intent).
  • admitted: the service has accepted it into its accepted-key set (the actual grant).
  • active: the capability is currently honored.
  • revoked: the capability is no longer honored.

A capability that is signed but never admitted is not valid.

Example scenarios

  • Sign Nostr events for one application
  • Authorize dStor operations
  • Authorize a limited Bitcoin signing workflow
  • Issue a time-limited application token
  • Rotate compromised operational keys

Application key generator UX

Cryptographic authorization without forcing the user to manually administer raw cryptographic keys.

Capability ID
β€”
Public fingerprint
β€”
Expiration
β€”
Permissions
β€”
The root secret is never exposed. This generates a scoped capability bound to a derived key.

07Time authorization

Time-scoped authorization, with a clear distinction between secret derivation and authorization policy.

Valid for…

One session

valid_for_single_session

One hour / one day

valid_until_timestamp

Until a block height

valid_until_block_height

Until a Knottime threshold

valid_until_next_knot

Until a PWBT window

valid_for_pwbt_window

Until explicitly revoked

valid_until_parent_rotation

Secret derivation β‰  authorization policy

The root secret does not change merely because a capability expires. Expiration is a property of the capability record (an authorization policy), not of the derived key or the root. When a capability expires, the same root can issue a new capability β€” the underlying key material is unchanged.

Clock-source trust and fail-closed behavior: Bitcoin-native clocks are gameable if the source is untrusted or stale. If a verifier cannot obtain a current, trusted clock value, it must deny (not honor). When both wall-clock and block-clock bounds are present, the capability is valid only when both hold (AND), unless the recipe explicitly specifies OR.

08Revocation

Revocation is not deletion of a copied secret. Revocation is refusal to honor the secret after a revocation condition.

The authority graph

Root └── Identity A └── Capability B └── Application C

When Capability B is compromised, you revoke B β€” without requiring Root compromise. You preserve the root and all unrelated derivations.

Before and after revocation

Before

Root └── Identity A β”œβ”€β”€ Capability B (active) β”‚ └── Application C └── Capability D (active) └── Application E

After revoking B

Root └── Identity A β”œβ”€β”€ Capability B (revoked) β”‚ └── Application C (denied) └── Capability D (active) └── Application E (still works)

Capability D and Application E are unaffected. The root is untouched.

Honest scoping β€” what revocation does and does not do

Revocation is honored only at acceptance boundaries that check revocation state. It is not honored by:

  • Bitcoin consensus. A revoked spend key still spends. The chain does not consult revocation state. Spend-capable lanes are not revocable once exported β€” treat them as permanent.
  • Offline verifiers that cannot reach revocation state. An offline verifier must deny on unknown (fail-closed). If it cannot verify current revocation state, it must not honor the capability.
Revocation checkpoint / epoch: every verifier must pass a revocation checkpoint before honoring any capability. The checkpoint is a signed, content-addressed revocation-state object with a monotonic epoch, a maximum staleness (TTL), a push/relay mechanism, and a fail-closed rule. A verifier that honors a capability without passing a fresh checkpoint is non-compliant.
Revocation-lane authority: the revocation_lane must be bound to a distinct revocation authority at issuance β€” a key that is not the capability issuer and that the issuer does not control. A capability whose revocation lane is self-declared must be rejected.

Revocation paths

  • Parent identity revokes child
  • Service peer updates accepted-key policy
  • Kapnet actor state marks child invalid
  • Recipe lane superseded
  • Expiry condition passes
  • HedlBit bond slashed
  • Trustee recovery branch rotates identity
  • Device key removed from accepted delegation set
  • Revocation event published
  • dStor keychain snapshot marks capability revoked

09Recovery

You lose the laptop, phone, application database, and operational keys β€” but you retain the physical entropy material and the recipe. Recovery reconstructs authority.

Recovery flow

physical material β†’ recipe β†’ deterministic reconstruction β†’ root β†’ identity runtime β†’ Bitcoin runtime β†’ capability reconstruction / replacement

Recovering authority vs. recovering every historical key

Recovery reconstructs the root and the runtimes β€” the authority. It does not necessarily recover every historical operational key. Where appropriate, operational state may instead be restored from encrypted backup material (e.g. the dStor keychain).

Recovery completeness: the full recovery set is the 8Γ—7 domino transcript (or canonical bytes) + the recipe (or recipe identifier) + the derivation profile/version. This is sufficient to regenerate S_root, both lane masters, and every downstream key. Holding only a BIP85 child seed reveals nothing about the Domino Compass root or the lane masters β€” that is a deliberate separation property.

Recovery checklist generator

Generate a printable recovery checklist describing what physical material must be retained, which recipe identifier applies, which derivation profile/version applies, and what public fingerprints should be expected. It does not include secrets.

10dStor cloud keychain

The optional Domino Compass + dStor architecture. dStor stores encrypted operational material β€” never root custody.

The model

physical root authority ↓ air-gapped signer ↓ signed request ↓ dStor encrypted keychain

dStor stores encrypted operational material. The user retains root authority.

What the cloud keychain may store (encrypted)

  • recipes
  • capability records
  • descriptors
  • watch-only Bitcoin material
  • revocation records
  • recovery packets
  • operational metadata

The cloud keychain must not be portrayed as holding custody of the root secret.

Hard rules

  • Do not store root secret plaintext in dStor.
  • Do not store plaintext nsec in dStor.
  • dStor possession β‰  signing authority.
  • dStor possession β‰  decryption authority. The keychain decryption key must be held only by the user and must not be derivable from any material stored in dStor (including the recipe).
  • Pluronymous possession β‰  recovery authority.

Keychain manifest

The keychain snapshot is content-addressed, manifest-backed, encrypted, and independently verifiable:

keychain_manifest_root, encrypted_payload_refs, public_metadata_envelope, recipient/decryption_policy_commitment, version, previous_snapshot_ref, revocation_state_ref, capability_set_root, descriptor_set_root, receipt_refs, HedlBit_persistence_payment_ref, expiry_or_renewal_terms, integrity_checksum

The manifest root is signed by the air-gapped authority (authenticity, not just integrity). Encryption is a deterministic AEAD (SIV-style, scheme dc-keychain-aead-v1): the IV is derived from the plaintext (iv = SHA-256(plaintext)[:16]), the keystream is HMAC-SHA256 counter blocks, and an HMAC-SHA256 tag authenticates iv || ciphertext. Because the IV is a function of the plaintext, re-encrypting the same plaintext yields the same ciphertext β€” so the content address is stable without ordinary nonce reuse. This is a misuse-resistant construction: the IV cannot be reused across different plaintexts, which is what breaks naive CTR. The exact scheme and version are bound in the manifest.

Air-gapped request signing

online client prepares request β†’ request transferred to air-gapped signer β†’ signer derives/unlocks nsec or delegated secret β†’ request signed offline β†’ signed request returned online β†’ cloud keychain / service peer verifies signature β†’ authorized action executes

The online machine asks. The air-gapped signer authorizes. The cloud keychain obeys only signed instructions.

Replay protection: every signed mutation request must carry a request nonce / idempotency key and a replay window. A captured signed request must not be replayable.

11Tails / air-gapped workflow

The secure dStor keychain workflow is the sealed round trip β€” both the outgoing encrypted TXXM and the incoming dStor response are sealed inside the same Tails amnesiac environment.

Recommended flow

1. boot trusted Tails environment 2. reconstruct root secret 3. derive required identity 4. create encrypted TXXM request 5. send request to dStor 6. receive dStor response 7. encrypt the response before leaving the same amnesiac environment 8. shut down 9. destroy plaintext session state

Strong mode (MUST-level)

In strong mode, the Tails sealed round trip is the only acceptable way to operate the dStor keychain. The full sequence:

boot Tails β†’ derive / unlock secret material inside Tails β†’ construct TXXM β†’ encrypt TXXM before persistence β†’ deploy encrypted TXXM to dStor β†’ receive dStor response β†’ encrypt / seal incoming dStor response inside the same Tails session β†’ export only encrypted artifacts, receipts, public fingerprints, signed commitments β†’ shutdown Tails β†’ discard live plaintext state

Allowed exports: encrypted TXXM blob, encrypted dStor response packet, content-addressed dStor manifest, signed receipt, public fingerprint, capability public record, revocation public record, watch-only descriptor, verification checksum, audit hash.

Disallowed unless explicitly intended: plaintext TXXM, plaintext nsec, plaintext recipe transcript, plaintext recovery packet, plaintext delegated secret, plaintext dStor response, unencrypted keychain snapshot.

Degradation conditions β€” each independently breaks the model

  • Request generation in Tails but the dStor response received/processed in a normal persistent OS β†’ degrades.
  • Signing in Tails but incoming response material stored plaintext outside Tails β†’ degrades.
  • Encrypted upload in Tails but receipts, capability state, recovery material, or response packets leave unencrypted β†’ degrades.
  • Response capture or sealing happens outside Tails β†’ degrades.
Warning: splitting request creation and response encryption across separate environments weakens the intended security properties. A degraded profile is still usable for low-sensitivity operations, but it is not the sealed round trip and must be labeled as such.

Amnesiac vs. air-gapped β€” do not conflate

  • The air-gapped signer is offline and never connects.
  • The Tails round-trip is amnesiac and network-capable.

The sealed round-trip derives the root inside Tails and connects to dStor from that same environment β€” the root is handled in a networked environment during the round-trip. For the highest-sensitivity operations, the air-gapped signer signs the request offline; the Tails session only handles the encrypted artifacts and the network round-trip, never the root in a form that can be exfiltrated.

12Security model

No "military-grade security," no "unhackable." Here are the assumptions and failure modes, honestly stated.

What we claim (and don't)

Correct to claim

  • ~265.9 bits of physical search entropy across two sortitions
  • 256-bit uniform secret target, appropriate for backup secrecy
  • Root-encoded secrecy: S_root = SHA-256(canonical_transcript_bytes) is the root of all derivation
  • Canonical, ambiguity-free transcript encoding
  • BIP85-ready downstream interoperability

Do NOT claim

  • 256-bit effective secp256k1 signing security (the curve's group order limits signing to ~128-bit)
  • The wordlist is the backup (it is a BIP85 artifact, never the root)
  • 8 rows are 8 independent events (they are display wrapping of 2 passes)
  • 56 tokens are 56 independent base-70 digits
  • The system removes the need to protect secret material (it changes its form)

Threat model

For each threat: what is exposed, what remains safe, what must be rotated, what must be reconstructed.

ThreatWhat is exposedWhat remains safeWhat you must rotate / reconstruct
Compromised browserAnything rendered in itRoot (if never entered online)Rotate operational keys; reconstruct from card offline
Compromised OSLocal plaintext stateRoot (if air-gapped)Rotate operational keys; rebuild environment
Compromised cloud storageEncrypted operational materialRoot (never stored there); decryption key (user-only)Nothing if encryption holds; rotate if decryption key leaked
Leaked recipePurpose, scope, lane context, commitmentRoot secret (commitment is computationally hiding, not absolute)Reconstruct a new recipe; re-derive lanes
Leaked capabilityThat capability's scopeRoot, other capabilitiesRevoke the capability; issue a replacement
Stolen entropy cardsThe rootNothing β€” this is the rootReconstruct a new physical card; migrate everything
Partial physical entropy disclosureSome of the transcriptRemaining entropy (search space shrinks)Reconstruct a new card if disclosure is material
Poor entropy constructionReduced search spaceβ€”Reconstruct with a proper ceremony
Compromised operational keyThat key's scopeRoot, other lanesRevoke; rotate the operational key
Compromised root keyEverythingNothingReconstruct a new physical card; migrate everything
Metadata leakageWho/what/when of operationsKey materialReduce metadata; rotate affected capabilities
Deterministic encoding ambiguityPotential wrong-key derivationβ€”Verify fingerprints; use canonical encoding
Implementation bugsDepends on the bugβ€”Use the audited reference; verify against test vectors

Where the secret lives

In the current DKR model, the secret is the root: S_root = SHA-256(canonical_transcript_bytes). It is the physical entropy commitment and the root of all derivation. The recipe and the derivation transcript are context for domain-separated HKDF β€” they do not carry the secret.

  • The 8Γ—7 domino card / transcript / canonical bytes are the root secret material. Anyone with them can regenerate every key.
  • The recipe is a graded secret (it reveals purpose, scope, lane context, and the commitment) but is not root-equivalent β€” it does not contain S_root or anything from which it is recoverable.
  • The derivation transcript is public context that binds the derivation; it is not secret material.
Compatibility: Domino Compass is not interoperable at the root level with ordinary wallets. Compatibility arrives only through a BIP85 export.

13Interactive simulator

An educational browser-based simulator. It runs the real Domino Compass math in your browser β€” nothing is sent anywhere.

Educational runtime β€” do not use demonstration secrets to secure funds. This simulator is not production key-generation software. Secrets are shown only when you deliberately reveal them.

1 Β· Transcript

Paste an 8Γ—7 Domino Compass transcript (two passes of 28 tiles), or load the sample. Rows 1–4 = pass 1, rows 5–8 = pass 2. Each pass uses all 28 tiles exactly once. Doubles carry a compass quadrant (NE/SE/SW/NW).

0 / 56 tokens

14Determinism test

A dedicated reproducibility tool. Enter an example recipe and entropy, and the page outputs the root commitment, transcript hash, identity fingerprint, Bitcoin fingerprint, and capability fingerprint. Reload the page and reproduce the same outputs.

Root commitment
β€”
Transcript hash (S_root)
β€”
Identity fingerprint
β€”
Bitcoin fingerprint
β€”
Capability fingerprint
β€”
Reload the page and re-run: the outputs are byte-identical. That is the point.

15Test vectors

Official Domino Compass test vectors β€” valid, invalid, boundary, versioning, and domain-separation cases. Downloadable as JSON.

Domino ceremony / legacy BIP85 export vector

This is the older ceremony/export mechanism: the physical transcript is hashed to a secret S, split into a nine-level hardened BIP32 path, and exported via BIP85 (BIP39 / WIF / xprv). It is not the current DKR derivation model β€” it is retained here only as the historical ceremony/export profile. The current DKR model (below) derives lane masters via domain-separated HKDF instead.

Secret S
0af8cb2d482b2cd22f34f4b127871ce6d3658d453d2e6cb52188fb03d6bc1ea3
Path
m/46019275'/344109773'/36648180'/185759857'/216453989'/148132818'/242005281'/143634493'/112991907'
Final xprv
xprvA9xEHv4cgudterd6KNzfdn3sszxCB2w5UTRS6sEtcX4FM1xr1pkGhB7gDpD8zTTqDyhBvMH2qd6aygnyXixeij7BGyt2zg44oaZeNjhEteR
BIP39-12
kick square ensure skate lake female zoo letter animal neglect near dutch
BIP39-24
hub planet spoon reflect minor gentle mixture mule fitness aisle solar jump sweet live sight apart panic era bronze enter theme okay midnight auction
WIF
KzcCaoWq9MH4TDxrHZ3WPrUTFAUq5cseUrZNzghuhZdVhNzmgcta

DKR v1 vector (current model β€” dual derivation)

The coherent modern DKR vector: recipe ID, card commitment, separate identity/Bitcoin lane seeds, pubkeys, and fingerprints. This is the model the rest of the site teaches.

recipe_id
200d43552aff44f38025e5bcd87cb4ba5c284fc6863673451b780c1635a7f2a2
entropy_card_commitment
a8d134d1fa9ea982cec0fc2b70af24f7887cc05588c72ea837e3a634bbc8dcd3
identity lane seed
d0b9a523c9f99421aa0604554d6ce09a8993bc59b4701d3b823ed0e1fd880a83
bitcoin lane seed
ad3dd33c1c5195f4c2b31c16c57a34caa9be85f436723e83fd6b14be393d0cfa
identity pubkey
02d4b5470e4e5392d19cbbf9e7a64fd00e216cc43e201b23657ed0d6b00f996c2f
bitcoin pubkey
03db0b23d2b9a10407a9854d1128543e1e774c507ff6d1f8ff06de11b02e30eda1
identity fingerprint
50b0abfa083530e7506e982ded2c056059f3f9e3627886a139e3054226f4fec3
bitcoin fingerprint
c4e7fafcb8bc1521301bb6b2d69ee3647345664a455af02ed68bec9f4525bd58

Vector categories

CategoryWhat it covers
Valid casesCorrect transcripts and recipes producing expected outputs
Invalid casesMalformed tokens, wrong token counts, bare doubles without a quadrant
Boundary casesEdge token values, minimum/maximum indices
Versioning casesDifferent recipe/derivation/encoding versions producing different results
Domain-separation casesIdentity vs Bitcoin lanes, different child indices, different scopes

16Transcript inspector

The derivation transcript at the byte level β€” protocol documentation, not ordinary web copy. Expand and collapse every derivation stage.

Derivation transcript fields

Each field is serialized as 1-byte tag || 2-byte big-endian length || field bytes, in fixed order.

Run the simulator or determinism test to populate the transcript inspector.

17Public fingerprints

Fingerprints are verification handles. They prove regeneration succeeded without exposing the secret.

What each fingerprint proves

FingerprintFormulaProvesDoes not reveal
Root commitmentSHA-256(transcript || "dc-commit-v1")You hold the same physical cardThe root secret
Identity fingerprintSHA-256(id_pubkey || recipe_id || "identity")Regeneration of the identity keyThe identity private key
Bitcoin fingerprintSHA-256(btc_pubkey || recipe_id || "bitcoin")Regeneration of the Bitcoin keyThe Bitcoin private key
Capability fingerprintcontent hash of the capability recordThe capability is intact and signedAny private material
Descriptor fingerprinthash of the descriptorThe descriptor is intactSigning authority
Recovery = verification: recovery means rerunning the air-gapped recipe against the same physical entropy and verifying the resulting public key's fingerprint matches the expected value. The nsec itself never needs to be printed, cloud-stored, screenshotted, or placed in a persistent password manager.

Verification tool

Paste a public fingerprint or capability record and verify format validity, version, checksum, public identity, scope, expiration, and derivation profile identifier. The verifier requires no private material.

18Watch-only Bitcoin & descriptors

Bitcoin public material can be separated from signing material. Watch-only systems track funds without possessing signing authority.

Watch-only separation

Domino Compass root β†’ Bitcoin signing hierarchy β†’ descriptors / xpub-derived material β†’ watch-only wallet

Watch-only wallets can track funds without possessing signing authority. The signing keys stay under the user's physical control; only public material (xpub, descriptors) is shared with the watch-only surface.

Descriptor explorer

Domino Compass derivation β†’ derived Bitcoin key β†’ extended public key / descriptor material β†’ watch-only wallet representation
Domino Compass does not replace Bitcoin wallet standards. It generates deterministic key material compatible with BIP-32, BIP-84, BIP-86, descriptors, and PSBT. It does not invent proprietary Bitcoin transaction formats.

19Nostr identity

A Nostr-oriented example: the nsec can be regenerated from the deterministic root rather than permanently stored online.

Nostr derivation

Domino Compass root β†’ identity derivation β†’ nsec β†’ npub β†’ delegated application key β†’ scoped authorization

The nsec is a downstream artifact of the identity lane. It can be regenerated from the deterministic root whenever needed β€” it does not need to be permanently stored online.

Nostr identity lane: the identity lane uses a Domino-Compass-specific purpose constant (m/220'/0'/0', unregistered private placeholder). It is not a standard BIP path β€” it is Domino-Compass-native.

20Architecture

The system as independent layers β€” never melded.

Layers

Physical Layer entropy cards Β· domino states Β· deterministic observations Encoding Layer recipe grammar Β· canonical encoding Β· transcript Secret Layer root secret Β· root commitment Derivation Layer identity lane Β· Bitcoin lane Β· application lanes Capability Layer delegation Β· expiration Β· revocation Persistence Layer encrypted local storage Β· dStor keychain Application Layer Nostr Β· Bitcoin Β· Hermes Β· Kapnet Β· third-party applications

21Domino Compass + Kapnet

Domino Compass is an authority and key-generation substrate that can interact with Kapnet applications. It does not depend on Kapnet β€” it remains usable independently.

Possible uses

  • Kapnet actor identity
  • KOR identities
  • TXXM signing
  • dStor authorization
  • service capabilities
  • scoped KSP credentials
  • recovery identities
  • encrypted operational metadata

Kapnet actors can have deterministic Nostr identity, Kapnet actor key, service-peer key, recovery key, decoy identity, Bitcoin path namespace, and KSP payment lane β€” without storing root secret material digitally.

22Versioning

Deterministic cryptographic systems require strict versioning. Changing any versioned component may deliberately produce a different derivation result.

Versioned components

Recipe v1 Derivation Profile v1 Encoding v1

Changing any versioned component may deliberately produce a different derivation result. The system must not silently reinterpret older recipes.

Why: a deterministic system's whole value is that the same inputs produce the same outputs. If a recipe could be silently reinterpreted under a new encoding, recovery would produce a different key than the original β€” a silent, unrecoverable divergence. Versioning makes the divergence explicit and detectable.

23Glossary

Strict vocabulary. The distinctions below are load-bearing.

TermDefinition
RecipeDeterministic derivation grammar + identifier. β‰  secret.
Root secret (S_root)SHA-256(canonical_transcript_bytes). The root of all derivation.
Root commitmentSHA-256(transcript || "dc-commit-v1"). β‰  root secret. Non-revealing.
FingerprintPost-derivation verification handle. β‰  key.
Identity keyNostr / Kapnet / service key. β‰  Bitcoin key.
Bitcoin keyBIP-86/84 derived key. β‰  identity key.
CapabilityScoped, time-bounded, revocable delegation statement. β‰  root authority.
Encrypted cloud keychainEncrypted operational material in dStor. β‰  custody.
Physical entropyThe unpredictable physical outcome. β‰  recipe.
RecoveryReconstructing authority from physical material + recipe. β‰  backup file restoration.

24Runtime specification

The normative specification, reference implementation, and developer resources.

Developer resources

ArtifactPath
BIP draft (normative spec)BIP-draft.md
Canonical transcript encoding specdocs/transcript-encoding.md
Runtime spec (DC-RUNTIME v0.2)runtime-spec.md
Derivation encoding specdocs/derivation-encoding.md
Entropy & security analysisdocs/security-analysis.md
Reference implementation (pure stdlib)ref/domino_compass.py
Runtime reference implementationref/dc_runtime.py
Capability + revocation schemaref/dc_capability.py
dStor keychain manifest schemaref/dc_keychain.py
Tails sealed round-tripref/tails_round_trip.py
Test vectorsref/vectors.json, ref/runtime-vectors.json

Design defaults (flagged for operator review)

DecisionDefault used
KDF profileHKDF-SHA256 (RFC 5869), post-root lane expander
Derivation codeclength-delimited binary
CommitmentSHA-256(transcript || "dc-commit-v1")
Identity lanem/220'/0'/0' (DC purpose 220, unregistered private placeholder)
Bitcoin laneBIP-86 m/86'/0'/0'/0/0 (P2TR) default; BIP-84 m/84'/0'/0'/0/0 (P2WPKH) interop profile

25Offline mode

The long-term runtime is installable or downloadable for offline use.

Potential surfaces

  • static offline web app
  • Tails-compatible bundle
  • CLI
  • native application
  • deterministic reference runtime

The public website explains this separation: documentation and simulation are distinct from a hardened production runtime. If production secret generation is eventually supported in-browser, it is a separate hardened application surface with explicit security assumptions. The marketing site must not silently become a wallet.

26Explicit non-goals

What the initial website does not do.

  • act as a custodial wallet
  • store user root secrets
  • require user accounts
  • require cloud identity
  • silently upload entropy
  • generate production secrets without explicit mode separation
  • imply deterministic generation eliminates operational security risks
  • invent proprietary Bitcoin transaction formats
  • replace descriptors, BIP32, PSBT, or Bitcoin wallet standards where those standards already apply

27Analytics & privacy

Privacy-preserving analytics or none. Never log secrets.

This site defaults toward privacy-preserving analytics or no analytics. It never logs:

  • secrets
  • entropy inputs
  • derived private keys
  • recovery material
  • recipe contents containing sensitive state

Telemetry boundaries are documented. All cryptography runs locally in your browser β€” nothing is sent anywhere.

28Accessibility

All derivation diagrams have textual equivalents.

  • keyboard navigation
  • high contrast
  • SVG diagrams
  • selectable text
  • non-animation fallback
  • reduced-motion mode

Cryptographic information never depends exclusively on color. Every diagram has a text equivalent.

29Mobile behavior

Mobile supports understanding and verification. Complex derivation editing progressively moves to desktop.

Mobile priorities

  • read documentation
  • inspect fingerprints
  • verify capability records
  • view recovery instructions
  • scan QR representations
  • inspect public descriptors

30QR representation

Public and encrypted artifacts can be encoded as QR where appropriate.

Examples

  • public fingerprints
  • capability records
  • encrypted recovery packets
  • descriptor material
  • recipe identifiers
Do not encourage encoding raw root secrets into casually scannable QR codes.