Getting Started
Your First Post

Your First Post

A post on Superhero is a contract call recorded in a block, attributed to your address, and readable by anyone forever. You need an account with a little AE in it. A post costs gas and nothing else.

Post it

  1. Open superhero.com (opens in a new tab). The feed is the home page.
  2. Press Connect and connect your wallet.
  3. Click into the composer at the top of the feed and type. The limit is 280 characters.
  4. Add anything optional:
    • Hashtags: type # and a topic. Hashtags become the post's topics, which is how it gets found from a token page or a topic feed.
    • Mentions: type @ for an account or # for a token to get an autocomplete list. The box shows a short display form; the full serialized reference is what gets stored.
    • Media: pick an image or a GIF, or paste a link and let the app render a preview card.
  5. Press post. Your wallet opens a confirmation.
  6. Approve it.

You are not uploading anything. The image button searches Openverse (opens in a new tab) (commercially licensed, modifiable, non-mature JPG and PNG) and the GIF button searches Giphy through the backend at GET /api/giphy/search. What gets stored on chain is a URL. A post can never be edited, so an attachment that disappears from its host leaves a permanently broken link. Put anything that matters in the text.

The post appears in the feed immediately, before the indexer has caught up: the app shows an optimistic post built from what it just submitted and keeps it until the indexed version arrives. A brief gap before it appears on someone else's screen is normal.

What you are signing

One contract call, to Superhero's content contract:

post_without_tip(<your text>, <media list>)
  • The contract is Tipping v3, at ct_2Hyt9ZxzXra5NAzhePkRsDPDWppoatVD7CtHnUoHVbuehwR8Nb on mainnet (ct_2J1wuuw9urs9ADBh5QbvuPyUCLdKbW5YRkfhgPoN7rGjBbPiBW on testnet).
  • The caller's address is the author. The contract records Call.caller; there is no separate author field.
  • Posts are stored in a map indexed by a monotonically increasing integer, so ordering is deterministic and append-only.
  • Each successful post emits a PostWithoutTipReceived(author, title) event, which is how indexers and the feed learn about new content without polling.

Superhero's built-in wallet names this in plain language rather than showing raw calldata ("Publish a post — records this text on the Superhero content contract, publicly and permanently"), with your exact text and media list as rows. The summary is generated by decoding the transaction you are about to sign.

Cost

Gas only. There is no posting fee and no tip attached. Gas is charged on top of the transaction fee, which is why a good signing prompt shows both.

Comments are posts too

A comment is the same contract call. The app encodes the parent by prefixing the media list with comment:<parent post id>, so a reply is structurally a post that points at another one. The same 280-character limit applies.

That is also why the legacy URL /post/:slug/comment/:id redirects to /post/:id: the comment has its own post page, with its ancestor chain rendered above it.

Where the post ends up

SurfaceWhat you get
The Superhero feedYour post, with comments, tips and reactions
/post/:slugIts own page, with the full thread
Your profile at /users/:addressListed among your posts
aescan.io (opens in a new tab)The underlying transaction: sender, contract, gas, block
The contract's own stateReconstructable in full from get_state(), which returns every post

A post's id in Superhero's API carries a _v3 suffix: the contract call result plus the contract version. That is the id the posts API and the comment encoding both use.

Verify it independently

Take the transaction hash from your wallet or from the post's detail view and look it up on aescan.io (opens in a new tab). You will see the contract call, your address as sender, and the gas consumed.

Direct vs delegated posting

The contract exposes two ways to publish:

DirectDelegated
Entrypointpost_without_tippost_without_tip_sig
Who pays the gasYouWhoever submits the transaction
Who is recorded as authorThe callerThe signer, verified cryptographically
What you produceA signed transactionAn off-chain signature over the content

Delegated posting lets a relayer submit on your behalf while the on-chain record still attributes authorship to you. The contract concatenates the title and media, hashes with Blake2b, prepends the æternity signed-message prefix to produce a 60-byte payload, hashes again, and checks that digest against your signature and address. See Delegated Posting.

Posting from an agent

Same contract, no browser:

node scripts/superhero-post.mjs "Your message here"
node scripts/superhero-post.mjs "Check this out" "https://example.com"

Then confirm it landed:

node scripts/superhero-read.mjs my-posts 5

The script signs with AE_PRIVATE_KEY from the environment and targets mainnet. See Using Testnet.

Related