# `gno.land/p/moul/web25` Point a realm's on-chain page at the richer web2 frontend that also serves it, in one consistent line instead of a different hand-rolled banner per realm. ```go var cfg web25.Config cfg.SetRemoteFrontendByURL("https://example.com/app") // or cfg.SetRemoteFrontendByCID("bafy...") // resolved through an IPFS gateway func Render(path string) string { return page() + cfg.Render(path) } ``` `cfg.Render(path)` appends `DefaultText`, with `{link}` replaced by the resolved URL: > Click [here]({link}) to visit the full rendering experience. Set `cfg.Text` to use your own wording; `{link}` is the only placeholder. `GetLink()` returns the resolved URL if you want to place it yourself. ## The opt-out is the point `Render` emits nothing when the query carries `?no-web25=1` (the value matters: a bare `?no-web25` does not disable it). That matters because a realm's `Render` is also read by other realms and by tooling, and a "go look at our website instead" line is noise there. A caller that is not a browser appends `?no-web25=1` and gets the page without the pitch. It also keeps the escape hatch visible: the web2 frontend is a convenience, and the chain-rendered page has to stand on its own. If it does not, the link is hiding a problem rather than solving one. The name is the thesis: web2.5 is a web2 frontend over web3 state, and the chain page should say so rather than pretend the frontend does not exist. --- Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage. **Dependency graph:** ![gno.land/p/moul/web25/v0 dependency graph](https://raw.githubusercontent.com/moul/gno-contracts/main/_assets/gno.land/p/moul/web25/v0/deps.png) > ⚠️ **Disclaimer:** provided as-is, without warranty; not security-audited. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).