diff --git a/docs/build/javascript/waku-forum-opchan.md b/docs/build/javascript/waku-forum-opchan.md
new file mode 100644
index 0000000..06e2ddc
--- /dev/null
+++ b/docs/build/javascript/waku-forum-opchan.md
@@ -0,0 +1,561 @@
+---
+title: Build a Forum
+sidebar_label: Build a Forum
+description: Ship decentralized forum experiences over Waku using the OpChan React SDK.
+---
+
+`@opchan/react` adds a forum-focused state layer on top of `@opchan/core`, Wagmi, and the Waku network.
+
+## Why OpChan on Waku?
+
+- **Relevance-based sorting** – content scores combine engagement metrics (upvotes +1, comments +0.5), verification bonuses (ENS authors +25%, wallet-connected +10%), exponential time decay, and moderation penalties to surface quality discussions.
+- **Forum-first primitives** – cells, posts, comments, votes, bookmarks, and moderation helpers.
+- **Identity blending** – anonymous sessions, wallet accounts, ENS verified owners, and call signs share one cache.
+- **Permission reasoning** – UI gates and string reasons with zero custom role logic.
+- **Delegated signing** – short-lived browser keys prevent repetitive wallet prompts while keeping signatures verifiable.
+- **Local-first sync** – IndexedDB hydrates instantly while Waku relays stream live updates in the background.
+
+## Prerequisites
+
+- React 18+ with a modern build tool (Vite examples below).
+- Node.js 18+ and a package manager (npm or yarn).
+- A WalletConnect / Reown project id (`VITE_REOWN_PROJECT_ID`) so users can connect wallets.
+- Basic familiarity with [Waku content topics](/learn/concepts/content-topics) and message reliability concepts.
+
+## Quick Links
+
+- [Install the SDKs](#install-the-sdks)
+- [Bootstrap the provider](#1-bootstrap-the-provider)
+- [Hook surface overview](#2-understand-the-hook-surface)
+- [Common UI patterns](#3-compose-ux-patterns)
+- [Authentication flows](#4-authentication-flows)
+- [Reference app (collapsible)](#6-reference-layout)
+- [Troubleshooting](#8-troubleshooting)
+
+## Install the SDKs
+
+```mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+```
+
+
+
+
+```bash
+npm install @opchan/react react react-dom buffer
+```
+
+
+
+
+```bash
+yarn add @opchan/react react react-dom buffer
+```
+
+
+
+
+For Vite + TypeScript projects also install `@vitejs/plugin-react`, `typescript`, and `@types/react`.
+
+## 1. Bootstrap the provider
+
+Add the Buffer polyfill (still required by many crypto libraries) and wrap your tree with `OpChanProvider`. The provider internally wires Wagmi, React Query, and the OpChan client to the Waku relay layer. Configure it with the content topic you want to publish under plus the reliable channel id you use for the [Waku Reliable Message Channel](https://specs.vac.dev/specs/waku/waku-reliable-message-delivery/).
+
+**Pick your own identifiers.** The content topic and reliable channel ID form the address of your forum data. The sample values below point to the public `https://opchan.app/` deployment; leave them as-is only if you want to read/write the shared data graph. For a separate app, use two unique values (for example `/myapp/1/forum/proto` and `myapp-forum`) and reuse them everywhere you run the OpChan SDK so all clients join the same silo.
+
+```tsx title="src/main.tsx"
+import { createRoot } from 'react-dom/client';
+import { OpChanProvider } from '@opchan/react';
+import { Buffer } from 'buffer';
+import App from './App';
+
+if (!(window as any).Buffer) {
+ (window as any).Buffer = Buffer;
+}
+
+const config = {
+ // These defaults stream from the hosted https://opchan.app/ deployment;
+ // change both values to point the SDK at your own isolated data silo.
+ wakuConfig: {
+ contentTopic: '/opchan/1/messages/proto',
+ reliableChannelId: 'opchan-messages',
+ },
+ reownProjectId: import.meta.env.VITE_REOWN_PROJECT_ID,
+};
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+);
+```
+
+**Understanding `reownProjectId`:**
+
+The `reownProjectId` is required by WalletConnect/Reown (formerly WalletConnect) to identify your application when users connect their wallets. Here's how it works:
+
+- **Why it's needed:** WalletConnect/Reown uses project IDs to manage application registrations, track usage, and provide secure wallet connection services. Without a valid project ID, wallet connection attempts will fail.
+
+- **How the value flows:**
+ 1. Set `VITE_REOWN_PROJECT_ID` in your `.env` file (e.g., `VITE_REOWN_PROJECT_ID=your-project-id-here`)
+ 2. Vite injects it at build time via `import.meta.env.VITE_REOWN_PROJECT_ID`
+ 3. The value is passed to `OpChanProvider`'s `config` object
+ 4. `OpChanProvider` internally forwards it to Wagmi's configuration, which initializes WalletConnect/Reown connectors
+ 5. When users click "Connect Wallet", WalletConnect/Reown uses this project ID to establish the connection
+
+- **Getting a project ID:** Register your application at [cloud.reown.com](https://cloud.reown.com) to receive a free project ID. This ID uniquely identifies your app in the WalletConnect network.
+
+:::tip
+Keep secrets out of the bundle: reference the Reown id via an environment variable (`VITE_REOWN_PROJECT_ID`) rather than hard-coding it.
+:::
+
+## 2. Understand the hook surface
+
+Most apps can reach for the high-level `useForum()` hook and destructure the four core stores it exposes.
+
+```tsx title="src/App.tsx"
+import { useForum } from '@opchan/react';
+
+const { user, content, permissions, network } = useForum();
+```
+
+### Advanced: Fine-Grained Hook Reference
+
+For more customized or advanced needs, you can work directly with the individual hooks that power OpChan.
+
+| **Hook** | **Purpose** | **Common Methods/Values** |
+|-----------------------------------|-------------------------------------------------------------------------|------------------------------------------------------------|
+| `useAuth()` | User authentication, call signs, session & identity management | `connect()`, `startAnonymous()`, `delegate('7days')`, `updateProfile()` |
+| `useContent()` | Read and write data: cells, posts, comments, votes, bookmarks | `createPost()`, `vote()`, `moderate.post()`, `pending.isPending(id)` |
+| `usePermissions()` | Check what the user can or can't do, with detailed reasons | `canCreateCell`, `canModerate(cellId)`, `check('canPost')` |
+| `useNetwork()` | Network state, Waku connectivity, and hydration cycle | `isConnected`, `statusMessage`, `refresh()` |
+| `useUserDisplay(address)` | Get ENS & call-sign profile info about any Ethereum address | `displayName`, `ensAvatar`, `verificationStatus` |
+| `useUIState(key, defaultValue, category?)` | Persist UI/user state in IndexedDB | `[value, setValue]` (React state pair) |
+| `useEthereumWallet()` `useClient()` | Power-user hooks for direct access to Wagmi or the OpChanClient | `signMessage()`, direct client/database calls |
+
+_Note: These hooks can be combined with the high-level `useForum()` API or used independently where your app structure requires._
+
+### Sample snippets
+
+```tsx title="AuthButton.tsx"
+import { useAuth } from '@opchan/react';
+
+export function AuthButton() {
+ const { currentUser, connect, startAnonymous, disconnect } = useAuth();
+
+ if (currentUser) return ;
+
+ return (
+
+ );
+}
+```
+
+
+
+
+## 7. Troubleshooting
+### "useClient must be used within ClientProvider"
+
+Hooks must live under ``.
+
+```tsx
+function App() {
+ return (
+
+
+
+ );
+}
+
+function MainApp() {
+ const { currentUser } = useAuth();
+ return
Hello
;
+}
+```
+
+### Wallet connection fails
+
+Set `reownProjectId` inside the provider config (WalletConnect / Reown requires a project id).
+
+### `Buffer is not defined`
+
+Add the Buffer polyfill snippet before rendering (see step 1).
+
+### Anonymous users lose permissions after setting a call sign
+
+Ensure your helpers map the `ANONYMOUS` status correctly and that `updateProfile` preserves the existing `verificationStatus`.
+
+### Wallet disconnect clears anonymous sessions
+
+Check that your disconnect UX only clears browser keys for the current mode.
+
+## 9. Quick reference checklist
+
+1. Install `@opchan/react` + `@opchan/core`.
+2. Polyfill `Buffer`, wrap the tree with `OpChanProvider`, and pass `wakuConfig` + `reownProjectId`.
+3. Use `useForum()` for day-to-day UI; drop down to other hooks when necessary.
+4. Gate every action through `usePermissions()` (surface `reasons` in the UI).
+5. Render identities through `useUserDisplay()` so ENS + call signs stay in sync.
+6. Monitor `network.isHydrated` before rendering expensive components.
+7. Show optimistic UI feedback via `pending.isPending(id)` hooks.
+
+## License
+
+MIT — Built with ❤️ for decentralized communities.
diff --git a/sidebars.js b/sidebars.js
index 68a01b3..425c9c2 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -23,7 +23,7 @@ const sidebars = {
"build/javascript/message-encryption",
"build/javascript/use-waku-react",
"build/javascript/use-waku-create-app",
- "build/javascript/local-dev-env",
+ "build/javascript/waku-forum-opchan",
"build/javascript/configure-discovery",
"build/javascript/run-waku-nodejs",
"build/javascript/debug-waku-dapp",