Skip to content

iassetsorg/iBird

Repository files navigation

iBird - Decentralized Social Media Platform

iBird Logo

A fully decentralized social media platform built on Hedera Hashgraph

Next.js React TypeScript Hedera License: CC BY-NC 4.0

Live Demo Β· Documentation Β· Report Bug


Table of Contents


Project Overview

What is iBird?

iBird is a fully decentralized Web3 SocialFi platform built on Hedera where all content is permanently stored on the blockchain. Unlike traditional social media platforms that store data on centralized servers, iBird leverages Hedera Consensus Service (HCS) for message storage and Arweave for permanent media storage.

Every post, comment, like, and interaction is recorded as an immutable transaction on Hedera's distributed ledger, ensuring:

  • Censorship Resistance: No central authority can delete or modify content
  • Data Permanence: Content lives forever on the blockchain
  • True Ownership: Users own their profiles as NFTs
  • Transparent Operations: All transactions are verifiable on HashScan
  • SocialFi: Earn tips in HBAR and ASSET tokens directly from your audience

Core Value Proposition

Feature Traditional Social Media iBird
Data Ownership Platform owns your data You own your data
Censorship Platform can delete content Immutable on blockchain
Account Control Platform can suspend accounts NFT-based profiles you own
Monetization Platform takes revenue Direct tipping between users
Media Storage Centralized servers Decentralized via Arweave
Verification Platform-controlled On-chain verification

Problems Solved

  1. Centralized Control: Traditional platforms can arbitrarily censor, modify, or delete content. iBird stores everything on-chain.

  2. Data Portability: Users can't export or truly own their social graph. iBird profiles are NFTs you control.

  3. Platform Risk: Accounts can be suspended without recourse. iBird accounts are blockchain assets.

  4. Opaque Algorithms: Traditional feeds are controlled by hidden algorithms. iBird's content is transparent and verifiable.

  5. Monetization Inequality: Creators get little from platforms. iBird enables direct HBAR/ASSET tipping with only 1% platform fee.


Architecture Deep Dive

System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              iBird Architecture                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚   Frontend   │────▢│   Wallets    │────▢│   Hedera     β”‚                β”‚
β”‚  β”‚   (Next.js)  β”‚     β”‚  (Kabila,    β”‚     β”‚   Network    β”‚                β”‚
β”‚  β”‚              β”‚     β”‚   HashPack,  β”‚     β”‚              β”‚                β”‚
β”‚  β”‚  App Tabs:   β”‚     β”‚   WalletCon) β”‚     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚                β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  β”‚  HCS   β”‚  β”‚                β”‚
β”‚  β”‚  β”‚Explorerβ”‚  β”‚                          β”‚  β”‚ Topics β”‚  β”‚                β”‚
β”‚  β”‚  β”‚Chats   β”‚  β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚                β”‚
β”‚  β”‚  β”‚Billbrd β”‚  │────▢│   Arweave    β”‚     β”‚              β”‚                β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚     β”‚   Storage    β”‚     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚                β”‚
β”‚  β”‚              β”‚     β”‚              β”‚     β”‚  β”‚  NFT   β”‚  β”‚                β”‚
β”‚  β”‚  Content:    β”‚     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚     β”‚  β”‚ Smart  β”‚  β”‚                β”‚
β”‚  β”‚  Posts,Polls β”‚     β”‚  β”‚ Media  β”‚  β”‚     β”‚  β”‚Contractβ”‚  β”‚                β”‚
β”‚  β”‚  Threads,Ads β”‚     β”‚  β”‚ Files  β”‚  β”‚     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚     β”‚              β”‚                β”‚
β”‚         β”‚             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚         β”‚                                         β”‚                         β”‚
β”‚         β–Ό                                         β–Ό                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚   Mirror     │◀─────────────────────────│  Consensus   β”‚                β”‚
β”‚  β”‚    Node      β”‚                          β”‚   Nodes      β”‚                β”‚
β”‚  β”‚   (REST)     β”‚                          β”‚              β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Hierarchy

src/
β”œβ”€β”€ pages/                          # Next.js pages (routes)
β”‚   β”œβ”€β”€ _app.tsx                   # App wrapper with wallet providers + SEO meta
β”‚   β”œβ”€β”€ _document.tsx              # Document customization
β”‚   β”œβ”€β”€ index.tsx                  # Landing page
β”‚   β”œβ”€β”€ app.tsx                    # Main application (Explorer / Chats / Billboard tabs)
β”‚   β”œβ”€β”€ profile.tsx                # User profile page
β”‚   β”œβ”€β”€ lab.tsx                    # Developer lab
β”‚   β”œβ”€β”€ how-it-works.tsx           # SEO-optimized explainer page with FAQ
β”‚   β”œβ”€β”€ channel/[id].tsx           # Dynamic channel view
β”‚   β”œβ”€β”€ group/[id].tsx             # Dynamic group view
β”‚   β”œβ”€β”€ Posts/[sequenceNumber].tsx # Shareable post permalink
β”‚   β”œβ”€β”€ Threads/[topicId].tsx      # Shareable thread permalink
β”‚   β”œβ”€β”€ Polls/[topicId].tsx        # Shareable poll permalink
β”‚   β”œβ”€β”€ Ads/[sequenceNumber].tsx   # Shareable billboard ad permalink
β”‚   └── api/
β”‚       └── sitemap.ts             # Dynamic XML sitemap
β”‚
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ wallet/                    # Wallet integration
β”‚   β”‚   β”œβ”€β”€ WalletContext.tsx      # Global wallet state
β”‚   β”‚   β”œβ”€β”€ config.tsx             # Wallet configuration
β”‚   β”‚   β”œβ”€β”€ wallet.tsx             # Wallet display component
β”‚   β”‚   └── ConnectModal.tsx       # Wallet connection UI
β”‚   β”‚
β”‚   β”œβ”€β”€ layout/
β”‚   β”‚   └── Navbar.tsx             # Global navigation bar
β”‚   β”‚
β”‚   β”œβ”€β”€ hooks/                     # Custom React hooks
β”‚   β”‚   β”œβ”€β”€ use_send_message.tsx       # Send HCS messages
β”‚   β”‚   β”œβ”€β”€ use_create_topic.tsx       # Create HCS topics
β”‚   β”‚   β”œβ”€β”€ use_get_data.tsx           # Fetch topic messages
β”‚   β”‚   β”œβ”€β”€ use_get_post_data.tsx      # Fetch single post data
β”‚   β”‚   β”œβ”€β”€ use_get_profile.tsx        # Fetch user profiles (V1 + V2)
β”‚   β”‚   β”œβ”€β”€ use_follow.tsx             # Follow/unfollow logic
β”‚   β”‚   β”œβ”€β”€ use_asset_balance.tsx      # Token balance queries
β”‚   β”‚   β”œβ”€β”€ use_profile_lists.tsx      # Read/write V2 profile list topics
β”‚   β”‚   β”œβ”€β”€ use_profile_migration.tsx  # Migrate V1 β†’ V2 profiles
β”‚   β”‚   └── use_refresh_trigger.tsx    # UI refresh event bus
β”‚   β”‚
β”‚   β”œβ”€β”€ send message/              # Content creation
β”‚   β”‚   β”œβ”€β”€ new_message.tsx            # Message composer
β”‚   β”‚   β”œβ”€β”€ send_new_post.tsx          # Post creation (multi-step)
β”‚   β”‚   β”œβ”€β”€ send_new_poll.tsx          # Poll creation (multi-step)
β”‚   β”‚   β”œβ”€β”€ send_new_thread.tsx        # Thread creation (multi-step)
β”‚   β”‚   └── add_to_thread.tsx          # Add message to existing thread
β”‚   β”‚
β”‚   β”œβ”€β”€ read message/              # Content display
β”‚   β”‚   β”œβ”€β”€ read_post.tsx              # Post renderer
β”‚   β”‚   β”œβ”€β”€ read_poll.tsx              # Poll renderer
β”‚   β”‚   β”œβ”€β”€ read_thread.tsx            # Thread renderer
β”‚   β”‚   └── read_repost.tsx            # Repost renderer
β”‚   β”‚
β”‚   β”œβ”€β”€ read shared message/       # Shareable permalink renderers
β”‚   β”‚   β”œβ”€β”€ read_shared_post.tsx
β”‚   β”‚   β”œβ”€β”€ read_shared_thread.tsx
β”‚   β”‚   └── read_shared_poll.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ billboard/                 # Billboard advertisement system
β”‚   β”‚   β”œβ”€β”€ billboard.tsx
β”‚   β”‚   β”œβ”€β”€ read_ad.tsx
β”‚   β”‚   β”œβ”€β”€ read_shared_ad.tsx
β”‚   β”‚   └── send_new_ad.tsx            # Ad creation (multi-step)
β”‚   β”‚
β”‚   β”œβ”€β”€ explorer/                  # Explorer feed
β”‚   β”‚   β”œβ”€β”€ explorer.tsx               # Main public feed
β”‚   β”‚   └── user_explore.tsx           # User discovery / search
β”‚   β”‚
β”‚   β”œβ”€β”€ chats/                     # Unified chats (channels + groups)
β”‚   β”‚   β”œβ”€β”€ chats_manager.tsx          # Navigation - list ↔ channel/group view
β”‚   β”‚   └── unified_chat_list.tsx      # Combined channels & groups list
β”‚   β”‚
β”‚   β”œβ”€β”€ channels/                  # Channel management
β”‚   β”‚   β”œβ”€β”€ create_new_channel.tsx     # (multi-step)
β”‚   β”‚   β”œβ”€β”€ channel_list.tsx
β”‚   β”‚   β”œβ”€β”€ channel_view.tsx
β”‚   β”‚   β”œβ”€β”€ channel_manager.tsx
β”‚   β”‚   └── update_channel.tsx         # (multi-step)
β”‚   β”‚
β”‚   β”œβ”€β”€ groups/                    # Group management
β”‚   β”‚   β”œβ”€β”€ create_new_group.tsx       # (multi-step)
β”‚   β”‚   β”œβ”€β”€ group_list.tsx
β”‚   β”‚   β”œβ”€β”€ group_view.tsx
β”‚   β”‚   β”œβ”€β”€ group_manager.tsx
β”‚   β”‚   └── update_group.tsx           # (multi-step)
β”‚   β”‚
β”‚   β”œβ”€β”€ profile/                   # Profile management
β”‚   β”‚   β”œβ”€β”€ create_new_profile.tsx     # (multi-step, up to 6 steps)
β”‚   β”‚   β”œβ”€β”€ profile.tsx
β”‚   β”‚   β”œβ”€β”€ user_profile.tsx
β”‚   β”‚   β”œβ”€β”€ update_profile.tsx         # (multi-step)
β”‚   β”‚   └── migration_modal.tsx        # V1 β†’ V2 migration UI
β”‚   β”‚
β”‚   β”œβ”€β”€ media/                     # Media handling
β”‚   β”‚   β”œβ”€β”€ read_media_file.tsx
β”‚   β”‚   └── use_upload_to_arweave.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ tip/                       # Tipping system
β”‚   β”‚   └── tip.tsx                    # HBAR + ASSET tipping
β”‚   β”‚
β”‚   β”œβ”€β”€ replay/                    # Reply/interaction
β”‚   β”‚   β”œβ”€β”€ replay_to_thread.tsx       # (multi-step)
β”‚   β”‚   β”œβ”€β”€ replay_to_poll.tsx         # (multi-step)
β”‚   β”‚   └── repost.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ landing/                   # Landing page components
β”‚   β”‚   β”œβ”€β”€ Hero.tsx
β”‚   β”‚   └── Lab.tsx
β”‚   β”‚
β”‚   β”œβ”€β”€ utils/                     # Shared utilities
β”‚   β”‚   β”œβ”€β”€ execute-transaction.ts     # Centralized transaction executor
β”‚   β”‚   β”œβ”€β”€ transaction-errors.ts      # Error classification
β”‚   β”‚   β”œβ”€β”€ cropImage.ts               # Image crop helper
β”‚   β”‚   └── nextjs-dev-error-suppression.ts
β”‚   β”‚
β”‚   β”œβ”€β”€ services/
β”‚   β”‚   └── event_service.ts           # Global pub/sub event bus
β”‚   β”‚
β”‚   └── common/                    # Shared UI components
β”‚       β”œβ”€β”€ modal.tsx
β”‚       β”œβ”€β”€ SimpleModal.tsx
β”‚       β”œβ”€β”€ Spinner.tsx
β”‚       β”œβ”€β”€ EnhancedSpinner.tsx
β”‚       β”œβ”€β”€ LoadingSpinner.tsx
β”‚       β”œβ”€β”€ EmojiPickerPopup.tsx
β”‚       β”œβ”€β”€ ImageCropModal.tsx
β”‚       β”œβ”€β”€ InsufficientBalanceModal.tsx
β”‚       β”œβ”€β”€ MessageCard.tsx
β”‚       β”œβ”€β”€ ResponsiveLayout.tsx
β”‚       β”œβ”€β”€ TypewriterEffect.tsx
β”‚       β”œβ”€β”€ SEOHead.tsx
β”‚       β”œβ”€β”€ StructuredData.tsx
β”‚       β”œβ”€β”€ seo.config.ts
β”‚       β”œβ”€β”€ link_and_hashtag_reader.tsx
β”‚       └── formatTimestamp.ts

Technology Stack

Layer Technology Purpose
Frontend Next.js 15.3.5, React 19 UI framework and SSR
Styling Tailwind CSS v4 Utility-first CSS
Language TypeScript 5 Type-safe development
Blockchain Hedera Hashgraph Consensus and storage
Wallets HashPack, Kabila, WalletConnect User authentication
Media Storage Arweave (via ArDrive Turbo) Permanent file storage
Smart Contracts Solidity NFT profile minting
Icons React Icons, Lucide React UI iconography
Notifications React Toastify User feedback
Image Handling react-easy-crop, react-image-crop Profile/banner image cropping
Media Playback react-player In-feed video rendering
Animations react-type-animation, typed.js Landing page effects
Theming next-themes Light/dark mode support
HTTP axios API requests
Arweave Upload arbundles Arweave bundle signing

Design Philosophy

iBird follows these core principles:

  1. Decentralization First: Every piece of data that can be stored on-chain, is stored on-chain.

  2. SocialFi: Social interactions are tied to real economic value through tipping and the ASSET token burn mechanism.

  3. Multi-Step Transactions: Complex operations are broken into clear, resumable steps with a consistent UI pattern. See architecture/multi-step-transaction-architecture.md.

  4. Auto-Progression: Users can enable automatic transaction progression for faster workflows.

  5. Error Resilience: All transactions have retry mechanisms and clear error states.

  6. Profile Versioning: Profiles support V1 (array-embedded) and V2 (topic ID-referenced) formats, with seamless in-app migration.


Tokenomics

iBird uses a dual-token economy combining HBAR (Hedera's native token) with ASSET (iBird's utility token).

HBAR Usage

HBAR is used for all network operations:

Action Cost
Network transaction fees ~$0.0001 (varies)
Profile NFT minting 1 HBAR
Topic creation (channels/groups) ~0.01 HBAR
Tipping Variable

ASSET Token

Token ID: 0.0.1991880 (HTS Token)

ASSET is the platform utility token with a deflationary burn mechanism:

Action Cost (ASSET) Destination
Post to Explorer 1,000 ASSET πŸ”₯ Burned
Billboard Advertisement 10,000 ASSET πŸ”₯ Burned
Tipping Variable Creator (99%) + Treasury (1%)

πŸ”₯ Burn Mechanism: ASSET tokens used for posting fees are sent to the burn address (0.0.8215507), permanently reducing total supply. The more iBird is used, the scarcer ASSET becomes.

Trade ASSET: SaucerSwap

Fee Structure

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         FEE BREAKDOWN                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚  TIPPING (HBAR or ASSET):                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  99% β†’ Content Creator                                      β”‚ β”‚
β”‚  β”‚   1% β†’ Platform Treasury (0.0.2278621)                      β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                  β”‚
β”‚  POSTING FEES (ASSET):                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  100% β†’ Burn Address (0.0.8215507)                          β”‚ β”‚
β”‚  β”‚  (Permanently removed from circulation)                     β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Topic System

How Topics Work

Hedera Consensus Service (HCS) Topics are the backbone of iBird's data storage. A Topic is essentially a stream of messages that anyone can write to and read from.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        HCS Topic: 0.0.10214045                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Seq 1: {"Type":"Post","Message":"Hello World","Media":null}    β”‚
β”‚  Seq 2: {"Type":"Poll","Poll":"0.0.10214050"}                   β”‚
β”‚  Seq 3: {"Type":"Post","Message":"GM everyone!","Media":"ar://."}β”‚
β”‚  Seq 4: {"Reply_to":"1","Message":"Great post!"}                β”‚
β”‚  Seq 5: {"Like_to":"1"}                                         β”‚
β”‚  ...                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Each message in a topic has:

  • Sequence Number: Unique identifier within the topic
  • Consensus Timestamp: When consensus was reached
  • Sender: The Hedera account that submitted the message
  • Message: JSON payload (base64 encoded)

Topic Types

Topic Type Purpose Submit Key Example
Explorer Global public feed None (anyone can post) 0.0.10214045
Billboard Advertisements None 0.0.10214048
Profile User's profile data User's key Per-user topic
Channels List V2: list of user's channels User's key Per-user topic
Groups List V2: list of user's groups User's key Per-user topic
Following Ch. V2: list of followed channels User's key Per-user topic
Following Gr. V2: list of followed groups User's key Per-user topic
Thread Long-form discussion None Created per thread
Poll Voting/survey None Created per poll
Channel Creator announcements Creator's key (only creator posts) Created per channel
Group Community discussions None (anyone in group posts) Created per group

Topic Naming Conventions

Topics are identified by their Hedera Topic ID in the format: 0.0.XXXXXXX

  • First segment: Always 0 (shard)
  • Second segment: Always 0 (realm)
  • Third segment: Entity number (unique identifier)

When creating topics, iBird uses meaningful memos:

  • Profile topics: "ibird profile"
  • Channel topics: "Channel: {name}"
  • Group topics: "Group: {name}"
  • V2 list topics: "iBird Channels List", "iBird Groups List", "iBird Following Channels List", "iBird Following Groups List"

Profile Architecture (V1 vs V2)

Profiles have two versions. All new profiles are created as V2.

V1 Profile Format

In V1, channels, groups, and following lists are stored directly as arrays embedded in the profile JSON message:

{
  "Type": "Profile",
  "Name": "CryptoEnthusiast",
  "Bio": "Web3 builder",
  "Channels": [{ "Name": "My Channel", "Channel": "0.0...." }],
  "Groups": [{ "Name": "Hedera Devs", "Group": "0.0...." }],
  "FollowingChannels": ["0.0.10220001"],
  "FollowingGroups": ["0.0.10221001"],
  "ProfileVersion": 1
}

Problem: HCS messages have a size limit (~1,024 bytes after encoding). Large channel/group lists exceed this.

V2 Profile Format

In V2, each list is stored in its own dedicated HCS topic. The profile JSON only contains the topic IDs:

{
  "Type": "Profile",
  "Name": "CryptoEnthusiast",
  "Bio": "Web3 builder",
  "Channels": "0.0.10230010",
  "Groups": "0.0.10230011",
  "FollowingChannels": "0.0.10230012",
  "FollowingGroups": "0.0.10230013",
  "ExplorerMessages": "",
  "BillboardAds": "",
  "PrivateMessages": "",
  "Picture": "ar://profilePicCID",
  "Banner": "ar://bannerCID",
  "ProfileVersion": "2"
}

Each list topic stores the current array as its most recent message (the latest message is the source of truth).

Lazy Topic Creation: V2 list topics are created on demand β€” if a user has no channels, the Channels topic is only created when they create their first channel.

Profile Migration

Existing V1 users must migrate before performing write actions. The migration:

  1. Creates separate HCS topics for each non-empty list
  2. Sends the existing array data to each new topic
  3. Updates the profile JSON with the new topic IDs and ProfileVersion: "2"

The in-app migration UI (migration_modal.tsx) guides users through each step with the standard multi-step transaction pattern. The use_profile_migration.tsx hook handles all migration logic.


Message Flow and Communication

JSON Message Structures

All messages in iBird are JSON objects submitted to HCS topics. The structure varies by message type.

Understanding the Two-Layer System

For complex content (Threads, Polls), iBird uses a two-layer architecture:

  1. Reference Message β†’ Sent to Explorer topic (lightweight pointer)
  2. Content Messages β†’ Sent to dedicated topic (full content)
Explorer Topic (0.0.10214045)          Thread Topic (0.0.10215000)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ {"Type":"Thread",          β”‚         β”‚ {"Type":"Thread",          β”‚
β”‚  "Thread":"0.0.10215000"}  β”‚ ──────▢ β”‚  "Message":"Full content..",β”‚
β”‚                            β”‚         β”‚  "Media":"ar://xyz123"}    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Types Reference

1. Post Message (Simple Content)

Sent directly to the Explorer topic (or a group/channel topic).

{
  "Type": "Post",
  "Message": "Hello iBird! This is my first post πŸš€",
  "Media": "ar://abc123xyz"
}
Field Type Required Description
Type string Yes Always "Post"
Message string Yes Post content (max ~850 chars)
Media string No Arweave URI (ar://...) or null

2. Thread Messages

Step 1: Reference to Explorer

{
  "Type": "Thread",
  "Thread": "0.0.10215000"
}

Step 2: Content to Thread Topic

{
  "Type": "Thread",
  "Message": "This is a long-form thread post with detailed content...",
  "Media": "ar://abc123xyz"
}

3. Poll Messages

Step 1: Reference to Explorer

{
  "Type": "Poll",
  "Poll": "0.0.10216000"
}

Step 2: Poll Content to Poll Topic

{
  "Message": "What's your favorite blockchain?",
  "Media": null,
  "Choice1": "Hedera",
  "Choice2": "Ethereum",
  "Choice3": "Solana",
  "Choice4": "Bitcoin",
  "Choice5": null
}

Step 3: Vote Submission (to Poll Topic)

{
  "Choice": "Choice1"
}

4. Reply Message

{
  "Author": "0.0.123456",
  "Reply_to": "5",
  "Message": "Great point! I completely agree.",
  "Media": "ar://xyz789"
}

5. Like Message

{
  "Author": "0.0.123456",
  "Like_to": "5"
}

6. Dislike Message

{
  "Author": "0.0.123456",
  "DisLike_to": "5"
}

7. Profile Message (V2)

Sent to user's personal profile topic.

{
  "Type": "Profile",
  "Name": "CryptoEnthusiast",
  "Bio": "Web3 builder | Hedera advocate | Building the future 🌐",
  "Website": "https://example.com",
  "Picture": "ar://profilePicCID",
  "Banner": "ar://bannerCID",
  "Channels": "0.0.10230010",
  "Groups": "0.0.10230011",
  "FollowingChannels": "0.0.10230012",
  "FollowingGroups": "0.0.10230013",
  "ExplorerMessages": "",
  "BillboardAds": "",
  "PrivateMessages": "",
  "ProfileVersion": "2"
}

8. Channel Identifier Message

Sent as the first message in a new channel topic.

{
  "Type": "ChannelIdentifier",
  "Name": "Official Announcements",
  "Description": "All official updates and news",
  "Media": "ar://channelLogoCID"
}

9. Group Identifier Message

Sent as the first message in a new group topic.

{
  "Type": "GroupIdentifier",
  "Name": "Hedera Builders",
  "Description": "Community for Hedera developers",
  "Media": "ar://groupLogoCID"
}

10. Billboard Advertisement

{
  "Type": "Ad",
  "Title": "Check out our new DApp!",
  "Message": "Revolutionary decentralized application...",
  "Link": "https://example.com",
  "Media": "ar://adImageCID"
}

Complete Workflows

Post Workflow

Creating a simple post is the most straightforward workflow.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           POST CREATION WORKFLOW                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  User    │──▢│  Compose     │──▢│  Upload Media  │──▢│  Submit to   β”‚   β”‚
β”‚  β”‚  Types   β”‚   β”‚  Message     β”‚   β”‚  to Arweave    β”‚   β”‚  Explorer    β”‚   β”‚
β”‚  β”‚  Post    β”‚   β”‚  + Media?    β”‚   β”‚  (if media)    β”‚   β”‚  Topic       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                             β”‚                    β”‚          β”‚
β”‚                                             β–Ό                    β–Ό          β”‚
β”‚                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                                    β”‚  ar://abc123   β”‚   β”‚  SUCCESS!    β”‚   β”‚
β”‚                                    β”‚  (Media CID)   β”‚   β”‚  Post Live   β”‚   β”‚
β”‚                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Steps:

  1. Compose - User writes post content and optionally attaches media
  2. Upload (if media) - Media file is uploaded to Arweave via ArDrive Turbo
  3. Submit - JSON message sent to Explorer topic via HCS

Code Flow:

// From send_new_post.tsx
const handleSendPost = async () => {
  // Step 1: Upload media if exists
  if (file) {
    const mediaCID = await uploadToArweave(file);
  }

  // Step 2: Create message
  const message = {
    Type: "Post",
    Message: postContent,
    Media: mediaCID || null,
  };

  // Step 3: Send to Explorer topic
  await send(explorerTopicId, message);
};

Thread Workflow

Threads require creating a dedicated topic first.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          THREAD CREATION WORKFLOW                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Step 1: Create Topic                                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  TopicCreateTransaction β†’ Topic ID: 0.0.10215000                     β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 2: Publish Reference to Explorer                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  Explorer Topic ← {"Type":"Thread","Thread":"0.0.10215000"}          β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 3+: Send Thread Messages (one per message entry, each with optional   β”‚
β”‚           Arweave upload + HCS send)                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  Thread Topic ← {"Type":"Thread","Message":"...","Media":"ar://..."}β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Poll Workflow

Similar to threads but with voting functionality.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           POLL CREATION WORKFLOW                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Step 1: Create Poll Topic                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TopicCreateTransaction β†’ Topic ID: 0.0.10216000                    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 2: Publish to Explorer                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  {"Type":"Poll","Poll":"0.0.10216000"} β†’ Explorer Topic             β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 3: Send Poll Content                                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  {"Message":"Question?","Choice1":"A","Choice2":"B",...}            β”‚    β”‚
β”‚  β”‚  β†’ Poll Topic                                                        β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 4: Users Vote                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  {"Choice":"Choice1"} β†’ Poll Topic (each vote is a message)         β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Channel Workflow

Channels are creator-controlled broadcasting streams.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         CHANNEL CREATION WORKFLOW                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Step 1: Create Channel Topic (with Submit Key)                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TopicCreateTransaction                                              β”‚    β”‚
β”‚  β”‚    .setSubmitKey(userKey)  ← Only creator can post!                 β”‚    β”‚
β”‚  β”‚  β†’ Topic ID: 0.0.10220000                                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 2: Upload Channel Image (Optional)                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Channel Logo β†’ Arweave β†’ ar://channelLogo123                       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 3: Send Channel Identifier                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  {"Type":"ChannelIdentifier","Name":"...","Description":"...",...}  β”‚    β”‚
β”‚  β”‚  β†’ Channel Topic (first message)                                    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 4: Update User Profile (V2: append to Channels list topic)             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Append channel to Channels list topic (lazy-creates topic if new)  β”‚    β”‚
β”‚  β”‚  + Updates profile if new list topic was created                    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Group Workflow

Groups are community spaces where anyone can post.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           GROUP CREATION WORKFLOW                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Step 1: Create Group Topic (NO Submit Key)                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TopicCreateTransaction                                              β”‚    β”‚
β”‚  β”‚    ← No submit key = anyone can post                                β”‚    β”‚
β”‚  β”‚  β†’ Topic ID: 0.0.10221000                                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 2: Upload Group Image (Optional)                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Group Logo β†’ Arweave β†’ ar://groupLogo456                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 3: Send Group Identifier                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  {"Type":"GroupIdentifier","Name":"...","Description":"...",...}    β”‚    β”‚
β”‚  β”‚  β†’ Group Topic (first message)                                       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 4: Update User Profile (V2: append to Groups list topic)               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Append group to Groups list topic (lazy-creates topic if new)      β”‚    β”‚
β”‚  β”‚  + Updates profile if new list topic was created                    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Profile Creation Workflow

The most complex workflow - creates an NFT-backed user profile using V2 format.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       PROFILE CREATION WORKFLOW (V2)                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Step 1: Upload Profile Picture (Optional)                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Profile Photo β†’ Arweave β†’ ar://profilePic789                       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 2: Upload Banner (Optional)                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Banner Image β†’ Arweave β†’ ar://banner012                            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 3: Create Profile Topic                                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TopicCreateTransaction                                              β”‚    β”‚
β”‚  β”‚    .setMemo("ibird profile")                                        β”‚    β”‚
β”‚  β”‚    .setSubmitKey(userKey)                                           β”‚    β”‚
β”‚  β”‚  β†’ Topic ID: 0.0.10230000                                           β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 4: Initialize V2 Profile                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  Send V2 profile JSON β†’ Profile Topic                               β”‚    β”‚
β”‚  β”‚  {Type,Name,Bio,Picture,Banner,Channels:"",Groups:"",              β”‚    β”‚
β”‚  β”‚   FollowingChannels:"",FollowingGroups:"",ProfileVersion:"2"}      β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 5: Associate NFT Token                                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TokenAssociateTransaction                                          β”‚    β”‚
β”‚  β”‚    .setTokenIds([profileNFTTokenId])                                β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                      β”‚                                       β”‚
β”‚                                      β–Ό                                       β”‚
β”‚  Step 6: Mint Profile NFT                                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  ContractExecuteTransaction                                         β”‚    β”‚
β”‚  β”‚    .setFunction("mintTransferAndFreeze")                            β”‚    β”‚
β”‚  β”‚    .setPayableAmount(1 HBAR)  ← Mint fee                            β”‚    β”‚
β”‚  β”‚  β†’ NFT Serial # minted to user's account                            β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β”‚  RESULT: User owns NFT pointing to their V2 profile topic                    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tipping Workflow

Direct value transfer between users.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                            TIPPING WORKFLOW                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  Supported Tokens:                                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  β€’ HBAR (native) - Direct transfer                                   β”‚    β”‚
β”‚  β”‚  β€’ ASSET Token (0.0.1991880) - HTS Token transfer                   β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β”‚  Fee Structure:                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  β€’ 1% Platform Fee β†’ 0.0.2278621 (iBird treasury)                   β”‚    β”‚
β”‚  β”‚  β€’ 99% β†’ Content Creator                                             β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β”‚  Transaction Flow:                                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚  TransferTransaction                                                 β”‚    β”‚
β”‚  β”‚    .addHbarTransfer(sender, -amount)                                β”‚    β”‚
β”‚  β”‚    .addHbarTransfer(receiver, amount * 0.99)                        β”‚    β”‚
β”‚  β”‚    .addHbarTransfer(treasury, amount * 0.01)                        β”‚    β”‚
β”‚  β”‚    .setMemo("iBird Tip | sender >> receiver | Amount | For: topic")β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multi-Step Transaction Architecture

All complex operations (post creation, profile creation, channel/group creation, following, etc.) follow a consistent multi-step pattern documented in architecture/multi-step-transaction-architecture.md.

Key features of this architecture:

  • Two-mode UI: Edit form β†’ Processing steps view
  • Step status tracking: idle | loading | success | error
  • Auto-progression toggle: Automatically proceeds to next step on success
  • Error resilience: Any step can be retried independently
  • Consistent UI: All multi-step flows use the same visual design
Component Steps Pattern
Create Profile Up to 6 Conditional Sequential
Update Profile Up to 3 Conditional Sequential
Create Channel Up to 4 Conditional Sequential
Update Channel Up to 2 Linear Sequential
Create Group Up to 4 Conditional Sequential
Update Group Up to 2 Linear Sequential
Send Post 2 Linear Sequential
Send Thread 2 + NΓ—2 Dynamic Step Count
Send Poll Up to 4 Conditional Sequential
Add to Thread Up to 2 Conditional Sequential
Send Ad Up to 3 Conditional Sequential

Configuration and Setup

Prerequisites

Before setting up iBird, ensure you have:

  • Node.js 18.17 or later
  • npm or yarn package manager
  • Hedera wallet (Kabila, HashPack, or WalletConnect-compatible)
  • HBAR for transaction fees
  • (Optional) ASSET tokens for platform features

Installation

# Clone the repository
git clone https://github.com/ibird/ibird.git
cd ibird

# Install dependencies
npm install

# Copy environment variables
cp .env.local.example .env.local

# Configure your environment (see below)

# Run development server (uses Turbopack)
npm run dev

# Build for production
npm run build
npm start

Environment Variables

Create a .env.local file with the following configuration:

# =============================================================================
# HEDERA NETWORK CONFIGURATION
# =============================================================================

# Network selection: "mainnet" or "testnet"
NEXT_PUBLIC_NETWORK=mainnet

# Base URL for the application
NEXT_PUBLIC_BASE_URL=https://ibird.io

# =============================================================================
# TOPIC IDS
# =============================================================================

# Main Explorer Topic - Global public feed
NEXT_PUBLIC_EXPLORER_ID=0.0.10214045

# Billboard Topic - Advertisements
NEXT_PUBLIC_BILLBOARD_ID=0.0.10214048

# =============================================================================
# TOKEN CONFIGURATION
# =============================================================================

# ASSET Token ID - Platform utility token
NEXT_PUBLIC_TOKEN_ID=0.0.1991880

# Burn Address - Where ASSET tokens are burned
NEXT_PUBLIC_BURN_ADDRESS_ID=0.0.8215507

# =============================================================================
# ASSET TOKEN POSTING FEES (in ASSET tokens)
# =============================================================================

# Fee to post to Explorer (burned)
NEXT_PUBLIC_EXPLORER_FEE=1000

# Fee for Billboard advertisements (burned)
NEXT_PUBLIC_BILLBOARD_FEE=10000

# =============================================================================
# NFT PROFILE SYSTEM
# =============================================================================

# Profile NFT Smart Contract
NEXT_PUBLIC_CONTRACT_ID=0.0.10213999

# Profile NFT Token Collection
NEXT_PUBLIC_PROFILE_NFT_TOKEN_ID=0.0.10214004

# Mint fee in HBAR
NEXT_PUBLIC_MINT_FEE_HBAR=1

# Profile Topic Memo
NEXT_PUBLIC_PROFILE_TOPIC_MEMO=ibird profile

# =============================================================================
# ARWEAVE CONFIGURATION
# =============================================================================

# Arweave wallet JWK (JSON Web Key) for signing uploads
# Replace with your wallet key for local use
ARWEAVE_WALLET_KEY={"kty":"RSA",...}

# ArDrive Turbo API endpoint
NEXT_PUBLIC_ARWEAVE_UPLOAD_URL=https://upload.ardrive.io/v1/tx

Network Configuration

iBird supports both Hedera mainnet and testnet:

Setting Mainnet Testnet
NEXT_PUBLIC_NETWORK mainnet testnet
Mirror Node mainnet.mirrornode.hedera.com testnet.mirrornode.hedera.com
HashScan hashscan.io/mainnet hashscan.io/testnet
Transaction Fees Real HBAR Test HBAR (free)

For Development:

NEXT_PUBLIC_NETWORK=testnet

For Production:

NEXT_PUBLIC_NETWORK=mainnet

Key Addresses

All official iBird contract and token addresses on Hedera mainnet:

Item Address Purpose
ASSET Token 0.0.1991880 Platform utility token
Explorer Topic 0.0.10214045 Public social feed
Billboard Topic 0.0.10214048 Advertisement feed
Profile NFT Contract 0.0.10213999 Smart contract for minting
Profile NFT Token 0.0.10214004 NFT collection for profiles
Platform Treasury 0.0.2278621 Receives 1% tip fees
Burn Address 0.0.8215507 ASSET token burns

Verify on HashScan: All addresses can be verified at hashscan.io/mainnet


Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Workflow

# Install dependencies
npm install

# Run development server with hot reload (Turbopack)
npm run dev

# Run linting
npm run lint

# Build for production
npm run build

# Run production build locally
npm start

Project Structure for Contributors

  • pages/: Next.js routes β€” add new pages here
  • components/hooks/: Custom React hooks β€” Hedera interactions
  • components/wallet/: Wallet integration logic
  • components/send message/: Content creation components (multi-step pattern)
  • components/read message/: Content display components
  • components/read shared message/: Shareable permalink renderers
  • components/billboard/: Billboard advertisement system
  • components/explorer/: Public feed and user discovery
  • components/chats/: Unified channels + groups interface
  • components/utils/: Shared utility functions + centralized transaction executor
  • architecture/: Developer reference documentation

Multi-Step Transaction Pattern

All new components that require multiple blockchain transactions must follow the multi-step transaction pattern described in architecture/multi-step-transaction-architecture.md. This ensures a consistent UX across the entire app.


License

This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).

You are free to:

  • Share β€” copy and redistribute the material in any medium or format
  • Adapt β€” remix, transform, and build upon the material

Under the following terms:

  • Attribution β€” You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • NonCommercial β€” You may not use the material for commercial purposes.

For more details, see the full license text.


Acknowledgments

  • Hedera Hashgraph - For the blazing fast, fair, and secure DLT
  • ArDrive - For the Turbo upload service
  • HashPack & Kabila - For excellent wallet integrations
  • The iBird Community - For feedback and support

Built with ❀️ on Hedera

Website Β· Twitter / X Β· Discord Β· How It Works

About

Web3 Social Media on Hedera.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages