Skip to main content
This page covers the commands provided by the tuple CLI. For installation instructions, see the Tuple CLI overview.

Global flags

Errors go to stderr. With --format json, errors are JSON objects with an error field and may include error_code and kind. Use JSON for a stable machine-readable contract. Text output is for people.

Person arguments

Commands with a <person> argument search contact names and email addresses. One match selects that contact. No matches return an error. Multiple matches return an error and list the candidates.

tuple contacts

contacts list [flags]

List contacts, sorted by favorites, presence, then name.Filters combine with AND. An empty result succeeds and returns an empty list.

contacts follow

Emit the complete contact list as JSON Lines whenever it changes. The first line is the initial snapshot. This command does not accept the list filters.

contacts show <person>

Show one contact’s ID, name, email, presence, kind, and favorite state.

contacts favorite <person> / contacts unfavorite <person>

Favorite or unfavorite a contact.

contacts remove <person>

Remove a contact.

contacts invite <email>

Invite someone to Tuple by email.

tuple call

call list [flags]

List ongoing calls.

call show [call] [--only <field>]

Show the active call, or select an active or retained call by exact ID. An unambiguous retained-call ID prefix also works.--only prints one field without a label. Valid fields are id, state, participants, title, summary, started_at, and ended_at.
If you omit the selector while outside a call, the command returns not in a call and exits nonzero.

call edit [call]

Set a call’s title or summary. You must pass --title, --summary, or both. An empty value clears that field.

call start <person-or-machine-id>

Start a 1:1 call with a contact or one of your connected machines. Get machine IDs from machines list.--wait waits for the connection. --timeout controls how long it waits and defaults to 30s. A wait exits 0 when connected, 2 if the call ends first, and 3 on timeout.

call join <person-or-url>

Join a contact’s call or a room slug or URL. Tuple tries the argument as a contact first. Pass --switch to leave your current call before joining.

call participants add <person> / call participants remove <person>

Add or remove someone from a call. Both commands accept --call, which defaults to current. add also accepts the same --wait and --timeout behavior as call start.

call leave

Leave a call. --call defaults to current.

call mute / call unmute

Mute or unmute your microphone. --call defaults to current.

call react <sound>

Play airhorn, trombone, or flute for everyone on the call. --call defaults to current.

tuple rooms

Manage Tuple rooms. Existing-room commands accept an exact slug, such as acme/general, or a full room URL.

rooms list [flags]

List your personal and team rooms. Occupied rooms come first, followed by favorites, then name.

rooms follow [flags]

Emit the complete filtered room list as JSON Lines when the result changes. It supports --kind, --occupied, --favorited, and --limit.

rooms show <slug-or-url>

Show one room by exact slug or URL.

rooms join <slug-or-url>

Join a room without resolving the argument as a contact. Pass --switch to leave your current call first.

rooms favorite <slug-or-url> / rooms unfavorite <slug-or-url>

Favorite or unfavorite a room.

rooms create <name>

Create a team room.

tuple machines

machines list

List your other signed-in, connected machines. Each result contains its machine ID, platform, device name when available, and current call ID when that machine is in a call. Use a machine ID with tuple call start to call that device.

tuple screen

Save the shared screen as a JPEG with visible annotations composited in.
For stored frames, read stderr for timing and annotation caveats.

tuple capture

Control call capture, read its records, and find or export stored calls. The app owns the local archive. Use the CLI instead of reading its database directly.Capture records have three categories: transcript, events, and content. Read commands include all three unless --exclude removes a category.

capture start / capture stop

Start or stop capture. --call defaults to current.

capture show [call-id]

Print a finite snapshot, then exit. Omit the selector for the active call, use current, or pass a stored call ID or unique prefix. Use --recording <uuid> to select one recording session without a call selector.Text output is one readable line per record. --format json emits one canonical record per line as JSON Lines. It is not a single object or array. The number of lines grows with the selected records, so use --since and --until when a JSON consumer needs a bounded interval.

capture follow [call-id]

Follow records continuously. Without a call ID, it stays subscribed across calls. When pinned to a call or recording session, it ends with that scope.

capture next [call-id]

Return one batch and exit. The first read without --cursor returns the available catch-up immediately. To wait for later records, pass the highest delivered record ID back with --cursor.If the first read is empty and provides no record ID, use --cursor 0 to start waiting.Use one foreground invocation at a time. Let your agent harness or task runner schedule the next invocation after it processes the result. Avoid an unattended shell polling loop.

Live-read flags

follow and next support these flags in addition to --recording, --since, --exclude, and --timestamps:For follow and next, --since applies only to the initial catch-up. Each JSON output line is either a canonical capture record or a synthetic status line such as {"kind":"status","status":"call_ended","call_id":"..."}. Status lines frame delivery. They are not stored capture records and have no durable record ID.A consumer should save the highest positive record id only after those records reach the model or destination. Preserve the call or recording selector and category exclusions when resuming. Never advance a checkpoint from a status line or a record with ID 0.

Wake phrases

Use --wake-on with --batch to flush buffered output early. Matching is case-insensitive and applies only to finalized speech. * matches every finalized speech record. An agent_prompt flushes a batch regardless of wake phrases.capture follow watches each referenced @FILE and reloads it when it changes. capture next reads the file once. Wake phrases apply only to that command invocation.

capture list

List stored calls newest first. Results include call metadata, a segment count, and resolved participants.

capture search <query>

Search stored speech and shared app names, window titles, and URLs. Results are newest first.Use plain terms or quote a phrase. If the result set is broad, add participant, call, date, kind, or speaker filters.Each result identifies its kind, call ID, timestamp, and matching snippet. Spoken results also identify the speaker and can include context_before and context_after. Content results include the app name, window title, and URL when available.

capture export <destination>

Write selected records from one or more calls to one artifact file. The destination is replaced only after the complete artifact is ready. If no calls match, the command fails and leaves an existing destination untouched. On POSIX systems, the file mode is 0600.Each JSON Lines artifact record preserves the canonical capture record and adds call_id. The global --format json changes only the command receipt; --as controls the artifact.

capture delete <call-id>

Permanently delete one stored call’s conversation, events, content, and retained media. This cannot be undone.

Recording sessions

Each time capture starts, Tuple creates a recording-session UUID. show, follow, next, search, and export accept --recording <uuid>. The call-capture-started and call-capture-complete triggers provide it as TUPLE_TRIGGER_RECORDING_ID.

tuple notifications

The --call flag applies to every notification command and defaults to current.

notifications send

Post a notice without waiting for a response. --title, --body, and --sender are required. By default, the card persists until dismissal or cancellation.--ephemeral dismisses an unnoticed card after 10 seconds. --interaction-timeout <duration> sets a value from 2s through 60s and implies --ephemeral.

notifications ask

Post a decision card and wait. --title, --body, and --sender are required. --accept-label and --reject-label customize the buttons.The command prints decision and notification_id. It exits 0 only for accepted; rejected and canceled exit nonzero. The card has no timeout.

notifications list

Return bounded notification containers with their current state, response, timestamps, and lifecycle.

notifications follow

Follow notification lifecycle events. With --format json, each event is one JSON line. --interval <duration> buffers output.

notifications cancel <notification-id>

Withdraw a card you posted. Only the user can accept or reject it.

tuple whoami

Print the signed-in user’s email in text output. --format json returns id, email, full_name, and short_name.

tuple state

Print a bounded orientation summary. It contains the active call, current user, contact and room counts, pending-invite count, connection state, platform, app version, and available update. Its see map points to commands for full entity lists.The summary’s call field is the same normalized Call shape returned by tuple call show --format json. Online favorite names are capped at 10. When connection.websocket_state is not connected, presence-derived counts are last-known. Pass --raw for the full daemon state.

state follow

Emit a complete bounded summary whenever it changes. With --format json, each summary is one JSON line. Pass --raw for the daemon’s initial state and incremental event stream.

tuple agent guide [topic]

Read operating guidance embedded in this CLI build. Run tuple agent guide for the bounded index, then read only the topic your task needs.Topics include automation, call-content, communication, connection, live-call, past-calls, safety, and troubleshooting. An app-managed agent also gets managed-agent. Availability can hide guidance for unsupported operations.Use connection for call connectivity or quality diagnosis. Use command --help for exact flags.

Session-specific agent commands

The session’s generated guidance exposes agent message <text> when agent messaging is available. It sends a message to the user’s Tuple chat panel. Capture must be running for the message to enter the stored record.An app-designated managed run can expose agent attention. Its --cadence sets a duration in whole seconds and repeatable --wake-on values replace that run’s wake phrases. Use only the commands exposed for the app-provided session; reading a guide does not enable a capability.

tuple connect [purpose]

Launch the configured AI agent with current-call context and embedded operating instructions. With --call, an active call supplies live context and an ended call supplies historical context. See Connect an AI agent.

connect prompt [purpose]

Print the same instructions without launching an agent. It accepts --call.

connect configure [harness]

Configure the default agent and its launch settings. This command requires a terminal.

tuple mcp

Run the Tuple MCP server over stdin and stdout. See the MCP server page.

mcp install [agent...]

Register the server with detected supported agents, or name one or more of claude, claude-desktop, and codex. Use --name to choose the server identifier.