{
  "markdown": "# vibedating\n\nDating by tokens — connect your Claude Code / Codex usage, get sorted into a\n**league** (1M / 5M / 10M / 100M / 1B+), and match with people who burn tokens\nthe way you do. The premise: heavy users of these tools share something worth\nmatching on.\n\nPart of the **Vibe Suite** — companion tools for agentic coding CLIs. Ships as\n**CLI + npm package + MCP server**, plus a local web app. Built on\n[`@pooriaarab/vibe-core`](https://www.npmjs.com/package/@pooriaarab/vibe-core).\n\n## Demo\n\n[▶ Watch the launch video](branding/launch-video.mp4) — she matched with the man of her dreams. He was coding in a basement.\n\nhttps://github.com/pooriaarab/vibedating/raw/main/branding/launch-video.mp4\n\n> **Local-first.** Raw token usage is read and stored on your own machine and\n> **never leaves it.** Only the coarse league *bucket* is ever shared — never the\n> raw number, never per-project breakdowns. Live matching is peer-to-peer over a\n> DHT (no central server) and **opt-in only**; without it the pool is a local\n> seeded demo.\n\n## Status\n\n**v0 — works locally, privacy-first.** Usage is **verified from your harness's\nreal local logs** via vibe-core's `readHarnessUsage` (source `real` →\n`verified: true`); when no logs are readable you can self-report\n(`VIBEDATING_TOKENS`, unverified) or fall back to a demo value (unverified).\nHandles are bound to a persistent ed25519 identity (`~/.vibedating/identity.json`,\nmode 0600): every hello is signed, and a forged signature gets the peer dropped.\n\n## Install\n\n```bash\nnpm install -g vibedate\n```\n\n…or run it ad-hoc:\n\n```bash\nnpx vibedate connect\n```\n\n## Quick start\n\n```bash\n# 1. Read your usage, compute + print your league (stored locally at ~/.vibedating)\nvibedating connect\n\n# 2. See candidates in your league (same or adjacent tier)\nvibedating matches\n\n# 3. (Opt-in) find live same-league peers over the DHT — no server\nvibedating discover --live        # shares ONLY handle+league+harness+verified flag+identity pubkey\n\n# 4. Open the local web app in your browser (served from your machine)\nvibedating open\n```\n\nSelf-report a token count (otherwise a demo value is used):\n\n```bash\nVIBEDATING_TOKENS=23400000 vibedating connect   # also accepts 12M / 1.2B / 500k\n```\n\n### All commands\n\n```\nvibedating connect            Read usage, compute + print your league\n                              (first run auto-assigns a memetic handle — never @you)\nvibedating matches [--live]   List candidates in your league (live peers if any,\n                              with last-message time)\nvibedating discover [--live]  Find live same-league peers over the DHT (opt-in)\nvibedating live [--keep-alive]  Live text chat (--keep-alive / non-TTY survives stdin EOF)\nvibedating handle [@name]     Print or set your handle\nvibedating daemon [start|stop|status|install|uninstall]\n                              Notify-only background daemon — alerts on NEW matches,\n                              never opens chat/video; install = run on login (launchd/systemd)\nvibedating open [--port N]    Serve the local web app (default: random free port)\nvibedating mcp                Run the stdio MCP server (tools: profile, matches)\nvibedating --version\nvibedating --help\n```\n\n### Live P2P discovery (opt-in)\n\n`vibedating discover --live` joins the public [hyperswarm](https://github.com/holepunchto/hyperswarm)\nDHT on your league topic — `sha256('vibedate:' + leagueBucket)` — so same-league\npeers find each other with **no central server**. On each encrypted connection\nthe two sides exchange a one-line hello with only\n`{ handle, league, harness, verified, pubkey, nonce, sig }` — the proof fields\nsign the hello with your persistent ed25519 identity so a handle can't be\nimpersonated; raw usage is never put on the wire. Discovered\npeers are stored in `~/.vibedating/peers.json` and shown by `vibedating matches`.\n\nLive discovery is **off by default**. The `--live` flag is the explicit opt-in\n(persisted as the `share:live` consent scope); every live run prints what it\nshares before joining. `Ctrl+C` leaves the swarm cleanly.\n\n## Three faces, one local engine\n\nThe same local engine drives all three, so you can use it wherever you work:\n\n- **Web** — `vibedating open` serves the dating UI (profile, match stack, league\n  ladder) at `http://localhost:PORT`. The page reads your league + matches from a\n  tiny local JSON endpoint.\n- **CLI** — `vibedating connect` / `matches`.\n- **MCP** — `vibedating mcp` exposes `profile` (your league) and `matches` to any\n  MCP host (Claude Code, Codex, Cursor, …).\n\n### As a library\n\n```ts\nimport { league, matches, readUsage, CANDIDATES } from 'vibedate';\n\nconst usage = await readUsage('claude-code');     // { totalTokens, verified, ... }\nconst lg = league(usage.totalTokens);             // { name: '10M', min: 10_000_000 }\nconst who = matches(lg.name, CANDIDATES);         // same/adjacent-tier candidates\n```\n\n## Privacy\n\n- **Raw usage stays local.** `totalTokens` is read into memory, stored at\n  `~/.vibedating/state.json`, and shown in the web app only behind an opt-in\n  toggle. It is never transmitted.\n- **Only the league bucket is shared** — with the local demo pool, and (only if\n  you opt in with `--live`) as `{ handle, league, harness, verified, pubkey,\n  nonce, sig }` with same-league peers over the hyperswarm DHT. The handshake\n  parser whitelists those fields, so a peer can't even be *sent* anything else\n  into your process; the `verified` flag and identity pubkey are the only\n  additions, never a token count.\n- Consent for sharing the league is modeled with `@pooriaarab/vibe-core`'s consent\n  ledger (scope `share:league`), granted on `connect` and revocable on reset.\n  Live P2P discovery has its own scope (`share:live`), default **off**.\n\n## Leagues & matching\n\nBucketed by lifetime tokens; you match within your league **or an adjacent tier**\n(so the tiny 1B+ pool still has people to match with):\n\n| League | Tokens (lifetime) |\n| ------ | ----------------- |\n| 1M     | 1M – 4.99M        |\n| 5M     | 5M – 9.99M        |\n| 10M    | 10M – 99.9M       |\n| 100M   | 100M – 999M       |\n| 1B+    | 1B+               |\n\n## Prototype\n\nAn interactive, self-contained UX prototype (no build, no network):\n[`docs/prototype.html`](docs/prototype.html). The shipped local web app\n(`vibedating open`) is an adapted, data-driven version of this prototype.\n\n## License\n\nMIT\n",
  "bytes": 6370,
  "sha": "cae68e49abb38f13f5c2cc2aeafe83eb1bf1e758876218c765c0026e6c19f7ba",
  "repo_slug": "pooriaarab/vibedating",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_pooriaarab_vibedate_ef772525/readme"
}