Metadata-Version: 2.4
Name: zoran
Version: 0.2.1
Summary: Your agents know how to reach you — Claude Code & Cursor sessions ring your real phone
Author-email: Polymerix Labs Ltd <support@polymerix.io>
License: Apache-2.0
Project-URL: Homepage, https://zoran.run
Keywords: claude-code,cursor,hooks,phone,twilio,agent
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: Build Tools
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: zoran-proto>=0.2.1
Requires-Dist: httpx>=0.27
Requires-Dist: pyyaml>=6.0
Requires-Dist: pydantic>=2.7
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"

# Zoran

**Your agents know how to reach you.**

Zoran watches your local [Claude Code](https://claude.com/claude-code) and Cursor
sessions. When a session needs a human — a permission to grant, a deploy waiting,
a question only you can answer — your real phone rings. Press **1** to allow,
**2** to deny. Hang up, go back to your life.

No screen, no notifications to miss. A phone call.

## Install

```bash
pip install zoran   # or: pipx install zoran
zoran init
```

`zoran init` does everything: registers your device, installs the hooks into
Claude Code (`~/.claude/settings.json`) and Cursor (`~/.cursor/hooks.json`)
without touching your existing hooks, starts the daemon as a background service
(launchd on macOS, systemd on Linux), and opens your dashboard to set your
phone number. Nothing to keep running in a terminal.

If your terminal says `zoran: command not found` (common with the macOS
system Python, which installs scripts outside your PATH), this always works:

```bash
python3 -m zoran init
```

## What it feels like

- An agent asks for a risky permission → your phone rings, you press 1 or 2.
- A task finishes and the agent is waiting on your word → your phone rings.
- You're away and curious → **call back**. A voice tells you what's moving,
  what broke, what's waiting on you.
- An agent is going off the rails → say "freeze". It stops.
- Missed the call? You get an SMS, and YES/NO by text works too.

## Your code stays home

The daemon runs on `127.0.0.1` only. Transcripts are read locally, on demand,
and never stored or synced. What leaves your machine: session metadata and an
80-character tool preview, redacted before it leaves. The cloud exists so your
phone can ring — it never sees your source. Details: [zoran.run/privacy](https://zoran.run/privacy/).

If the cloud is unreachable, hooks fail open: your agents keep working as if
Zoran wasn't there.

## Commands

| Command | What it does |
| --- | --- |
| `zoran init` | register, install hooks, start the service, open the dashboard |
| `zoran status` | is the daemon alive, which sessions it sees |
| `zoran test-call` | ring your phone right now, to make sure it works |
| `zoran start` / `zoran stop` | start / stop the background service |
| `zoran uninstall-hooks` | remove Zoran's hooks, leave everything else |

Local dashboard: `http://127.0.0.1:4090` · Cloud dashboard: [zoran.run/app](https://zoran.run/app/)

---

Zoran is a product of [Polymerix Labs Ltd](https://zoran.run/terms/), London.
Support: support@polymerix.io
