{"id":44750589,"url":"https://github.com/linq-team/linq-cli","last_synced_at":"2026-05-15T01:25:46.842Z","repository":{"id":338686003,"uuid":"1141384772","full_name":"linq-team/linq-cli","owner":"linq-team","description":"Linq CLI - messaging from your terminal","archived":false,"fork":false,"pushed_at":"2026-05-13T23:34:06.000Z","size":640,"stargazers_count":22,"open_issues_count":1,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T01:40:29.588Z","etag":null,"topics":["cli","developer-tools","imessage","linq","messaging","sms","typescript"],"latest_commit_sha":null,"homepage":"https://linqapp.com/s/cli","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linq-team.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-24T19:00:04.000Z","updated_at":"2026-04-28T13:19:41.000Z","dependencies_parsed_at":"2026-02-16T04:10:09.770Z","dependency_job_id":null,"html_url":"https://github.com/linq-team/linq-cli","commit_stats":null,"previous_names":["linq-team/linq-cli"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/linq-team/linq-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linq-team%2Flinq-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linq-team%2Flinq-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linq-team%2Flinq-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linq-team%2Flinq-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linq-team","download_url":"https://codeload.github.com/linq-team/linq-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linq-team%2Flinq-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33049875,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","imessage","linq","messaging","sms","typescript"],"created_at":"2026-02-15T23:06:16.214Z","updated_at":"2026-05-15T01:25:46.828Z","avatar_url":"https://github.com/linq-team.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Linq CLI\n\n[![License](https://img.shields.io/github/license/linq-team/linq-cli.svg)](LICENSE)\n[![CI](https://img.shields.io/github/actions/workflow/status/linq-team/linq-cli/ci.yml?branch=main)](https://github.com/linq-team/linq-cli/actions/workflows/ci.yml)\n\nA command-line interface for the [Linq](https://linqapp.com) messaging API. Send and receive iMessages programmatically.\n\n## Installation\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew install linq-team/tap/linq\n```\n\n### Quick Install (macOS / Linux)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/linq-team/linq-cli/main/install.sh | sh\n```\n\nAutomatically detects your OS and architecture, downloads the latest release, and installs it.\n\n### Manual Download\n\nDownload the latest installer for your platform from the [Releases](https://github.com/linq-team/linq-cli/releases/latest) page:\n\n| Platform | File | Install Command |\n|----------|------|-----------------|\n| **macOS (Apple Silicon)** | `linq-*-mac-apple-silicon.pkg` | Double-click to install |\n| **macOS (Intel)** | `linq-*-mac-intel.pkg` | Double-click to install |\n| **Windows (x64)** | `linq-*-windows-x64.exe` | Run the installer |\n| **Windows (ARM)** | `linq-*-windows-arm64.exe` | Run the installer |\n| **Linux (x64)** | `linq-*-linux-x64.deb` | `sudo dpkg -i linq-*.deb` |\n| **Linux (ARM)** | `linq-*-linux-arm64.deb` | `sudo dpkg -i linq-*.deb` |\n\nAfter installation, the `linq` command will be available in your terminal.\n\n## Quick Start\n\n1. **Create your account**:\n\n   ```bash\n   linq signup\n   ```\n\n   Enter your email, paste the 6-digit code we send you, then your name. You get a shared phone line you can use right away.\n\n2. **Add a contact** so they can text you:\n\n   ```bash\n   linq contacts add +19876543210\n   ```\n\n3. **Listen for incoming messages**:\n\n   ```bash\n   linq webhooks listen\n   ```\n\n   Have the contact text your shared line — events stream into your terminal.\n\n4. **Reply back**:\n\n   ```bash\n   linq chats create --to +19876543210 --message \"Hi from the CLI!\"\n   ```\n\n\u003e **Heads up:** shared lines are inbound-first. Someone on your contact list has to text you before you can text them. Upgrade to a dedicated line to message anyone without that restriction.\n\n## Commands\n\n### Setup\n\n#### `linq signup`\n\nCreate a Linq developer account and get a shared phone line. Authenticates via email OTP — no API token needed.\n\n```bash\nlinq signup\n```\n\nThe flow: enter email → check inbox for the 6-digit code → enter the code → enter your name. You're in.\n\n#### `linq login`\n\nLog in to an existing account using email OTP.\n\n```bash\nlinq login\n```\n\n#### `linq logout`\n\nClear local credentials. Does **not** revoke your API key on the server — just removes the stored token from this machine.\n\n```bash\nlinq logout\n```\n\n#### `linq whoami`\n\nShow your current identity and account info.\n\n```bash\nlinq whoami\nlinq whoami --json\n```\n\n#### `linq doctor`\n\nCheck your CLI configuration and API connectivity. Runs diagnostic checks and reports any issues.\n\n```bash\nlinq doctor\n```\n\n#### `linq init`\n\nInteractive setup wizard. Useful if you already have an API token (e.g. from the dashboard) and want to wire it up to the CLI without going through the OTP flow.\n\n```bash\nlinq init\n```\n\n### Profile\n\n#### `linq profile get|set`\n\nManage profile configuration values.\n\n```bash\n# View current profile config\nlinq profile get\n\n# Set your API token manually\nlinq profile set token YOUR_API_TOKEN\n\n# Set default sender phone (must be one from `linq phonenumbers`)\nlinq profile set fromPhone +12025551234\n```\n\n#### `linq profile list`\n\nList all configuration profiles.\n\n```bash\nlinq profile list\n# Output:\n# Profiles:\n#   default (active)\n#   personal\n#   work\n```\n\n#### `linq profile use`\n\nSwitch to a different profile.\n\n```bash\nlinq profile use work\n```\n\n#### `linq profile create`\n\nCreate a new named profile.\n\n```bash\nlinq profile create staging\nlinq profile create work --token YOUR_TOKEN --from-phone +12025551234\n```\n\n#### `linq profile delete`\n\nDelete a named profile.\n\n```bash\nlinq profile delete staging\n```\n\n### Profiles\n\nProfiles work like AWS CLI profiles — switch between different accounts or phone numbers easily. `linq signup` and `linq login` save credentials to the `default` profile.\n\n```bash\n# Create a work profile\nlinq profile create work\nlinq profile set token WORK_TOKEN --profile work\nlinq profile set fromPhone +18005551234 --profile work\n\n# Switch default profile\nlinq profile use work\n\n# Or use --profile flag with any command\nlinq chats create --to +19876543210 --message \"Hello\" --profile personal\n```\n\nEnvironment variables:\n- `LINQ_PROFILE` — Override the active profile\n- `LINQ_FROM_PHONE` — Override the sender phone number\n\n### Phone Numbers\n\n#### `linq phonenumbers`\n\nList your available phone numbers.\n\n```bash\nlinq phonenumbers\n```\n\n#### `linq phonenumbers set`\n\nSet the default sender phone for the active profile.\n\n```bash\nlinq phonenumbers set +12025551234\n```\n\n### Contacts (shared line)\n\nShared lines are inbound-first: a contact must text you before you can text them. Use `linq contacts` to manage the allowed contact list (max 100 per shared line).\n\n#### `linq contacts add`\n\nAllow a phone number to message your shared line.\n\n```bash\nlinq contacts add +19876543210\n```\n\n#### `linq contacts list`\n\nList all contacts on your shared line.\n\n```bash\nlinq contacts list\n```\n\n#### `linq contacts remove`\n\nRemove a contact.\n\n```bash\nlinq contacts remove +19876543210\n```\n\n### Chats\n\n#### `linq chats create`\n\nCreate a new chat and send an initial message.\n\n```bash\n# Send to a single recipient (uses fromPhone from config)\nlinq chats create --to +19876543210 --message \"Hello!\"\n\n# Or specify --from explicitly\nlinq chats create --to +19876543210 --from +12025551234 --message \"Hello!\"\n\n# Send to multiple recipients (group chat)\nlinq chats create --to +1111111111 --to +2222222222 --from +12025551234 --message \"Group chat\"\n\n# With iMessage effects\nlinq chats create --to +19876543210 --from +12025551234 --message \"Party!\" --effect confetti\n```\n\n**Flags:**\n- `--to` (required): Recipient phone number or email. Can be specified multiple times for group chats.\n- `--from`: Your sender phone number (must be one from `linq phonenumbers`). Uses config `fromPhone` if not specified.\n- `--message`, `-m` (required): Message text\n- `--effect`: iMessage effect (confetti, fireworks, lasers, balloons, etc.)\n- `--profile`, `-p`: Config profile to use\n- `--token`, `-t`: Override stored API token\n\n#### `linq chats list`\n\nList chats for a phone number.\n\n```bash\n# Uses fromPhone from config\nlinq chats list\n\n# Specify phone number explicitly\nlinq chats list --from +12025551234\nlinq chats list --from +12025551234 --limit 50\n```\n\n**Flags:**\n- `--from`: Your phone number to list chats for (must be one from `linq phonenumbers`). Uses config `fromPhone` if not specified.\n- `--limit`: Maximum number of chats to return (default: 20, max: 100)\n- `--cursor`: Pagination cursor from previous response\n- `--profile`, `-p`: Config profile to use\n- `--token`, `-t`: Override stored API token\n\n#### `linq chats get`\n\nGet details of a specific chat.\n\n```bash\nlinq chats get CHAT_ID\n```\n\n#### `linq chats update`\n\nUpdate a chat's display name or group icon.\n\n```bash\n# Rename a chat\nlinq chats update CHAT_ID --name \"Team Discussion\"\n\n# Set group icon\nlinq chats update CHAT_ID --icon https://example.com/icon.png\n```\n\n**Flags:**\n- `--name`: New display name for the chat\n- `--icon`: URL for group chat icon\n- At least one of `--name` or `--icon` must be specified\n\n#### `linq chats read`\n\nMark all messages in a chat as read.\n\n```bash\nlinq chats read CHAT_ID\n```\n\n#### `linq chats typing`\n\nStart or stop a typing indicator in a chat.\n\n```bash\n# Start typing indicator\nlinq chats typing CHAT_ID\n\n# Stop typing indicator\nlinq chats typing CHAT_ID --stop\n```\n\n#### `linq chats voicememo`\n\nSend a voice memo to a chat.\n\n```bash\nlinq chats voicememo CHAT_ID --url https://example.com/memo.m4a\n```\n\n**Flags:**\n- `--url` (required): URL of the voice memo audio file\n\n#### `linq chats share-contact`\n\nShare your contact card with a chat.\n\n```bash\nlinq chats share-contact CHAT_ID\n```\n\n#### `linq chats participants add`\n\nAdd a participant to a group chat.\n\n```bash\nlinq chats participants add CHAT_ID --handle +19876543210\n```\n\n**Flags:**\n- `--handle` (required): Phone number or email of participant to add\n\n#### `linq chats participants remove`\n\nRemove a participant from a group chat.\n\n```bash\nlinq chats participants remove CHAT_ID --handle +19876543210\n```\n\n**Flags:**\n- `--handle` (required): Phone number or email of participant to remove\n\n### Messages\n\n#### `linq messages send`\n\nSend a message to an existing chat.\n\n```bash\n# Uses fromPhone from config\nlinq messages send CHAT_ID --message \"Hello!\"\n\n# Specify sender explicitly\nlinq messages send CHAT_ID --from +12025551234 --message \"Hello!\"\n\n# With iMessage effect\nlinq messages send CHAT_ID --message \"Surprise!\" --effect fireworks\n\n# Reply to a message (creates a thread)\nlinq messages send CHAT_ID --message \"Reply\" --reply-to MSG_ID\n```\n\n**Flags:**\n- `--from`: Your sender phone number (must be one from `linq phonenumbers`). Uses config `fromPhone` if not specified.\n- `--message`, `-m` (required): Message text\n- `--effect`: iMessage effect\n- `--reply-to`: Message ID to reply to (creates a thread)\n- `--profile`, `-p`: Config profile to use\n- `--token`, `-t`: Override stored API token\n\n#### `linq messages list`\n\nList messages in a chat.\n\n```bash\nlinq messages list CHAT_ID\nlinq messages list CHAT_ID --limit 50\nlinq messages list CHAT_ID --order asc\n```\n\n**Flags:**\n- `--limit`: Maximum number of messages to return (default: 20, max: 100)\n- `--cursor`: Pagination cursor from previous response\n- `--order`: Sort order (asc or desc, default: desc)\n- `--profile`, `-p`: Config profile to use\n- `--token`, `-t`: Override stored API token\n\n#### `linq messages get`\n\nGet a specific message by ID.\n\n```bash\nlinq messages get MESSAGE_ID\n```\n\n#### `linq messages delete`\n\nDelete a message.\n\n```bash\nlinq messages delete MESSAGE_ID\n```\n\n#### `linq messages react`\n\nAdd or remove a reaction on a message.\n\n```bash\n# Add a reaction (--operation defaults to \"add\")\nlinq messages react MESSAGE_ID --type love\n\n# Remove a reaction\nlinq messages react MESSAGE_ID --operation remove --type like\n\n# Custom emoji reaction\nlinq messages react MESSAGE_ID --type custom --emoji \"🎉\"\n\n# React to a specific message part\nlinq messages react MESSAGE_ID --type laugh --part-index 1\n```\n\n**Flags:**\n- `--type` (required): Reaction type (love, like, dislike, laugh, emphasize, question, custom)\n- `--operation`: Operation to perform — `add` (default) or `remove`\n- `--emoji`: Custom emoji (required when type is `custom`)\n- `--part-index`: Index of the message part to react to (default: 0)\n\n#### `linq messages thread`\n\nGet all messages in a thread.\n\n```bash\nlinq messages thread MESSAGE_ID\nlinq messages thread MESSAGE_ID --limit 10 --order desc\n```\n\n**Flags:**\n- `--limit`: Maximum number of messages to return\n- `--cursor`: Pagination cursor\n- `--order`: Sort order (asc or desc)\n\n### Attachments\n\n#### `linq attachments upload`\n\nRequest a presigned upload URL for a file.\n\n```bash\nlinq attachments upload --filename photo.jpg --content-type image/jpeg --size 1024000\n```\n\n**Flags:**\n- `--filename` (required): Filename (e.g. photo.jpg)\n- `--content-type` (required): MIME type (e.g. image/jpeg)\n- `--size` (required): File size in bytes\n\n#### `linq attachments get`\n\nGet attachment metadata.\n\n```bash\nlinq attachments get ATTACHMENT_ID\n```\n\n### Webhooks\n\n#### `linq webhooks create`\n\nCreate a new webhook subscription.\n\n```bash\n# Subscribe to specific events\nlinq webhooks create --url https://example.com/webhook --events message.received,message.sent\n\n# Subscribe to all events\nlinq webhooks create --url https://example.com/webhook --all-events\n```\n\n**Flags:**\n- `--url` (required): Target URL for webhook events\n- `--events`: Comma-separated list of events to subscribe to\n- `--all-events`: Subscribe to all event types\n\nEither `--events` or `--all-events` is required.\n\nAvailable events: message.sent, message.received, message.read, message.delivered, message.failed, reaction.added, reaction.removed, participant.added, participant.removed, chat.created, chat.group_name_updated, chat.group_icon_updated, chat.group_name_update_failed, chat.group_icon_update_failed, chat.typing_indicator.started, chat.typing_indicator.stopped\n\n#### `linq webhooks list`\n\nList all webhook subscriptions.\n\n```bash\nlinq webhooks list\n```\n\n#### `linq webhooks get`\n\nGet details of a specific webhook subscription.\n\n```bash\nlinq webhooks get SUBSCRIPTION_ID\n```\n\n#### `linq webhooks update`\n\nUpdate a webhook subscription.\n\n```bash\n# Update URL\nlinq webhooks update SUBSCRIPTION_ID --url https://new-url.com/webhook\n\n# Update events\nlinq webhooks update SUBSCRIPTION_ID --events message.received,message.sent\n\n# Activate/deactivate\nlinq webhooks update SUBSCRIPTION_ID --activate\nlinq webhooks update SUBSCRIPTION_ID --deactivate\n```\n\n#### `linq webhooks delete`\n\nDelete a webhook subscription.\n\n```bash\nlinq webhooks delete SUBSCRIPTION_ID\n```\n\n#### `linq webhooks events`\n\nList available webhook event types.\n\n```bash\nlinq webhooks events\n```\n\n#### `linq webhooks listen`\n\nListen for webhook events in real time, optionally forwarding them to a local server. Creates a temporary webhook subscription that's automatically deleted when you stop.\n\n```bash\n# Listen for all events (structured log output)\nlinq webhooks listen\n\n# Forward to a local server (great for local dev)\nlinq webhooks listen --forward-to http://localhost:3000/webhook\n\n# Filter to specific events\nlinq webhooks listen --events message.received,message.sent\n\n# Output raw JSON instead of structured logs\nlinq webhooks listen --json\n```\n\n**Flags:**\n- `--forward-to`, `-f`: Forward each event to a local URL via HTTP POST\n- `--events`: Comma-separated list of events to subscribe to (default: all)\n- `--token`, `-t`: API token (overrides stored token)\n- `--profile`: Config profile to use\n- `--json`: Output raw JSON instead of structured log format\n\nEvents are displayed in a structured log format:\n\n```\n2024-01-15T10:30:45.123Z [message.received] message.id=msg_123 message.body=\"Hello world\" message.chat_id=chat_456\n```\n\nPress `Ctrl+C` to stop. The CLI automatically cleans up the webhook subscription.\n\n## Shell Autocomplete\n\nEnable tab completion for all commands and flags:\n\n```bash\n# Setup for your shell (bash, zsh, or fish)\nlinq autocomplete\n\n# Follow the printed instructions, then restart your terminal\n```\n\nAfter setup, press `\u003cTAB\u003e` to autocomplete commands, subcommands, and flags.\n\n## Telemetry\n\nLinq CLI collects anonymous usage data to help improve the tool. This includes:\n\n- **Command name** (e.g., `chats create`)\n- **CLI version**, OS, Node version, architecture\n- **Error stack traces** for crashes\n\n**Never collected**: tokens, phone numbers, message content, flag values, or any PII.\n\n### Opt out\n\n```bash\n# Via profile config\nlinq profile set telemetry false\n\n# Or via environment variable\nexport LINQ_TELEMETRY=0\n```\n\n## Environment Variables\n\n- `LINQ_TOKEN`: API token (overrides config file)\n- `LINQ_FROM_PHONE`: Default sender phone number (overrides config file)\n- `LINQ_PROFILE`: Profile to use (overrides config file)\n- `LINQ_TELEMETRY`: Set to `0` to disable telemetry\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines. Please read our [Code of Conduct](CODE_OF_CONDUCT.md) before participating.\n\n## License\n\nApache-2.0 — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinq-team%2Flinq-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinq-team%2Flinq-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinq-team%2Flinq-cli/lists"}