A fully decentralized social media platform built on Hedera Hashgraph
Live Demo Β· Documentation Β· Report Bug
- Project Overview
- Architecture Deep Dive
- Tokenomics
- Topic System
- Profile Architecture (V1 vs V2)
- Message Flow and Communication
- Complete Workflows
- Multi-Step Transaction Architecture
- Configuration and Setup
- Key Addresses
- Contributing
- License
- Acknowledgments
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
| 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 |
-
Centralized Control: Traditional platforms can arbitrarily censor, modify, or delete content. iBird stores everything on-chain.
-
Data Portability: Users can't export or truly own their social graph. iBird profiles are NFTs you control.
-
Platform Risk: Accounts can be suspended without recourse. iBird accounts are blockchain assets.
-
Opaque Algorithms: Traditional feeds are controlled by hidden algorithms. iBird's content is transparent and verifiable.
-
Monetization Inequality: Creators get little from platforms. iBird enables direct HBAR/ASSET tipping with only 1% platform fee.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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) β β β β
β ββββββββββββββββ ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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
| 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 |
iBird follows these core principles:
-
Decentralization First: Every piece of data that can be stored on-chain, is stored on-chain.
-
SocialFi: Social interactions are tied to real economic value through tipping and the ASSET token burn mechanism.
-
Multi-Step Transactions: Complex operations are broken into clear, resumable steps with a consistent UI pattern. See
architecture/multi-step-transaction-architecture.md. -
Auto-Progression: Users can enable automatic transaction progression for faster workflows.
-
Error Resilience: All transactions have retry mechanisms and clear error states.
-
Profile Versioning: Profiles support V1 (array-embedded) and V2 (topic ID-referenced) formats, with seamless in-app migration.
iBird uses a dual-token economy combining HBAR (Hedera's native token) with ASSET (iBird's utility token).
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 |
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 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) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 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 |
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"
Profiles have two versions. All new profiles are created as V2.
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.
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.
Existing V1 users must migrate before performing write actions. The migration:
- Creates separate HCS topics for each non-empty list
- Sends the existing array data to each new topic
- 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.
All messages in iBird are JSON objects submitted to HCS topics. The structure varies by message type.
For complex content (Threads, Polls), iBird uses a two-layer architecture:
- Reference Message β Sent to Explorer topic (lightweight pointer)
- 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"} β
ββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββ
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 |
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"
}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"
}{
"Author": "0.0.123456",
"Reply_to": "5",
"Message": "Great point! I completely agree.",
"Media": "ar://xyz789"
}{
"Author": "0.0.123456",
"Like_to": "5"
}{
"Author": "0.0.123456",
"DisLike_to": "5"
}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"
}Sent as the first message in a new channel topic.
{
"Type": "ChannelIdentifier",
"Name": "Official Announcements",
"Description": "All official updates and news",
"Media": "ar://channelLogoCID"
}Sent as the first message in a new group topic.
{
"Type": "GroupIdentifier",
"Name": "Hedera Builders",
"Description": "Community for Hedera developers",
"Media": "ar://groupLogoCID"
}{
"Type": "Ad",
"Title": "Check out our new DApp!",
"Message": "Revolutionary decentralized application...",
"Link": "https://example.com",
"Media": "ar://adImageCID"
}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:
- Compose - User writes post content and optionally attaches media
- Upload (if media) - Media file is uploaded to Arweave via ArDrive Turbo
- 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);
};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://..."}β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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")β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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 |
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
# 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 startCreate 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/txiBird 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=testnetFor Production:
NEXT_PUBLIC_NETWORK=mainnetAll 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
We welcome contributions! Please see our Contributing Guide for details.
# 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- 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
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.
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).
- Share β copy and redistribute the material in any medium or format
- Adapt β remix, transform, and build upon the material
- 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.
- 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