---
title: Using it on your phone
nav: On your phone
summary: Which address to open, adding it to the Home Screen, pairing; what the colours mean, browsing replies, sending pictures, files and voice, hold to approve, Stop everything, lock-screen alerts, and what to do when the connection drops.
order: 4
---

# Using it on your phone

## The address

Open this in your phone's browser: **https://m.agentj.app**

- Use Safari on an iPhone and Chrome on Android.
- There is **no account and no sign-in on the phone**. You pair the phone with your computer once, and from then on the computer knows it.
- The email code and the passkey are for signing in to the **account dashboard**, which is a different page. See [Account and billing](/docs/account/).

> **Note:** there is no Android or iPhone app to download, and you won't find one in an app store. The phone side is a web app. Add it to your Home Screen and it opens just like an app.

The order that works best: **add it to the Home Screen first, open it from the new icon, and pair from there.** On an iPhone the Home Screen icon and a Safari tab are two separate places that don't share anything: pair in Safari and the icon still says "Not paired yet". Lock-screen alerts also only work from the Home Screen icon.

## Add it to the Home Screen: iPhone

1. Open https://m.agentj.app in **Safari** and tap the Share button at the bottom (a square with an arrow pointing up). On newer iOS versions you may have to tap "⋯" first, then Share.

   ![iPhone step 1: tap Share in Safari](iphone-1-share.en.svg)

2. Scroll down the menu that opens and tap "Add to Home Screen".

   ![iPhone step 2: tap Add to Home Screen](iphone-2-add.en.svg)

3. The name is already "Agent J"; tap "Add" at the top right. A new icon appears on your Home Screen — open it from there from now on.

   ![iPhone step 3: tap Add](iphone-3-confirm.en.svg)

## Add it to the Home Screen: Android

1. Open https://m.agentj.app in **Chrome** and tap ⋮ (three vertical dots) at the top right.

   ![Android step 1: tap the ⋮ menu](android-1-menu.en.svg)

2. Tap "Add to Home screen". On some phones and Chrome versions it is called "Install app".

   ![Android step 2: tap Add to Home screen or Install app](android-2-add.en.svg)

3. Confirm with "Install" or "Add". An Agent J icon appears on your Home Screen.

   ![Android step 3: confirm](android-3-confirm.en.svg)

The wording and position of the menu differ a little between phone brands. If you can't find it, look in Chrome's menu for the item that mentions "Home screen" or "Install".

## Pairing: introduce your phone to your computer

When m.agentj.app is not paired yet, its "Connect to your computer" page shows numbered cards. **Pick any one of them:**

- **Way 1: scan this device's code with a remote that is already paired.** The quickest when a paired phone is at hand; see the be-scanned section below.
- **Way 2: run `agentj pair` in your computer's terminal.** Use this for your first pairing; it is the steps in this section. The terminal is the window where you type commands: Terminal on macOS, PowerShell or Windows Terminal on Windows, your terminal app on Linux. If you can't scan, run `agentj pair --link`, paste the link it prints (it starts with `https://`) into the pairing page's link box and tap "Pair".
- **Way 3: add it in the account dashboard.** For computers already in an Agent J account; see the section on adding a remote to a seat from another computer below.

Paired before and only switched browsers or cleared website data? See "Paired this device before?" at the bottom of the pairing page and tap the Face ID button to reconnect, no new pairing.

You pair once, and again only for a new or an extra phone. You need the computer next to you, Agent J running on it, and the remote pairing password (if none is set yet, `agentj pair` asks you to set one first, at least 8 characters).

![Pairing: the computer shows a QR code; the phone scans it and shows 6 digits; you type them and your remote pairing password on the computer](pairing.en.svg)

1. In a terminal on the computer, run:

   ```bash
   agentj pair
   ```

   A QR code appears. For an iPhone run `agentj pair --link` instead: it shows the QR code and a pairing link. You can also run `agentj admin` and tap "Add a phone remote" on the Agent settings page it opens.

   If the terminal says Agent J is not running on this computer, run `agentj service install` first, then `agentj pair` again.

2. Open Agent J on the phone (from the Home Screen icon). The top of the page says "Not paired yet".

   Tap "Scan QR code" inside this Home Screen app on either iPhone or Android. Allow camera access to open a full-screen camera page. It starts scanning at once: the viewfinder is drawn as four rounded corners with a grey bar sweeping from top to bottom; point it at the computer’s QR code, no button to tap. The three icons below are back, pause scanning and stop scanning; back returns to the pairing page. The app includes a decoder for browsers without native QR support. If camera access is unavailable, paste the pairing link into the field below the pairing instructions under "Or paste the pairing link" and tap "Pair". Use the app’s scanner: the system Camera app opens a separate browser tab.

3. The phone shows 6 digits under "Type this 6-digit code on your computer". Type those 6 digits in the terminal on the computer, press Enter, then type your remote pairing password.

4. The phone says "Waiting for your computer to approve", then "Connected", and opens the chat by itself. You're paired.

## Add another remote from one you already paired

Once one phone or computer browser is paired, the next one needs no trip to the computer and nothing typed:

1. On the paired one, open Settings and tap "Add a remote" under Computer. A QR code appears; it works once, for 5 minutes.
2. On the new phone, open Agent J and tap "Scan QR code". If the new device is a computer browser, tap "Copy pairing link" on the Add a remote page and paste the link into the new browser's pairing page.
3. The new device says "Request sent — confirm it on any remote that is already paired" above a 6-digit match code. Nothing to type there.
4. Every paired remote shows an "A new remote asks to pair" card with the device name, type, time and the same match code. If the digits match, hold "Confirm" on any one of them; if that remote has Face ID saved, it asks you to verify it's you first. If they don't match, tap "Cancel".
5. As soon as one remote confirms, the card folds away on the others and the new device opens the chat. If nobody confirms within 5 minutes, the request expires.

When you pair with `agentj pair` in a terminal or with "Add a remote" on the account page, the same card appears on your paired remotes, so you can confirm there instead of typing the 6 digits and your remote pairing password on the computer.

## Getting the pairing link onto an iPhone

**The link is the key:** whoever opens it within 5 minutes can pair. It works once, and after 5 minutes it's dead. So **never send it through WeChat, any group chat or email, and never to any AI** (not even the one that set up Agent J for you).

- **A Mac on the same Apple ID as the iPhone:** copy the link on the Mac and paste it on the iPhone (Universal Clipboard: Wi-Fi, Bluetooth and Handoff on, on both). Or paste it into a note in Notes, open that note on the iPhone and press and hold to copy it. Don't tap the link.
- **Not AirDrop:** the iPhone opens an AirDropped link in Safari right away, so it pairs a Safari tab instead of the Home Screen icon, and the link is used up.
- **Linux, Windows or any other computer** (a Mac too): the QR code that `agentj pair --link` draws contains the same link. Open the iPhone's Camera app and point it at the QR code; a yellow link button appears. **Press and hold** it (don't tap it), choose to copy the link, then paste it in the Home Screen icon. Tapping it opens Safari and pairs a Safari tab — that works too, only without lock-screen alerts.
- Too slow, or something went wrong? Run `agentj pair --link` on the computer again. Each run makes a new link, and the old one stops working.

## Pairing over SSH: start in the terminal, finish in the terminal

When the computer is bound to your account you can pair over SSH in one go, without going back to a web page:

1. In the SSH terminal run `agentj pair --link`, get the printed link onto the phone your own way, and open it in the Home Screen icon.
2. Once the phone connects, the terminal offers two ways at once, and whichever comes first wins: approve on this computer's seat card on the account page with your passkey, or look at the phone and type the 6 digits it shows after the prompt "Type the 6-digit code shown on the phone", then press Enter.
3. A wrong code can be retried, 3 tries in all; then type the remote pairing password. If none is set yet, `agentj pair` asks you to set one before anything else.

Being able to type commands in this computer's terminal shows you already own it; the 6 digits show that the phone that connected is the one in your hand. An Agent's own shell, a script or a pipe cannot approve this way; they can only wait for you on the account page. Type the code while the prompt is showing: digits typed after the command has ended go to the shell as a command. After 120 seconds without approval, run `agentj pair --link` again and open the new link on the phone.

## Good to know

- A wrong 6-digit code on the admin page ends that pairing attempt; in the terminal you get 3 tries. A wrong remote pairing password doesn't: the phone keeps waiting and you can try again, but 5 wrong tries in a row lock pairing for a while.
- Each Agent takes up to 10 phones or browsers. When all 10 are taken you don't have to unlink one first: approving a new phone on the computer unlinks the one unused the longest (offline ones first), and the terminal says which. To choose yourself, run `agentj revoke <id>` first.
- A paired phone reconnects by itself when you close the page, kill the browser, or reopen it from a bookmark or your history; no new pairing. On iPhone, don't use Safari's Private Browsing: closing a private tab throws the pairing away. Better, add the page to your Home Screen and open it from the icon.
- After a pairing the phone asks once whether to remember it with Face ID. Save it, and the Home Screen icon, a new private tab or a browser whose data you cleared on the same phone can reconnect with Face ID from the pairing screen: no QR code, and the computer still counts one phone. See the [User guide](/docs/manual/#pairing-and-face-id).
- The QR code only ever appears on your own computer. Never scan a QR code sent to you by the account dashboard, by email or by someone claiming to be support.
- Lost your phone? On the computer run `agentj devices` to find its id, then `agentj revoke <id>`; it is cut off at once. Away from the computer, tap "Unlink" next to that phone on the Agent card in the account dashboard. See the [FAQ](/docs/faq/).
- Forgot the remote pairing password? Run `agentj passphrase reset` on the computer. It deletes the old password and unpairs every phone; then set a new one and pair again.

## The colour tells you what it's doing

Once paired, the whole screen is the Agent's state, so you don't have to read anything:

| Colour | Meaning |
|---|---|
| Green | Waiting for your next message |
| Blue, with a light running along the top | Working |
| Orange, with the edges slowly pulsing | An action is waiting for your approval |
| Purple | A question is waiting for your answer |
| Grey | Not connected to the computer, or everything is stopped |

![Green: waiting for your next message](idle.en.webp)

![Blue: working](working.en.webp)

![Orange: an action is waiting for your approval](approval.en.webp)

![Purple: a question is waiting for your answer](question.en.webp)

- The thin line under the top bar and the one above the message box are your AI account's "Weekly quota" and "5-hour quota": the longer, the more is used.
- The water level rising in the background is how much of the context (what the Agent can keep in mind at once) this conversation uses. When it is nearly full, tap `/compact` in the ≡ menu.
- The top bar shows the model and the effort level in use. Tap to switch to the next one, hold to go back to the default. Taps only change the label: a half is switched once you leave it alone for 5 seconds (meanwhile it fades, with a thin line running out underneath); tapping back to the one in use sends nothing. Holding for the default and typing `/model name` take effect at once. OpenCode lists providers and models configured on your computer. "Models & API keys" in the menu also switches models or requests a replacement key. A missing or invalid key opens the matching provider’s secret card: paste only into the card, never into chat.
- The logo at the top left: tap to change the text size (medium → large → medium → small); hold it to jump to the first unread reply ("No unread" when there is none). The size is remembered on this phone, so a reload or reopening from the home screen keeps it.

Tap either line for the Usage card. The day in brackets after the weekly figure is where you are in the 7-day reset cycle; the card adds a "Reset cycle" bar with how long until the reset, when it happens, and how much you will have used by then at the current pace. The figures do not glow normally: the weekly one glows faint blue when it is used faster than the even pace (about 14% a day); either quota glows soft orange from 80% and orange-red from 90%, meaning little is left. Providers that do not report a reset time show no day.

## One message per page — swipe to browse

Each page shows what you said on top and the Agent's reply below it. The phone shows you results, not every tool call and command it ran along the way.

- **Swipe right for older pages, left for newer ones.** Double-tap a reply to open the "Full-screen reader".
- Under each reply: "Read this one aloud" (the phone's own voice reads it; the text goes nowhere), "Share this one" (the phone's own share sheet), copy, and reply to this one.
- Select a few words in a reply to quote just that part in your answer (it is copied as well).
- Each page says who it came from: you, another device, the computer, a scheduled task, a command, or a "Notice".
- The conversation is kept on your computer, so a new phone, or the page opened again, can still scroll back through it. Don't want it kept there? Run `agentj config history off` on the computer.

## Model usage and context

OpenCode reports its selected provider and model. When a provider supports plan usage, the phone displays 5-hour, weekly, daily or monthly windows with matching labels: Kimi Code membership, Zhipu GLM Coding Plan and MiniMax Coding Plan are read; the Volcano Ark and Alibaba Bailian Coding Plans have no usage query that works with the API key. Without a figure both quota lines stay in place, just without text. The thin line below the top bar shows context used against the model limit. The selected language applies to error messages and the Agent’s next reply.

## Sending messages, pictures and files

- Type, then press Enter or tap send. Until the Agent has it, "Cancel" takes it back and puts the text back in the box.
- Above the message box: "File", "Photos" and "Camera". You can also paste a picture, or, in a desktop browser, drag files onto the page.
- Up to 10 attachments at a time, 200 MB each, of any file type. Recordings and videos are transcribed on your computer and the Agent gets the original too. Very long pasted text becomes an attachment by itself.
- In Chrome or Edge on a computer, turn on "Screenshots to attachments" in Settings: take a screenshot that goes to the clipboard (Win+Shift+S on Windows, for example), come back to this page, and it lands in the attachments, waiting for you to send it. Phone browsers can't do this — a web page is never told about a phone screenshot; on a phone, tap "Photos" and pick it.
- Attachments are encrypted just like text and go straight to your computer, into the Agent's work folder; they are cleaned up after 30 days.
- No network? Send anyway: the message is kept encrypted on the phone, the page says "Will send when you're back online", and it goes out in order once you're connected.
- Pictures, audio, video, PDFs, web pages and files the Agent mentions show up right in its reply; code, maths and diagrams are laid out too. See the [User guide](/docs/manual/).

## Talking: hold, speak, let go

- Hold the microphone button and speak; let go and your words appear as text in the box, so you can check them before sending. Changed your mind? Slide clearly off the button (about 80 px, or up by more than its height) and let go there; a shaky hand does not cancel.
- For a long take: double-tap to lock, keep talking without holding, tap again to finish. A long take goes over as an audio attachment and is turned into text on the computer.
- **Long recordings (meetings, lectures):** a locked take runs up to 200 minutes. Every 20 minutes it is cut into a part that goes straight into the tray and uploads in the background while you keep talking; the recording card shows which part is recording and the limit. When you finish, all parts go together, in order. A 20-minute part is about 7 MB; 200 minutes about 70 MB.
- A reload, a browser crash or a dropped connection does not lose the recording: every few seconds what was just recorded is stored, encrypted, on the phone, and the next time the page opens it asks whether to put it back in the tray or discard it. Once sent, the phone's copy is deleted.
- **Locking the screen interrupts recording:** on iPhone (Safari and the Home Screen app) locking the screen or switching apps stops the microphone; Android differs by phone. While recording, the page keeps the screen awake where it can (iOS 18.4 and later, Chrome on Android) — don't press the power button. If the recording is interrupted anyway, what was recorded goes to the tray; tap the microphone again to continue, and the new part follows.
- **The recording card:** holding to talk, a double-tap lock and a long take all show the same dark round card in the middle of the screen, with a ring around the microphone that follows your voice. While you record (holding to talk or locked, the same), the whole page behind the card, top line included, blurs in the colour of the current state (green stays a green blur, blue a blue one). A locked take adds three buttons under the card: on the left ✕ cancel (erases the take; Esc does the same), in the middle ■ stop (the words go into the message box, a long take into the tray, so you can check before sending), on the right ➤ stop and send (ends the take and sends it in one tap). The gestures still work.
- **You are told if a stretch may be missing:** on some Android phones a long dark screen or the power button makes the microphone deliver only silence (a system limit a web page cannot get around). When a take contains such silence you are told when it ends — “0:07–0:30 of the recording came in silent and may be missing” — and right away if you come back while it is still recording; a long take's tray item is marked “may be missing …” too.
- **Your voice is turned into text on your own computer.** It doesn't pass through us or any other speech service.
- Before the first time, the computer needs a speech model, about a 180 MB download. If it is missing, tap the install action on the phone and wait for the computer to finish before recording. If installation fails, your phone keyboard’s dictation works just as well.

## The ≡ menu and `/` commands

The ≡ button left of the message box ("All commands") holds:

- One-tap commands: `/compact` compact the context, `/clear` start a new conversation (undo until your next message), `/model` see which models you can switch to, `/context` how much context is used, `/cost` cost, `/usage` usage limits, `/status` status, `/stop` interrupt the current turn.
- "Stop everything" (see below).
- The Agent's own skills — a tap puts one into the message box.
- "Keyboard shortcuts".

Type `/` at the start of the message box and the matching commands pop up as you type. Clearing asks first and can be undone ("Undo clear"). Commands that change settings have to be run on the computer.

## Settings

Tap the gear at the top right to open "Settings"; it fills the whole screen. In a desktop browser you can also press `s`, or `⌘,` / `Ctrl+,`; Esc or the ✕ at the top right closes it. On a phone it is one column; on a wide screen the sections are listed on the left and the cards sit in two columns. The three-line menu that used to sit at the top right is gone: everything in it now lives in "Settings".

- "Agent & remotes": your Agent's name and whether it is connected, "Remotes" (next section), "Set up Face ID", "Scan to pair again" and "Unpair".
- "Agent tools": "Models & API keys", "Memory", "Activity", "Schedules", "Friends", "Bots / Customer service" and the "First-run checklist" — tap one to open its page.
- "Language & look": "Language" is the only language setting. The phone screens, the emails we send you and the way Agent J talks to you all follow it, and the computer and the account dashboard pick up the change by themselves. "Language" has 中文 on the left and English on the right with a small sliding switch between them: slide it to the side you want. "Appearance" is one row of three small options — System, Light, Dark; tap one.
- "Reading and voice": "Reply text size" (80% to 160%; it only changes the text in reply cards and is remembered on this phone only). The grey box marked "Preview" shows the result as you tap − / +. "Send sound volume": the whoosh when you send. It follows the phone's media volume, not the ringer, so turning the ringer down does nothing; set it here. 15% by default, all the way left mutes it, and "Play" lets you hear it. Faster: with the message box empty, press and hold the grey Send button (hold the mouse on a computer) and a volume slider grows up out of it; keep your finger down and slide up for louder, down for quieter, and let go to keep it. On a computer ↑ / ↓ also work, and Esc closes it. Also "Read replies aloud", "Voice wake" and, in a computer browser, "Screenshots to attachments".
- "Channels": "Email" (see [Command Agent J by e-mail](/docs/email/)), "Contacts" (your friends' e-mails and phones, one tap adds them to the e-mail allowlist; see [Contacts](/docs/contacts/)), "My contact details".
- "Notifications": "Lock-screen alerts".
- "Safety": "High-risk warnings" (off by default), "Session mode" ("Separate" on the left, "Shared" on the right, a sliding switch between; separate by default), "Isolated sandbox", "Allow Docker" (off by default). "Isolated sandbox" covers the Agents that Agent J starts itself — independent sessions and scheduled tasks: they can't see Agent J's keys or pairing data. On a shared session the session already open on your computer isn't affected, and Settings says so in a line under the switch. "Allow Docker" works with Isolated sandbox and greys out while it is off. Isolation and Docker changes apply the next time the Agent starts. Also "How safe is this web app?".
- "Web app": "Upgrade method" ("Automatic" on the left: a new version installs once the computer is idle; "Ask first" on the right: you're only told and decide when; a sliding switch between; urgent security fixes always upgrade right away, see [Official notices](/docs/notices/)), "Upgrade Agent J on the computer" (lists what would be interrupted and asks first, see the upgrade section below), the versions of the web app and of the computer program, "Update and reload" (after the web app is updated, tap it to fetch the new version and reopen), "Add to Home Screen", "Keyboard shortcuts".
- "Account & help": "Account and subscription", "Invites and points", "Help and feedback", and the data security, privacy and terms pages.

Changing a setting needs the phone connected to the computer. Where the program on the computer is too old to take a setting from the phone, the screen shows the command to run on the computer instead, with a copy icon next to it.

## Remotes

In "Settings" → "Agent & remotes", tap "Remotes" to open its own page:

- At the top, "N / 10": each Agent takes up to 10 remotes (phones, tablets, or a browser on a computer). With all 10 in use, adding one more unbinds the one unused the longest (offline ones first).
- "Paired remotes" lists each one: its name, online or offline, when it was paired, when it was last used, how it was added, and its device ID. The one in your hand is marked "This one".
- "Rename": edit the name right in its row and tap "Save".
- "Unbind": asks once first. That remote disconnects right away and must be paired again to use. Unbinding "This one" also makes this phone forget the computer.
- "Add a remote" (the scan icon on its right works the other way round: it scans a code shown on the new device, see the next section): a QR code and "Copy pairing link" appear; they work once, for 5 minutes. Scan the code with the new phone's camera (or open the link in another computer's browser). The new device shows a 6-digit safety code: type those 6 digits here and tap "Approve". One try: a wrong code ends that pairing, so make a new code and try again.

Every add and unbind is announced to all your remotes and sends a lock-screen alert. To stop phones from adding remotes, run `agentj remote-pair off` on the computer (this also turns off adding from the account page). If the program on the computer is too old, this page only shows the list; to add, rename or unbind, run `agentj pair`, `agentj devices` or `agentj revoke <device>` on the computer.

## Be scanned: the new device shows a code, a paired phone scans it

Like paying with WeChat — you can scan a code, or let your code be scanned. On a new device (a browser on another computer, a tablet) open m.agentj.app: the code is in the pairing page's "Way 1" card, titled "Scan this device’s code with a remote that is already paired".

1. On a phone that is already paired, open Agent J and tap the scan icon at the top right (or Settings → Remotes → the scan icon right of "Add a remote", or hold the camera button above the message field).
2. Scan the new device's code. A card asks "Add this device as a remote?", with the name the device gives itself (not verified) and 6 digits.
3. The new device shows 6 digits too. If they match, tap "They match — add it" on the phone; if not, tap "They don't match".
4. The new device connects to your computer by itself and opens the chat. Nothing to type on the computer.

- Only scan a code on a device right in front of you. Never scan a code someone sent you, or a code a web page asks you to scan to sign in.
- A code changes every 5 minutes and works once; an expired, already scanned or malformed code is refused on the phone.
- With 10 remotes already, it still works: the card says which one will be unpaired.
- If the phone says "That device already received another pairing", someone got there first: stop using that device and reload its page.
- Needs Agent J 0.20.0 or later on the computer (an older one says to update first). `agentj remote-pair off` turns this off too.

Anything else you scan goes into the message field as it is (links are not opened) — read it, then decide whether to send it. A computer's pairing code never goes into the chat.

## Official notices and admin cards

Official notices from us (new versions, security fixes and so on) get a page of their own in the conversation, marked Agent J official — see [Official notices](/docs/notices/).

When the Agent needs an admin password or an API key, a card titled "Admin rights needed" or "A key is needed" appears on your phone. Type or paste it there: it goes encrypted straight to your computer and the Agent never sees it. See [Admin rights and API keys, from your phone](/docs/phone-admin/).

## When it needs your OK

Whenever it needs your OK, it pops up a question on your phone: the screen turns orange and a card slides up, titled "Your OK, please", saying what it wants to do.

![Approval card: when the Agent needs your OK, a card like this appears on your phone](approval-card.en.svg)

- To say yes, **press and hold** "Hold to approve" for about a second, until the button fills up. A quick tap never approves, so a stray touch can't either. It comes first: on top on a phone, on the left on a computer.
- To say no, tap "Deny" (below it on a phone, to its right on a computer).
- The card goes away as soon as you answer; it does not wait for the computer. If your answer did not reach the computer, or the request had already timed out there, the card comes back to tell you.
- A long command shows only two lines, so the buttons stay in view. "Show all" opens it; the copy button at the right of the title copies the whole command so you can read it elsewhere.
- If the Agent did not say what a command is for, one plain line above it says what it does (delete files, push code, copy files to another computer, …). The command itself is always shown exactly as written.
- **No answer within 2 minutes counts as deny.** The card shows the countdown. The exception is when none of your remotes is online: then the card stays for 30 minutes — see [When no remote is online](/docs/phone/#no-remote-online).
- Not now? "Hide" puts the card away; the request keeps waiting. You can also answer on the computer — the first answer counts.
- A sub-agent the Agent sent off (even one still running in the background after the main reply) asks the same way: the card's last line says which one ("From sub-agent: …"), and the card stays until you or the computer answer it.
- With "High-risk warnings" on, spending money, deleting, sending anything out, changing passwords or keys, and changing prices always need your own OK, one at a time: the card is marked ⚠, a "Why: …" line gives the reason. The button is still "Hold to approve", and it approves only this one.
- For other actions the card has one more button: "Hold: approve, and auto-approve the same low-risk kind for the rest of this turn". Below it the card says what "similar" means and how many times at most. It ends with the turn, you can withdraw it any time with "Cancel approval", and those five kinds are never included.

When the phone comes back from the background, after a network drop, or when you open it, it first asks the computer which cards are still waiting: missed approval, question, secret, sudo and contact cards come back; ones already handled on another remote close by themselves; ones that timed out while you were away say "Expired". The computer answers only a paired phone that can approve, and the request is signed with that phone's approval key.

Which actions ask you starts from your own settings in the AI coding tool: whatever Claude Code would normally ask you about is now asked on the phone. "High-risk warnings" in "Settings" are off by default; turning them on adds two stricter rules: the five kinds above always ask on the phone, even if your AI coding tool allows them; and with OpenCode or Codex every step except read-only ones (like reading files) asks the phone first. Anything your settings forbid stays forbidden — the phone can't approve it. Codex has one more case, explained in the [FAQ](/docs/faq/).

In a shared session, "Changes passwords or keys" asks only when a password or key file really changes (written, replaced or deleted; `gh auth`, `aws configure`, `ssh-keygen`, `passwd` and the like), and "Shows passwords or keys" asks when one would be printed on the screen (`cat .env`, `grep KEY .env`, `head ~/.ssh/id_ed25519` …), because the shared conversation reaches your phone. A program that reads `.env` by name without printing it, or a note or commit message that only mentions `.env`, no longer asks. Prefer the old, stricter rule? Run `agentj config approvals strict` on the computer; `agentj config approvals standard` switches back. Spending, sending out and public deletion work the same either way. Approval cards follow your language setting: all Chinese or all English.

Up to 0.20.0 a shared session only asked about these five kinds with the optional extra warnings on (`agent.high_risk_warnings`), although this page said they always ask; since 0.20.1 they ask by default (on an OpenCode server you started yourself, still only with that setting on). Want only your AI coding tool's own permission prompts in a shared session? Run `agentj config approvals native` on the computer (rewriting Agent J's hook files still asks); `agentj config approvals standard` switches back.

Only real danger asks. The five kinds above count only on a clear match: `git push`, a deploy (`wrangler deploy`, `vercel` …), a payment or messaging API call, deleting cloud data, writing a password or key file — those always ask. These don't: writing an ordinary file (a heredoc such as `cat >> notes.md <<'EOF' … EOF` — words like "deploy", "git push" or "key" in the text don't count, only the file it goes to); a small `python3 - <<'EOF'` script that edits files; rehearsal or read-only commands such as `--dry-run`, `list`, `status` (a real `deploy` still asks); `systemctl --user` / `systemd-run --user` starting or stopping your own background jobs; a `for … sleep … done` wait loop. A heredoc that a shell runs (`bash <<EOF`, `cat <<EOF | sh`, written to a script and then run) or that runs a command through `$( )` is still judged as commands.

A command Agent J can't read clearly (say, the program name is a variable like `$PY`) used to always ask "Can't tell what this does". With Jev set up on the computer (`OPENROUTER_API_KEY`), Agent J first gives Jev your latest words, what the Agent said it is doing this turn and the command, and asks whether it fits the task: at or above the "Jev threshold" in "Settings" (default 0.70, adjustable from 0.50 to 0.95) it runs without a card and "Allowed by Jev" plus the reason goes into "Activity"; below it, on a timeout or an error, the card shows as usual. The threshold only affects these unclear commands: the five clear dangers above are not affected and Jev can't allow them, and encoded or assembled commands (`curl … | sh`, `base64 -d | bash`) never go to Jev — they still ask. Too many cards? Tell the Agent "too many approval cards"; it explains and runs `agentj config set approval.jev_threshold 0.6`, which shows one confirmation card on your phone.

## Approval level: Safe, Standard, Full access {#approval-level}

Pick a level under "Approval level" in Settings → Safety. It decides how often the Agent stops to ask you:

- **Safe**: asks more — unclear commands, batch approvals and goal-mode countdowns all wait for your tap. Safest, most cards.
- **Standard (default)**: asks only before spending, deleting, sending out, changing passwords or keys, or changing prices. Same as before.
- **Full access**: like Claude Code's `--dangerously-skip-permissions` — almost no cards, everything still logged. Suspected attacks, passwords or keys, and spending money still ask you.

What Safe adds, exactly: a command Agent J can't read clearly never goes to Jev, it always asks; cards no longer offer "Hold: approve, and auto-approve the same low-risk kind for the rest of this turn"; in goal mode, a step the computer could undo gets an ordinary card instead of the 10-second countdown; a shared session asks as strictly as `agentj config approvals strict`, and every deletion asks, files on this computer included.

With Full access, an Agent step that would have shown a card just runs. Each one goes into "Activity" and the phone shows a single quiet line. Deleting, pushing, deploying and sending messages no longer ask, so choose it on purpose. These still ask you, one at a time:

- anything that looks like an attack: `curl … | sh`, decoding something and running it, downloading something and running it (`eval "$(curl …)"`, or saving a script and running it straight away), changing Agent J's hook or approval files, `agentj config …`, touching Agent J's own settings or state folders;
- changing a password or key, putting one on the screen, or sending one out (`cat ~/.aws/credentials | curl -d @-`, `env | curl …`) — any command that touches a password or key file asks;
- spending money or changing a price.

Agent J's own cards keep coming too: pairing a new remote, running without isolation, AI sign-in rescue, and Agent J's own commands (sending mail through Agent J, starting a goal and so on). So do the Agent's multiple-choice questions and OpenCode's cards for a possible loop and for sub-tasks. Codex's requests to leave its sandbox or use the network are approved under Full access, just like Codex's own full access. Full access needs at least one paired remote that can approve.

Only a paired phone can change the level; an Agent can't. The phone signs every switch with its approval key, and the computer checks the signature before the switch takes effect — at once. Switching to Full access also takes Face ID if this phone has a passkey; going back to Standard or Safe never does. Before Full access is turned on, a confirmation sheet lists what still asks and makes clear that the level covers everything the Agent does from then on, scheduled tasks included, until you switch back. After a switch, every remote shows one line saying which level is now on and which phone confirmed it, and a lock-screen alert goes out. If the Agent runs `agentj config set approval.level full` on the computer, nothing changes by itself: you get a confirmation card on your phone. Writing Full access into the configuration file on the computer doesn't count either: without the phone's signature it works as Standard, and you are told once.

## When no remote is online {#no-remote-online}

Sometimes the Agent needs your OK while none of your paired remotes has Agent J open (the page is closed, or it dropped its connection in the background). Here is what happens:

- The card goes out as usual, and so does the lock-screen alert. Open Agent J and it's there.
- If you've connected Telegram with forwarding on, or set up the e-mail channel, Agent J also sends one line to your private Telegram chat and to your own address: how many approval cards are waiting, that none of your remotes is online, and that opening Agent J on your phone shows them. It never says what a card is about, and it goes out at most once every 15 minutes.
- If nobody has come online after 20 seconds, the Agent is told you're away. It moves on to the work that doesn't depend on that step instead of sitting there.
- The card stays on your phone for 30 minutes. Approve it in that time and the Agent gets a system note; the next time it tries that exact step, it runs. Deny it and the Agent leaves it alone. After 30 minutes with no answer, the card expires.
- If the Agent tries the same step again before you're back, there's no second card.
- Your approval only lets the original requester through: the same main conversation or the same scheduled task, the same AI coding tool, the same folder. "Stop everything" cancels any approval not yet used.

Before this release, a card with no remote online was simply denied after 2 minutes. The Agent sat blocked the whole time, and nothing reached Telegram or your inbox.

## Goal mode: say it once, it finishes while you sleep (/goal)

Tap `/goal` in the ≡ menu and add what to finish and by when, for example "/goal finish the report tonight and send it to Wang, before 8 am". The Agent first sends one opening card: the goal, how you'll know it's done, the deadline, and every dangerous action it expects, listed by kind with a limit — "push to GitHub repository X", "deploy to agentj.app", "spend: one domain only", "email: only to Wang", "delete: only worktrees and temp files". Hold to approve once and you've signed it: while the goal runs, those actions no longer ask, and each one goes into "Activity". Anything not on the card isn't approved, and changing passwords or keys can never be approved in advance.

During the goal the computer decides, not what the Agent says about a step. Inside the grant it just runs. Outside it, if the computer can undo the step (committed in git with nothing uncommitted, moved to the trash, a push to a remote this repository already has, a new file copied with scp or rsync to a machine named in your `~/.ssh/config` that isn't there yet), you get a 10-second countdown card that says "Goal mode: approves itself in 10 s" — no tap means yes, Deny cancels. Steps that can't be undone (a deploy, a payment, a new recipient, a new repository, a force push, credentials, overwriting a file that already exists on a remote machine) ask as usual and never approve themselves; that step waits, the rest of the work carries on, and the result card lists it under "Waiting for your decision". Anything that looks like an injection or an attack (`curl … | sh`, `base64 -d | bash`, changing hooks or approval settings) shows a red card and is never approved automatically.

Cards that wait for you, and the result card, say it in plain words: who (Codex, say) wants to do what, why it wasn't approved automatically, what happens if you don't tap, and how to approve. Left unapproved, the step is skipped and everything else goes on, and the result card says so; to allow it afterwards, reply "allow item N" and the Agent redoes that step with a new card for you. The raw command is folded under "Details".

When work the plan didn't mention comes up mid-goal (a test run on another machine, say), you don't get one card per step: on a waiting card, press and hold "Hold: approve and add to the goal's grant". This step goes ahead and the same kind of step is covered from then on, up to 20 times, until the goal ends. The Agent can also ask for one extra grant with `agentj goal grant`: one card on your phone, nothing added until you sign. Cards about money, passwords or keys don't offer this button.

A goal lasts 8 hours by default, at most 72, or until the deadline you gave; then approvals go back to normal. `/goal status` shows progress; `/goal stop` ends it at once and withdraws the one-time grant — the same command asks again afterwards. "Stop everything", or unpairing the phone that signed, also ends it. The Agent sends one line at each milestone and, at the end, a result card: done or not, which grants it used, how many approvals happened automatically, and what is waiting for you. For a company or team, switch off "Goal mode: approve in 10 s" under Settings → Safety; the countdown cards then only wait for a tap. With the approval level set to Safe there is no countdown either.

Settings → Safety has one more switch, "Goal mode: no cards". It is off by default:

- **Off (default)**: `/goal` shows one opening card; you sign once and the goal runs within it.
- **On**: a goal starts right away and runs without cards (all logged, result card at the end); suspected attacks, passwords or keys and spending still ask. Counts only while this phone stays paired.

Skipping the opening card applies only to your own `/goal`: the proposal the Agent sends back within 30 minutes. A goal that would spend money or change prices still shows you the opening card first. Switching it off ends at once any goal that started without a card.

Like the approval level, it is turned on with a signed confirmation on a paired phone (plus Face ID if the phone has a passkey); an Agent can't turn it on. Once the phone that turned it on is unpaired or paired again, the switch stops counting and `/goal` shows the opening card again. Turning it on by editing the configuration on the computer doesn't count either.

## When it asks you a question

Sometimes the Agent wants you to pick an answer. The screen turns purple and the card says "Answer a question": tap your choice, then "Confirm". If none of the options fits, tap "Cancel the question" and just type your answer.

## Stop everything

In the ≡ menu tap "Stop everything", then "Yes, stop everything". Then:

- whatever it is doing is interrupted at once;
- every request waiting for your approval is denied;
- all batch approvals are withdrawn;
- all scheduled tasks are paused.

The top of the page says "Everything is stopped". It takes no new messages until you tap "Resume", or run `agentj resume` on the computer (it asks your remote pairing password). It stays stopped even if the computer restarts.

## Memory, Activity, Scheduled tasks

In "Settings" → "Agent tools":

- **Models & API keys:** the model picker at the top; below it "Base models" (one card per provider, its subscription and pay-as-you-go keys, and the Claude / Codex sign-in) and "Third-party API keys" (the other keys on your computer, + adds one). A filled row shows only •••• and the last 4 characters, with Copy, Edit and Delete; an empty row has +. Copy and Delete need Face ID, and the value goes straight to the clipboard without being shown. Every copy, edit and delete is logged, and the Agent never sees the value. After installing, fill your keys in here and you can leave the terminal.
- **Memory** (the page is titled "What it remembers"): what the Agent reads every time it starts work, listed entry by entry. You can delete entries and undo a deletion for 7 days.
- **Activity** (the page is titled "Activity and approvals"): what it has done lately — each conversation turn, each request, who approved and who denied. Newest first. It is stored only on your computer, for 30 days.
- **Scheduled tasks:** on top, Agent J's own scheduled tasks — workflows that run on a schedule. "Turn on" or "Turn off" each one here; your Agent can switch one on too when you ask. Below them, "Other scheduled tasks on this computer": what the computer already schedules by itself, read afresh each time the page opens (systemd user timers and crontab on Linux, LaunchAgents and crontab on a Mac, Task Scheduler on Windows) — name, when it runs, next and last run, and status. That part is read-only: nothing can be changed or deleted there, and the commands the tasks run are never shown.

"Back to chat" takes you back.

## First-run checklist

Right after installing, a thin bar may sit above the chat: "First-run setup 3/12 · Continue". It never covers the chat. Tap it to open the checklist as its own page: the steps are done on the computer, the phone shows the progress, and if you get stuck you just tell your Agent in the chat. Each row says "On the computer", "Tap on the phone", "I do it" or "Not in this version", and a row that has not passed says what was found and what to tap next. The bar's ✕ closes it at once and it stops popping up; "Settings" → "Agent tools" → "First-run checklist" opens it again. See [Before you leave your computer](/docs/first-run/).

## In a desktop browser

https://m.agentj.app works on a computer too, with keyboard shortcuts: press `?`, or open "Settings" and choose "Keyboard shortcuts". A few favourites: `j` / `k` previous and next page, `f` full-screen reader, `r` reply to this one, hold `M` to talk.

![Settings in a desktop browser](settings.en.webp)

## Lock-screen alerts

To know when it answers while your phone is locked: in "Settings" → "Notifications" → "Lock-screen alerts", tap "Turn on" and allow notifications when the browser asks. The page then says "On. Alerts never include what was said."

- An alert says only "New reply" or "A request is waiting for your approval". It never contains the message itself.
- You won't get alerts while you are looking at the page — only after you switch away or lock the phone.
- **iPhone:** the "Turn on" button under "Lock-screen alerts" only appears once you have added it to the Home Screen and opened it from the icon, on iOS 16.4 or later. Opened in Safari, the page tells you to use Share → Add to Home Screen first.
- **Android:** alerts come through Google's push service. Phones without Google services (many phones sold in mainland China, such as Huawei or Xiaomi models) usually don't get lock-screen alerts; the page may say "Couldn't turn on: this browser doesn't support web push, or the push service can't be reached." Chat and approvals still work whenever the page is open.
- If the page says "Notifications are blocked", allow notifications for this site, or for Agent J, in your phone's settings.

## In mainland China

The phone page and the relay server run on Cloudflare; from mainland China they can be slow and occasionally unreachable — just try again. Use Safari on an iPhone, and Chrome on Android if the phone has it. For lock-screen alerts on Android, see the section above.

## When the connection drops

| You see | It means | What to do |
|---|---|---|
| "Computer offline" or "Waiting for your computer…" | The computer is off, asleep or offline, or the background program isn't running | Turn the computer on and get it online. On the computer, `agentj service status` shows whether the service is running. If the computer is on, tap **Emergency repair** on the card and start with ① Reset connection ([more](/docs/reconnect/)) |
| "Agent J on your computer isn't responding · rescue helper online" | Agent J on the computer is frozen or stopped; a small rescue helper answers for it | Tap **Repair** on the banner, then ① Reset connection; if that doesn't help, ② Ask Agent J Father for remote help |
| "Connection lost. Retrying in N s…" | A shaky network that has not come back within a few seconds; it reconnects by itself (a one- or two-second blip reconnects quietly and shows nothing) | Wait a moment. Switching back to the page also reconnects at once |
| A line under the chat: "Telegram can't be reached right now; this page keeps working." | Your computer's Telegram channel failed to reach Telegram several times in a row | Nothing to do; the phone keeps working and the line disappears once Telegram is back |
| A "Disconnected" page with a "Reconnect" or "Try again" button | Something went wrong with the connection | Tap the button. If that doesn't help, close the page and open it again |
| "This phone was removed by your computer" | The phone was unlinked on the computer | Tap "Pair again" and run `agentj pair` on the computer |
| "The other app took over" | The Home Screen app, another browser or a new device took over the connection | Continue in the Home Screen icon or browser you just connected; no Face ID recovery is needed |
| "This browser deleted the pairing it had saved on this phone…" | The browser deleted this page's saved data (a private tab was closed, or website data was cleared). Your computer did not remove the phone | Run `agentj pair` on the computer and pair once more. The same browser pairing again replaces its old entry instead of taking another slot |
| "Not paired yet" | This browser or icon hasn't been paired yet | Pair it as described above |
| "That link is invalid or has expired. Run agentj pair on your computer again." | The pairing link was already used, or more than 5 minutes old | Run `agentj pair` again on the computer (`agentj pair --link` for an iPhone) |
| "This browser doesn't support the encryption we need. Try the latest Chrome, Safari or Firefox." | The browser is too old | Use the latest Safari or Chrome |
| "Couldn't save this phone's device key (private browsing?). Try a normal window." | A private or incognito window | Open it in a normal window |

More in the [FAQ](/docs/faq/).

## One-tap upgrade

Send `/update`, tap “⬆ Upgrade Agent J” in the ≡ menu, or tap "Upgrade Agent J on the computer" in Settings → Web app to authorize installation, restart and doctor. First the computer lists what a restart now would interrupt: a turn in progress, queued messages, cards waiting for you, a scheduled task running or due within 15 minutes, background tasks, friend sessions. Nothing → it upgrades right away; something → a card "Upgrading now would interrupt something" lists it, and only "Upgrade now" upgrades ("Not now" drops it). Asking the Agent to upgrade Agent J works the same way: if something would be interrupted, it doesn't force the upgrade, it puts this card on your phone. The menu shows current/latest versions and disables the entry when up to date. Reconnect after restart to see the version change and doctor counts. Follow any failure instructions with `agentj update check` or `agentj doctor` on the computer.


## Background records and lock-screen reconnection

Silent turns stay out of normal chat pages. Read them in View silent history in the menu; clearing the conversation clears them too. A temporary lock-screen disconnection does not unpair the phone; returning to the foreground reconnects automatically. If another remote has taken over, follow the on-screen message rather than pairing again for an ordinary disconnection.

## 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; compromise of the signing service could still add a device. 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.

New replies keep you on the history page you are reading. Tap the new-message indicator at the top right of the input card to jump to the latest message. With unread messages, the page-number capsule pulses between sage green and buttery orange; a single or double tap jumps to latest and stops the pulse. Reduced motion shows a static sage-green capsule. Otherwise, double-tap the top-right page number to jump to the latest, or the top-left speaker and time to jump to the first message. Without new messages, single taps on these two corners do not change pages. After sending, “Delivered, waiting for the computer…” becomes “Chairman, your latest instruction is in — your assistant is on it.” when the agent starts (to be called something else, tell the agent “call me X”); a finished request without text shows “(No text reply)”. Empty background turns add no page or notification.

The header is split into three equal parts: double-tap the left third to go to the first (oldest) message, double-tap the right third (the page number) for the latest; the middle third is for unread replies. When replies arrived after this remote last looked, a small pulsing round badge in the middle of the header shows how many; tap it to jump to the first unread reply and page forward from there — the badge goes away once you reach the latest. With nothing unread there is no badge and a tap in the middle does nothing. Holding the logo at the top left, or pressing `u` on a computer, also jumps to the first unread reply. Each remote keeps its own unread count; silent turns do not count.

Every page has a header. A page without your input (the Agent reporting in, a scheduled check, a finished background task) shows a header card of the same size in the input card's place, saying where the page came from: “Agent reporting in”, “Scheduled check”, “Background task finished”, “Typed on the computer”. The page number, double-tapping the top right for the latest, double-tapping the top left for the first message and the new-message pulse work exactly as on the input card. When you are on the newest page, a new page turns to it automatically; while you page through history nothing interrupts you, only the page-number capsule pulses with “New message”, and one tap takes you to the latest. Silent turns (〔不回群〕) send no notification, count as no new message and add no page.

Press and hold the source at the top left of the input card (half a second) to rename the remote in your hand; other remotes and the account page show the new name right away. Only the owner can rename other remotes, on the account page. A remote the owner renamed shows that name as the message source, followed by the device type (for example "Alex (boss) · iOS Safari"); the account page, the phone's settings and `agentj devices` mark it "(name set by the owner)", and a tap shows the name the device gave itself. Remotes nobody renamed are still marked "(name set by the device)". The Agent also uses the owner's name to tell who is speaking, but the name is only a label, not proof of identity.

Voice transcription supports the phone's ten-minute recordings. Processing time includes cold start and scales with recording length. If processing times out, the original audio still reaches your Agent with a clear failure notice. Narrow screens stack text buttons vertically.

## Repeated pairing / missing Face ID button

Pairing once is enough. As long as your computer hasn't unpaired this phone, opening the page connects by itself. Safari on iPhone clears what websites store; from 0.17.4 the page then quietly reconnects to the same computer with an automatic sign-in token kept on your phone — no QR code, no Face ID. Only your computer recognises the token, and it is replaced each time it is used. You only scan again when the computer has unpaired this phone (for example after you lost it).

Open a regular Safari window on iPhone or Chrome on Android. In-app browsers in WeChat, QQ, Weibo, Telegram, LINE, Facebook or Instagram may not retain pairing or support platform passkeys. Use the top-right menu to open in Safari / Chrome; if unavailable, tap “Copy page link” and paste it into that browser.

Leave Private Browsing / Incognito, allow cookies and website data, then Add to Home Screen. Open the same icon each time and pair once there. Safari and the Home Screen app keep separate pairing records; adding the icon does not transfer the earlier pairing. The copied page link excludes the one-use pairing secret; run `agentj pair` on the computer again if needed.

After pairing, choose “Set up Face ID” in "Settings" → "Agent & remotes", including after choosing “Later” on the invitation. Android uses screen unlock. Availability depends on the browser's platform authenticator support, even on a phone with Face ID. A denied persistent-storage grant does not prove private browsing; the page offers guidance and cannot guarantee that the system or user will never clear website data.


If Face ID is unavailable, check iOS Settings → General → AutoFill & Passwords: enable AutoFill Passwords and Passkeys and select Passwords. Check iCloud → Passwords (Keychain), Face ID & Passcode, and restrictions in Screen Time or device-management profiles. Each scan or pairing-link tap creates a new pairing; after pairing, open the same Home Screen icon.


## Sharing screenshots

See [Android sharing and the iPhone clipboard Shortcut](/docs/share-screenshot/). Shared content enters the composer; add a note before sending.

Cloud read-aloud: if a speech key is missing, add it to the computer service environment and restart. If the provider refuses, check the key, credit and voice. Busy or unavailable providers can be retried later. On iPhone, tap Read once to enable playback; if playback is blocked, tap again. A playback retry reuses the audio already synthesized.

Local read-aloud uses only voices on this phone. Host/cloud voices stay in `voice.tts.voice`; choose a phone voice separately with `voice.tts.phone_voice` (empty selects the local default for the reply language). Switching modes keeps both choices. An unavailable phone voice falls back with one notice. On first opening, iPhone waits for local voices to load before reporting that no voice is available.


0.18.1: Valid older Telegram enrollment continues with its local bot environment name. Huawei HarmonyOS devices have accurate names; account owners can rename a remote with a passkey while its host is online.

## Files in secret pickup cards

Variable names, `secret=true` and placeholder JSON in ordinary reports do not make them credential files. Real keys still require a secret pickup card and are withheld from mail attachments. After Face ID, tap the preview’s top-right fullscreen icon or double-tap its text. Markdown is typeset; scroll to read and copy the original text. Esc, Back or browser Back returns to the card. Finish, hiding the page or two minutes clears the preview.


A collapsed input card shows two quote lines and one body line, or up to three body lines without a quote, with an ellipsis for overflow. Attachments appear as a line paperclip and total count beside “…” (images, files and audio together); zero attachments show no count. Double-click the body, tap “…” or press `o` to expand all text, the quote and attachments.
