01Obsidian

On-chainHtml hosting

Host websites directly on the blockchain. Obsidian message payload supports any binary format. HTML, CSS, JavaScript, images, and more. Finalized, censorship-resistant web publishing with archive-backed retrieval.
02Section 02

How itWorks

Obsidian message payload field is opaque bytes. The protocol does not interpret the content. This means you can store any data format, including complete web pages.

Step 01

Encode your content.

Convert your HTML, CSS, or JavaScript to bytes. Optionally compress with gzip for larger files.

Step 02

Send as message.

Submit via eth_sendMessageBlob RPC. Your content becomes finalized chain data with archive-backed retrieval.

Step 03

Serve via archives.

Retrieve via RPC and serve through gateways backed by archive nodes that preserve long-term history.

03Section 03

SupportedFormats

The payload field accepts any binary data up to 8 KB. The protocol is format-agnostic. Your application decides how to encode and decode.

Format
HTML
Complete web pages.
Format
CSS
Stylesheets.
Format
JavaScript
Client-side code.
Format
JSON
Structured data.
Format
Images
Base64 or binary.
Format
SVG
Vector graphics.
Format
Markdown
Documentation.
Format
Any binary
Your format.

Size limits

  • Single message. Up to 8 KB payload.
  • Larger content. Split across multiple messages with content-addressing.
  • Compression. Use gzip to fit more content per message.
04Section 04

CodeExample

Store HTML on-chain

// Your HTML content
const html = `
<!DOCTYPE html>
<html>
<head>
  <title>My On-Chain Page</title>
</head>
<body>
  <h1>Hello, Blockchain!</h1>
  <p>This page is finalized on-chain and retrievable through archive nodes.</p>
</body>
</html>
`;

// Convert to hex
const payload = "0x" +
  Buffer.from(html).toString("hex");

// Send to blockchain
await provider.send(
  "eth_sendMessageBlob",
  [{
    from: myAddress,
    data: payload,
    signature: sig,
    nonce: nonceHex,
    chainId: "0x1a5"
  }]
);

Retrieve and serve

// Fetch message by hash
const msg = await provider.send(
  "eth_getMessageByHash",
  [messageHash]
);

// Decode payload
const html = Buffer.from(
  msg.payload.slice(2),
  "hex"
).toString("utf8");

// Serve via HTTP gateway
app.get("/page/:hash", (req, res) => {
  const html = fetchFromChain(
    req.params.hash
  );
  res.setHeader(
    "Content-Type",
    "text/html"
  );
  res.send(html);
});

Zero gas fees for standard messages. Your website costs nothing to publish in the standard lane.

05Section 05

UseCases

Archive-backed landing pages.

Deploy marketing pages, portfolios, or documentation with finalized on-chain history and archive-backed retrieval.

Censorship-resistant publishing.

Publish journalism, research, or controversial content that cannot be censored. The blockchain ensures your words persist.

Decentralized apps.

Host your dApp frontend on-chain. Even if your domain is seized, users can access your app through any blockchain gateway.

NFT metadata and media.

Store NFT artwork and metadata directly on-chain instead of relying on IPFS pinning or centralized servers.

Historical archives.

Preserve important documents, articles, or web pages with finalized on-chain ordering and archive-backed retrieval. Create an immutable historical record.

Proof of publication.

Timestamp content with cryptographic proof of when and by whom it was published, then retrieve it through archive-backed history.

06Section 06

Vs traditionalHosting

FeatureAWS / NetlifyIPFSObsidian
PermanenceUntil you stop payingWhile pinnedArchive-backed
CensorshipCan be removedGateway dependentResistant
Ongoing costMonthly feesPinning costsNone (SM)
Proof of publishNoHash onlyFull signature
TimestampMutableNoBlock timestamp

Deploy on-chain websites.

Your HTML stays retrievable through archive-backed history.