A website is a doorway. The chain keeps the story.
Read conversations, start a thread and reply on Hauntboard. The full post payload is stored in a Tari Ootle smart contract. Each client reads that contract to reconstruct the board. Public text and optional sealed message bodies live in contract state.
CHECKING CONFIGURATION
Checking this client's network and available features. The technical sections below describe older localnet boards until the current configuration loads.
Built on
START HERE / YOUR FIRST VISIT
Read first. Post when you are ready.
Hauntboard is a text discussion board. You can read public conversations without creating or unlocking a wallet. Posting uses test TARI to pay a network fee; test currency has no monetary value.
Choose a conversation
Open General, Tari or Politics. Select a thread to read its opening post and replies. Use Reply order to change their order and Load older replies to see earlier messages.
Prepare to contribute
Choose Start a thread for a new conversation, or write in Leave a reply. The app guides you to wallet setup or funding when needed. Check the network shown in the app before proceeding.
Review before publishing
Choose Review post or Review reply. Check your words and the displayed network fee before confirming. Accepted posts cannot be edited or deleted. Avoid publishing information you want to keep private.
Wait for the result
The app tracks submission, confirmation and indexing. A confirmed transaction may take time to appear in the feed. Refresh threads or Refresh conversation to check the latest chain data.
Available wallet and privacy features depend on this client's network and board version. The sections below update when the current configuration loads.
WALLET / KEEP ACCESS TO YOUR FUNDS
One wallet. A PIN for this device.
Create a wallet
Open Wallet and choose Create wallet. Enter six digits using the keypad, keyboard or number pad. The app moves to confirmation automatically; enter the same six digits again. You do not need to select a text field or press a submit button. Save the 24-word Tari L2 recovery phrase somewhere private and confirm you have saved it before continuing to funding.
Recover an existing wallet
Choose Recover with seed phrase, enter your 24 words and set a new device PIN. If the original wallet used a seed passphrase or a different account index, enter those values too. Compare the receive address before saving. Recovery replaces the wallet saved in this browser.
Check your funds
Wallet balance includes account funds and native outputs. Available for posting shows the funds this app can currently use to publish. Open Balance details to see account funds, reserved funds and change held separately. Choose Check for incoming funds to scan again.
Fund your first post
Need test tokens? Receive funds at your wallet address, or recover a funded wallet. If your account has funds, follow Convert to posting funds and review its network fee.
Forgot your PIN?
Your PIN unlocks the saved wallet on this device. The operator cannot recover it. Choose Forgot PIN? and Recover with seed phrase to set a new PIN. The app checks your recovery details, lets you create and confirm a PIN, then asks you to review before replacing the saved wallet. Delete saved wallet is a separate action; keep your recovery credentials before deleting. Deletion removes local wallet access; it does not remove funds or posts from Tari.
Moving to another browser?
Recover with your 24 words and any original seed passphrase and account index. Keep them private: someone with the recovery credentials can control the wallet. Lock wallet when finished. Reloading or backgrounding the app also locks it.
HELP / WHEN A POST TAKES TIME
Check the existing submission.
If the app shows a pending operation or Submission needs checking, use Check existing submission when offered. A connection problem can leave the outcome uncertain even after a transaction reached Tari. Resolve that operation before starting another post; submitting the same text again could publish it twice and pay another fee.
A confirmed post can still be waiting for the indexer. Refresh the conversation before assuming it failed. If the provider is unavailable, wait for connectivity and check again. Keep your recovery phrase, PIN and private keys out of troubleshooting messages.
00 / THE APPLICATION AT A GLANCE
One board. Three places for data.
The browser prepares each post, a relay forwards the signed transaction, and Tari executes the smart contract. Reads return through an indexer. The labels below show what each part keeps.
KEPT ON YOUR DEVICE
Your browser
Write, encrypt, review fees, sign, and decrypt locally.
Wallet keys: password-encrypted browser storage and your backup file.
Secret-thread keys: protected browser storage; separate invitation and backup.
Serves the application and forwards signed transactions to the configured provider.
Retry journal: operation fingerprint, transaction ID, and status.
No post-content database: accepted messages are retrieved from Tari.
No participant keys: wallet passwords and thread keys remain in your browser.
Submit→←Read state
AUTHORITATIVE CHAIN STATE
Tari network
Indexer: reads and caches chain state. Validators: execute transactions and enforce contract rules.
Hauntboard smart contract
Board componentThread addresses, public titles, mode, IDs, and author references.
Thread componentPage addresses, thread context, and total post count.
Post-page componentsFull public message bytes or full sealed ciphertext, plus signer, nonce, reply parent, and epoch.
A confirmed post lives in contract state, not in a website database. Public text is readable on chain. Sealed ciphertext is also on chain; the browser needs the invitation key to decrypt it. Signer identities and activity remain observable. The indexer is a provider you trust, rather than an independent consensus proof checked by this browser.
The diagram describes the message path. In this local PoC, optional companion demo wallets hold their own keys in private Docker volumes. The public testnet profile requires browser-owned signing and exposes no demo-wallet signing routes. The current network and deployed contract addresses are shown below.
01 / FROM BROWSER TO BOARD
How a post travels.
Write in your browser
Choose a public or sealed thread. Public text becomes a JSON payload. Sealed text is encrypted before it leaves your browser.
Review and sign
The app estimates the network fee and asks you to confirm. An unlocked browser wallet signs locally; its keys are never sent to the companion. If you use a companion demo wallet, that service signs with its pre-funded keys.
The contract records it
Tari executes the transaction. A new thread creates a thread component and registers its address on the board; a reply appends to a page owned by that thread. A new page is created automatically after every 16 posts. Failed transactions do not partially publish a thread.
Any client can sync
An indexer retrieves the component state. The client checks its template and reconstructs threads from the full stored payloads. Sealed posts open locally when the browser has the invitation key.
02 / WHAT “ON CHAIN” MEANS
The posts are on chain. The keys stay with you.
The app does not keep a separate post-content database or replace your post with an IPFS link. “On chain” describes the board and post records; it does not mean every piece of app data belongs on the chain.
Where Hauntboard stores each kind of data
Data
Stored where
Who can read it
Board registry
Tari board component: thread addresses, public titles, mode, IDs and author public keys
Anyone who can read this network
Public posts
Tari post-page components: complete JSON bytes, including title, display name, body and optional tip address
Anyone who can read this network
Sealed posts
Tari post-page components: complete encrypted envelope, with nonce and authentication tag
Ciphertext is public; readable content requires the thread key
Post metadata
Tari: thread page addresses and total count; each page stores signer public key, post nonce, global parent index and epoch
Anyone who can read this network
Secret-thread keys
Your browser’s IndexedDB, encrypted with a device key; optional password-encrypted backup file
Your browser or someone with the invitation / backup credentials
Browser and demo wallet keys
Browser wallet: password-encrypted IndexedDB and optional encrypted backup. Demo wallet: private local Docker volumes.
Browser wallet: the password holder on this device. Demo wallet: the local service / machine operator.
Drafts and preferences
Public drafts in session storage; hidden threads and pending operation IDs in local storage. Sealed plaintext drafts stay in memory.
This browser; these are not chain records
Indexer and retry records
Local indexer cache of chain state; companion journal of submission IDs and status
The local service operator; the journal has no thread keys or post bodies
A conversation stays together in the app. The opening post stays visible; recent replies appear first. Choose Load older replies to retrieve earlier pages from the chain. No posts are compressed away or discarded. Previous schema-2 boards remain accessible through the board chooser and retain their original 32-post limit.
03 / BEHIND A SEALED DOOR
Encryption, before publication.
Your browser generates a random 256-bit thread key and uses AES-GCM to encrypt each sealed post. The real title, display name, text and optional tip address are inside the ciphertext. The board lists it as “Sealed thread.” The encrypted envelope is bound to this network, board, thread ID, post nonce and reply target.
The invitation is the key
The key travels in a URL fragment, after #. Browsers do not send fragments in HTTP requests. Hauntboard imports the key locally and removes the fragment from the address bar. Anyone you share that invitation with can read the whole thread, including future replies.
Privacy has a boundary
Encryption conceals content. It does not conceal the existence of a thread, its signer identities, post count, ordering or transaction activity. This is not anonymous posting. Losing every copy of a thread key means losing access to its content.
Private tips are separate native Tari stealth transfers. Hauntboard does not append their amount or a payment link to the thread. The sending companion sees the recipient and amount; network fees and timing are still observable.
04 / LOOK THROUGH THE DOORWAY
Verify what the app reads.
Open any thread and choose Inspect chain bytes to see the thread metadata and loaded post-page states returned by the indexer. Public posts contain readable JSON bytes; sealed posts contain encrypted envelopes. Use Sync from chain to refresh your view.
The second client uses a separate wallet and indexer connected to the same local validator. The PoC has demonstrated that it can recover public and sealed threads and post replies while the primary website, indexer and wallet are stopped. Both clients still depend on the local chain infrastructure.
05 / KNOW WHAT LINGERS
Publication is a lasting choice.
The contract has no edit or delete method. Hiding a thread changes only your browser’s view. A reset of this isolated local network can erase its data.
Each board holds up to 128 threads; each new thread holds up to 2,048 posts (2,047 replies), across 128 pages of 16 posts; each post envelope is limited to 4,096 bytes. This PoC supports text, not image uploads.
Browser wallets sign board posts locally using existing native test TARI. Private tips still use the operator-controlled companion demo wallets. The website and companion deliver code and chain data; you still trust that code, the provider and the network you connect to.
A different client can read the same board from its contract address. Running a client locally does not by itself make the network decentralized; this PoC runs one local validator.
Encrypted content may remain available indefinitely. If its key is later disclosed, previously published content becomes readable. Backup passwords and invitation keys are not stored on chain.
Run your own copy.
Download the client and Rust contract from GitHub, then follow the Docker instructions to read and post to this same board without the hosted Hauntboard server. Your wallet keys stay in your browser. The current client still depends on Tari-hosted Esmeralda indexers and the testnet; running it locally does not give you independent consensus verification or complete anonymity.