caty-gateway
🇺🇸 English | 🇯🇵 日本語 | 🇨🇳 简体中文 | 🇹🇭 ไทย
A small background program that lets you talk by voice, from the CatyPhone iPhone app, to the AI running on your computer.
What it does | What you need | Getting started | Why it is safe | When something goes wrong | Learn more
Step away from your computer and you can still talk to your usual AI from your iPhone,
ask it to keep going, or show it a photo or your screen. Conversations go to the AI you chose, and nowhere else.
Take your usual AI with you, in your pocket.
🔧 Engineering docs | 📘 Reference
Sound familiar?
If even one of these rings a bell, caty-gateway is for you.
- You asked your AI to do something on your computer, stepped away, and couldn't give it the next instruction
- You had an idea while out and about, and had to explain it to the AI all over again once you got home
- You wanted to show your computer's AI a photo or screenshot from your phone, but had no way to send it
- You signed up for a separate AI app on your phone, but it doesn't share memory with the AI on your computer
The common cause is simple: your computer's AI has no way for your phone to reach it. caty-gateway takes care of exactly that, and nothing more.
Note that caty-gateway is a tool for people already running an AI agent or a local LLM on their computer. It's meant to be used together with the CatyPhone iPhone app. If you don't have an AI running on your computer, or don't use CatyPhone, this isn't for you.
What it does
It connects the AI on your computer and CatyPhone on your iPhone, only inside a private network that belongs to you.
flowchart LR
phone["CatyPhone<br/>(iPhone)"]
subgraph tailnet["Your private network (Tailscale)"]
gw["caty-gateway<br/>(running on your computer)"]
end
ai["Your usual AI<br/>Claude Code / Codex CLI / OpenClaw<br/>Hermes / Ollama / LM Studio"]
phone <-- "voice, photos, screen" --> gw
gw <-- "via your usual CLI" --> ai
-
🎙️ Talk by voice
Speak into your iPhone and the AI on your computer answers back. It remembers the earlier part of the conversation. You can optionally set a voice for its replies.
-
📷 Show it photos and your screen
Send a photo you took, or your shared screen, straight to the AI. You can say "fix this error on my screen" while you're out.
-
🔗 Uses your usual AI as-is
It doesn't change your AI's settings or working folder. It simply calls the CLI you already use, like Claude Code or Codex CLI, in the background.
-
🔒 Conversations go only to the AI you chose
Traffic between your iPhone and computer stays inside your private Tailscale network. The gateway itself sends the conversation nowhere, and history is kept on your own computer. If your AI uses the cloud (Claude Code, Codex CLI and the like), that is the same traffic that AI always has.
On the computer side you only need three things.
What you need
You need "an AI", "Tailscale", and "ffmpeg" on your computer, plus CatyPhone on your iPhone.
| Item | Support |
|---|---|
| Computer OS | ✅ macOS / ✅ Linux (Windows via WSL2 is ⚠️ untested) |
| iPhone | ✅ CatyPhone app |
| Python | ✅ 3.10 or later (see the collapsible section below for how to install it) |
| Network | ✅ Tailscale (the free plan works) |
Supported AIs (backends)
A "backend" is the AI that caty-gateway talks to behind the scenes. You choose it with the --backend value.
| Tier | AI | --backend value |
Live-conversation record |
|---|---|---|---|
| Bundled | Claude Code | claude |
In progress |
| Bundled | Codex CLI | codex |
In progress |
| Bundled | OpenClaw | openclaw |
In progress |
| Bundled | Hermes | hermes |
In progress |
| Bundled | Ollama / LM Studio | openai-compat |
In progress |
| Connectable | vLLM / LiteLLM / OpenRouter | openai-compat |
None |
| Planned | opencode / Aider / Goose / Kimi / Qwen and others | — | None |
- Bundled — this repository ships an adapter and tests for it
- Connectable — connects through the
openai-compatOpenAI-compatible API - Planned — no adapter yet. See Contributing for how to add one
"Live-conversation record" means whether this repository has a written walkthrough of an actual back-and-forth conversation from an iPhone. Until that record exists, this column stays "In progress".
Three things your computer needs
| Prerequisite | How to check | If it's missing |
|---|---|---|
| A CLI or server for your usual AI | e.g. claude --version |
See that AI's own setup instructions |
| Logged in to Tailscale | tailscale status |
Create a free account at tailscale.com and log in on both your computer and your iPhone |
| ffmpeg | ffmpeg -version |
macOS: brew install ffmpeg / Linux: apt install ffmpeg |
Tailscale is a free app that creates a private network connecting only your own devices to each other. caty-gateway assumes your iPhone and computer are on the same Tailscale network, and pairing (scanning the QR) is not accepted from any other route. After pairing, every request is protected by the key (token) handed over at that moment.
Once you have these, you can get started with a single command.
Getting started
There are four steps: install → check → set up → scan the QR code.
Have your AI install it for you
You can paste the following three lines to your AI agent and ask it to do this for you.
Please read https://github.com/caty-ai/caty-gateway and install caty-gateway.
To install it, run `uv tool install caty-gateway` (or `pipx install caty-gateway` if you don't have uv; if you have neither, follow the steps in the README).
Once installed, run `caty-gateway doctor --backend claude` and show me the result as-is.
The commands are spelled out on purpose, so the agent doesn't have to guess how to install it. Only the official package gets installed, and doctor only checks things — it never changes anything.
Install it yourself
1. Install
The one-command installer sets up uv if it's missing, then installs caty-gateway. It is coming with the PyPI release; until then, use the uv command below it.
curl -fsSL https://caty.talk/gateway/install.sh | sh
If you already have uv:
uv tool install caty-gateway
If you don't have uv, pipx install caty-gateway works the same way.
2. Check
caty-gateway doctor --backend claude
Replace claude with the --backend value from the table above. When only PASS and WARN remain, you're ready to go. Any FAIL line comes with instructions for fixing it. WARN marks a check that could not be confirmed passively; if that AI works as usual, carry on.
PASS OS
PASS Python
PASS ffmpeg
PASS ffprobe
PASS tailscale executable
PASS tailscale login
PASS tailscale IPv4
PASS port
PASS public URL
PASS config directory
PASS state directory
PASS data directory
PASS claude version
PASS claude working directory
PASS claude credentials
3. Set up
caty-gateway setup --member me --backend claude
Replace me with a short name for yourself using letters and numbers (or just keep me). This creates a background service that starts every time your computer boots, and shows a QR code at the end. If you just want to preview what it will do first, add --plan-only to see the full plan without changing anything.
Running it over ssh or from a script? Add --yes (there is no terminal to answer the confirmation) and put CATY_QR_DELIVERY=tty in front so the QR code is drawn as text: CATY_QR_DELIVERY=tty caty-gateway setup --member me --backend claude --yes
4. Scan the QR code
Open CatyPhone and scan the QR code shown on screen. Your iPhone and computer will connect, and you'll be able to start talking. The QR code expires after 10 minutes, and can only be scanned once. To get a new one, run caty-gateway qr --member <id> (see Reissuing the QR).
If something goes wrong (command not found, no uv or pipx, Python too old)
caty-gateway: command not found— Reopen your terminal. Ifuv tool installprinted a line about adding something to your PATH, run that line first.- Neither
uvnorpipxis installed — Install one of them. uv: docs.astral.sh/uv / pipx: pipx.pypa.io. - Python is older than 3.10 — You can let uv install Python for you too, e.g.
uv tool install --python 3.12 caty-gateway. - Package not found (
No solution foundor similar) — Until the package is published on PyPI, install straight from GitHub:uv tool install --from git+https://github.com/caty-ai/caty-gateway caty-gateway - What's a terminal? — On macOS it's "Terminal.app"; on Linux it's your terminal application. Paste the commands above one line at a time and press Enter.
Now that it's connected, here's what this tool deliberately does not do.
Why it is safe to install
caty-gateway only handles the "front door" — it doesn't do anything extra to your AI or your conversations.
-
It doesn't change your AI's settings
it talks to Claude Code and others by calling the same CLI you already use. It never touches your working folder or config files
-
Checks only look, they don't act
doctoronly checks version numbers and login status; it never sends a prompt to your AI (so it never uses up any of your usage quota) -
Pairing only happens inside your private network
pairing requests are only accepted from inside your Tailscale network, or from the computer itself. After pairing, every request without the key (token) is refused
-
The QR code never carries a long-lived key
it only contains a one-time password that expires in 10 minutes; the real key is handed over separately, after scanning
-
Records stay on your computer
conversation history is stored at
~/.local/state/caty-gateway/history/<name>/, and deleting that folder deletes it
The gateway sends the conversation only to the AI you chose. Beyond that, nothing goes out except for optional features you turn on yourself, such as text-to-speech or avatar generation. Which features send what is documented in privacy.
If you want to stop using it (full removal steps)
- Stop and remove the background service (macOS:
~/Library/LaunchAgents/ai.caty.gateway.<name>.plist; Linux:caty-gateway-<name>.service). Full steps are in the Engineering docs - Delete the config and history folders:
~/.config/caty-gateway/,~/.local/state/caty-gateway/,~/.local/share/caty-gateway/ - Remove the program itself:
uv tool uninstall caty-gateway(orpipx uninstall caty-gateway)
The gateway creates nothing on the AI's side. The conversation does remain as that AI's own history (Claude Code or Codex CLI sessions); delete it there if you want it gone too.
If something still isn't working, look for it in the list below.
When something goes wrong
First run caty-gateway doctor --backend <value> and follow the instructions next to any FAIL line. If you're still stuck, look for your symptom below.
`FAIL tailscale login` / `FAIL tailscale IPv4`
You aren't logged in to Tailscale on your computer. Open the Tailscale app, log in, confirm your computer shows up in tailscale status, and run doctor again.
`FAIL port` (doctor) / `port … is already listening` (setup)
Another program is using the same port number. Run doctor and setup again with an open port, e.g. --port 8811.
`FAIL claude version` / `WARN claude credentials` (backend not found, or login cannot be confirmed)
That AI's CLI either isn't installed or you aren't logged in. WARN claude credentials also appears when your login lives in the OS keychain, which doctor cannot read. If claude works normally in your terminal, you can carry on. Start that CLI once in your terminal, log in, then run doctor again. For Ollama or LM Studio, start the server first, then set CATY_OPENAI_BASE_URL to a URL like http://127.0.0.1:11434/v1.
It started, but scanning the QR code doesn't connect
In most cases, your iPhone isn't on the same Tailscale network as your computer. Log in to the same Tailscale account on your iPhone's Tailscale app, confirm the connection is on, and generate a fresh QR code by following Reissuing the QR. Any route other than Tailscale (like your home Wi-Fi's IP address) may start up fine but will get stuck at pairing.
Scanning the QR code says it "expired"
QR codes expire 10 minutes after they're shown. Follow Reissuing the QR to get a new one.
You can find the full picture of how it works and how to configure it in the documents below.
Learn more
Documentation is split by what you're looking for. The engineering guide and the reference have Japanese versions, linked at the top of those two pages.
| What you want to know | Page |
|---|---|
| How it works, all commands, running the service, uninstalling | Engineering docs |
| Every command's arguments, where files are saved, pairing rules | Reference |
| Full table of environment variables (auto-generated) | docs/env.md |
| What each feature sends externally | docs/privacy.md |
| Pairing protocol details | docs/contracts/pairing-v1.md |
Adding or fixing a backend is welcome — here's how.
Contributing
Adding support for the AI you use can be as simple as writing one preset.
Setup steps, test conventions, and the review process are in CONTRIBUTING.md. For bugs or questions, please open an issue.
Part of the Caty AI family — open tools for running a family of AI agents. The full map, including modules still being prepared for release, lives in Family OS.
| Axis | Module | What it does | State |
|---|---|---|---|
| Map | Family OS | The map of the whole family — every module, its state, and how they fit | published, MIT |
| Rules | Family Dev Handbook | The rules of the road — issues, PRs, worktrees, handoffs, parallel development | published, MIT |
| Vertical · foundation | Caty Agent Harness | Task backbone for AI agents — retries, checkpoints, and honest completion | published, MIT |
| Vertical | context-kit | Six-piece context hygiene kit for one agent — bounded output, delegation briefs, safety guards, recall, worktree snapshots | published, MIT |
| Vertical | Persona Engine | Layers relationship and emotion onto an agent's existing persona | published, MIT |
| Vertical | Persona Growth Loop | Grows the persona itself — minimal, idempotent proposals | published, MIT |
| Vertical | X Collector | Turns X and the web into one daily digest — for people and agents | published, MIT |
| Vertical | Self Growth Loop | Lets an agent grow its own abilities — proposals, governance, adoption records | published, MIT |
| Horizontal · foundation | Family Memory Architecture | The memory bus — how the family shares what it knows | published, MIT |
| Horizontal | Sitter | Babysits delegated agent runs — watches, keeps evidence, restarts only within declared bounds | published, MIT |
| Horizontal | Alpha Nightshift | Nightly autonomous maintenance loop — isolated night lanes behind a deny-by-default guard; humans cherry-pick in the morning | published, MIT |
| Horizontal | errmeter | Reports failed or silent AI agents and scheduled jobs across machines — emit, spool, shared board, repair hook; a shout that is never lost | published, MIT |
| Vertical | Caty Gateway | PC-side gateway for CatyPhone — one-line install; pairs your phone with the agent running on your machine (Claude Code / Codex CLI / OpenClaw / Hermes / OpenAI-compatible) | published, MIT |
License
MIT License. We chose a license that lets anyone freely use and build with this, so you can add a front door to your own AI too.
One command | Your usual AI, unchanged | Conversations go only to the AI you chose
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file caty_gateway-0.1.6.tar.gz.
File metadata
- Download URL: caty_gateway-0.1.6.tar.gz
- Upload date:
- Size: 1.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13e637cd009b2f46e4d9a7447c70fd01dbaf762020d747818f719cb02ca8e374
|
|
| MD5 |
e4d27a4e099ef32df2cb69d9fc572f89
|
|
| BLAKE2b-256 |
7d952c3ca702fbc268b7b150d78299b51e2bcc86f690cb4e8dd557e45528f968
|
Provenance
The following attestation bundles were made for caty_gateway-0.1.6.tar.gz:
Publisher:
publish.yml on caty-ai/caty-gateway
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
caty_gateway-0.1.6.tar.gz -
Subject digest:
13e637cd009b2f46e4d9a7447c70fd01dbaf762020d747818f719cb02ca8e374 - Sigstore transparency entry: 2750118620
- Sigstore integration time:
-
Permalink:
caty-ai/caty-gateway@8c8fd6dc7b10f78af84e8329d6e6196ecdb52388 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/caty-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8c8fd6dc7b10f78af84e8329d6e6196ecdb52388 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file caty_gateway-0.1.6-py3-none-any.whl.
File metadata
- Download URL: caty_gateway-0.1.6-py3-none-any.whl
- Upload date:
- Size: 1.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8825d26ac74f1090282756ac38831d87e7bca642ca30180deba1f9c96ac08d0
|
|
| MD5 |
5063ce2a7abd2466c8e010eafa599638
|
|
| BLAKE2b-256 |
9835881bab1266d51acba168ef77573e1b0e7ba3a8d64e643bcd26ff779835ab
|
Provenance
The following attestation bundles were made for caty_gateway-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on caty-ai/caty-gateway
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
caty_gateway-0.1.6-py3-none-any.whl -
Subject digest:
b8825d26ac74f1090282756ac38831d87e7bca642ca30180deba1f9c96ac08d0 - Sigstore transparency entry: 2750118646
- Sigstore integration time:
-
Permalink:
caty-ai/caty-gateway@8c8fd6dc7b10f78af84e8329d6e6196ecdb52388 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/caty-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8c8fd6dc7b10f78af84e8329d6e6196ecdb52388 -
Trigger Event:
workflow_dispatch
-
Statement type: