The problem Safaricaster solves
Safaricaster brings wildlife observation and conservation to a global audience in a way that is fun, social, and memorable. It allows users to:
Experience Wildlife in Real-Time:
Warpcast users can enjoy real-time wildlife sightings through the NamibiaCam live stream directly in-frame. This brings the thrill of spotting animals in their natural habitat to crypto natives worldwide, fostering a deeper connection with nature and an opportunity to "touch grass".
Create Personalized NFTs:
Safaricaster offers a unique way for users to create and own personalized NFTs that capture the serendipity of wildlife encounters. These NFTs include details such as: the specific animal spotted, the time of the encounter, and the user's Farcaster information. Each NFT is a one-of-a-kind digital memento.
Engage with Farcaster Friends:
Safaricaster promotes social engagement on Warpcast by allowing users to share their experiences and wildlife sightings. The frame also shows which Farcaster users are also tuned into the live stream.
Contribute to Wildlife Conservation:
By minting NFTs of wildlife encounters, users directly contribute to the funding and maintenance of the Namibia Desert waterhole and its equipment. This ensures the continuous operation and improvement of wildlife monitoring and conservation efforts in the region.
Challenges we ran into
Performance (Frames/Frog)
- Image generation is difficult to do in a performant way on-demand inside an edge worker
- This results in the images being slow to generate, and making the frame feel less "real-time"
- We set a quality standard of every frame image needs to return under 1000ms
- Satori (the current preferred method for generating Farcaster frame images) is very slow (>4s) for images with photos inside
- Fixed this by
- Using wasm modules for image manipulation tasks
- Aggressive caching - almost every image a user sees is pre-cached before the user even requests it
Customized NFTs (Signing/IPFS)
- Each NFT has to be generated on the spot (since it's personalized), and pinned to IPFS dynamically
- The tokenUri of a NFT is dynamic based on the image
- To prevent griefing / abuse, we only pin once some one mints an NFT
- Minting requires a signature from us that signs over the tokenUri, so there was an issue where we needed the tokenUri before we pinned the image
- We ended up pre-computing the ipfs hash, then listening to the mint event to finally pin it
Detecting animals (ChatGPT)
- We tuned ChatGPT to detect which safari animal there is (if at all) in each frame screenshot
- To make animal detection as accurate as possible, we first had chatGPT identify whether or not there was an animal at all in the image
- Providing context on the environment (e.g., location of the waterhole) improved accuracy
- Next, we gave the model a predetermined list of ~30 animals found in the Namibia Desert so it could determine which it had detected
- The end-result was a highly accurate identification service at all times of day