⚠️ Alpha · testnets only. ChainRender is in active alpha and deployed on testnets only — Ethereum Sepolia, the Robinhood Chain Testnet, and the Circle Arc Testnet — not on any mainnet. Contracts, addresses, and APIs may change. Do not use with real funds or production assets.
Getting Started

Your First App

The one idea that matters: a ChainRender app is a component compiled to bytes, registered on-chain, and rendered by an eth_call — the component IS the app. Do not fetch data with viem and hand-render it in React with ChainRender only printing a hash on the side; that is a conventional Web3 dashboard, not a ChainRender app. See Building Correctly.

Build, grade, and understand a real component end-to-end.

1. Compose

import { compose } from "@chainrender/client";

const app = compose.box([
  compose.heading("My First On-Chain App"),
  compose.text("This UI lives entirely on-chain."),
  compose.button("Do it", { variant: "primary", action: { to: "0x…", sig: "act(uint256)", args: "$n" } }),
]);

You composed from the vocabulary — a closed set of primitives. You literally cannot express anything outside it, which is what makes the next step meaningful.

2. Compile — get your app's identity

import { compileComponent } from "@chainrender/client";
const built = compileComponent(app);
console.log(built.hash); // 0x… — this IS your app, forever

The hash is content-addressed: it's the keccak256 of your app's exact bytes. Change anything and the hash changes. See Content Addressing.

3. Grade — know your trust level before deploying

import { grade } from "@chainrender/client";
const g = grade(app);
console.log(g.letter, g.word); // "A" "Trustless"

Your app is grade A because it's fully on-chain with no external dependencies. If you'd added an off-chain image, you'd see it drop to C — with an itemized reason. This grade equals what the chain computes (drift-locked). See The Trust Grade.

4. Register — pay gas once

Register the bytes to the ComponentRegistry (one transaction). After that, anyone renders your app for free, forever, from any RPC.

5. Render — free, reproducible

import { renderComponent } from "@chainrender/client/runtime";
const html = await renderComponent({ rpc, router }, built.hash );

What you learned

  • Composition is constrained (safe by construction).
  • The hash is the identity (immutable, verifiable).
  • The grade discloses trust (honest, itemized).
  • Rendering is a free, reproducible eth_call.

Next: Bind Live On-Chain Data to make it show real chain state.