Skip to main content
The Agora Forum system provides a comprehensive discussion platform for DAO governance and community engagement, supporting rich interactions, content moderation, and document management.

Overview

The forum system enables:
  • Discussion threads - Create topics and reply with nested conversations
  • Content moderation - Admin controls with NSFW detection
  • Document sharing - IPFS-based file uploads and attachments
  • Reactions - Express sentiment with emoji reactions
  • Upvoting - Highlight quality content
  • Search - Full-text search across all forum content
The forum is fully integrated with your DAO’s governance system, making it easy to discuss proposals and coordinate with delegates.

Forum Structure

Categories

Forums are organized into categories:

General Discussions

Open conversations about DAO operations and governance

Proposal Discussions

Dedicated spaces for specific proposals

Admin Categories

Restricted areas for governance team coordination

DUNA Reports

Specialized category for quarterly reports and documents

Topics

Each category contains multiple topics (threads):
  • Topic title and author
  • Creation date and last activity
  • Post count and view count
  • Upvote count for quality signaling
  • Archived/deleted status indicators

Posts

Topics contain posts with features:
  • Rich text content with markdown support
  • Nested replies (threaded conversations)
  • File attachments from IPFS
  • Emoji reactions from community
  • Soft delete and moderation controls
  • NSFW content flagging

Creating Content

Starting a New Topic

1

Navigate to Category

Choose the appropriate category for your discussion
2

Click Create Topic

Look for the “New Topic” or ”+” button
3

Write Your Post

Add a clear title and detailed description
4

Add Attachments (Optional)

Upload relevant files, images, or documents
5

Sign and Submit

Sign with your wallet to post
import { createForumTopic } from '@/lib/actions/forum/topics';

const topic = await createForumTopic({
  categoryId: 1,
  title: "Proposal Discussion: Treasury Diversification",
  content: "Let's discuss the proposed treasury diversification strategy...",
  address: userAddress,
  signature: signedMessage
});

Replying to Topics

Join existing conversations:
  1. Open the topic you want to reply to
  2. Read existing posts and replies
  3. Write your response in the reply box
  4. Optionally attach files or reference other posts
  5. Sign and submit your reply
Reply features:
  • Quote other posts for context
  • Tag users with @ mentions
  • Add inline images and links
  • Edit within a time window
import { createForumPost } from '@/lib/actions/forum/posts';

const post = await createForumPost(topicId, {
  content: "Great point! I'd like to add...",
  parentPostId: 123, // Optional: for threaded replies
  address: userAddress,
  signature: signedMessage
});

Interactive Features

Emoji Reactions

React to posts with emojis:

Quick Reactions

Default emoji set: 👍, 🔥, 🤔, 👀, 🎉, ❤️, 👏, 😄, 🤝

One Click

Click any emoji to add your reaction

See Who Reacted

Hover to see which users added each reaction
import { addForumReaction, removeForumReaction } from '@/lib/actions/forum/reactions';

// Add a reaction
await addForumReaction({
  postId: 123,
  emoji: "👍",
  address: userAddress,
  signature: signedMessage
});

// Remove your reaction
await removeForumReaction({
  postId: 123,
  emoji: "👍",
  address: userAddress,
  signature: signedMessage
});

Upvoting Topics

Highlight quality content:
  • One upvote per user per topic
  • Upvote count displayed prominently
  • Helps surface important discussions
  • Can be removed/changed at any time
import { upvoteForumTopic, removeUpvoteForumTopic } from '@/lib/actions/forum/topics';

// Upvote a topic
await upvoteForumTopic({
  topicId: 456,
  address: userAddress,
  signature: signedMessage
});

// Remove upvote
await removeUpvoteForumTopic({
  topicId: 456,
  address: userAddress,
  signature: signedMessage
});

File Management

Uploading Files

Share documents, images, and other files:
Files are stored on IPFS for permanent, decentralized storage. Make sure you want to permanently publish before uploading.
Supported file types:
  • Documents: PDF, DOC, DOCX, TXT, MD
  • Images: JPG, PNG, GIF, SVG
  • Other: ZIP, CSV, JSON
1

Select File

Choose file from your computer (check size limits)
2

File Validation

System checks file type and size
3

Upload to IPFS

File is uploaded to decentralized storage
4

Attach to Post

IPFS CID is linked to your post or topic
import { uploadFileToIPFS, uploadDocumentFromBase64 } from '@/lib/actions/forum/attachments';

// Upload a file
const ipfsCid = await uploadFileToIPFS(file);

// Upload document with metadata
const attachment = await uploadDocumentFromBase64({
  data: base64Data,
  fileName: "proposal-details.pdf",
  contentType: "application/pdf",
  address: userAddress,
  signature: signedMessage,
  categoryId: 1 // Optional: attach to category
});

Accessing Files

Download and view attachments:
  1. Files appear as links in posts
  2. Click to download or view
  3. Served through IPFS gateway
  4. Permanent and immutable storage

Search and Discovery

Find discussions quickly:
  • Search across all topics and posts
  • Real-time indexing of new content
  • Filter by category or author
  • Sort by relevance or date
import { searchForumContent } from '@/lib/actions/forum/search';

const results = await searchForumContent({
  query: "treasury diversification",
  categoryId: 1, // Optional filter
  limit: 20,
  offset: 0
});

Browse by Category

Explore organized discussions:
  1. View all categories on forum home
  2. See topic count and recent activity
  3. Click category to view all topics
  4. Sort topics by activity, upvotes, or date

Content Moderation

Automatic Moderation

The system includes built-in protections:

NSFW Detection

Automatic content analysis flags inappropriate content

Spam Prevention

Rate limiting and signature verification prevent abuse

Admin Controls

Forum administrators can:
Hide content while preserving it for recovery
import { 
  deleteForumTopic,
  softDeleteForumTopic,
  archiveForumTopic,
  restoreForumTopic 
} from '@/lib/actions/forum/topics';

// Soft delete (reversible)
await softDeleteForumTopic({
  topicId: 123,
  address: adminAddress,
  signature: signedMessage
});

// Archive topic
await archiveForumTopic({
  topicId: 123,
  address: adminAddress,
  signature: signedMessage
});

// Restore deleted topic
await restoreForumTopic({
  topicId: 123,
  address: adminAddress,
  signature: signedMessage
});

Permission System

Role-based access control:
  • Super Admin - Full control over all forums
  • Admin - Manage topics and posts
  • DUNA Admin - Special access to DUNA categories
  • Users - Create and reply to topics
import { checkForumPermissions } from '@/lib/actions/forum/admin';

const permissions = await checkForumPermissions(
  userAddress,
  categoryId // optional
);

if (permissions.canManageTopics) {
  // User can moderate content
}

if (permissions.canCreateAttachments) {
  // User can upload files
}

Analytics and Tracking

View Tracking

Monitor topic popularity:
  • View counts tracked per topic
  • Real-time updates via Redis
  • Periodic sync to PostgreSQL
  • Unique view deduplication

Subscription System

Stay notified of updates:
1

Subscribe to Topic

Get notified of new replies
2

Subscribe to Category

Track all new topics in a category
3

Manage Subscriptions

View and unsubscribe from your profile
import { 
  subscribeToForumContent,
  unsubscribeFromForumContent,
  getForumSubscriptions 
} from '@/lib/actions/forum/analytics';

// Subscribe to a topic
await subscribeToForumContent({
  targetType: 'topic',
  targetId: 123,
  address: userAddress,
  signature: signedMessage
});

// Get user's subscriptions
const subs = await getForumSubscriptions(userAddress);

DUNA Integration

Special features for DUNA (Decentralized Universal Node Administration):

Quarterly Reports

Report Creation

Create quarterly reports with structured data

Document Storage

Store supporting documents on IPFS

Comment System

Discuss reports with stakeholders

Archive Access

Browse historical reports and documents

Document Management

Dedicated document handling:
  • Upload official documents
  • Organize by category
  • Version control through IPFS
  • Access control by role
  • Archive old documents

Best Practices

  • Use clear, descriptive titles
  • Provide sufficient context and background
  • Include relevant links and references
  • Choose appropriate category
  • Tag important stakeholders
  • Read existing replies before posting
  • Stay on topic and relevant
  • Be respectful and constructive
  • Use reactions to show agreement
  • Quote specific points when replying
  • Compress large files before uploading
  • Use descriptive file names
  • Consider file permanence (IPFS)
  • Verify file type is supported
  • Include file descriptions in post
  • Report inappropriate content to admins
  • Use soft delete for borderline cases
  • Document moderation decisions
  • Communicate with affected users
  • Archive resolved discussions

API Reference

Working with Topics

// Fetch topics in a category
const topics = await getForumTopics({
  categoryId: 1,
  limit: 20,
  offset: 0,
  sortBy: 'recent' // or 'upvotes', 'replies'
});

// Get single topic with posts
const topic = await getForumTopic(topicId);

// Get upvote count
const upvotes = await getForumTopicUpvotes(topicId);

// Check user's vote
const myVote = await getMyForumTopicVote(topicId, address);

Working with Posts

// Get posts for a topic
const posts = await getForumPostsByTopic(topicId);

// Get single post
const post = await getForumPost(postId);

// Delete post (soft delete)
await softDeleteForumPost({
  postId,
  address,
  signature
});

Categories and Attachments

// Get all categories
const categories = await getForumCategories();

// Get attachments
const attachments = await getForumAttachments({
  categoryId: 1, // optional
  limit: 20
});

// Delete attachment
await deleteForumAttachment({
  attachmentId,
  address,
  signature
});

Proposals

Discuss proposals before and after voting

Delegation

Coordinate with delegates in forum discussions

Voting

Link forum discussions to governance votes

Troubleshooting

  • Check wallet is connected
  • Verify you have permission for category
  • Ensure category accepts new topics
  • Check for rate limiting
  • Verify signature is valid
  • Check file size limit (varies by tenant)
  • Verify file type is supported
  • Ensure stable internet connection
  • Try again if IPFS is temporarily slow
  • Check browser console for errors
  • Wait for transaction confirmation
  • Refresh the page
  • Check if content was auto-flagged as NSFW
  • Verify you’re viewing correct category
  • Contact admin if persists
  • Ensure wallet is connected
  • Check you haven’t already reacted
  • Verify content isn’t archived/deleted
  • Sign the action in your wallet
  • Refresh if reaction doesn’t appear

Build docs developers (and LLMs) love