[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-106182":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":9,"pushedAt":36,"updatedAt":37,"readmeContent":38,"aiSummary":9,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":39,"discoverSource":40},106182,"agentring","mutonby\u002Fagentring","mutonby","Let your AI agents call your phone over VoIP, and call them back. Your phone rings like a real call, even locked; a voice AI talks it through and returns the transcript. Self-hosted, open source, no phone numbers or Twilio.",null,"Python",260,30,3,2,0,35,46,116,89.07,"Apache License 2.0",false,"main",[24,25,26,27,28,29,30,31,32,33,34,35],"ai-agents","android","claude-code","gemini-live","livekit","mcp","mcp-server","phone-calls","self-hosted","voice-ai","voip","webrtc","2026-11-01 21:57:35","2026-11-02 20:17:30","# agentring\n\n**Your AI agent can call you.** When it needs a decision, hits a wall or finishes a\nlong job, your phone rings like a real call, even locked and in Doze. A voice AI tells\nyou what's going on, you talk it through, and the agent gets the transcript and carries\non. You can also call your agents back from the app and ask them things by voice.\n\nSelf-hosted and open source. No phone numbers, no Twilio, no per-minute fees: calls go\nover VoIP from your own server to your own phone. Don't want to run a server? The hosted\nversion is at [agentring.io](https:\u002F\u002Fagentring.io) (contact: info@agentring.io).\n\n[![CI](https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fagentring\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fagentring\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Android](https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fagentring\u002Factions\u002Fworkflows\u002Fandroid.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fagentring\u002Factions\u002Fworkflows\u002Fandroid.yml)\n[![License: Apache-2.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache--2.0-blue.svg)](LICENSE)\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F4d925f22-727f-4d66-8665-c392cc3d1eb3\n\n*Sound on. A real run with Claude Code, a Pixel 6 and the voice AI: a migration fails, Claude Code\ncalls the locked phone, you decide, it carries on. The phone is a screen recording with the call\naudio (the ringtone was added), the terminal is redrawn from Claude Code's output, and only the waits were cut. Silent\nversion: [demo.gif](docs\u002Fmedia\u002Fdemo.gif).*\n\n> **Pre-release.** Messages, calls on a locked phone, the voice AI, calling your agent\n> from the app and the MCP server all work. So far it has been tested on one phone\n> (Pixel 6, Android 16). Android only for now.\n\n## What it does\n\n- **Your agent reaches you.** It can send you a message, wait for your reply or call\n  you (`send_message`, `get_replies`, `call`). On a call, a voice AI explains why the\n  agent is calling, answers your questions and hands the transcript back.\n- **You reach your agents.** Tap \"Call agent\" in the app. The voice AI can ask your own\n  agents for help mid-call. If one is slow, the call goes on and its answer arrives\n  when it's ready, or as a message if you've already hung up.\n- **Nothing gets lost.** A missed call turns into a message you can answer from the\n  notification.\n\nThings people use it for: *\"run the migration and call me if anything fails\"*, *\"ask\nme before you deploy\"*, *\"what did CI say?\"* while driving, a daily call with your\nassistant about your inbox.\n\n## Works with your agent\n\nagentring doesn't care which harness you use: anything that speaks MCP can reach you,\nand anything you can run as a command can be consulted from a call.\n\n| | Reaches you | You consult it from a call |\n|---|---|---|\n| Claude Code | MCP | `claude -p` |\n| Codex | MCP | `codex exec` |\n| opencode | MCP | `opencode run` |\n| OpenClaw | MCP | `openclaw agent` |\n| Hermes | MCP | `hermes -z` |\n| n8n, scripts, anything with HTTP | REST API, CLI | any command, or a small script for an HTTP agent |\n\nCopy-paste setup for each: [docs\u002Fagents.md](docs\u002Fagents.md#recipes-by-harness).\n\n## How it works\n\n```\n your agent ──MCP\u002FCLI──▶ daemon ──WSS (outbound only)──▶ relay ──FCM push──▶ Android app\n     ▲                     │                      (your server)                   │\n     └── agents.yaml ◀── voice AI (realtime) ◀──────── LiveKit (call audio) ───────┘\n```\n\n- **relay** (TypeScript): pairing, messages, call state, push, LiveKit tokens. Runs on\n  your server behind Caddy.\n- **LiveKit**: the call audio, self-hosted in the same compose file.\n- **daemon** (Python): the `agentring` CLI, the MCP server and the voice AI. Runs next\n  to your agents, behind NAT is fine.\n- **Android app** (Kotlin): QR pairing, the native call screen, messages.\n\nThe voice AI is the voice, your agent is the brain: a realtime speech model handles\nthe conversation and hands real work to your agents. Pick the one you like:\n\n| Voice AI | `--provider` | Key |\n|---|---|---|\n| [Gemini Live](https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Flive) (default, free tier) | `gemini` | `GEMINI_API_KEY` |\n| [OpenAI Realtime](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Frealtime-conversations) | `openai` | `OPENAI_API_KEY` |\n| [Grok Voice](https:\u002F\u002Fdocs.x.ai\u002Fdocs\u002Fguides\u002Fvoice\u002Fagent) (xAI) | `grok` | `XAI_API_KEY` |\n| [Phonic](https:\u002F\u002Fdocs.phonic.ai) | `phonic` | `PHONIC_API_KEY` |\n\nSet `AGENTRING_VOICE_PROVIDER` in `~\u002F.agentring\u002F.env` to use one for every call, from the\nCLI and from MCP. How they compare (latency, tool use) and how to add another one:\n[docs\u002Fvoice.md](docs\u002Fvoice.md#providers).\n\nMore: [architecture](docs\u002Farchitecture.md) · [protocol](docs\u002Fprotocol.md) ·\n[voice AI](docs\u002Fvoice.md)\n\n## Quickstart\n\nYou need:\n- somewhere to run the relay: a Linux server with Docker and a domain name, **or** your own\n  computer with Docker (the phone on the same Wi-Fi, or anywhere over Tailscale),\n- a free Firebase project, which is what makes a locked phone ring ([docs\u002Ffirebase.md](docs\u002Ffirebase.md)),\n- a key for the voice AI: Gemini ([free tier](https:\u002F\u002Faistudio.google.com\u002Fapikey)), or OpenAI,\n  xAI (Grok) or Phonic ([providers](docs\u002Fvoice.md#providers)),\n- an Android phone.\n\n```bash\n# 1. The relay, on a server with a domain (ports 80, 443, UDP 50000-50100 and TCP 7881 open)\ncd deploy && cp .env.example .env && $EDITOR .env && docker compose up -d --build\n#    ... or on your own computer, at its LAN or Tailscale IP\ncd deploy && cp .env.local.example .env.local && $EDITOR .env.local \\\n  && docker compose -f docker-compose.local.yml --env-file .env.local up -d --build\ndocker compose logs relay | grep -A2 \"API key\"   # add the same -f\u002F--env-file for the local one\n\n# 2. The computer where your agent runs\nuv tool install '.\u002Fdaemon[voice]'\nagentring init --relay https:\u002F\u002Frelay.example.com --api-key ak_...\nagentring pair                         # scan the QR code with the app\nagentring msg \"hello\"                  # the phone gets a notification\necho GEMINI_API_KEY=... >> ~\u002F.agentring\u002F.env  # or OPENAI_API_KEY \u002F XAI_API_KEY \u002F PHONIC_API_KEY\nagentring call \"Testing agentring\" --ai       # + --provider openai|grok|phonic\n\n# 3. Your agent (Claude Code here; others: docs\u002Fagents.md)\nclaude mcp add agentring -- agentring mcp\n```\n\nGet the app from [Releases](https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fagentring\u002Freleases). The full\ntutorial, step by step for both options and with a troubleshooting table:\n**[docs\u002Fsetup.md](docs\u002Fsetup.md)**. If the phone doesn't ring when locked, it's usually the\nvendor's battery saver: [docs\u002Ftroubleshooting-oem.md](docs\u002Ftroubleshooting-oem.md).\n\n## Privacy and security\n\nEverything runs on your own servers and accounts. Messages and call metadata are stored\non your relay. Push notifications go through your own Firebase project; they are\nsigned, not encrypted, so Google's FCM can read pushed text. Call audio goes through\nyour LiveKit server and, with the voice AI, to the provider you chose (Google, OpenAI,\nxAI or Phonic); on Google's free tier, Google may use that data to improve its products.\n\nOver the phone, the voice AI acts on what it hears, so give it only the tools and\nagents you'd trust someone holding your phone with. Details and the threat model:\n[SECURITY.md](SECURITY.md).\n\n## Limitations\n\n- Android only (no iOS yet).\n- One user per relay: no accounts.\n- The voice AI needs a cloud realtime model (Gemini, OpenAI, Grok or Phonic); others,\n  local ones included, plug in through [`RealtimeBackend`](docs\u002Fvoice.md#backends).\n\n## Development\n\n```bash\ncd relay && npm ci && npm test                         # relay\ncd daemon && uv run --extra voice pytest               # daemon (+ e2e against the relay build)\ncd app-android && .\u002Fgradlew :core:test :app:assembleDebug\n```\n\nCI builds the APK and runs an end-to-end test on an Android emulator against a real\nrelay. See [CONTRIBUTING.md](CONTRIBUTING.md) and [docs\u002Frelease.md](docs\u002Frelease.md).\n\n## License\n\n[Apache-2.0](LICENSE)\n","2026-11-03 04:31:11","CREATED_QUERY"]