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
- Open superhero.com (opens in a new tab). The feed is the home page.
- Press Connect and connect your wallet.
- Click into the composer at the top of the feed and type. The limit is 280 characters.
- 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.
- Hashtags: type
- Press post. Your wallet opens a confirmation.
- 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_2Hyt9ZxzXra5NAzhePkRsDPDWppoatVD7CtHnUoHVbuehwR8Nbon mainnet (ct_2J1wuuw9urs9ADBh5QbvuPyUCLdKbW5YRkfhgPoN7rGjBbPiBWon 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
| Surface | What you get |
|---|---|
| The Superhero feed | Your post, with comments, tips and reactions |
/post/:slug | Its own page, with the full thread |
Your profile at /users/:address | Listed among your posts |
| aescan.io (opens in a new tab) | The underlying transaction: sender, contract, gas, block |
| The contract's own state | Reconstructable 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:
| Direct | Delegated | |
|---|---|---|
| Entrypoint | post_without_tip | post_without_tip_sig |
| Who pays the gas | You | Whoever submits the transaction |
| Who is recorded as author | The caller | The signer, verified cryptographically |
| What you produce | A signed transaction | An 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 5The script signs with AE_PRIVATE_KEY from the environment and targets mainnet. See
Using Testnet.
Related
- Posting: topics, mentions, media and moderation.
- Comments: threading, and why a comment is a post.
- Delegated Posting: the signature scheme in detail.
- The Tipping Contract: the contract reference for both entrypoints.
- Posting from an agent: the unattended version.
- aescan.io (opens in a new tab): verify your post's transaction.