Inline CLI
Global flags
--json: Output raw JSON payloads (proto/RPC results) to stdout (available on all commands).- When
--jsonis set and a command fails, the CLI prints a structured error JSON to stderr:{"error":{"code","message","hint","examples"}}and exits non-zero. - Table-only convenience flags are disabled in
--jsonmode. Specifically:inline users list --filter/--ids/--id,inline bots list --filter/--ids/--id, andinline chats list --ids/--id. inline chats list --jsonstill supports--filter,--limit, and--offsetfor pre-filtered/paginated payloads.- Destructive commands never prompt in
--jsonmode; pass--yesexplicitly.
- When
--pretty: Pretty-print JSON output (default).--compact: Compact JSON output (no whitespace).
Subcommands
auth
inline auth login [--email you@x.com | --phone +15551234567]- Run an interactive login flow.
- If code is wrong, prompt to try again or edit email/phone (no hard exit).
inline auth me- Fetch and print the current user (verifies your token is still valid).
inline auth logout- Clear the stored token and current user.
shortcuts and aliases
inline meandinline whoami- Shortcut for
inline auth me.
- Shortcut for
inline search ...- Shortcut for
inline messages search ....
- Shortcut for
inline chat ...,inline thread ...,inline threads ...- Aliases for
inline chats ....
- Aliases for
inline bot ...- Alias for
inline bots ....
- Alias for
chats
inline chats list- List chats with human-readable names, unread count, and last message preview (sender + text in one column).
inline chats list --json --filter "launch"- Same
GetChatsResultJSON payload, but pre-filtered by chat name/space/id for agent pipelines.
- Same
inline chats get [--chat-id 123 | --user-id 42]- Fetch a chat (thread or DM) by id.
inline chats participants --chat-id 123- List participants for a chat, including join date.
inline chats add-participant --chat-id 123 --user-id 42- Add a user to a chat.
inline chats remove-participant --chat-id 123 --user-id 42- Remove a user from a chat.
inline chats create --title "Project" [--space-id 31] [--description "Spec"] [--emoji ":rocket:"] [--public] [--participant 42]- Create a new chat or thread. If
--publicis set, participants must be empty.
- Create a new chat or thread. If
inline chats create-dm --user-id 42- Create a private chat (DM).
inline chats update-visibility --chat-id 123 [--public | --private --participant 42 --participant 99]- Change a chat between public/private.
--publiccannot include participants.--privaterequires one or more--participantvalues.
inline chats rename --chat-id 123 --title "New title" [--emoji "🚀"]- Rename a chat or thread.
inline chats mark-unread [--chat-id 123 | --user-id 42]- Mark a chat or DM as unread.
inline chats mark-read [--chat-id 123 | --user-id 42] [--max-id 456]- Mark a chat or DM as read. If
--max-idis omitted, marks through the latest message.
- Mark a chat or DM as read. If
inline chats delete --chat-id 123- Delete a chat (space thread). Prompts for confirmation unless
--yesis provided (--jsonrequires--yes).
- Delete a chat (space thread). Prompts for confirmation unless
bots
- Alias:
inline bot ...maps toinline bots .... inline bots list [--filter "name"] [--ids | --id]- List bots you can access.
inline bots create --name "Build Bot" --username build_bot [--add-to-space 31]- Create a bot. Token is not printed in table output; use
inline bots reveal-tokenexplicitly. JSON includes the token.
- Create a bot. Token is not printed in table output; use
inline bots reveal-token --bot-user-id 42- Print (or JSON-return) an existing bot token by bot user id.
typing
inline typing start [--chat-id 123 | --user-id 42]- Send a "typing" compose action.
inline typing stop [--chat-id 123 | --user-id 42]- Clear the compose action (stop typing).
users
inline users list [--filter "name"] [--ids | --id]- List users that appear in your chats (derived from getChats).
--filtermatches name, username, email, or phone.--idsprints one user id per line.--idrequires exactly one match and prints that id.
inline users get --id 42- Fetch one user by id (from the same getChats payload).
spaces
inline spaces list- List spaces referenced by your chats (derived from getChats).
inline spaces members --space-id 31- List members in a space.
inline spaces invite --space-id 31 [--user-id 42 | --email you@x.com | --phone +15551234567] [--admin] [--public-chats]- Invite a user to a space (role is optional; defaults to server behavior).
inline spaces delete-member --space-id 31 --user-id 42- Remove a member from a space (prompts for confirmation; use
--yesto skip;--jsonrequires--yes).
- Remove a member from a space (prompts for confirmation; use
inline spaces update-member-access --space-id 31 --user-id 42 [--admin | --member] [--public-chats]- Update a member's access/role. Provide
--adminor--member(and optional--public-chats).
- Update a member's access/role. Provide
notifications
inline notifications get- Show current notification settings.
inline notifications set [--mode all|none|mentions|only-mentions|important] [--silent | --sound]- Update notification settings.
update
inline update- Download and install the latest release for this machine.
doctor
inline doctor- Print diagnostic info (system, config, paths, auth state).
tasks
inline tasks create-linear --chat-id 123 --message-id 456 [--space-id 31]- Create a Linear issue from a message.
inline tasks create-notion --chat-id 123 --message-id 456 --space-id 31- Create a Notion task from a message.
schema
inline schema proto- Print bundled protobuf source files.
messages
inline messages list [--chat-id 123 | --user-id 42] [--limit 50] [--offset-id 456] [--translate en] [--since "yesterday"] [--until "today"]- List chat history for a chat or DM.
--translate <lang>fetches translations and includes them in output.
inline messages export [--chat-id 123 | --user-id 42] [--limit 50] [--offset-id 456] [--since "1w ago"] [--until "today"] --output PATH- Export chat history to a JSON file.
inline messages search [--chat-id 123 | --user-id 42] --query "onboarding" [--query "alpha beta"] [--limit 50] [--since "today"] [--until "tomorrow"]- Search messages in a chat or DM.
--queryis repeatable; each query can contain space-separated terms (ANDed within a query, ORed across queries). Extra whitespace is collapsed.--sinceand--untilaccept relative time expressions likeyesterday,2h ago,monday,2024-01-15, or RFC3339.
inline messages get --chat-id 123 --message-id 456 [--translate en]- Fetch one full message by id (includes media + attachments).
inline messages send [--chat-id 123 | --user-id 42] [--text "hi" | --message "hi" | --msg "hi" | -m "hi"] [--stdin] [--reply-to 456] [--mention USER_ID:OFFSET:LENGTH ...] [--attach PATH ...] [--force-file]- Send a message (markdown parsing enabled). Mentions are provided via
--mentionwith UTF-16 offsets. --stdinreads message text from stdin.--attachis repeatable. Each attachment is sent as its own message;--textis reused as the caption.- Folders are zipped before upload. Attachments over 200MB are rejected.
--force-fileuploads photos/videos as files (documents).--mentionis repeatable and must match the message text (user_id:offset:lengthwith UTF-16 units).
- Send a message (markdown parsing enabled). Mentions are provided via
inline messages forward --from-chat-id 123 --message-id 456 --to-chat-id 789 [--no-header]- Forward one or more messages between chats or DMs.
- Repeat
--message-idto forward multiple messages.
inline messages edit [--chat-id 123 | --user-id 42] --message-id 456 [--text "updated" | --message "updated" | --msg "updated" | -m "updated" | --stdin]- Edit a message by id.
inline messages delete [--chat-id 123 | --user-id 42] --message-id 456 [--message-id 789]- Delete one or more messages (prompts for confirmation; use
--yesto skip;--jsonrequires--yes).
- Delete one or more messages (prompts for confirmation; use
inline messages add-reaction [--chat-id 123 | --user-id 42] --message-id 456 --emoji "👍"- Add an emoji reaction to a message (emoji characters only, no
:shortcode:).
- Add an emoji reaction to a message (emoji characters only, no
inline messages delete-reaction [--chat-id 123 | --user-id 42] --message-id 456 --emoji "👍"- Remove an emoji reaction from a message (emoji characters only, no
:shortcode:).
- Remove an emoji reaction from a message (emoji characters only, no
inline messages download [--chat-id 123 | --user-id 42] --message-id 456 [--output PATH | --dir PATH]- Download the attachment from a message.
Examples
- Login and greet user:
inline auth login(prompts for email/phone + code, then prints welcome name)
- Verify who you are:
inline auth me- Shortcut:
inline me
- Check diagnostics:
inline doctor
- List chats/threads:
inline chats list- Alias:
inline thread list
- Update chat visibility:
inline chats update-visibility --chat-id 123 --publicinline chats update-visibility --chat-id 123 --private --participant 42 --participant 99
- Search messages in a chat:
inline messages search --chat-id 123 --query "design review"- JSON:
inline messages search --chat-id 123 --query "design review" --json - Shortcut:
inline search --chat-id 123 --query "design review"
- Translate and list messages:
inline messages list --chat-id 123 --translate en
- Filter messages by time:
inline messages list --chat-id 123 --since "yesterday"inline messages list --chat-id 123 --since "2h ago" --until "1h ago"
- Export messages to a file:
inline messages export --chat-id 123 --output ./messages.jsoninline messages export --chat-id 123 --since "1w ago" --output ./recent.json
- Send message with multiple attachments:
inline messages send --chat-id 123 --text "FYI" --attach ./photo.jpg --attach ./spec.pdf
- Reply to a message:
inline messages send --chat-id 123 --reply-to 456 --text "on it"
- Forward a message:
inline messages forward --from-chat-id 123 --message-id 456 --to-chat-id 789
- Send a message with a mention entity:
inline messages send --chat-id 123 --text "@Sam hello" --mention 42:0:4
- Download an attachment:
inline messages download --chat-id 123 --message-id 456 --dir ./downloads
- Rename a thread:
inline chats rename --chat-id 123 --title "New title"
- Bots:
inline bots listinline bots create --name "Build Bot" --username build_botinline bots reveal-token --bot-user-id 42(token is not printed by default)
- Tasks:
inline tasks create-linear --chat-id 123 --message-id 456inline tasks create-notion --chat-id 123 --message-id 456 --space-id 31
- Typing:
inline typing start --chat-id 123inline typing stop --chat-id 123
- Edit and delete a message:
inline messages edit --chat-id 123 --message-id 456 --text "updated"inline messages delete --chat-id 123 --message-id 456
- Invite and manage members:
inline spaces invite --space-id 31 --email you@example.cominline spaces update-member-access --space-id 31 --user-id 42 --admin
- JQ pipelines for lists:
inline users list --json | jq -r '.users[] | "\(.id)\t\(.first_name) \(.last_name)\t@\(.username // "")\t\(.email // "")"'inline users list --json | jq -r '.users[] | select((.first_name + " " + (.last_name // "") + " " + (.username // "") + " " + (.email // "")) | ascii_downcase | contains("mo")) | "\(.id)\t\(.first_name) \(.last_name)"'
inline chats list --json | jq -r '.chats[] | "\(.id)\t\(.title // "")\tspace:\(if .space_id == null then "dm" else (.space_id | tostring) end)"'inline chats list --json | jq -r '.dialogs[] | select(.unread_count > 0) | "\(.chat_id)\tunread:\(.unread_count)"'inline messages list --chat-id 123 --json | jq -r '.messages[] | "\(.id)\t\(.from_id)\t\((.message // "") | gsub("\n"; " ") | .[0:80])"'inline schema proto --json --compact | jq -r '.files[].name'
Agent Tips
Finding users quickly
inline users list | grep -i "partial_name"
Faster than parsing JSON when you just need user ID.
DM: last 5 messages + download media
# Find the DM user id by name/email/username
USER_ID="$(inline users list --filter "sam" --id)"
# Read the last 5 messages
inline messages list --user-id "$USER_ID" --limit 5 --json --compact
# Download media from the last 50 messages
inline messages list --user-id "$USER_ID" --limit 50 --json --compact \
| jq -r '.messages[] | select(.media != null) | .id' \
| while read -r MESSAGE_ID; do
inline messages download --user-id "$USER_ID" --message-id "$MESSAGE_ID" --dir ./downloads
done
Filtering messages with jq
# Get last N outgoing messages (your messages)
inline messages list --user-id ID --json | jq '[.messages[] | select(.out == true)] | .[0:3]'
# Get last N incoming messages (their messages)
inline messages list --user-id ID --json | jq '[.messages[] | select(.out == false)] | .[0:3]'
Multi-term search for feedback/bugs
inline messages search --user-id ID --query "bug" --query "issue" --query "loom" --query "broken" --limit 30 --json
Each --query is ORed together - useful for finding feedback items.
Common patterns
- Use --user-id for DMs instead of looking up chat IDs
- Use --json + jq for programmatic filtering
- Use default (non-JSON) mode for quick human-readable output
More quick tips
# Page back with offset-id
inline messages list --chat-id ID --limit 50 --offset-id 1234
# Get the latest message id
inline messages list --chat-id ID --limit 1 --json | jq '.messages[0].id'
# Export a batch for offline review
inline messages export --chat-id ID --limit 500 --output ./chat.json
# Compact JSON for pipelines
inline messages list --chat-id ID --json --compact | jq '.messages | length'
JSON samples
Chat list (GetChatsResult, truncated to essential fields):
{
"dialogs": [
{
"peer": { "type": { "Chat": { "chat_id": 340 } } },
"space_id": 31,
"archived": false,
"pinned": false,
"read_max_id": 1,
"unread_count": 0,
"chat_id": 340,
"unread_mark": false
}
],
"chats": [
{
"id": 340,
"title": "Main",
"space_id": 31,
"description": "Main chat for everyone in the space",
"emoji": null,
"is_public": true,
"last_msg_id": 1,
"peer_id": { "type": { "Chat": { "chat_id": 340 } } },
"date": 1754585453
}
],
"spaces": [
{ "id": 31, "name": "Design", "creator": false, "date": 1750000000 }
],
"users": [
{
"id": 1000,
"first_name": "Ava",
"last_name": "Chen",
"username": "ava",
"email": "ava@example.com",
"min": false,
"bot": false
}
],
"messages": [
{
"id": 1,
"from_id": 1000,
"peer_id": { "type": { "Chat": { "chat_id": 340 } } },
"chat_id": 340,
"message": null,
"out": true,
"date": 1754585453,
"media": {
"media": {
"Document": {
"document": {
"id": 32,
"file_name": "recording.mp4",
"mime_type": "video/mp4",
"size": 6932635,
"cdn_url": "https://..."
}
}
}
}
}
]
}
Message list (GetChatHistoryResult, truncated to essential fields):
{
"messages": [
{
"id": 456,
"from_id": 42,
"peer_id": { "type": { "Chat": { "chat_id": 123 } } },
"chat_id": 123,
"message": "Ship it",
"out": true,
"date": 1733184000,
"attachments": {
"attachments": [
{
"id": 9001,
"attachment": {
"UrlPreview": {
"id": 88,
"url": "https://...",
"site_name": "Docs",
"title": "Spec",
"description": "API rollout spec"
}
}
}
]
}
}
]
}
Source: inline-chat/inline — distributed by TomeVault.