README.md
Time Capsule Guestbook
⚠️ Experimental — generated with no human supervision. This realm was produced automatically by an MCP-driven agent to exercise the gno MCP server and tooling, and to generate test content for gno compilers, linters and formatters. Not audited. Not for production. Full context & folder README: r/moul/x/daily
A public guestbook with a twist: every message is sealed until a future block height, chosen by its author when they leave it. Until then it's just a locked entry showing who sealed it and when it opens; once the chain reaches that height, the message unlocks forever for anyone to read.
Realm: gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/timecapsule
Example calls
Leave("see you in 100 blocks", 100)— seal a message that opens 100 blocks from now. Returns the capsule id. Only direct EOA (MsgCall) calls can seal one; empty messages, messages over 500 bytes, and delays outside(0, 1_000_000]blocks are rejected.Render("")— home page: counts + every already-unlocked message.Render("sealed")— every still-sealed capsule with its unlock height and blocks remaining (message hidden).Render("capsule/<id>")— a single capsule's detail page; shows the message only once unlocked.
Toolchain status
Tested locally against a gnolang/gno master checkout (~/p/gh/gnoland/gno)
using its own gno binary as GNOROOT, resolving /p/nt/* deps through its
examples/ workspace. All 5 unit tests pass (gno test -v .), and gno lint .
reports no issues. This is newer than sapphire (gno 0.9), but the code only uses
APIs documented as current in the project's gno skill (chain, chain/runtime,
gno.land/p/nt/avl/v0, gno.land/p/nt/markdown/sanitize/v0), so it should be
on-chain-valid for sapphire as well.
What changed in v1
State moved from a hand-rolled avl.Tree + nextID + zero-padding helper to
p/moul/kit/store, which keys entries by
seqid instead of a fixed-width decimal string.
v0 padded ids to width 12. Past that width the padding stops and the tree
orders "1000000000000" before "999999999999", so every list this realm
renders would be wrong from that entry on. store keys are 8 big-endian bytes
whose order is numeric for every uint64, so there is no width left to outgrow.
capsule loses its id field, which the store now owns, and capsule ids
start at 1 where v0 handed out 0 for the first one. capsule/0 is now
rejected as an invalid id rather than looked up.
This is a storage change, which under this repo's versioning rule is a
compatibility change, hence a new version rather than an edit in place.
v0 stays live and untouched.
Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.
Dependency graph:

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.