LOCAL-TRUE · not a relay · not on-chain

Private messenger · sealed envelopes · selective reveal

Nocturne Messenger Studio

World-class educational preview of Midnight-style private messaging: claim a handle, seal DM bodies in an envelope veil, publish only a commitment on the ledger rail, then run a selective reveal theater — without claiming a relay, Lace, Compact compiler, or on-chain settlement. By @kshot9000 · nightdream.xyz · inspired by the standalone Nocturne product vision.

I Identity T Threads N Compose S Seal R Reveal ? Shortcuts D Donate
Honest scope: local HTML/JS teaching studio only. Does not relay messages across devices, connect Lace, compile Compact, start a proof server, or settle ADA / NIGHT / DUST. Does not claim GitHub Pages is live until Actions are enabled. Seeded residents and canned replies are simulated. Sealing uses WebCrypto SHA-256 + localStorage — teaching stand-in, not a Midnight network messenger.

Messenger journey

Labeled phases from idle → identity → thread → sealed → committed → revealed. Reveal is a teaching theater, not a decrypt-on-chain claim.

  1. 1
    IdleClaim a handle
  2. 2
    IdentityLocal device seal
  3. 3
    ThreadPeer selected
  4. 4
    SealedBody in veil
  5. 5
    CommittedHash on rail
  6. 6
    RevealedSelective open

Phase: idle — claim a Nocturne handle to begin.

Local identity

Handle + device commitment stay in this browser (schema v2 localStorage · BroadcastChannel sync · JSON export/import). Press I. No passphrase leaves the box; no relay. LOCAL-TRUE ≠ on-chain.

Sealed messenger

Dual rails: envelope veil (private body) vs ledger commit (public hash). Seeded residents reply locally — simulated, not networked.

Envelope veil

Private message bodies + typing theater stay local. Never declared as ledger.

0% veil surface

Ledger commit rail

Public commitments + thread ids observers could see. Bodies stay veiled.

0% ledger surface

Select a thread

—

local
Claim identity + pick a thread

Selective reveal theater

Prove you can open a sealed envelope without dumping every body on the rail. Press R. Teaching only — not on-chain decrypt.

Reveal score

Awaiting reveal theater.

Idle

Findings appear after you run selective reveal against the latest sealed envelope.

Awaiting reveal theater…

Messenger privacy glossary

Concepts this studio annotates. Prefer official Midnight docs for normative dual-state semantics.

Teaching Compact sketch

Illustrative sealed-message pattern — not a compilable contract. Verify helpers against Compact docs before any real work.

pragma language_version >= 0.23;

import CompactStandardLibrary;

/* Public: thread id + message commitment. Private body is a witness. */
export ledger threadCommit: Bytes<32>;
export ledger msgCount: Counter;

witness sealedBody(): Bytes<32>;

export circuit postSealed(threadTag: Bytes<32>): [] {
  /* Teaching stand-in — verify persistentHash / pad before compile. */
  const body = sealedBody();
  threadCommit = persistentHash<Bytes<32>>(
    pad(32, "nocturne:msg:") || threadTag || body
  );
  msgCount.increment(1);
  disclose(threadCommit);
  disclose(msgCount);
  /* Body never becomes ledger. */
}