| name | Farcaster Social Protocol Handler |
| category | Web3 Core Operations |
| subcategory | SocialFi |
| description | Manage casts, reactions, and Frames on Farcaster decentralized social protocol |
| tags | ["farcaster","socialfi","decentralized-social","neynar","frames","web3-social"] |
| difficulty | intermediate |
| status | production |
| version | 1.0.0 |
| activation_triggers | ["cast","recast","farcaster","frame","like cast","publish to farcaster","social protocol"] |
| parameters | {"api_key":{"description":"Neynar API key for Farcaster access","required":true,"example":"your_neynar_api_key"},"signer_uuid":{"description":"Managed signer UUID for write operations","required":false,"example":"19d0c5fd-9b33-4a48-a0e2-bc7b0555baec"}} |
| requirements | {"python":">=3.8","packages":["requests"],"external":["Neynar API key (free tier available)","Neynar signer UUID (for posting)"]} |
Farcaster Social Protocol Handler
Overview
Complete integration with Farcaster, a decentralized social protocol built on Optimism. Manage casts (posts), reactions (likes/recasts), and interactive Frames (Mini Apps) via the Neynar API.
Protocol Type: Decentralized Social (SocialFi)
Network: Optimism (L2)
API Provider: Neynar (managed infrastructure)
Status: Production Ready
Key Capabilities
1. Cast Management (cast_manager.py)
- โ
Publish casts with text, embeds, and mentions
- โ
Post to channels or reply to other casts
- โ
Delete your own casts
- โ
Search casts by keyword
- โ
Lookup casts by hash or URL
- โ
Fetch user's cast history
- โ
Channel-based posting (topic communities)
2. Reaction Management (reaction_manager.py)
- โ
Like casts (show appreciation)
- โ
Recast (reshare) casts
- โ
Unlike and unrecast
- โ
Get reaction counts and details
- โ
Fetch user's reaction history
- โ
Bulk like operations
- โ
Reaction aggregation
3. Frame Handling (frame_handler.py)
- โ
Validate Frame URLs
- โ
Parse Frame metadata from HTML
- โ
Generate Frame HTML tags
- โ
Support interactive buttons (post, link, mint, tx)
- โ
Input field handling
- โ
State management
- โ
Transaction frame support
Components
cast_manager.py
Purpose: Manage Farcaster casts (posts)
Classes:
CastManager - Main cast handler
Cast - Cast data structure
CastEmbed - Embed configuration
Methods:
publish_cast(text, embeds, channel_id, parent)
delete_cast(cast_hash)
lookup_cast(identifier, by_url)
search_casts(query, limit, priority_mode)
get_user_casts(fid, limit, include_replies)
reaction_manager.py
Purpose: Handle likes and recasts
Classes:
ReactionManager - Main reaction handler
Reaction - Reaction data structure
ReactionSummary - Aggregated reaction counts
Methods:
like_cast(cast_hash, target_author_fid)
unlike_cast(cast_hash, target_author_fid)
recast(cast_hash, target_author_fid)
unrecast(cast_hash, target_author_fid)
get_reactions(cast_hash, reaction_type, limit)
get_user_reactions(fid, reaction_type, limit)
bulk_like_casts(cast_hashes, delay_ms)
frame_handler.py
Purpose: Interactive Frame/Mini App management
Classes:
FrameHandler - Main frame handler
FrameMetadata - Frame configuration
FrameButton - Button configuration
FrameValidation - Validation result
Methods:
validate_frame(url)
fetch_frame_metadata(url)
parse_frame_html(html)
generate_frame_html(metadata)
is_frame_url(url)
Usage Examples
Example 1: Publish a Cast
from cast_manager import CastManager
manager = CastManager(
api_key="your_neynar_api_key",
signer_uuid="your_signer_uuid"
)
cast = manager.publish_cast(
text="Exploring decentralized social protocols! ๐ #Farcaster",
embeds=["https://farcaster.xyz"],
channel_id="farcaster"
)
print(f"Published: {cast.hash}")
Expected Output:
======================================================================
FARCASTER CAST MANAGER
======================================================================
โ
Write access enabled
Signer UUID: 19d0c5fd...bc7b0555
๐ Publishing Cast
Text: Exploring decentralized social protocols! ๐ #Fa...
Embeds: 1
Channel: farcaster
โ
Published successfully
Hash: 0x71d5225f77e0164388b1d4c120825f3a2c1f131c
View: https://warpcast.com/username/0x71d5225f
Example 2: Search and Like Trending Casts
from cast_manager import CastManager
from reaction_manager import ReactionManager
cast_mgr = CastManager(api_key, signer_uuid)
react_mgr = ReactionManager(api_key, signer_uuid)
casts = cast_mgr.search_casts("web3 protocol", limit=10, priority_mode=True)
for cast in casts[:5]:
if cast.likes_count > 10:
react_mgr.like_cast(cast.hash)
print(f"Liked: {cast.text[:60]}")
Expected Output:
๐ Searching Casts
Query: 'web3 protocol'
Limit: 10
โ
Found 10 results
๐ Liking Cast
Cast: 0x71d5225f77e01643...
โ
Like added
Liked: Just deployed a new web3 protocol for decentralized storage...
๐ Liking Cast
Cast: 0x3702ec1b9a28f4e2...
โ
Like added
Liked: Excited to share our progress on the decentralized protocol...
Example 3: Reply to a Cast
from cast_manager import CastManager
manager = CastManager(api_key, signer_uuid)
original = manager.lookup_cast("0x71d5225f77e0164388b1d4c120825f3a2c1f131c")
reply = manager.publish_cast(
text="Great insights! Looking forward to seeing more ๐",
parent=original.hash,
parent_author_fid=original.author_fid
)
print(f"Replied to @{original.author_fid}")
Expected Output:
๐ Looking up Cast
Identifier: 0x71d5225f77e0164388b1d4c120825f3a2c1f131c...
โ
Found
Author: @username
Text: Exploring decentralized social protocols! ๐ #Farcaster...
Reactions: ๐ 15 | ๐ 3
๐ Publishing Cast
Text: Great insights! Looking forward to seeing more ๐
Reply to: 0x71d5225f77e01643...
โ
Published successfully
Hash: 0x8f3d1a2b4c5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a
Example 4: Get Reaction Analytics
from reaction_manager import ReactionManager
manager = ReactionManager(api_key)
summary = manager.get_reactions("0x71d5225f77e0164388b1d4c120825f3a2c1f131c")
print(f"Total Engagement: {summary.likes_count + summary.recasts_count}")
print(f"Likes: {summary.likes_count}")
print(f"Recasts: {summary.recasts_count}")
for like in summary.likes[:5]:
print(f" Liked by FID {like['user']['fid']}")
Expected Output:
๐ Fetching Reactions
Cast: 0x71d5225f77e01643...
โ
Retrieved reactions
๐ Likes: 23
๐ Recasts: 5
Total Engagement: 28
Likes: 23
Recasts: 5
Liked by FID 12345
Liked by FID 67890
Liked by FID 24680
Example 5: Validate and Create a Frame
from frame_handler import FrameHandler, FrameMetadata, FrameButton, FrameButtonAction
handler = FrameHandler(api_key)
validation = handler.validate_frame("https://gallery.so/frame")
if validation.valid:
print(f"โ
Valid Frame with {len(validation.metadata.buttons)} buttons")
frame = FrameMetadata(
version="vNext",
image="https://myapp.com/quiz-image.png",
image_aspect_ratio="1:1",
input_text="Enter your guess",
post_url="https://myapp.com/api/submit",
buttons=[
FrameButton(1, "Option A", FrameButtonAction.POST),
FrameButton(2, "Option B", FrameButtonAction.POST),
FrameButton(3, "See Results", FrameButtonAction.LINK,
target="https://myapp.com/results")
]
)
html = handler.generate_frame_html(frame)
print("Frame HTML generated for embedding")
Expected Output:
๐ Validating Frame
URL: https://gallery.so/frame
โ
Frame is valid
Version: vNext
Buttons: 2
โ
Valid Frame with 2 buttons
๐๏ธ Generating Frame HTML
โ
Generated 10 meta tags
Frame HTML generated for embedding
Example 6: Monitor Channel Activity
from cast_manager import CastManager
import time
manager = CastManager(api_key)
while True:
casts = manager.search_casts("channel:farcaster", limit=5)
for cast in casts:
print(f"@{cast.author_fid}: {cast.text[:80]}")
print(f" ๐ {cast.likes_count} | ๐ {cast.recasts_count}")
print("\n---Refreshing in 60s---\n")
time.sleep(60)
Expected Output:
๐ Searching Casts
Query: 'channel:farcaster'
Limit: 5
โ
Found 5 results
@3: Just launched a new feature for decentralized identity management...
๐ 45 | ๐ 12
@15789: Excited to share our Farcaster integration roadmap for Q2...
๐ 33 | ๐ 8
@9876: Built a Frame that lets you mint NFTs directly in the feed!...
๐ 67 | ๐ 23
---Refreshing in 60s---
Testing
Prerequisites
-
Get Neynar API Key:
-
Get Signer UUID (optional, for posting):
- In Neynar dashboard, create a managed signer
- Copy the signer UUID
-
Set Environment Variables:
export NEYNAR_API_KEY="your_api_key"
export NEYNAR_SIGNER_UUID="your_signer_uuid"
Run Tests
python cast_manager.py
python reaction_manager.py
python frame_handler.py
Manual Testing
from cast_manager import CastManager
manager = CastManager(api_key="your_api_key")
casts = manager.search_casts("farcaster", limit=5)
for cast in casts:
print(f"{cast.text[:60]}... (๐ {cast.likes_count})")
Common Issues & Solutions
Issue 1: "No signer UUID configured"
Cause: Attempting write operations without signer
Solution: Set NEYNAR_SIGNER_UUID environment variable
Workaround: Use read-only operations (search, lookup)
Issue 2: HTTP 401 Unauthorized
Cause: Invalid or missing API key
Solution: Verify NEYNAR_API_KEY is correct
Check: Test key at https://docs.neynar.com/
Issue 3: HTTP 429 Too Many Requests
Cause: Rate limit exceeded
Solution: Use delay_ms parameter in bulk operations
Upgrade: Consider paid Neynar plan for higher limits
Issue 4: Cast not found
Cause: Cast hash is invalid or cast was deleted
Solution: Verify hash format (0x...) and cast exists
Alternative: Use URL lookup with by_url=True
Issue 5: Frame validation fails
Cause: Missing required meta tags
Solution: Ensure all required fc:frame tags present
Tool: Use https://warpcast.com/~/developers/frames validator
Production Deployment
Security Checklist
Performance Optimization
reaction_mgr = ReactionManager(api_key, signer_uuid)
cast_hashes = ["0x...", "0x...", "0x..."]
reaction_mgr.bulk_like_casts(cast_hashes, delay_ms=200)
Monitoring
import logging
logging.basicConfig(level=logging.INFO)
try:
cast = manager.publish_cast(text="Hello!")
logging.info(f"Cast published: {cast.hash}")
except Exception as e:
logging.error(f"Cast failed: {e}")
Farcaster Concepts
Protocol Architecture
- Onchain (Optimism): FID registration, storage rental, fname registry
- Offchain (Hubs): Message storage and validation (Hubble nodes)
- Clients: Applications built on protocol (Warpcast, custom apps)
Key Terms
- FID: Farcaster ID (unique user identifier, e.g.,
3)
- fname: Username (e.g.,
@username)
- Cast: Post/message on Farcaster
- Recast: Reshare of a cast (like retweet)
- Channel: Topic-based community (e.g.,
/farcaster, /crypto)
- Frame: Interactive Mini App embedded in feed
- Signer: Ed25519 keypair for message signing
- Hub: Node storing and validating Farcaster messages
Cost Model
- FID Registration: ~$10 USD (one-time, on Optimism)
- Storage Rental: Included with FID registration (renewable)
- Posting: Free (no gas fees for messages)
- Neynar API: Free tier available, paid plans for higher limits
References
Extensions
Potential Enhancements
- WebSocket support for real-time updates
- Advanced search with filters (by channel, date, author)
- Cast thread management (fetch full conversations)
- User profile management
- Notification handling
- Direct cast (private messages)
- Wallet verification and display
- NFT collection display
Integration Ideas
- Discord bot for Farcaster notifications
- Telegram bot for casting
- Twitter cross-poster
- Analytics dashboard
- Trending content aggregator
- Automated engagement bot
- Content moderation tools
Status: Production Ready
Version: 1.0.0
Last Updated: 2024
Maintainer: Spoon Awesome Skills Team