WW VIBEBack to W VIBE
COMMITTED PROJECT NOTESDownload Markdown

Architecture

Two independent deployments

  1. The website is built with React/Vinext and deployed through Sites as a Cloudflare Worker-compatible application.
  2. The Rust registry is compiled into a Solana SBF executable, then deployed to public Devnet using the Solana CLI. The site calls its program ID over HTTPS JSON-RPC.

Sites does not compile Rust automatically. A deployed site does not require a Rust compiler or local validator. The program's compiler can run in this workspace or another build machine. Alchemy MCP is useful for chat-time inspection, but does not automatically provide runtime API credentials to the site.

Chain and backend responsibilities

  • Chain: issuer authorization, owner signatures, first-finder credit, immutable ciphertext, origin traits, birth time, transfer rules and scheduled state/price calculations.
  • Private backend: encryption/decryption keys, test-wallet signing, data formatting, authenticated recipes and type-aware rendering.
  • Browser: decoded public Devnet inventory, scheduled/receipt Moments and decorative motion; optional Phantom public-address connection; separate lab test controls and returned public results. No private signing or decoder keys ship to the browser.

The blockchain is the persistent source of record ownership. The repository's evidence JSON is a dated test snapshot. A live read must be labelled separately from that snapshot. No D1 is necessary to remember these test records; they live on Devnet. Devnet can reset.

Network guard

Only HTTPS endpoints on api.devnet.solana.com or solana-devnet.g.alchemy.com are allowed by the shared client. Before any signed submission, read getGenesisHash and compare to EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG. Fail closed on mismatches.

The lab uses disposable server-side test wallets. My Stash separately offers a user-controlled Phantom connection for read-only Devnet balance. The Chase supports claimant-signed Devnet rewards; the program enforces the platform issuer. Production wallet recovery and full inventory onboarding remain open.

Privacy boundaries

AES-256-GCM encrypts a 16-byte random seed using a 12-byte nonce and 16-byte tag. V3 authenticates the canonical issuance recipe in a versioned associated-data domain and commits its SHA-256 digest in the 216-byte record. Access/reward/publication/difficulty are also stored on-chain; type selects an authenticated game profile. V2 retains its original 212-byte format. Record address, issuer, type, renderer, traits, schedule rule and pricing policy are bound before issuance. The program records actual birth time using Clock. The server checks the binding and maps the authenticated identity plus program-derived state to named image phases. Legacy 156-byte records retain their original decoder and manual checkpoint for the isolated lab.

The public on-chain program never stores our decoder key. Account records can be enumerated. Ciphertext cannot itself authorize a claim. Frontend source, returned fingerprints, and any eventual rendered output remain inspectable/capturable. Encryption protects the seed at rest; it cannot guarantee that nobody copies the displayed experience. The on-chain registry is a custom account protocol, not a standard NFT/token mint; ordinary wallet marketplaces will not automatically list or trade these records.

Costs

Query getMinimumBalanceForRentExemption with the final exact account byte length. Do not reuse a static dollar quote; query actual parameters and distinguish account funding from transaction fees. Storage balance is funded once and stays with the account; transaction/signature/priority fees are separate. The current lab has no close instruction, so its record funding cannot currently be reclaimed.

Consumer data, decoding and Moments

lib/vibe-gallery.mjs reads the 100-record catalog, checks existence and uses five batches of at most 20 unsigned simulateTransaction calls to execute read-only program quotes. Return data and account snapshots come from each simulation; the first quote fixes a common chain evaluation time and later batches require that minimum slot. A slot range makes clear that all ownership is not one atomic snapshot. No quote is signed or broadcast.

lib/vibe-issuance.mjs authenticates issuance-bound seeds and implements the three temporary image adapters. It mirrors schedule/price rules for verification and historical rendering; current prices come from the program. Only permitted revealed identities are decoded for consumer responses. Hidden on-chain origin parameters remain publicly inspectable; encrypted identity is not a private blockchain.

GET /api/vibe/data validates filters, ordering, pagination and detail access. It needs only the decoder, no signer binding. No D1 or persistent inventory cache is used; each request owns its fetches, with a 35-second total deadline and 5-second per-attempt RPC limit and one transient read retry. In-flight promises are never shared across Worker request contexts. Independent existence/blockhash checks and historical receipt verification overlap with other reads after network verification. Clients reject obsolete requests and older slot/generation results. The independent network footer keeps a short status cache; wallet reads do not sign.

components/vibe-gallery.tsx drives The Flex and Moves; components/vibe-clips.tsx drives Moments and fixed exports. Scheduled Moments contain only the immediately previous/current state and use issuance provenance, never an invented Shift transaction. Sales, gifts, claims and application asks remain distinct. Hidden member identities are never serialized into public feeds. The game separately returns only step-permitted clue/preview data. The user has ruled out the internal preview browser; verification uses the published Site HTTP APIs and real RPC.

Test sales compose System Program payment and record transfers atomically, including five concealed members. This does not implement standing listings, escrow or enforcement of platform prices as purchase offers. Program recovery and fixture restoration are explicit admin operations. See HOMEPAGE-V1.md, Program and BOOTSTRAP.md.

lib/chase-game.mjs implements sealed progress, server-validated locks, scoped decoding, wallet-bound claim preparation, Ed25519 validation and receipt resolution. lib/chase-policy.mjs keeps acquisition rights independent of prices/rarity; lib/chase-events.mjs verifies game receipts for public Moments. No D1 or reservation store is added. The claim instruction enforces V3 mint-bound reward/access rights. lib/vibe-mint.mjs validates authored factors and derives the evolution-dominant score; the program independently checks birth terms. Minting. Discovery.