packages/examples/farcaster/README.md
A self-contained TypeScript reference showing how to run an elizaOS agent that monitors and posts on Farcaster.
| Component | Description |
|---|---|
| Text generation + embeddings | OpenAI via plugin-openai |
| Farcaster integration | Neynar API via plugin-farcaster |
| Persistence | plugin-sql (PGLite or PostgreSQL) |
The agent responds to mentions in your Farcaster feed and can autonomously post casts.
cd packages/examples/farcaster
cp env.example .env
# Edit .env with your credentials
bun install
bun run start
Copy env.example to .env and fill in the required values:
| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY | Yes | OpenAI API key |
FARCASTER_FID | Yes | Your Farcaster ID (FID) |
FARCASTER_SIGNER_UUID | Yes | Neynar signer UUID |
FARCASTER_NEYNAR_API_KEY | Yes | Neynar API key |
FARCASTER_DRY_RUN | No | Set to true to disable posting (default: true) |
FARCASTER_MODE | No | polling or webhook (default: polling) |
FARCASTER_POLL_INTERVAL | No | Polling interval in seconds (default: 120) |
ENABLE_CAST | No | Enable autonomous casting (default: false) |
CAST_INTERVAL_MIN | No | Min minutes between autonomous casts (default: 90) |
CAST_INTERVAL_MAX | No | Max minutes between autonomous casts (default: 180) |
MAX_CAST_LENGTH | No | Maximum cast length (default: 320) |
DATABASE_URL | No | PostgreSQL URL (uses PGLite if not set) |
For each incoming mention, the examples route the event through the elizaOS "message service" for consistent state composition and response generation.
@elizaos/plugin-farcaster which registers:
FarcasterService (handles polling, client lifecycle)SEND_CAST, REPLY_TO_CASTfarcasterProfile, farcasterTimeline, farcasterThreadFarcasterService background clientsruntime.messageService.handleMessage() inside the plugin.For each incoming mention:
Memory for the Farcaster cast (stable IDs per cast/thread)FARCASTER_DRY_RUN=true)The TypeScript example relies on the plugin-farcaster service for polling and posting.
The default character (FarcasterBot) is configured as a helpful AI agent on Farcaster. Customize character.ts to change:
message_service.handle_message() for proper state composition and response generationThe @elizaos/plugin-farcaster plugin provides these components:
| Action | Description | Trigger Keywords |
|---|---|---|
SEND_CAST | Post a new cast to Farcaster | "post", "cast", "share", "announce" |
REPLY_TO_CAST | Reply to an existing cast | "reply", "respond", "answer", "comment" |
| Provider | Description |
|---|---|
farcasterProfile | Agent's Farcaster profile (username, FID, bio) |
farcasterTimeline | Recent casts from agent's timeline |
farcasterThread | Thread context for ongoing conversations |
| Service | Description |
|---|---|
FarcasterService | Main service managing client lifecycle, polling, and cast operations |
packages/examples/farcaster/
├── README.md # This file
├── env.example # Environment variable template
├── .gitignore # Git ignore rules
├── agent.ts # Main entry point
├── character.ts # Character configuration
├── package.json # Dependencies
└── tsconfig.json # TypeScript config
Create a signer at neynar.com and add the UUID to your .env file.
The agent handles 429 errors automatically with exponential backoff. You can also increase FARCASTER_POLL_INTERVAL.
Casts are automatically truncated to MAX_CAST_LENGTH (default 320 characters).