The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Vibedate listing page.
Dating by tokens — connect your Claude Code / Codex usage, get sorted into a league (1M / 5M / 10M / 100M / 1B+), and match with people who burn tokens the way you do. The premise: heavy users of these tools share something worth matching on.
Part of the Vibe Suite — companion tools for agentic coding CLIs. Ships as
CLI + npm package + MCP server, plus a local web app. Built on
@pooriaarab/vibe-core.
▶ Watch the launch video — she matched with the man of her dreams. He was coding in a basement.
https://github.com/pooriaarab/vibedating/raw/main/branding/launch-video.mp4
Local-first. Raw token usage is read and stored on your own machine and never leaves it. Only the coarse league bucket is ever shared — never the raw number, never per-project breakdowns. Live matching is peer-to-peer over a DHT (no central server) and opt-in only; without it the pool is a local seeded demo.
v0 — works locally, privacy-first. Usage is verified from your harness's
real local logs via vibe-core's readHarnessUsage (source real →
verified: true); when no logs are readable you can self-report
(VIBEDATING_TOKENS, unverified) or fall back to a demo value (unverified).
Handles are bound to a persistent ed25519 identity (~/.vibedating/identity.json,
mode 0600): every hello is signed, and a forged signature gets the peer dropped.
…or run it ad-hoc:
Self-report a token count (otherwise a demo value is used):
vibedating discover --live joins the public hyperswarm
DHT on your league topic — sha256('vibedate:' + leagueBucket) — so same-league
peers find each other with no central server. On each encrypted connection
the two sides exchange a one-line hello with only
{ handle, league, harness, verified, pubkey, nonce, sig } — the proof fields
sign the hello with your persistent ed25519 identity so a handle can't be
impersonated; raw usage is never put on the wire. Discovered
peers are stored in ~/.vibedating/peers.json and shown by vibedating matches.
Live discovery is off by default. The --live flag is the explicit opt-in
(persisted as the share:live consent scope); every live run prints what it
shares before joining. Ctrl+C leaves the swarm cleanly.
The same local engine drives all three, so you can use it wherever you work:
vibedating open serves the dating UI (profile, match stack, league
ladder) at http://localhost:PORT. The page reads your league + matches from a
tiny local JSON endpoint.vibedating connect / matches.vibedating mcp exposes profile (your league) and matches to any
MCP host (Claude Code, Codex, Cursor, …).totalTokens is read into memory, stored at
~/.vibedating/state.json, and shown in the web app only behind an opt-in
toggle. It is never transmitted.--live) as { handle, league, harness, verified, pubkey, nonce, sig } with same-league peers over the hyperswarm DHT. The handshake
parser whitelists those fields, so a peer can't even be sent anything else
into your process; the verified flag and identity pubkey are the only
additions, never a token count.@pooriaarab/vibe-core's consent
ledger (scope share:league), granted on connect and revocable on reset.
Live P2P discovery has its own scope (share:live), default off.Bucketed by lifetime tokens; you match within your league or an adjacent tier (so the tiny 1B+ pool still has people to match with):
| League | Tokens (lifetime) |
|---|---|
| 1M | 1M – 4.99M |
| 5M | 5M – 9.99M |
| 10M | 10M – 99.9M |
| 100M | 100M – 999M |
| 1B+ | 1B+ |
An interactive, self-contained UX prototype (no build, no network):
docs/prototype.html. The shipped local web app
(vibedating open) is an adapted, data-driven version of this prototype.
MIT