
Form builder
Every form is a Sui NFT with reusable fields, policies, and on-chain metadata.
Walrus-native feedback and form protocol
Forms are Sui NFTs. Responses are encrypted Walrus blobs. A composable primitive any dApp can embed, audit, and reward without owning a private database.
Walform
LIVEWhat worked well?
Long textOverall rating
Scale 1-10Attach screenshot
File upload0
responses
0.0
avg rating
0
SBT receipts
Composable building blocks for verifiable, private feedback.

Every form is a Sui NFT with reusable fields, policies, and on-chain metadata.

Responses are stored as Walrus blobs instead of rows in a centralized database.

Threshold decryption keeps raw feedback private until authorized parties can inspect it.

Move views expose counts and aggregate ratings for any Sui app to read.

Escrow WAL to reward approved responses, reports, and useful feedback.

Submitters receive non-transferable receipts without revealing private answers.
Meet Founder Fina Persona
A representative persona for solo or 2-person teams shipping a Sui/Walrus dApp

Sub-cent storage at scale for millions of responses.
Multi-admin decrypt with policy-based access.
Deploy as a Walrus Site with one command. No central server.
Form is a Sui object, not SaaS metadata.
Create fields, policies, bounty, and access rules.
Form schema is stored as a Sui-linked Walrus blob.
Answers encrypt with Seal and land on Walrus.
Admins decrypt, review entries, and export insights.
Call Walform Move functions directly from your own Sui dApp. SDK available as an internal package.
form::create_formCreate a new form Sui NFT
form::submit_responseSubmit encrypted response
form::count_responsesCount responses (view, no gas)
form::aggregate_ratingAggregate rating (view, no gas)
bounty::approve_responseApprove response + payout bounty
// Create a form
const tx = new Transaction()
tx.moveCall({
target: PACKAGE_ID + "::form::create_form",
arguments: [
tx.pure.vector("u8", schemaBlobId),
tx.pure.u64(schemaVersion),
],
})
// Composable reads — any dApp, no gas, no signing
const result = await client.devInspectTransactionBlock({
transactionBlock: (() => {
const tx = new Transaction()
tx.moveCall({
target: PACKAGE_ID + "::form::count_responses",
arguments: [tx.object(formId)],
})
tx.moveCall({
target: PACKAGE_ID + "::form::aggregate_rating",
arguments: [tx.object(formId), tx.pure.vector("u8", fieldId)],
})
return tx
})(),
sender: "0x0",
})Pay for storage, not response caps. Quilts drive response storage down at scale.
~0.002 WAL
per response
Example single-field text response
~0.08 WAL
per 1,000 responses
Example mix of fields
No accounts. No databases. Encrypted blobs, verifiable Sui objects, and bounty escrow for reputation.
