Proof Of Vibe

A personal AI agent that turns a Telegram message into a poetic vibe reading + music rec

Proof Of Vibe

Created At

Open Agents

Project Description

Proof of Vibe is a Telegram-native AI agent that reads how you're feeling, recommends music that matches the texture of that feeling, and seals every emotional moment as a verifiable on-chain proof on 0G, turning your inner life into a portable, encrypted, ownable asset.

You DM the bot something like "feeling melancholy and rainy tonight." It runs sealed mood inference on 0G Compute, picks tracks from a curated library, commits a hashed "vibe" to the ProofOfVibe contract on 0G Galileo, encrypts your evolving taste profile and stores it on 0G Storage, and updates a personal ENS subname (<your-tg-username>.proofofvibe-bot.eth) on Sepolia so anyone can resolve your current mood live and anonymously from any wallet or ENS app.

Each user owns their agent end-to-end: their own HD-derived 0G wallet (auto-funded on /start), their own ERC-7857 Intelligent NFT (VibeAgentINFT), their own ENS subname auto-allocated through the NameWrapper, and their own AES-256-GCM-encrypted taste profile pinned on 0G Storage. /export hands the user their private key, they can walk away with the iNFT, the ENS subname, and their full on-chain emotional history. The agent is theirs, not ours.

The agents also talk to each other. After every commit, the bot fans the vibe out over a Gensyn AXL peer-to-peer mesh (Yggdrasil-routed, no central server, no API keys). When a second user's taste profile matches the broadcast mood, they receive an anonymous Telegram DM with the music the first user is listening to, turning shared feeling into shared discovery without ever exposing identity. It's an emotional protocol, not an app.

How it's Made

The system is four loosely coupled services pieced together over the full 0G stack plus ENS and Gensyn AXL.

Smart contracts ProofOfVibe.sol is an append-only ledger keyed by user address, each commit pins a bytes32 vibeHash plus human-readable mood/energy/storageRef so the timeline is meaningful even without resolving the off-chain payload. VibeAgentINFT.sol is a full ERC-7857 implementation with role-based access (MINTER_ROLE for the bot wallet), per-user tokenId keyed by keccak256(telegramUserId), and app-level extensions for ENS name + vibeCount + taste-profile pointer. We deployed the canonical Verifier.sol from 0glabs/0g-agent-nft unchanged so the proof verification path is exactly the reference one.

TG Bot (TypeScript). Core flow lives in bot/src/index.ts and orchestrates: mood analysis via @0glabs/0g-serving-broker calling qwen-2.5-7b-instruct on 0G Compute with a heavily engineered five-block system prompt (JOB / SCHEMA / VOICE / EXAMPLES / LIBRARY); a curated music-library.ts injected into the prompt so recommendations are picked from a vetted set instead of hallucinated; rich JSON payload upload to 0G Storage via @0gfoundation/0g-ts-sdk Indexer; commitVibe to ProofOfVibe with the merkle root as storageRef; iNFT updates; ENS writes; AXL broadcast, everything after the chain commit is fire-and-forget so the user reply never blocks on side effects.

Per-user wallets. Every Telegram user gets a deterministic BIP-44 wallet derived from a MASTER_MNEMONIC at path m/44'/60'/0'/0/<index> where <index> is the first 31 bits of keccak256(telegramUserId), 2.1B unique paths, negligible collision risk. The bot's operational wallet auto-funds the user's 0G wallet on /start, and /export reveals the private key so users can self-custody. The iNFT is minted directly to the user's HD wallet, not the bot — so vibes signed by that wallet, ENS records pointing at it, and the iNFT itself all share one chain-level identity.

Encrypted taste profile. Per-user feedback (this hit / not it buttons under each reply) updates an in-memory profile, which is encrypted with AES-256-GCM (crypto.ts, per-user key derived from INFT_ENCRYPTION_KEY) and re-uploaded to 0G Storage; the merkle root goes into the iNFT's dataHashes. Future inference re-injects the decrypted summary into the system prompt — the agent learns you without leaking your taste anywhere off-mesh.

ENS Creative Track (Sepolia). The parent proofofvibe-bot.eth is wrapped in the NameWrapper; on /start we call setSubnodeRecord to allocate <tg-username>.proofofvibe-bot.eth (or tg-<8-hex> fallback when the username isn't ENS-safe), then setAddr and text-record writes publish the live mood. Sepolia writes are funneled through a serialized queue (sepolia-queue.ts) because public RPCs hate concurrent nonces. The whole subname lifecycle is per-user, deterministic, idempotent, and survives username changes via a local allocations index.

Gensyn AXL mesh. Two AXL nodes run locally with ed25519 keys; the bot POSTs vibe.committed envelopes to node A's HTTP bridge (X-Destination-Peer-Id header), which Yggdrasil-routes them to node B, which a vibe-listener polls and matches against other users' taste profiles in user-registry.ts. Mood matches trigger anonymous Telegram DMs from the bot to the matched user — peer-to-peer agent-to-agent comms with zero central infra.

Dashboard is Next.js + Tailwind on Vercel, reads vibes directly from chain via ethers, resolves ENS subnames from Sepolia, and pulls full payloads from 0G Storage by root hash.

background image mobile

Join the mailing list

Get the latest news and updates

Proof Of Vibe | ETHGlobal