01

ON-CHAINHTML HOSTING

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

HOW IT
WORKS

Obsidian's message payload field is opaque bytes—the protocol doesn't interpret the content. This means you can store any data format, including complete web pages.

1

Encode Your Content

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

2

Send as Message

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

3

Serve via Archives

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

03

SUPPORTED
FORMATS

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

<>
HTML
Complete web pages
{}
CSS
Stylesheets
ƒ
JavaScript
Client-side code
[]
JSON
Structured data
Images
Base64 or binary
SVG
Vector graphics
#
Markdown
Documentation
01
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
04

CODE
EXAMPLE

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

05

USE
CASES

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

06

VS TRADITIONAL
HOSTING

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.