Skip to main content

One post tagged with "social"

View All Tags

Inside farcaster-canvas: A Farcaster Mini App as an EffectStream Indexer

15 min read

Farcaster Canvas is a collaborative pixel-painting game that ships as a Farcaster Mini App. Two users on Warpcast can sit on the same canvas, pick colors from a palette, and watch each other's paints land in near real time. When a canvas runs out of slots, anyone can fork it to their own timeline as the next canvas to paint on.

The app is built on EffectStream, which is multi-chain by design: the game logic is chain-neutral, so while this build settles on an EVM chain inside Warpcast, the same state machine retargets to the Cardano ecosystem with a configuration change - the social surface (Farcaster) and the settlement chain are independent choices.

The interesting thing about this implementation isn't the canvas itself — it's that the entire game is wired through an Effectstream node sitting between a near-empty Solidity contract and a React UI rendered inside Warpcast's iframe. There's no game logic on chain. There's no game logic in the frontend. Everything that decides "is this paint valid, does this canvas get filled, who owns the fork" runs inside a state machine that consumes JSON inputs from a single L2 event.

This post walks through what each piece does, why the contract is one line of meaningful Solidity, and how the node turns chain events into the canvas grid the user sees.