文档Docs
数据安全Data security
我们看不到什么、能看到哪些信息、为什么;Beta 版还没做到的地方也写在这里。What we can't see, what we can see and why — and what the Beta doesn't do yet.
先说结论:你和 Agent 说的话、它回你的话、它要你批准的内容,我们都看不到(唯一的例外见下一段)。 这些内容在你的手机和你的电脑之间端到端加密,只有这两端能解开。你现在买到的 Beta,所有用户都是这样:文字、图片、文件和语音都加密。我们的服务器只负责转发,拿到的是看不懂的乱码。
唯一的例外是网页版:手机上的网页是我们的服务器发下来的,万一我们(或黑进我们服务器的人)改了网页,就能看到你手机屏幕上的内容。详见下面「Beta 版还没做到的」。
下面分三块说:我们看不到什么,我们能看到什么,Beta 版还有哪些没做到。
我们看不到的
- 你在手机上发的每一条消息,以及图片、文件和语音;
- Agent 的回复和它的工作状态;
- 审批卡片上的内容,以及你点了批准还是拒绝;
- 配对用的 6 位码、配对链接、你的遥控器配对密码;
- 你电脑上的文件、Agent 的工作成果、它的记忆、聊天记录和操作记录;
- 你在工作流设计向导里的回答,以及它生成的文件;
- 你在手机卡片上输入的管理员密码和粘贴的 API key。
为什么看不到:
- Telegram 机器人上的客人和你分开。 如果你让 Agent J 的 Telegram 机器人也接待客人(默认关闭),只有你配对的私聊进主 Agent;其他人都交给你选的客服 bot,独立会话、独立限额和审核,聊天只存在你电脑上这个 bot 的会话里。
- 加手机必须经过你。 新手机要配对,三条路都要你本人:在账户页用通行密钥或那台电脑的遥控器配对密码确认;在你的电脑终端输入手机显示的 6 位码和遥控器配对密码;或者在已配对的手机上确认。你电脑上的 AI 没法替你加手机。账户页这条路依赖签名控制平面,被攻破时可能加手机,见下文;用
agentj remote-pair off可以关掉它。
发给你自己的显示什么、遮住什么
发给你本人的内容不打码。是不是发给本人,由 Agent J 按目的地判断,不靠 Agent 自觉。包括:你已配对的手机和网页、Telegram 里你和自己的 bot 的私聊、通讯录 0 号位里你的邮箱(以及邮件通道里标成「我本人」的邮箱)。
- 原样送达:邮箱、电话号码、人名、地址、文件路径、内网地址、链接(带参数的也一样)、访问码、一次性验证码、报告授权码。这些码本来就是要你拿去用的,遮了反而用不了。
- 仍然不发明文:API key、token、私钥、密码、助记词这类真正的凭据。邮件和 Telegram 都存在第三方服务器上,泄露面大,所以发给你自己也不带它们:Agent J 会把凭据从正文里拿掉,原处留一句说明,同时在你的手机上弹出一张密钥领取卡,用 Face ID 打开。手机和网页上,这类长串显示成
<redacted>;要把密钥交给你,Agent 用agentj secret send发领取卡。
发给别人的照旧严格脱敏,邮箱和电话也会遮:反馈、广场、客服、好友、客服 bot、Telegram 群、公开的网页报告,以及收件人里有任何一个不是你本人的邮件。
别人能看到的
有些服务本来就会经手你的内容,这跟我们无关,但你应该知道:
- AI 公司(Anthropic、OpenAI、智谱、DeepSeek 等):对话要交给模型处理,所以厂商能看到,订单、买家信息出现在对话里也一样。对话从你的电脑直接发给它们,用的是你自己的账号,不经过我们。它们怎么保存数据,以它们的隐私政策为准,比如 Anthropic 的隐私政策、OpenAI 的隐私政策。
- 你让 Agent 用的其他服务:比如电商平台、邮件、出图工具,各自能看到它们处理的那部分。
- 锁屏提醒:由 Google、Apple 或 Mozilla 的推送服务送到你手机上。它们知道你的电脑在什么时间给这部手机发过一条提醒,但提醒里只有「有新回复」或「有一个请求等你批准」,没有内容。
- 遥控器都不在线时的提醒:有审批卡在等你、而你的遥控器都不在线时,如果你接了 Telegram 或设好了邮箱,Agent J 会往你的 Telegram 私聊和你自己的邮箱发一句提醒,只说有几张卡在等你,不写卡片内容。Telegram 和你的邮箱服务商能看到这一句。
- GitHub(一个存放代码的网站):电脑上的程序每天会去 GitHub 查一次有没有新版本,GitHub 能看到你电脑的 IP、时间和程序版本。不想让它查:在电脑上运行
agentj update auto off。 - 云服务器:如果你把 Agent 装在自己租的云服务器上,能登录你云账号控制台的人,可以读到服务器上的文件。云账号有多安全,这台服务器就有多安全。
我们能看到的
为了让账号、付费和连接能用,我们能看到下面这些信息。它们不是你的对话内容,但我们照实列出来:
| 类别 | 我们能看到什么 |
|---|---|
| 账号 | 你的邮箱、通行密钥的公钥、登录时间 |
| Agent J 账号 | 账号 ID、团队名称(如果填了)、成员的邮箱 |
| Agent | 你给 Agent 起的名字;电脑的名字(可以关掉:在电脑上运行 agentj report-hostname off);在不在线;配了几部手机、手机自己起的名字、配对时间;电脑上程序的版本 |
| 付款 | 订阅状态、席位数、账单结果。卡号只在 Stripe,我们看不到 |
| 发给别人的席位 | 状态、时间、你填的对方邮箱、谁打开了链接、加入的是哪台电脑。设置码本身我们只存一个校验值,看不到原文 |
| 连接 | 哪台电脑在什么时间连了我们的转发服务器、IP、每次传输的大小和时间(内容补齐成固定大小,减少从长度猜内容) |
| IP | 用来防止滥用,打乱后保存,看不出原来是什么,48 小时后删除 |
| 模板下载 | 哪台电脑在什么时间要过模板(48 小时后删除) |
| 反馈 | 你同意发给我们的反馈原文。这是故意让我们看的,发之前已经去掉了敏感信息 |
| 广场 | 你同意公开的帖子和回复。所有有付费席位的账号都能看到,我们也能 |
| 客服 | 你的 Agent 主动问客服的内容(发出前已经去掉密钥、邮箱、电话、用户名和路径),以及它选择附上的 agentj doctor 自检结果。你的对话、文件和密钥,客服看不到。见 遇到问题找客服 |
| 官方通知 | 每条通知送到了哪些电脑、什么时候送到、什么时候在手机上读过;为了决定发给谁,还看得到每台电脑的 Agent J 版本、用的哪个 AI 编程工具、在不在线、配了几部手机。看不到对话、邮箱、电脑和手机的名字。见 官方通知 |
| 广场里的技能和工作流 | 你同意分享的包的全部文字(所有有付费席位的账号都能下载,我们也能读);哪台电脑装了哪个包的哪个版本;哪个账号点赞或举报了哪个包。看不到装好的东西在你电脑上做了什么 |
Beta 版还没做到的
这些地方我们现在还做不到,或者还没法让你自己核对:
- 手机上的网页由我们的服务器下发。 加密在网页里完成。如果我们(或者黑进我们服务器的人)改了网页代码,就能看到你在这个页面上看到的内容。我们的目标是「网页被改了你会知道」,但 Beta 版还没做到:还没有签名的公开发布记录,你还没法独立核对手机上加载的就是公开的那一版。点开页面顶部的「网页版」标识,能看到这段说明和当前版本的校验值。
- 没有原生 App。 原生 App 能把界面打包、签名后发给你,不用每次从我们这里取。这是之后的计划,现在还没有。
- 程序更新还没有数字签名。 安装说明靠「网站上的那份、网站公布的校验值、GitHub 上公开的那份三处一致」来防篡改;电脑端程序装的是 GitHub 上一个固定的版本标签,安装说明里写着它的校验值。这些都比签名弱。电脑端程序、手机网页版和安装说明的代码在 GitHub 上公开;账号后台、转发服务器和网站的代码还没公开。升级方式由你选:默认收到我们签名的新版本通知后,Agent 会自动升级再告诉你,也可以改成先问你;紧急安全修复总是马上升级。
- 没有第三方审计。 现在靠的是我们自己的自动化测试,和两个 AI 模型交叉做的安全检查,这代替不了独立安全公司的审计。Beta 期间没有独立第三方审计,做完会在数据安全页上公布。
- 隔离不是万能的。 Agent 和你的电脑共用网络。如果你电脑上开着某些接受你身份的本地服务(比如本机的 SSH、浏览器调试端口),你批准过的命令仍可能借它们绕出去。详见下面的技术细节。
- Codex 里你以前存过的「总是允许」规则,匹配到的命令按 Codex 自己的规则直接执行,不会问手机。
agentj doctor会数出你有几条,删不删由你决定。
我们不会说「绝对安全」「零知识」或者「任何人都看不到你的数据」。模型厂商看得到对话,我们看得到上面那张表里的信息,这是实情。
技术细节
这一节写给想深究的人和你的 AI,会用到一些术语。
加密与配对
- 手机和电脑之间是端到端加密。配对时,用 Noise IKpsk2 握手(一种公开的加密握手协议,两台设备借它商量出只有彼此知道的钥匙)。之后每次连接用 Noise IK,每条消息单独加密和校验。会话密钥只在两端。所有用户都走这条加密通道,没有不加密的备用通道。
- 二维码由你的电脑生成,里面是电脑的公钥和一次性的配对密钥,5 分钟有效、只能用一次。手机显示的 6 位码由握手结果算出,你在电脑上输入,两边一致才算数;再加上遥控器配对密码(电脑上只存它的 scrypt 哈希:一种故意算得很慢的单向摘要,拿到也很难反推出口令;连续输错 5 次会锁定,锁定时间逐次加倍)。
- 转发服务器运行在 Cloudflare Workers 和 Durable Objects 上,只按通道号配对两端,原样转发加密帧,每帧补齐到 256 字节。它不存帧、不写内容日志、不持有任何密钥。你的电脑只向外连接,不开任何入站端口。
- 电脑连上转发服务器时要出示一张由账号服务签发的席位证书,里面只有通道号和到期时间(最长 3 天),没有账号和电脑的信息。没有有效席位的电脑连不上;账号服务暂时连不上时,电脑用手里的证书继续工作到期满。
批准
- 配对时手机生成一把不可导出的签名密钥(浏览器自带的加密功能 WebCrypto,Ed25519 签名算法)。每次批准或拒绝,手机都对「这台电脑、这部手机、请求编号、批或拒、内容摘要的哈希」签名,电脑核对后才执行,并写进本机的 approvals.log(只记哈希)。
agentj approvals --verify可以逐条重新核对。按「全放行」档位或「设了目标就不弹窗」自动批准的,以及你批准了离线时留下的卡后 Agent 重试执行的,记录里都会指回手机上那次签名确认,同样能核对。电脑每次用到「全放行」都会用那部手机现在的批准密钥重新核对这次签名,核对不过(比如配置文件是手改的,或者那部手机已解绑)就按「中等」处理。 - 删除记忆、全部停下、恢复、启用定时任务这些手机上的操作,也一样要签名。
- 额外的高危提醒(花钱、删除、对外发送、改密码或密钥、改价格)是可选的,默认关闭,可以在手机「设置」里打开。你的 AI 编程工具自己的权限规则一直生效;它要问权限时,问题会送到你手机上,Agent J 绝不替你回答。
共享会话里,只读取凭据而不显示(程序按名字读 .env)不再弹审批卡;改凭据、把凭据显示到屏幕上仍然要你在手机上点头,卡片不带具体内容。agentj config approvals strict 可以换回只要碰到凭据就问的旧规则。
隔离
- 独立会话里,Agent 在 Linux 上用 bubblewrap(一个开源的进程隔离工具)、在 macOS 上用系统自带的 sandbox-exec 沙箱运行。它用你的系统用户和登录,可以改你的 shell 和应用配置、管理它自己的后台服务,但看不到 agentj 的状态目录、密钥、手机名单和口令;ssh-agent 接口、别的终端会话(tmux、herdr、screen、zellij 等)和 docker / podman 默认对它隐藏。手机「设置」里可以允许 docker,也可以关掉隔离。
- 隔离起不来时(比如没装 bubblewrap),Agent 不会启动,不会悄悄裸跑。手机卡片会说明原因和修法;点「本次不隔离运行」并用主人的通行密钥验证,才放行这一次,下次启动照样检查隔离。
- 隔离不是一堵文件墙:Linux 上整个文件系统按原样挂进隔离(bubblewrap 的
--dev-bind / /),除了上面隐藏的几处,你的用户能读写的文件,Agent 也能读写。 - 剩下的风险:共用网络;启动后新开的、不在清单里的本地控制接口遮不住;为了让 Agent 管理自己的后台服务,你的用户服务管理器和会话总线(D-Bus)接回了隔离里,所以它经会话总线能找钥匙串要密钥,经服务管理器启动的程序在隔离之外运行;macOS 上没有进程隔离,Agent 能看到同一用户其他进程的命令行和环境变量(agentj 不在环境变量里放密钥)。
- Agent J 专用浏览器本来就是给 Agent 用的,它靠这个浏览器替你上网办事。这个浏览器的调试端口每次启动随机选,只在 127.0.0.1 上监听;它的资料目录在隐藏的 agentj 文件夹里,Agent 拷不走里面的文件。但调试协议没有密码,Agent 又和你共用网络,所以 Agent(或者任何以你的用户身份运行的程序)能经这个端口使用在里面登录过的网站,包括 cookie。你自己登记的浏览器(比如开在 9222 端口的那个)也一样。只在里面登录你愿意让 Agent 使用的网站。
- Codex:通过 codex app-server 驱动,沿用你自己的 Codex 审批和沙箱设置,Agent J 不另加规则。Codex 要问权限时,问题会送到你手机上。
五项保证的现状
| 保证 | 现状 |
|---|---|
| 手机和电脑之间端到端加密,我们不持有会话密钥 | 文字、图片、文件和语音都已上线,还不能由你独立核对 |
| 中继只见密文,伸不进你的电脑 | 已上线,还不能由你独立核对 |
| 显示明文的代码不由我们临时下发 | 还没做(需要原生 App) |
| 到达你电脑的代码都签名、公示,由你决定装不装 | 还没做签名和发布日志;升级方式由你选(自动或先问你,安全修复总是马上升级) |
| 凭据和主密钥只在你那一侧 | 手机上的密钥卡把 key 加密后直接存进你电脑上的文件;我们不存你的 key |
自动登录凭证(0.17.4)
为了让手机配对一次就一直能用,你的电脑会给这台手机发一个自动登录凭证,经加密通道送到手机,由 m.agentj.app 存成只给这个网址用的 Cookie:页面脚本读不到,也不会随别的请求发出去。手机丢了网页数据时,我们的网页服务只用它算出一个一次性的证明,证明只对这台手机新生成的钥匙有效,凭证本身不会再回到页面里;真正核对的是你的电脑。我们不保存、不记录它。要说清楚的是:网页服务在那一刻经手这个凭证,所以如果网页服务被改坏,理论上可以抢走这台手机的位置。真发生了,原来的手机会马上看到「另一边接管了」;电脑解绑手机后,凭证立即作废。
从另一台电脑给席位添加遥控器
目标电脑安装完成、绑定账号且在线后,在账户页找到它的席位卡,点「添加遥控器」,确认是你本人后用手机扫码即可,不用去目标电脑的终端。确认方式二选一:通行密钥(这台电脑上没有的话,在弹窗里选「使用手机或平板」,用手机确认);或者输入那台电脑的遥控器配对密码。用通行密钥确认后,同一会话十分钟内免重复确认;二维码五分钟内只可添加一台设备。待批准设备也可在席位卡查看、批准;席位卡「更多」里的「查看电脑上等你处理的事」只在两种时候用:电脑被「全部停下」后要恢复,或 Agent 新建的定时任务等你启用;它跟席位和付费无关,欠费也不会停掉电脑上的任务。
默认允许账户页添加;目标电脑的主人可用 agentj remote-pair off 关闭。离线时不排队,开机后重试;旧版本按提示运行 agentj update apply 或从已有手机升级。新设备来源显示「经账户页添加」,其他遥控器收到通知。
账户页配对依赖签名控制平面。配对材料只以浏览器临时公钥加密回传,后端不保存明文;主机只核对控制平面的签名,不自己核对你的通行密钥:签名服务被攻破,仍可能给这台电脑加一部手机、解除「全部停下」、启用定时任务或给遥控器改名,而不经过电脑上的确认。新设备会通知你已有的手机;关掉开关(agentj remote-pair off)就拒绝这条路径。遥控器配对密码只在那台电脑上散列保存。在账户页输入它时,浏览器先用那台电脑临时给出的一次性公钥把它加密,只有那台电脑能解开、核对;我们的服务器只转发看不懂的密文,也不保存。连续输错 5 次,那台电脑会锁定一段时间。
公开客服 bot(0.17 候选)
主人可以在已配对手机的 /bots 管理客服,或让 Agent J 用 agentj-bots 技能配置产品资料、固定价格表和公司 HTTP API。公开网址 /bots/<名字> 与网页嵌入免费;主人电脑必须在线,访客不能进入主对话或审批通道。AI 回复可能有误,主人应审核对外资料和业务范围。
聊天、知识、工具定义和会话记录都在主人电脑。访客与电脑间的消息使用独立加密协议;云端只保存公共名字、展示资料、状态、限流和举报元数据。聊天默认保留 30 天,举报元数据保留 90 天。举报只传请求编号和类别,不上传聊天正文。首次访问仍信任网站提供的页面与公钥,不能防止恶意网页发布方替换页面。
Bot 共享主 Agent 当前使用的工具和套餐,支持 Claude Code、Codex、Gemini、OpenCode 及 key 型接入。个人订阅用于对外服务可能受服务商条款限制,主人须先确认并勾选风险提示。也可通过手机密钥卡添加自带 key。模型请求从主人电脑发给所选服务商;若选择 AgentsRelay,会经其中转,其政策是不记录请求和响应正文,这属于政策保证,不代表技术上看不到。Jev 审核必须使用主人自己的 OpenRouter 账户和 key,启用前真实验证 decisions,审核费用由该 OpenRouter 账户承担。模型服务商和 OpenRouter 会收到必要上下文,数据处理遵循各自政策。缺少 key、审核失败或不确定时停止外发,人工回复也过同一闸门。
默认每访客每天 20 条、每 bot 每天 100 条,主人跨 bot 每天合计 100 条和 100k 模型 tokens,审核与工具调用也计入预算;每席位最多一个启用 bot,并发默认 4、最多 16。主人可调低限额,超限或离线时礼貌停服。名字为小写字母、数字或连字符,3–32 位;保留词不能注册,改名或下架后旧名冻结 30 天。
查询工具只能访问主人批准的 HTTPS 域名;响应按字段白名单和长度截断。鉴权密钥只在主机运行时注入,不交给模型。访客自报订单号或邮箱只用于会话绑定,不等于身份核验;公司 API 仍须验证该客户是否有权访问记录。写入工具默认关闭,启用后每次调用都需主人在已配对手机批准。访客文字、知识和工具返回都不能授权修改配置、读取其他访客或泄露密钥;不支持 shell、任意文件或任意网址工具。Turnstile 只在独立验证页面运行,不接触聊天正文。
匿名访客的会话钥匙按 bot 存在独立的浏览器存储页面里,私钥不能导出。这个页面通过浏览器内部通道把钥匙交给隔离的聊天页面,父页面、人机验证页面和服务器都拿不到钥匙或聊天内容。24小时没有活动后会开启新会话;如果浏览器禁止跨站存储,刷新也会开启新会话。
The short version: we can't see what you say to your Agent, what it says back, or what it asks you to approve (the one exception is in the next paragraph). That content is end-to-end encrypted between your phone and your computer, and only those two can read it. In the Beta you can buy today, that holds for everyone, and for text, pictures, files and voice alike. Our server just passes it along; to us it is unreadable noise.
The one exception is the web app: the phone web page comes from our servers, so if we (or someone who broke into our servers) changed it, it could read what's on your phone screen. More under "What the Beta doesn't do yet" below.
Below: what we can't see, what we can see, and what the Beta doesn't do yet.
What we can't see
- the messages you send from your phone, and the pictures, files and voice;
- the Agent's replies and what it is busy with;
- what an approval card says, and whether you approved or denied it;
- the 6-digit pairing code, the pairing link, your remote pairing password;
- the files on your computer, the Agent's work, its memory, the conversation history and its activity record;
- your answers to the workflow design wizard and the files it writes;
- the admin password you type and the API keys you paste into a card on your phone.
Why we can't:
- The content is encrypted. When a phone is paired, it and your computer each make keys that never leave them. Every message is encrypted with those keys. Our server only connects the two ends by a number and forwards the encrypted data unchanged.
- Your things stay on your computer. The conversation history, memory, the activity record, approvals, scheduled tasks and the Agent's work are stored on your computer. When your phone shows them, it fetches them from your computer over the encrypted connection; nothing is kept on our server. Don't want the conversation kept on the computer? Run
agentj config history off. - Local speech stays on your devices. Local ASR runs on your computer and local read-aloud runs on your phone or computer. If you choose cloud ASR (OpenRouter or OpenAI) or cloud TTS (OpenAI or ElevenLabs), your computer sends the audio or text directly to that provider with your own key. Audio between your phone and computer passes through our relay as encrypted data. Telegram is optional and is not end-to-end encrypted; Telegram can read that channel.
- Guests on your Telegram bot stay apart from you. If you let your Agent J Telegram bot receive guests (off by default), only your paired private chat reaches your main Agent. Every other chat goes to the customer-service bot you chose, with its own session, limits and reviews, and is kept with that bot's conversations on your computer.
- Adding a phone always goes through you. All three ways need you: confirm on the account page with your passkey or the target computer's remote pairing password; type the phone's 6-digit code and the remote pairing password in that computer's terminal; or confirm on a paired phone. The AI on your computer can't add a phone. The account route trusts the signed control plane, whose compromise could add a phone (see below); disable it with
agentj remote-pair off. - Face ID only recognises a phone you already approved. After pairing you can choose to remember the phone with Face ID (a passkey). The passkey stays on your phone (on an iPhone, in iCloud Keychain); your computer keeps only its public key, next to that phone's pairing record, and we never receive it. Reconnecting later with Face ID — from the Home Screen app or a new private tab on the same phone — only takes over that record: no extra phone, no extra rights. Unpairing the phone on your computer cancels its Face ID record too. iCloud Keychain syncs the passkey to your other Apple devices on the same Apple ID; they can reconnect the same way (again only taking over that record).
- Files the Agent shows you are encrypted too. Images, audio, video, PDFs, web pages and files the Agent mentions in a reply travel encrypted from your computer straight to your phone; our server sees only how much data and when, never names or content. Only files inside the Agent's working folder are sent;
.env, private keys, certificates and anything that looks like it holds a secret are never sent. On the phone they live in memory only and are gone when you close the page, unless you download or share them yourself. - Messages queued offline are encrypted. What you send without a connection is kept encrypted on the phone and deleted once it has gone out; unpairing clears it too.
- The AI can't reach the approve button. The Agent runs under your computer account and can read and write your files, so it can do its work; but it is fenced off: it can't see the keys of
agentj, the list of phones or your passphrase. - Agent J puts no locks of its own on the Agent. What it may do, and when it has to ask you, follows the permission rules of your AI coding tool. Agent J only holds the data-safety floor: keys never go into the chat, logs, git or an unencrypted channel; pairing and approvals need your phone's signature; nobody else's data is touched. When an admin password or an API key is needed, you enter it in a card on your phone and the Agent never sees it — see Admin rights and API keys, from your phone.
What reaches you, and what stays hidden
What goes to you yourself is not masked. Agent J decides whether a message goes to you from its destination, not from the Agent's judgement: your paired phones and web pages, your private chat with your own Telegram bot, and the e-mail in slot 0 of your address book (plus any address marked as yourself in the e-mail channel).
- Delivered as written: e-mail addresses, phone numbers, names, postal addresses, file paths, local network addresses, links (query strings included), access codes, one-time codes and report authorization codes. These are meant for you to use; masking them would only get in your way.
- Never in plain text: real credentials — API keys, tokens, private keys, passwords, seed phrases. E-mail and Telegram are stored on third-party servers, so even mail or messages to yourself leave them out: Agent J takes the credential out of the text, leaves a short note in its place and puts a secret pickup card on your phone, opened with Face ID. On the phone and web page these strings show as
<redacted>; to hand you a secret the Agent usesagentj secret send, the same pickup card.
Everything that goes to anyone else stays strictly redacted, e-mail and phone numbers included: feedback, the plaza, support, friends, customer-service bots, Telegram groups, public web reports, and any mail with even one recipient who is not you.
Who else sees something
Some services handle your content by their nature. That isn't us, but you should know:
- The AI company (Anthropic, OpenAI, Zhipu, DeepSeek and others): the conversation has to go to the model, so the vendor sees it, including any orders or buyer details in it. It goes straight from your computer to them, under your own account — not through us. How they store data is governed by their privacy policies, for example Anthropic's privacy policy and OpenAI's privacy policy.
- Other services you let the Agent use — a marketplace, email, an image tool — each see the part they handle.
- Lock-screen alerts are delivered by Google's, Apple's or Mozilla's push service. They learn that your computer sent this phone an alert at a certain time, but the alert only says "New reply" or "A request is waiting for your approval" — no content.
- The reminder when no remote is online: when an approval card is waiting and none of your remotes is online, and you've connected Telegram or set up the e-mail channel, Agent J sends one line to your private Telegram chat and your own inbox. It says only how many cards are waiting, never what they ask. Telegram and your mail provider can read that line.
- GitHub (a website that hosts code): the program on your computer checks GitHub once a day for a newer version, so GitHub sees your computer's IP address, the time and the program's version. To stop it, run
agentj update auto offon the computer. - Your cloud provider: if the Agent runs on a cloud server you rent, anyone who can get into your cloud console can read the files on that server. The server is only as safe as your cloud account.
What we can see
To run accounts, billing and connections, we see the following. None of it is your conversation, but here it all is:
| Area | What we see |
|---|---|
| Account | your email address, the public part of your passkeys, sign-in times |
| Agent J account | account ID, team name (if you gave one), members' email addresses |
| Agents | the names you gave them; the computer's name (switch off by running agentj report-hostname off on the computer); online or not; how many phones, the names the phones gave themselves, when they were paired; the program version on the computer |
| Billing | subscription status, number of seats, invoice results. Card numbers stay with Stripe; we never see them |
| Seats sent to someone else | status, times, the email address you typed, who opened the link, which computer joined. Of the setup code itself we keep only a fingerprint, never the code |
| Connections | which computer connected to our relay server when, its IP address, and the size and timing of each transfer (content is padded to fixed sizes so lengths give little away) |
| IP addresses | for abuse protection, scrambled before storing so the original can't be read back, and deleted after 48 hours |
| Template downloads | which computer asked for templates and when (deleted after 48 hours) |
| Feedback | the reports you agreed to send us — meant for us to read, with sensitive details removed first |
| Plaza | the posts and replies you agreed to publish — every account with a paid seat can read them, and so can we |
| Support desk | what your Agent asks the support desk (keys, email addresses, phone numbers, user names and paths are removed before it leaves), plus the agentj doctor output if it chose to attach it. Not your conversations, files or keys. See Getting help from the support desk |
| Official notices | which computers each notice reached, when, and when it was read on a phone; to decide who gets a notice, each computer's Agent J version, which AI coding tool it uses, whether it's online and how many phones it has. Not conversations, email addresses, or the names of computers and phones. See Official notices |
| Plaza skills and workflows | the full text of packages you agreed to share (every account with a paid seat can download them, and we can read them); which computer installed which version of which package; which account liked or reported which package. Not what an installed package does on your computer |
What the Beta doesn't do yet
Some things we can't do yet, or can't yet let you check for yourself:
- The phone page comes from our server. The encryption happens inside that page. If we — or someone who broke into our servers — changed the page's code, it could see what you see on that page. Our goal is "if the page is changed, you'll know"; the Beta isn't there yet: there is no signed public release record, so you can't independently check that your phone loaded the published version. Tap the "Web app" badge at the top of the page to see this explanation and the current version's fingerprint.
- No native app. A native app would ship its screens signed and packaged instead of fetched from us each time. That is planned, not available.
- Updates aren't digitally signed yet. The install guide is protected by three copies agreeing — the one on our site, its published fingerprint and the public copy on GitHub; the program on your computer is installed from one fixed version tag on GitHub, and the install guide carries its fingerprints. All of that is weaker than a signature. The code for the program on your computer, the phone web app and the install guide is public on GitHub; the account dashboard, the relay server and the website aren't public yet. You choose how upgrades happen: by default, when a signed notice about a new version arrives, the Agent upgrades and then tells you; you can switch to being asked first. Urgent security fixes always upgrade right away.
- No third-party audit. So far we rely on our own automated tests and a security check by two AI models cross-reviewing each other, which is no substitute for an independent security firm. There's no independent third-party audit during the Beta; when one is done, it will be published on the data security page.
- The fence isn't perfect. The Agent shares your computer's network. If your computer runs local services that trust you — a local SSH server, a browser's debugging port — a command you approved could still use them to get out. Details below.
- Codex "always allow" rules you saved earlier let matching commands run without asking your phone, by Codex's own design.
agentj doctorcounts them; whether to delete them is your call.
We won't call it "absolutely secure", "zero-knowledge" or say "nobody can see your data". The model vendor sees your conversations and we see what's in the table above. That's the honest picture.
Technical details
For the curious, and for your AI. Some jargon ahead.
Encryption and pairing
- Phone and computer are end-to-end encrypted: pairing uses a Noise IKpsk2 handshake (a published encryption handshake that lets two devices agree on keys only they know), every later connection Noise IK, and each message is encrypted and authenticated on its own. Session keys exist only at the two ends. Everyone uses this encrypted channel; there is no unencrypted fallback.
- The QR code is generated on your computer and holds the computer's public key and a one-time pairing key (single use, 5 minutes). The 6-digit code on the phone is derived from the handshake; you type it on the computer and it must match. Then the remote pairing password (the computer stores only its scrypt hash, a deliberately slow one-way digest that is hard to turn back into the passphrase; 5 wrong tries in a row lock pairing, each lock longer than the last).
- The relay server runs on Cloudflare Workers and Durable Objects. It pairs the two ends by channel number and forwards encrypted frames unchanged, each padded to 256 bytes. It stores no frames, logs no content and holds no keys. Your computer only connects outwards and opens no inbound port.
- When your computer connects to the relay it shows a seat certificate signed by the account service. It holds only the channel number and an expiry time (at most 3 days), nothing about your account or computer. A computer without a valid seat cannot connect; if the account service is briefly unreachable, the computer keeps working on the certificate it holds until it expires.
Approvals
- At pairing the phone creates a non-exportable signing key (WebCrypto, the browser's built-in cryptography, with Ed25519 signatures). Every approve or deny is signed over "this computer, this phone, the request number, approve or deny, a hash of what you saw". The computer verifies it before acting and writes it to its local approvals.log (hashes only).
agentj approvals --verifyre-checks every entry. Steps approved automatically under the Full access level or "Goal mode: no cards", and a retry that ran because you approved a card left while you were offline, each point back to the signed confirmation on your phone and are checked the same way. Each time Full access is used, the computer re-checks that signature against the phone's current approval key; if it fails (the configuration file was edited by hand, or that phone was unpaired), Standard applies. - Deleting memory, Stop everything, resuming and enabling scheduled tasks from the phone are signed the same way.
- Extra high-risk warnings (spending, deleting, sending out, changing passwords or keys, changing prices) are optional and off by default; switch them on in the phone's Settings. Your AI coding tool's own permission rules always apply, and Agent J never answers one of its permission questions for you: those come to your phone.
In a shared session, a credential that is only read and not shown (a program reading .env by name) no longer raises an approval card; changing one or printing one on the screen still needs your OK on the phone, and the card never carries their contents. agentj config approvals strict restores the old rule that asks whenever a credential is touched.
The fence
- In an independent session the Agent runs inside bubblewrap (an open-source process isolation tool) on Linux, the built-in sandbox-exec sandbox on macOS. It keeps your user account and sign-ins, may change your shell and app settings and manage its own background services, but can't see the state folder of agentj, its keys, the phone list or the passphrase; the ssh-agent socket, other terminal sessions (tmux, herdr, screen, zellij and others) and docker / podman are hidden by default. The phone's Settings can allow docker or turn the isolation off.
- If the fence can't start (bubblewrap missing, for example), the Agent does not start; it never silently runs unfenced. The phone card names the cause and the fix. Run this launch without isolation, confirmed with the owner's passkey, allows that one launch only; the next launch checks the fence again.
- The fence is not a file wall: on Linux the whole filesystem is mounted as it is (bubblewrap
--dev-bind / /). Apart from the hidden places above, any file your user can read or write, the Agent can too. - What remains: the shared network; local control sockets opened after start in folders not on the list; so the Agent can manage its own services, your user service manager and session bus (D-Bus) are bound back in, so it can ask the keyring for secrets over the session bus, and a program it starts through the service manager runs outside the fence; on macOS there is no process isolation, so the Agent can see other processes' command lines and environment for the same user (agentj keeps no secrets in its environment).
- Agent J's own browser is meant to be driven by the Agent: that is how it does web work for you. Its debugging port is picked at random at every start and listens on 127.0.0.1 only, and its profile sits inside the hidden agentj folder, so the Agent can't copy the profile's files; but the debugging protocol has no password and the Agent shares your network, so the Agent, or any program running as your user, can use the sites signed in there, cookies included, through that port. A browser you registered yourself (for example one on port 9222) works the same way. Sign in there only to sites you want the Agent to use.
- Codex is driven through codex app-server with your own Codex approval and sandbox settings; Agent J adds no policy of its own. When Codex asks for permission, the question comes to your phone.
The five guarantees today
| Guarantee | Status |
|---|---|
| End-to-end encryption between phone and computer; we hold no session keys | live for text, pictures, files and voice; not yet independently verifiable |
| The relay sees only ciphertext and can't reach into your computer | live; not yet independently verifiable |
| The code that shows plaintext isn't served by us on the fly | not done (needs a native app) |
| Everything that reaches your computer is signed and published; you decide what to install | no signatures or release log yet; you choose how upgrades happen (automatic or ask first; security fixes always right away) |
| Credentials and master keys stay on your side | the key card on your phone saves a key, encrypted on the way, straight into a file on your computer; we store none of your keys |
The full itemised version (every table, every retention period) is on the Data security details page. Found a security problem? See Contact.
Automatic sign-in token (0.17.4)
So that a phone stays paired after one pairing, your computer gives it an automatic sign-in token. It travels through the encrypted channel and m.agentj.app keeps it as a cookie for that site only: page scripts cannot read it and no other request carries it. When the phone has lost the page's data, our web service uses it only to compute a one-time proof that is valid for this phone's new keys; the token itself never goes back to the page, and your computer does the checking. We neither keep nor log it. To be plain: our web service handles the token at that moment, so a tampered web service could in theory take this phone's place. If that happened, the original phone would immediately show that another one took over; unpairing the phone on your computer cancels the token at once.
Add a remote for another computer
Once the target computer is installed, account-bound and online, find its seat card on your account page and choose Add a remote. Confirm it's you, then scan with the phone; the target computer's terminal isn't needed. Confirm either way: with your passkey (none on this computer? choose Use a phone or tablet in the prompt and confirm on your phone), or with that computer's remote pairing password. After a passkey confirmation, the same session doesn't ask again for ten minutes; the QR expires after five minutes and adds one device. Pending devices can also be reviewed and approved on the seat card. Under More on the seat card, See what the computer is waiting on you for is only for two cases: resuming after Stop everything, or enabling a scheduled task the Agent created. It has nothing to do with seats or billing; an unpaid bill never stops the tasks on your computer.
Account-page pairing is on by default. The target computer’s owner can disable it with agentj remote-pair off. Offline hosts are never queued; turn them on and try again. Older hosts must run agentj update apply or update from a paired phone. Devices record “Added from account page” and other remotes receive a notice.
This route trusts the signing control plane. Pairing material is encrypted to an ephemeral browser key and its plaintext is never stored by the backend; the host checks the control plane's signature, not your passkey itself: a compromised signing service could add a phone to this computer, lift Stop everything, enable a scheduled task or rename a remote without any confirmation on the computer. Your existing phones are notified of a new device; agentj remote-pair off refuses this route. The remote pairing password is stored only on that computer, as a hash. When you type it on the account page, the browser first encrypts it to a one-time public key that computer just handed out; only that computer can open and check it. Our servers pass on ciphertext they can't read and keep nothing. Five wrong tries in a row lock it on that computer for a while.
Public customer-service bots (0.17 candidate)
Owners manage bots on the paired phone /bots, or ask Agent J to use agentj-bots for product manuals, fixed price lists and company HTTP APIs. The public /bots/<name> URL and website embedding are free. The owner computer must be online. Visitors cannot enter the main conversation or owner approval channel. AI answers can be wrong; owners must review public knowledge and business scope.
Chats, knowledge, tool definitions and conversation records stay on the owner computer. Visitor messages use a separate encrypted protocol to that computer. Cloud services hold public names, display metadata, status, rate limits and report metadata only. Chat retention defaults to 30 days and report metadata to 90 days. Reports contain a request ID and category, never chat text. First contact still trusts the website page and public-key binding; a malicious page publisher can replace them.
Bots share the main Agent’s current AI app and account plan, including Claude Code, Codex, Gemini, OpenCode and key providers. The owner must confirm provider terms: public use of a personal subscription may be restricted. Optional own-key profiles remain available through the phone secret card. Requests go from the owner computer to the chosen model provider. If that provider is AgentsRelay, requests pass through it; its policy is not to record request or response bodies, a policy assurance rather than technical inability to see them. Jev reviews require the owner’s own OpenRouter account and key, verified through the decisions endpoint before activation. Review costs are paid by that OpenRouter account. Model providers and OpenRouter receive the minimum necessary context under their own data policies. Missing, failed or uncertain reviews stop output; human replies use the same gate.
Defaults: 20 visitor messages/day, 100 bot messages/day, and 100 messages plus 100k model tokens/day across the owner bots, including review and tool costs. One enabled bot per seat; concurrency defaults to 4 and cannot exceed 16. Owners can lower limits. Limits or an offline computer stop service politely. Public names contain 3–32 lowercase ASCII letters, numbers or hyphens. Reserved names are unavailable; renamed or removed names freeze for 30 days.
Read tools access only owner-approved HTTPS domains and return selected, bounded fields. Authentication secrets are injected at runtime on the host, never sent to the model. Self-reported order numbers or emails bind a visitor session but do not authenticate a customer; company APIs must independently authorize record access. Write tools default off; each enabled write requires paired owner phone approval. Visitor text, knowledge and tool results cannot authorize configuration changes, cross-visitor access or credential disclosure. Shell, arbitrary files and arbitrary URL tools are unavailable. Turnstile runs only in an isolated verification page that cannot read chat content.
Anonymous visitor session keys are stored per bot in a separate browser origin and cannot be exported. Browser MessagePorts connect that storage frame directly to the isolated chat frame; parent pages, verification pages and servers receive no key or chat text. After 24 hours without activity a new session starts. Blocking cross-site browser storage also means a new session on reload.