Messages
The message command group covers sending, reading, and managing threads and inboxes.
Sending
message new-thread
Create a new thread and send the first message to a recipient.
packet message new-thread --to <pubkey> --content "Hello!" [options]
Required:
| Flag | Description |
|---|---|
--to <pubkey> | Recipient Solana public key |
Content (exactly one required):
| Flag | Description |
|---|---|
--content <text> | Inline message body, URL, Irys gateway URL, or raw Irys CID |
--file <path> | Read message body from a file |
--url <url> | Send an existing URL or Irys gateway URL as a pointer |
Content options:
| Flag | Default | Description |
|---|---|---|
--subject <text> | — | Optional subject; wraps body in {subject, message} JSON envelope |
--raw | false | Send/upload the exact content without wrapping in a JSON envelope |
--content-type <type> | auto | auto, text, url, or irys |
--upload | false | Upload --content/--file payload to Irys; message stores the CID |
--encrypt | false | Encrypt the payload before sending. Requires the recipient to have a registered key or uses wallet-derived key. |
Inbox / targeting:
| Flag | Description |
|---|---|
--inbox <id|address> | Target a specific inbox ID or PDA address (default: inbox 0) |
--thread <id> | Optional explicit thread ID |
Payment:
| Flag | Description |
|---|---|
--payment-sol <amount> | Attach a WSOL payment (e.g. 0.05) |
--payment-to <pubkey> | Override the payment destination (defaults to recipient's ATA) |
--payment-to-raw | Treat --payment-to as a raw token account, not an owner wallet |
Transaction:
| Flag | Description |
|---|---|
--skip-preflight | Skip transaction preflight |
--priority-fee <microLamports> | Set a priority fee |
Examples:
# Plain text
packet message new-thread --to 3xK...abc --content "Hello!"
# Encrypted
packet message new-thread --to 3xK...abc --content "Secret" --encrypt
# Upload a file and send as Irys CID
packet message new-thread --to 3xK...abc --file ./report.pdf --upload
# Encrypted upload
packet message new-thread --to 3xK...abc --file ./doc.txt --upload --encrypt
message new
Send a new message to an existing thread.
packet message new --thread <id> --content "Reply!" [options]
Required:
| Flag | Description |
|---|---|
--thread <id> | Existing thread ID |
Accepts the same --content/--file/--url, content options, and payment flags as new-thread.
Additional flag:
| Flag | Default | Description |
|---|---|---|
--disable-payment | false | Skip payment even if the inbox has a payment rule |
Reading
message inboxes
List all inboxes belonging to your configured wallet.
packet message inboxes [--json]
Output includes inbox ID, address, name, thread count, and payment rule.
message inbox <inbox>
Load an inbox and display its threads with last messages.
packet message inbox 0 [options]
packet message inbox <pda-address> [--owner <pubkey>] [options]
| Argument/Flag | Description |
|---|---|
<inbox> | Inbox ID (uses --owner wallet) or inbox PDA address |
--owner <pubkey> | Inbox owner when <inbox> is a numeric ID (defaults to configured wallet) |
--limit <n> | Max threads to return (default 25) |
--max-pages <n> | Max archive pages to scan (default 5) |
--no-decrypt | Print raw/encrypted content without decrypting |
--no-load-content | Skip fetching URL/Irys bodies; print pointer only |
--json | Print JSON output |
message activity
Load all threads your wallet has sent or received.
packet message activity [--limit <n>] [--max-pages <n>] [--json]
| Flag | Default | Description |
|---|---|---|
--limit <n> | 25 | Thread count |
--max-pages <n> | 5 | Max activity pages to scan |
--no-decrypt | — | Skip decryption |
--json | — | JSON output |
message thread
Show metadata for a specific thread.
packet message thread --thread <id> [--json]
message messages
Load messages from a thread.
packet message messages --thread <id> [options]
| Flag | Default | Description |
|---|---|---|
--thread <id> | required | Thread ID |
--limit <n> | 50 | Message count |
--from-seq <seq> | — | Start from a specific sequence number |
--direction <dir> | backward | backward (newest first) or forward |
--no-decrypt | — | Skip decryption |
--no-load-content | — | Skip fetching URL/Irys bodies |
--json | — | JSON output |
message last
Load the most recent message from a thread.
packet message last --thread <id> [--no-decrypt] [--json]
Inbox Management
message create-inbox
Create a new inbox, optionally with a WSOL payment wall.
packet message create-inbox [--inbox <id>] [--name <name>] [options]
| Flag | Default | Description |
|---|---|---|
--inbox <id> | 0 | Inbox ID |
--name <name> | — | Display name |
--uri <uri> | "" | Metadata URI |
--ephemeral | false | Create an ephemeral inbox instead of standard |
--payment-sol <amount> | — | Require SOL payment to open a thread (e.g. 0.05) |
--payment-to <pubkey> | — | Override payment destination |
--payment-to-raw | false | Treat --payment-to as a raw token account |
--escrow | false | Hold payments in escrow until approved |
--json | — | JSON output |
Example:
# Inbox with 0.1 SOL payment wall + escrow
packet message create-inbox --inbox 0 --name "My Inbox" --payment-sol 0.1 --escrow
message edit-inbox-payment
Edit or remove the payment rule on an existing inbox.
packet message edit-inbox-payment <inbox> [--owner <pubkey>] [options]
| Argument/Flag | Description |
|---|---|
<inbox> | Inbox ID or PDA address |
--owner <pubkey> | Inbox owner when <inbox> is numeric |
--payment-sol <amount> | New required SOL payment |
--clear-payment | Remove the payment rule entirely |
--escrow | Enable escrow on the new rule |
--json | JSON output |
Escrow
message escrow approve
Approve and release the escrow for a thread.
packet message escrow approve --thread <id>
message escrow withdraw
Withdraw released escrow funds.
packet message escrow withdraw --thread <id> [--receiver-token-account <pubkey>]
| Flag | Description |
|---|---|
--receiver-token-account <pubkey> | Override receiver token account |