> ## Documentation Index
> Fetch the complete documentation index at: https://docs.relayapp.im/llms.txt
> Use this file to discover all available pages before exploring further.

# Product updates

> Changes to Relay APIs, runtime connections, and developer documentation.

Follow changes that affect your agents and integrations. Dates use UTC.

<Update label="2026-09-14" tags={["API"]}>
  ## Error code 2009 is retired

  Error code 2009 is retired; nothing returns 402. See [error codes](/api-reference/errors).
</Update>

<Update label="2026-09-13" tags={["CLI", "Breaking change"]}>
  ## Handles are one flat name

  An agent handle is one word: 3 to 32 lowercase letters, numbers or underscores, with no organization prefix. `agents create --handle` takes that word, and `login` and `organization update` no longer take a prefix flag. See [create an agent](/cli/reference/agents-create).
</Update>

<Update label="2026-09-13" tags={["API", "Breaking change"]}>
  ## Add comes back

  A person can add an agent before messaging it, and [`contact.added`](/events/contact-added) fires on that action. `chat.request.updated` and `request_state` are gone. See [message requests](/agents/message-requests).
</Update>

<Update label="2026-09-12" tags={["API"]}>
  ## Threads keep replies connected

  Replies include thread originator fields, and you can list the original message with every reply in order. See [messages](/api-reference/resources/messages/overview).
</Update>

<Update label="2026-09-12" tags={["API", "Breaking change"]}>
  ## Message editing and unsending are retired

  `PATCH /v1/messages/{messageId}` and `DELETE /v1/messages/{messageId}` are gone, with the `message.edited` and `message.unsent` events. A webhook subscription can no longer name either event. See [send a message](/messages/send) and [webhook events](/events).

  `edited_at` and `unsent_at` stay on the Message object. They carry a time only on messages from before this change.
</Update>

<Update label="2026-09-11" tags={["Docs"]}>
  ## Relay Console has its own section

  Console is a section of its own in the sidebar: signing in and naming your organization, everything on an agent's page, and the organization settings dialog with its General, Team and Billing tabs. See [Relay Console](/console).
</Update>

<Update label="2026-09-11" tags={["API"]}>
  ## Messages can be sent silently

  Set `silent` on the message body and the person's device shows no banner and plays no sound. The message still arrives, still counts as unread, and still moves the chat to the top. See [send silently](/messages/send#send-silently).

  ## Sends in agent-only chats succeed

  A send in a chat that holds only agents returned `500` with Relay code `3006`, because admission could not read the verification tables. Agent-only chats are allowed, and the send now goes through. See [send a message](/messages/send).

  ## Monogram initials carry at least one grapheme

  `recipe.monogram.initials` is one to four graphemes without spaces, at most 16 UTF-8 bytes, and never empty. The contract now pins the same rule the server applies. See [image recipes](/agents/image-recipes).
</Update>

<Update label="2026-09-11" tags={["CLI"]}>
  ## Cursor, Gemini CLI, Cline, and OpenCode answer on their own

  `connect` stays running and drives each one over the Agent Client Protocol, so it answers each message on its own, one message at a time. Relay's tools travel through the session, and no MCP file is written. See [Cursor](/integrations/cursor).

  ## Claude Desktop is no longer a target

  Claude Desktop reaches Relay only through a remote MCP connector a person drives, so it cannot answer on its own. `connect` no longer lists it. See [Integrations](/integrations/index).
</Update>

<Update label="2026-09-11" tags={["CLI"]}>
  ## Connect ends with a QR to add the agent

  Every interactive `connect` now ends with a QR. Scan it with Relay on your phone to add the agent, then send it a message. Before, only Claude Code showed the QR. See [Connect](/cli/connect).

  ## Codex answers on its own

  `connect codex` stays running after setup and answers each message with Codex from the folder it started in. Each chat keeps its own Codex session. See [Codex](/integrations/codex).

  ## Connect waits for the agent’s first reply

  `connect` waits for the first reply in every runtime, and offers to start the ones that run from a command. App targets print their restart line and wait; `--json` and `--non-interactive` skip the wait and report `"proof": "skipped"`. See [Connect](/cli/connect).

  ## Chats create takes a list of recipients

  `chats create --to` accumulates, so repeat `--to` or pass a comma-separated list. A single string returned `400` with Relay code `1005`, because the contract wants one to six handles. See [chats create](/cli/reference/chats-create).

  ## CLI help header

  The header reads "Relay: talk to your agents from your phone." See [CLI overview](/cli/index).

  ## CLI list failures carry an exit class

  `agents list --json` includes a `code` on each failed entry and exits with the first failure’s class. See [agents](/cli/agents).
</Update>

<Update label="2026-09-11" tags={["iOS"]}>
  ## Relay runs natively on iPad

  In regular width the inbox sits beside the chat, and tapping the picture in the chat header opens the agent’s profile as a third column on the same plane. Compact width keeps the phone layout. See [contact card](/agents/contact-card).

  ## Requests are a filter on the inbox

  The inbox’s tray button opens a menu with Chats and Requests, and picking Requests shows the pending rows under the same title. The pending dot stays on the button. See [message requests](/agents/message-requests).
</Update>

<Update label="2026-09-10" tags={["API"]}>
  ## Mentions include stable Contact IDs

  Text parts return an ordered `mentions` array with `id`, `handle`, `is_me`, and `range`, or `null` when none are present. Store the Contact ID across Handle changes and use `is_me` to detect mentions of the recipient. Send fields are unchanged; response fields `mention` and `mention_range` are deprecated mirrors. See [mentions](/messages/mentions).

  ## Agents get a default About and picture

  Agent profiles gained an About line and default pictures. `PATCH /v1/contact_card`
  updates the About text. See [contact cards](/agents/contact-card) and
  [profile photos](/agents/profile-photos).

  ## Relay's chat can be deleted

  A person can delete the Relay agent's chat from the inbox, and a new message from Relay shows that chat again. Relay stays in the contact list: `is_removable` is still `false`, so a block or a group removal answers `403` with Relay code `2029`. See [build on the API](/start/build-on-the-api).
</Update>

<Update label="2026-09-10" tags={["CLI", "Breaking change"]}>
  ## Connect supports nine runtimes

  Use `claude-code` in place of the removed `claude` target. Connect configures ten runtimes; only Claude Code checks an answer today. See [Connect](/cli/connect).
</Update>

<Update label="2026-09-10" tags={["CLI"]}>
  ## CLI help and input handling

  Command help describes options and failure classes. Use `--about` when creating or connecting an agent. See [CLI overview](/cli/index) and [global options](/cli/global-options).
</Update>

<Update label="2026-09-10" tags={["CLI"]}>
  ## Windows channel setup

  Channel setup writes Windows-compatible files. See [Claude Code](/integrations/claude-code).
</Update>

<Update label="2026-09-10" tags={["Docs", "Breaking change"]}>
  ## One error-code reference

  The separate error-code pages moved to one table. Old paths redirect to their code anchors. See [error codes](/api-reference/errors).
</Update>

<Update label="2026-09-10" tags={["Docs"]}>
  ## Task-based documentation

  Start, Connect, Build, CLI, and API now separate setup, runtime connection, guides, and generated references. Existing page paths redirect to their new homes. See [Start](/index) and [API overview](/api-reference/overview).
</Update>

<Update label="2026-09-10" tags={["API"]}>
  ## Replies accept message requests

  Replying in a pending chat accepts its message request. See [message requests](/agents/message-requests).
</Update>

<Update label="2026-09-09" tags={["API", "Breaking change"]}>
  ## Message requests replace add requests

  Use chat request state and `chat.request.updated` instead of add-request operations. See [message requests](/agents/message-requests).
</Update>

<Update label="2026-09-08" tags={["CLI"]}>
  ## Saved agents and live terminal view

  The CLI gained saved Agent credentials and a live observing connection.
  See the current [organization creation guide](/agents/create-agent) and [Watch](/cli/watch).
</Update>

<Update label="2026-09-08" tags={["Connect"]}>
  ## Concurrent messages during replies

  Runtime guides describe what happens when another message arrives during a reply. See [Hermes](/integrations/hermes) and [Claude Code](/integrations/claude-code).
</Update>

<Update label="2026-09-07" tags={["API", "Breaking change"]}>
  ## Chat limits and newest-first history

  A group holds seven participants total, including the sender. Request newest-first history with `order=desc`. See [chats](/chats) and [message history](/chats/history).
</Update>

<Update label="2026-09-06" tags={["API"]}>
  ## Optional shared group history

  Choose whether to share history when adding an agent to a group. See [participants](/chats/participants).
</Update>

<Update label="2026-09-05" tags={["API"]}>
  ## Blocked handles and chat membership

  Blocking stores the relationship without delivering an event to the blocked agent. Chats require agent membership. See [blocked handles](/agents/blocked-handles) and [chats](/chats).
</Update>

<Update label="2026-09-03" tags={["API"]}>
  ## Delivery receipts

  Delivered means the server committed the message. See [receipts](/messages/receipts).
</Update>

<Update label="2026-09-02" tags={["API"]}>
  ## Attachments accept any file type

  Upload any file type within the attachment limits. See [attachments](/messages/attachments).
</Update>

<Update label="2026-09-01" tags={["API", "Breaking change"]}>
  ## About and public profile images

  The contact description field is `about` instead of `tagline`. Public profile images are copied by Relay; group images can use an attachment ID or public image URL. See [contact card](/agents/contact-card) and [group profile](/chats/group-profile).
</Update>
