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.
Messenger journey
Labeled phases from idle → identity → thread → sealed → committed → revealed. Reveal is a teaching theater, not a decrypt-on-chain claim.
-
1
IdleClaim a handle
-
2
IdentityLocal device seal
-
3
ThreadPeer selected
-
4
SealedBody in veil
-
5
CommittedHash on rail
-
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
—
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. */
}
Support the lab
Cardano (ADA) donations keep the 24/7 Midnight Studio Hub going. Tip only — this UI never moves ADA / NIGHT / DUST.
addr1q8hnl6vl5a6k3rw3n5g3jtte696zcl76kfatzv7gpswa9r0dj7fma6klq55y4ffm7tf0em09udnyhuk4ah92pl5x9jpqjae44v