THE CONVERSATION LIVES ON TARI

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 Tari
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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

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.
  • Private drafts: sealed plaintext stays in memory. Hide/filter preferences stay local.
OPERATIONAL RECORDS

Web server & relay

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.
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.

  1. 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.

  2. 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.

  3. 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.

  4. 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
DataStored whereWho can read it
Board registryTari board component: thread addresses, public titles, mode, IDs and author public keysAnyone who can read this network
Public postsTari post-page components: complete JSON bytes, including title, display name, body and optional tip addressAnyone who can read this network
Sealed postsTari post-page components: complete encrypted envelope, with nonce and authentication tagCiphertext is public; readable content requires the thread key
Post metadataTari: thread page addresses and total count; each page stores signer public key, post nonce, global parent index and epochAnyone who can read this network
Secret-thread keysYour browser’s IndexedDB, encrypted with a device key; optional password-encrypted backup fileYour browser or someone with the invitation / backup credentials
Browser and demo wallet keysBrowser 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 preferencesPublic 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 recordsLocal indexer cache of chain state; companion journal of submission IDs and statusThe 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.

Network
Isolated Tari localnet · v0.43.0
Current board component
Loading current configuration…
Published template
Loading current configuration…
This client’s provider
Loading current configuration…

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.

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.

Support Hauntboard.

If you would like to support Hauntboard development, donations are welcome at this wallet address:

1213nhRFy9S3tevPWJyThkZpEuDruaa4L4LNLEgzAuc4PG6dL862KzsijZgyg68qrcKS2U3hCqzjkiJHdasrTDj3pwf