Public commands
This reference is generated from the same command tree as the shipped CLI. Hidden operational commands are excluded.
Browse every public command and flag
This reference is generated from the same command tree as the shipped CLI. Hidden operational commands are excluded.
Fast web research, AI text/image/audio inference, social-platform research, email, cloud files, encrypted secrets, and bulk domain name checking, and more
One CLI with many services: web research, inference across Claude/GPT/Gemini/ElevenLabs (text, images, audio), social-platform reads, email over IMAP/SMTP, cloud-stored files with Unix-style verbs, encrypted JSON secrets, and bulk domain name checking, and more. New here? Run `clor account login` first (browser approval; the issued API key is saved automatically and reused by every subcommand). Then run `clor <subcommand> --help` on any group to see flags, output shapes, and runnable examples. `clor --long-help` dumps every subcommand's help in one shot if you want the whole tree.
clor [flags]| Flag | Description |
|---|---|
| --clor-dir | explicit path to the clor home directory holding config, state, and caches (overrides $CLOR_DIR; defaults to ~/.clor) |
| --config | explicit path to the TOML config file (overrides --clor-dir); defaults to <clor-dir>/config.toml |
| --help | help for clor |
| --impersonate | run commands as another team member by user id, like sudo (requires team admin, or a delegate grant from that member) |
| --profile | API-key profile to use for this command (overrides CLOR_PROFILE and the persisted default_profile); manage with `clor account profile` |
| --stderr-file | write stderr to this file instead of the terminal |
| --stderr-format | stderr format for progress/diagnostic events: text (logfmt with event= leader), jsonl (one JSON object per line), or json (single pretty-printed object) Default text |
| --stdout-file | write stdout to this file instead of the terminal |
| --stdout-format | stdout format: text (logfmt with event= leader), jsonl (one JSON object per line), or json (single pretty-printed object) Default text |
Sign in, see who is signed in (whoami), credit balance, recharge settings, and per-service usage
Read-only views of the account behind the current API key: who is signed in, account name and recharge settings, credit balance, and recent per-service spend.
clor account [flags]| Flag | Description |
|---|---|
| --help | help for account |
Complete a sign-in approval by polling the token printed by `account login`
Single poll by default: status=pending|approved|cancelled|expired. On approved, persist the issued API key and report who is signed in. With --wait, block-poll until a terminal state or TTL elapses.
clor account claim <TOKEN> [flags]| Flag | Description |
|---|---|
| --help | help for claim |
| --wait | block until the claim is approved, cancelled, or expires (default: true at an interactive terminal, false otherwise) |
Inspect the account's prepaid credit balance
clor account credit [flags]| Flag | Description |
|---|---|
| --help | help for credit |
Show the current credit balance in USD with the last-updated timestamp and dashboard URL
clor account credit show [flags]| Flag | Description |
|---|---|
| --help | help for show |
Grant, list, and revoke the members who can run commands as you with --impersonate
A delegate is a member allowed to run commands as you with the --impersonate flag, like sudo scoped to acting as you. Team admins can already act as any member, so delegating is for giving one specific member (a shared support or automation account) that power without making them an admin. Use when: - you want a support or automation account to run work as you - you want to see who can act as you, or who you can act as - you want to revoke a delegate you granted earlier Subcommands: add Allow a member to run commands as you list Show who can act as you and who you can act as remove Revoke a member's permission to run commands as you Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor account delegate [flags]| Flag | Description |
|---|---|
| --help | help for delegate |
Allow a member to run commands as you
Pass the member's user id. A team admin can list member ids with admin user list. Once added, that member can run commands as you with the --impersonate flag. Re-adding an existing delegate is a no-op.
clor account delegate add <DELEGATE USER ID> [flags]| Flag | Description |
|---|---|
| --help | help for add |
Show who can run commands as you (granted) and who you can run as (received)
Two sections. Granted is the members who may act as you. Received is the members you may act as, the user ids valid for --impersonate. JSON keys: granted, received.
clor account delegate list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Revoke a member's permission to run commands as you
clor account delegate remove <DELEGATE USER ID> [flags]| Flag | Description |
|---|---|
| --help | help for remove |
Show the account's name, id, auto-recharge state, and credits dashboard URL
clor account info [flags]| Flag | Description |
|---|---|
| --help | help for info |
Create narrower API keys scoped to specific services and an optional expiry
Issue a new API key that is no more powerful than the key you are signed in with. The new key's capabilities must be a subset of your own, and it can expire sooner than yours but never later. Use it to give a node or a single workflow only the access it needs. Use when: - you want a per-node credential that runs spaces but cannot edit them - you want a key that can reach only one service, like drive - you want a key that expires automatically Subcommands: create Issue a new scoped, optionally expiring key Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor account key [flags]| Flag | Description |
|---|---|
| --help | help for key |
Issue a new API key scoped to the given capabilities with an optional expiry
Issue a new key whose capabilities are a subset of the signed-in key's. A capability is a service slug (drive) or a service and action (claw:run). Tags are the runner identity this key carries; a key needs a host= tag to claim and run claws on a node, plus any role tags. Tags are the creator's choice and need not fit the signed-in key's tags. The plaintext key is printed once and cannot be retrieved later, so capture it now.
clor account key create [flags]| Flag | Description |
|---|---|
| --capability | a service slug (drive) or service:action (claw:run); repeatable Default [] |
| --expires | lifetime before the key stops working (e.g. 30m, 24h, 7d); omit for no expiry |
| --help | help for create |
| --name | label for the new key |
| --tag | a runner tag this key carries; a key needs a host= tag to run claws (host=db-1, gpu); repeatable, omit for a key that runs no claws Default [] |
Sign in by approving a browser link, or pass a key directly with --key
Three modes: - --key clor_xxx: verify the supplied key and store it in the target profile (pair with --profile NAME to name the account). Scriptable, no browser. - No API key set: allocate an approval claim and print the URL plus the `clor account claim <TOKEN>` resume command. With --wait, block until approved and persist the issued key. - Key already set: verify it and report who is signed in. At an interactive terminal with --stdout-format text (default), the URL opens in the system browser and the command waits for approval. Pass --wait=false to print and exit; --no-browser (env CLOR_NO_BROWSER=1) to skip the browser pop.
clor account login [flags]| Flag | Description |
|---|---|
| --help | help for login |
| --key | verify and store this API key (clor_xxx) directly instead of the browser flow; pair with --profile to name the account |
| --key-standard-input | read the API key from standard input, verify it, and store it |
| --no-browser | do not auto-open the approval URL in the system browser; print it for the user to open manually (env: CLOR_NO_BROWSER=1) |
| --wait | after starting a claim, block until the user approves, cancels, or it expires (default: true at an interactive terminal, false otherwise) |
Sign out by removing the stored API key and node identity from this machine
clor account logout [flags]| Flag | Description |
|---|---|
| --help | help for logout |
Show the user identity attached to the current API key (id, email, name, picture)
clor account me [flags]| Flag | Description |
|---|---|
| --help | help for me |
List, switch, and remove the API-key profiles stored on this machine
Each profile is one API key for one account, the way AWS profiles work. The active profile is chosen by the --profile flag, then CLOR_PROFILE, then the persisted default profile. Add a profile with `clor account login --key clor_xxx --profile NAME`. Use when: - the user holds keys for several accounts and wants to see them - the user wants to change which account is used by default - the user wants to drop a profile they no longer use Subcommands: list List stored profiles with active and default markers use Set the default profile used when no flag or env is given remove Delete a stored profile Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor account profile [flags]| Flag | Description |
|---|---|
| --help | help for profile |
List stored profiles with active and default markers
clor account profile list [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --reveal | show the verbatim API key instead of a redacted preview |
Delete a stored profile and its key
clor account profile remove <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for remove |
Set the default profile used when no flag or environment override is given
clor account profile use <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for use |
Add, list, and remove SSH public keys available when creating machines
Save SSH public keys once, then select their fingerprints whenever you create a machine. Each key is available only to your account in the active team. Use when - you want to save an SSH public key for repeated machine creation - you need the fingerprint for a machine creation request - you want to remove a key you no longer use Subcommands add Store an SSH public key for machine selection list List SSH keys available when creating machines remove Remove an SSH key by its fingerprint Output. Every subcommand supports --stdout-format text|jsonl|json. Text output is logfmt with an event leader.
clor account ssh-key [flags]| Flag | Description |
|---|---|
| --help | help for ssh-key |
Store an SSH public key for machine selection
clor account ssh-key add <PUBLIC_KEY> [flags]| Flag | Description |
|---|---|
| --file | read the public key from this file |
| --help | help for add |
| --name | label for this SSH key |
List SSH keys available when creating machines
clor account ssh-key list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Remove an SSH key by its fingerprint
clor account ssh-key remove <FINGERPRINT> [flags]| Flag | Description |
|---|---|
| --help | help for remove |
Show recent usage with a per-service spend and request-count breakdown
Returns total cost in USD, request count, and one row per service (search, inference, drive, etc.) over a chosen window. Pick the window with --since.
clor account usage [flags]| Flag | Description |
|---|---|
| --help | help for usage |
| --since | how far back to look (e.g. 30s, 90m, 24h, 7d, 2w, 1w3d) Default 24h |
Save Claude and Codex settings, credentials, and skills, install them into your local agent
Everything about the coding agents your spaces run. Save reusable, typed settings for Claude or Codex and install them into your local agent, store the OAuth tokens and API keys a space authenticates with, and save SKILL.md skills your agents pick up in every space. Use when: - you want to save a Claude or Codex settings profile and reuse it - you want to push a saved settings profile into your local ~/.codex/config.toml or Claude settings files - a space must run as a specific Claude or Codex account - you want to save a SKILL.md once and have every space's agent use it Subcommands: config Save, edit, and install typed Claude and Codex settings credential Store coding-agent OAuth tokens and API keys skill Save reusable agent skills, install them into the local agents Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor agent [flags]| Flag | Description |
|---|---|
| --help | help for agent |
Save, edit, and install typed Claude and Codex settings on your team
Reusable, typed settings for a coding agent, saved on your team. Each config is one agent type (claude or codex) carrying a typed settings body. Save several per type, edit one atomically by exporting the full JSON, changing it, and importing it back, and install a config into your local agent by merging it into ~/.codex/config.toml or ~/.claude/settings.json and ~/.claude.json, plus the user-configurable behavior prompt into ~/.codex/AGENTS.md or ~/.claude/CLAUDE.md below Clor's managed space context. Use when: - you want to save a Claude or Codex settings profile and reuse it - you want to edit a saved config's model, reasoning effort, or sandbox mode - you want to push a saved config into your local agent Subcommands: create Save a new config of a given type list List the team's saved configs show Show one config by id or name export Print a config's full JSON for editing import Replace a config's body from edited JSON install Merge a config into the local agent's settings file delete Delete a config Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor agent config [flags]| Flag | Description |
|---|---|
| --help | help for config |
Save a new agent config of a given type
Creates one config of the given type under a name unique to your team. Supply the typed body as JSON on stdin or with --stdin-file; when omitted an empty template is saved that you can fill in later with export and import. Several configs per type are allowed.
clor agent config create [flags]| Flag | Description |
|---|---|
| --help | help for create |
| --name | name for the config, unique within your team |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --type | agent this config targets (claude|codex) |
Delete an agent config by id or name
Permanently removes one saved config. This does not change native agent files written by an earlier installation.
clor agent config delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Print an agent config's full JSON body for editing
Prints the config's typed body as indented JSON with every field shown, including empty ones, so you can edit it and pipe the result back through `agent config import`. This is the export half of the atomic edit round trip; the body is the exact shape import reads.
clor agent config export <ID> [flags]| Flag | Description |
|---|---|
| --help | help for export |
Replace an agent config's body from edited JSON
Reads a JSON config body from stdin or --stdin-file and atomically replaces the config, the import half of the export, edit, import round trip. The whole body is swapped, never merged. The config type is immutable; pass --name to rename the config at the same time.
clor agent config import <ID> [flags]| Flag | Description |
|---|---|
| --help | help for import |
| --name | rename the config while replacing its body |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Merge an agent config into the local agent's native settings
Fetches the config from your team, checks the local agent binary is a supported minimum version or newer, then merges the config's managed keys into ~/.codex/config.toml or Claude's ~/.claude/settings.json and ~/.claude.json files. The agent's global instructions file, ~/.codex/AGENTS.md or ~/.claude/CLAUDE.md, gets an installer-managed block of Clor-owned space context followed by the config's user-configurable behavior prompt, both as plain text at the top, leaving every other byte in that file untouched. Outside a space only the behavior prompt is written and any earlier Clor context block is removed. It also trusts the space root and current directory in the agent's native project settings and completes Claude onboarding. Existing authentication, project, and unknown settings are preserved. Honors CODEX_HOME and CLAUDE_CONFIG_DIR.
clor agent config install <ID> [flags]| Flag | Description |
|---|---|
| --help | help for install |
List the team's saved agent configs by id, name, and type
Metadata for every config your team has saved: id, name, type, and schema version. Use `agent config show` or `agent config export` to see one config's typed body.
clor agent config list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one agent config by id or name
Resolves the argument as a config id or, failing that, a config name, and prints its metadata and typed body. Use `agent config export` when you want only the body JSON to edit.
clor agent config show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Store agent OAuth tokens and API keys for Claude and Codex, then run spaces as that account
Password manager for coding-agent credentials. Each credential is a sealed token (a Claude or Codex OAuth token, or an Anthropic or OpenAI API key) tagged with its runtime and stored under a name. Attach one to a space and the daemon injects the matching environment variable into the spawned agent at run time, so the agent authenticates as that account on any host without a local sign-in. The token stays encrypted in the vault and is never copied onto the space, so rotating it once updates every space that uses it. Credential types: Claude Subscription Token: --runtime claude --oauth-token (injects CLAUDE_CODE_OAUTH_TOKEN) Anthropic API Key: --runtime claude --api-key (injects ANTHROPIC_API_KEY) Codex Access Token: --runtime codex --oauth-token (injects CODEX_ACCESS_TOKEN) OpenAI API Key: --runtime codex --api-key (injects OPENAI_API_KEY) Use when: - a space must run as a specific Claude or Codex account, or on a host that is not signed in locally - you want to bring your own Claude/Codex subscription or Anthropic/OpenAI API key to an unattended space - you need to rotate a token in one place across every space that uses it Subcommands: create Save an agent OAuth token or API key under a name list List saved credentials with their runtime and type show Show one credential's runtime and type without revealing the token test Validate a saved credential's token against its provider update Rotate the token, type, or runtime of a saved credential delete Permanently remove a saved credential Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor agent credential [flags]| Flag | Description |
|---|---|
| --help | help for credential |
Save an agent OAuth token or API key under a name for spaces to authenticate with
Supply exactly one of --oauth-token or --api-key. The token form pairs with --runtime to pick the environment variable the daemon injects. claude with an oauth token sets CLAUDE_CODE_OAUTH_TOKEN, claude with an api key sets ANTHROPIC_API_KEY, codex with an oauth token sets CODEX_ACCESS_TOKEN, and codex with an api key sets OPENAI_API_KEY. Re-running with the same name rotates the credential in place. How to get each token: Claude Subscription Token (--runtime claude --oauth-token) Run Claude Code agents on your Claude subscription using an OAuth token 1. Install Claude Code and sign in to your Claude subscription 2. Run `claude setup-token` in your terminal to start the OAuth flow 3. Approve the request in the browser, then copy the token that begins with sk-ant-oat- Anthropic API Key (--runtime claude --api-key) Run Claude Code agents against the Anthropic API with a long-lived API key 1. Open the Anthropic Console API keys page https://console.anthropic.com/settings/keys 2. Create a new API key and copy the value that begins with sk-ant- Codex Access Token (--runtime codex --oauth-token) Run Codex agents with a ChatGPT access token 1. In the active Business workspace, open Workspace settings → Permissions & roles as an owner or admin https://chatgpt.com/admin/access-tokens 2. Under Access tokens, turn on Allow users to create access tokens 3. Under Codex Local, turn on Allow members to use Codex Local 4. Create an access token (a one-year expiration is recommended) and paste it here OpenAI API Key (--runtime codex --api-key) Run Codex agents against the OpenAI API with a long-lived API key 1. Open the OpenAI platform API keys page https://platform.openai.com/api-keys 2. Create a new secret key and copy the value that begins with sk-
clor agent credential create <NAME> [flags]| Flag | Description |
|---|---|
| --api-key | long-lived provider API key |
| --help | help for create |
| --oauth-token | agent OAuth token from an interactive sign-in |
| --runtime | agent the credential authenticates (claude|codex) |
Permanently remove a saved credential
Permanent: no soft-delete or recovery window. Spaces referencing this credential by name fall back to machine file credentials on their next run.
clor agent credential delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List saved agent credentials by name without revealing any token
Metadata only (id, name, runtime, type, last access); tokens stay encrypted in the vault. Runtime and type come from plaintext labels, so listing never decrypts a token and never updates a credential's last access. Use `credential show` to decrypt one credential.
clor agent credential list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one credential's runtime and type without revealing the token
Decrypts the credential to report its runtime and type and the environment variable the daemon would inject. The token value itself is never printed. Use `clor secret get` if you must read the raw token.
clor agent credential show <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Validate a saved credential's token against its provider
Decrypts the credential and checks its token. API keys are validated with a short live call to the provider; subscription tokens are checked for the expected format. The token value itself is never printed. The command succeeds whenever the check runs and reports the verdict in the valid field; valid=false means the token was rejected or could not be confirmed. A non-zero exit means the credential could not be read.
clor agent credential test <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for test |
Rotate the token, type, or runtime of a saved credential
Updates only the fields you pass. Supply a new --oauth-token or --api-key to rotate the token (at most one), and/or --runtime to retarget the agent. Unset fields keep their current value. The credential must already exist.
clor agent credential update <NAME> [flags]| Flag | Description |
|---|---|
| --api-key | rotate to a new provider API key |
| --help | help for update |
| --oauth-token | rotate to a new OAuth token |
| --runtime | retarget the agent the credential authenticates (claude|codex) |
Save reusable agent skills on your team and install them into Claude Code and Codex
Reusable skills for your coding agents, saved on your team. A skill is one SKILL.md, inline markdown installed as <slug>/SKILL.md into each agent's skills directory, or a source URL stored for reference. Spaces attach your visible skills at create; inside a space, install writes them into ~/.claude/skills and ~/.codex/skills. Use when: - you want to save a SKILL.md so every space's agent picks it up - you want to sync a skills directory from a file tree (import) - a space environment should install its attached skills at startup Subcommands: create Save a new skill from a SKILL.md file or a source URL list List the team's saved skills show Show one skill by id, name, or slug export Print a skill's SKILL.md markdown import Upsert a skill from a SKILL.md file install Write a space's attached skills into the local agents uninstall Remove the skills a previous install wrote delete Delete a skill Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor agent skill [flags]| Flag | Description |
|---|---|
| --help | help for skill |
Save a new agent skill from a SKILL.md file or a source URL
Creates one skill under a name unique to your team. Pass a SKILL.md file to store its full contents as the skill markdown; the file's frontmatter fills the name and description unless the flags override them. Pass --url instead to store a source URL without a body.
clor agent skill create [FILE] [flags]| Flag | Description |
|---|---|
| --description | what the skill does and when an agent should use it |
| --help | help for create |
| --name | name for the skill, unique within your team |
| --share-team | share the skill with the rest of the team |
| --url | skill source URL to store instead of inline markdown |
Delete an agent skill
clor agent skill delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Print an agent skill's SKILL.md markdown
Prints the skill's stored markdown verbatim, the editable form import reads back. A url skill has no markdown body; use `agent skill show` to see its source URL.
clor agent skill export <ID> [flags]| Flag | Description |
|---|---|
| --help | help for export |
Upsert an agent skill from a SKILL.md file
Reads a SKILL.md file and saves it as a skill: created when absent, replaced whole when present. The file's frontmatter fills the name and description unless the flags override them. Matching is by --slug when given, otherwise by name. --slug is the official directory sync's key and is accepted only from the official team's own key.
clor agent skill import <FILE> [flags]| Flag | Description |
|---|---|
| --description | override the frontmatter description |
| --help | help for import |
| --name | override the frontmatter name |
| --slug | stable upsert key for the official directory sync |
Write a space's attached skills into the local agents' skills directories
Fetches the skills attached to this space and writes each markdown skill as <slug>/SKILL.md under ~/.claude/skills and ~/.codex/skills (honoring CLAUDE_CONFIG_DIR and CODEX_HOME). The space id comes from CLOR_SPACE_ID or --space; authentication is the normal key resolution, which inside a managed space is the space identity key. Re-running converges: skills removed from the space are removed locally, tracked by a receipt so nothing installed another way is touched. URL skills are listed but not installed.
clor agent skill install [flags]| Flag | Description |
|---|---|
| --help | help for install |
| --space | space id to install skills for (defaults to CLOR_SPACE_ID) |
List the team's saved agent skills by id, name, and type
Metadata for every skill visible to you: your own, the team-shared rows, and the official directory. Use `agent skill show` or `agent skill export` to see one skill's markdown.
clor agent skill list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one agent skill by id, name, or slug
Resolves the argument as a skill id or, failing that, a skill name or official slug, and prints its metadata. Use `agent skill export` when you want only the SKILL.md markdown.
clor agent skill show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Remove the skills a previous install wrote from the local agents
Removes every skill directory the install receipt lists under ~/.claude/skills and ~/.codex/skills, plus the receipt itself. Skills installed any other way are never touched. Purely local; no request is made.
clor agent skill uninstall [flags]| Flag | Description |
|---|---|
| --help | help for uninstall |
Post to Bluesky and read it: timeline, feeds, threads, search, follow, like, notifications, direct messages
Speaks the AT Protocol directly to a Bluesky server, authenticated with a handle and an app password stored as a typed secret. Covers reading (timeline, custom and author feeds, threads, search, profiles), posting with rich-text links, hashtags, mentions, replies, quotes, images, and video, the social graph (follow, block, mute), engagement (like, repost), notifications, and direct messages. Use when: - the user wants to read their Bluesky timeline, a profile, a thread, or search posts - the user wants to post, reply, quote, like, repost, or delete - the user wants to follow, unfollow, block, or mute accounts - the user wants to read notifications or send and read direct messages Subcommands: account Manage saved Bluesky credentials timeline Read the home timeline feed List, read, and browse feeds thread Read a post and its replies post Create a post, reply, or quote pin Pin one of your posts to the top of your profile unpin Remove the pinned post from your profile card Preview a URL's link-card metadata before posting video Upload a video and track its transcode job delete Delete one of your posts search Search public posts profile Show, search, or update profiles follow Follow an account unfollow Stop following an account follower List who follows an account following List who an account follows block Block, unblock, and list blocked accounts mute Mute, unmute, and list muted accounts like Like a post unlike Remove your like repost Repost a post unrepost Remove your repost notification Read notifications and mark them seen chat Read and send direct messages Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky [flags]| Flag | Description |
|---|---|
| --help | help for bluesky |
Manage saved Bluesky credentials (handle, app password) used by every Bluesky subcommand
Credentials are stored as a typed secret (handle, app password, optional service host). Once saved, every Bluesky subcommand picks them up automatically (or via --account when more than one is configured). App passwords are generated in the Bluesky app under Settings, Privacy and Security, App Passwords. They bypass two-factor prompts, so no email-code step is needed. Never store the real account password here. Use when: - the user wants to register a Bluesky account for the CLI to use - the user wants to see which Bluesky accounts are saved - the user wants to inspect or rotate stored credentials - the user wants to remove a Bluesky account Subcommands: add Save or update a Bluesky account by handle and app password list List saved Bluesky accounts visible to the caller get Read one saved Bluesky account, with the raw JSON in json mode delete Permanently remove a saved Bluesky account by name Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky account [flags]| Flag | Description |
|---|---|
| --help | help for account |
Save or update a Bluesky account by handle and app password for use by other Bluesky subcommands
[NAME] defaults to the handle itself; re-running with the same name updates in place. The app password is generated in the Bluesky app under Settings, Privacy and Security, App Passwords. It looks like xxxx-xxxx-xxxx-xxxx, applies only to API access, can be revoked independently, and bypasses two-factor prompts. Pass it on --app-password directly, or pipe it via --stdin-format text to keep it out of shell history. --service only needs setting for self-hosted servers; the default entryway routes to whichever server actually holds the repository.
clor bluesky account add [NAME] [flags]| Flag | Description |
|---|---|
| --app-password | app password from the Bluesky app (Settings, Privacy and Security, App Passwords), not the account password |
| --handle | Bluesky handle, e.g. you.bsky.social (required) |
| --help | help for add |
| --service | AT Protocol service host (default https://bsky.social; set only for self-hosted servers) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Permanently remove a saved Bluesky account by name
After deletion the other Bluesky subcommands can no longer use the account unless re-added or supplied via --credentials-file or --stdin-format json.
clor bluesky account delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Read a saved Bluesky account; pass --stdout-format json for the raw JSON including the app password
Default logfmt drops the app password; `--stdout-format json` returns the raw bluesky-account JSON suitable for piping into `clor bluesky <SUBCOMMAND> --stdin-format json`.
clor bluesky account get <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for get |
List saved Bluesky accounts with id and name
Metadata only (id, name, last access); app passwords stay encrypted server-side. Use `account get` to retrieve the full JSON.
clor bluesky account list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Block and unblock accounts, and list the accounts you block
Blocking hides both directions: the account cannot see or interact with your posts, and theirs disappear from your views. Use when: - the user wants to block or unblock an account - the user wants to see who they have blocked Subcommands: add Block an account by handle or DID remove Unblock an account by handle or DID list List the accounts you block Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky block [flags]| Flag | Description |
|---|---|
| --help | help for block |
Block one or more accounts by handle or DID in a single session
clor bluesky block add <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for add |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List the accounts you block
clor bluesky block list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum accounts to return (1-100 per call, paginated above 100) Default 50 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Unblock one or more accounts by handle or DID in a single session
clor bluesky block remove <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for remove |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Preview a URL's link-card metadata before posting: title, description, thumbnail
Preview the link card Bluesky would build for a URL, without posting. The card service returns the title, description, and a resized thumbnail image URL, so you can see what a post's card will look like and decide whether to override a field or supply your own thumbnail. Use when: - the user wants to see a URL's card title, description, and thumbnail before posting - the user wants to check whether a URL has a thumbnail so they can generate one when it does not - a workflow builds a post's link card in steps rather than in one shot Subcommands: extract Extract the title, description, and thumbnail for a URL Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky card [flags]| Flag | Description |
|---|---|
| --help | help for card |
Extract the title, description, and thumbnail Bluesky would show for a URL
Query the card service for the title, description, and thumbnail image URL Bluesky would show for <URL>. When image is empty the URL has no thumbnail; generate one and pass it to `clor bluesky post --link-card-thumbnail`. likely_type and error report how the card service classified the URL.
clor bluesky card extract <URL> [flags]| Flag | Description |
|---|---|
| --help | help for extract |
Read and send direct messages: list conversations, read one, send a message
Direct messages are served by your own data server, not the public appview, so these subcommands proxy through it automatically. Use when: - the user wants to see their direct-message conversations - the user wants to read the messages in a conversation - the user wants to send someone a direct message Subcommands: list List your direct-message conversations read Read the messages in one conversation send Send a direct message to an account Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky chat [flags]| Flag | Description |
|---|---|
| --help | help for chat |
List your direct-message conversations with their members and unread counts
clor bluesky chat list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum conversations to return (1-100 per call, paginated above 100) Default 30 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Read the messages in one conversation, oldest first
<CONVERSATION> is a conversation id from `clor bluesky chat list`. Messages are returned oldest first so a thread reads top to bottom.
clor bluesky chat read <CONVERSATION> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for read |
| --limit | maximum messages to return (1-100) Default 50 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Send a direct message to an account by handle or DID
Opens or reuses the one-to-one conversation with <HANDLE> and sends <TEXT>. The recipient must allow direct messages from you.
clor bluesky chat send <HANDLE> <TEXT> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for send |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Delete one of your own posts by its at:// URI
<URI> is an at:// post URI, e.g. the one printed by `clor bluesky post`. Only records in your own repository can be deleted.
clor bluesky delete <URI> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for delete |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List saved feeds, read a custom or pinned feed, and read an account's posts
Read the custom and pinned feeds you follow in the app, and the author feed of any single account. A custom feed is an algorithmic feed generator (the kind you pin in the Bluesky app); the author feed is one account's own posts and reposts. Use when: - the user wants to read one of their saved or pinned feeds by name - the user wants to read a feed generator by its at:// URI - the user wants to see which feeds an account has saved or pinned - the user wants one account's own posts and reposts Subcommands: list List your saved and pinned feeds read Read the posts in a custom or pinned feed author Read the posts authored by one account Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky feed [flags]| Flag | Description |
|---|---|
| --help | help for feed |
List your saved and pinned feeds
Lists every feed saved to your account with a pinned= flag for the ones you have pinned. Feed-generator display names are resolved, so the name= attr matches what you see in the app. Pass a name or the uri= value to feed read.
clor bluesky feed list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for list |
| --pinned-only | list only the feeds you have pinned |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Read the posts in a custom or pinned feed, newest first
<FEED> is an at:// feed-generator URI, or the display name of a feed saved to your account (matched case-insensitively). Run feed list to see your saved feeds and their at:// URIs.
clor bluesky feed read <FEED> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for read |
| --limit | maximum posts to return (1-100 per call, paginated above 100) Default 30 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Follow one or more accounts by handle or DID in a single session
Pass any number of handles or DIDs; they are all followed within one session, so following back a whole list of accounts is one call rather than one login per account. Passing DIDs skips handle resolution, so piping DIDs from `follower list` is the fastest path. A target that fails does not stop the rest.
clor bluesky follow <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for follow |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List the accounts that follow an account
Use when: - the user wants to see who follows them or another account Subcommands: list List the accounts that follow a handle (defaults to your own) Output: the list subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky follower [flags]| Flag | Description |
|---|---|
| --help | help for follower |
List the accounts that follow an account, defaulting to your own
With --not-following, only followers you do not follow back are returned, which is the candidate set for a follow-back: pipe their DIDs into `clor bluesky follow` to follow them all in one session.
clor bluesky follower list [HANDLE] [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum accounts to return (1-100 per call, paginated above 100) Default 50 |
| --not-following | return only followers you do not follow back |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List the accounts an account follows
Use when: - the user wants to see who they or another account follows Subcommands: list List the accounts a handle follows (defaults to your own) Output: the list subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky following [flags]| Flag | Description |
|---|---|
| --help | help for following |
List the accounts an account follows, defaulting to your own
clor bluesky following list [HANDLE] [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum accounts to return (1-100 per call, paginated above 100) Default 50 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Like one or more posts by their at:// URIs in a single session
Pass any number of at:// post URIs; they are all liked within one session. A post that fails does not stop the rest.
clor bluesky like <URI>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for like |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Mute and unmute accounts, and list the accounts you mute
Muting hides an account's posts from your views without telling them or restricting them. It is private and one-directional. Use when: - the user wants to mute or unmute an account - the user wants to see who they have muted Subcommands: add Mute an account by handle or DID remove Unmute an account by handle or DID list List the accounts you mute Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky mute [flags]| Flag | Description |
|---|---|
| --help | help for mute |
Mute one or more accounts by handle or DID in a single session
clor bluesky mute add <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for add |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List the accounts you mute
clor bluesky mute list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum accounts to return (1-100 per call, paginated above 100) Default 50 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Unmute one or more accounts by handle or DID in a single session
clor bluesky mute remove <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for remove |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Read notifications (likes, reposts, follows, replies, mentions) and mark them seen
Use when: - the user wants to see who liked, reposted, followed, replied to, or mentioned them - the user wants to clear the unread notification badge Subcommands: list List recent notifications, optionally only unread ones seen Mark all notifications as seen as of now Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky notification [flags]| Flag | Description |
|---|---|
| --help | help for notification |
List recent notifications, optionally only unread ones or only certain reasons
--reason filters to one or more notification reasons (like, repost, follow, mention, reply, quote, starterpack-joined). A reply-bot, for example, lists only mention and reply notifications to decide what to answer.
clor bluesky notification list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for list |
| --limit | maximum notifications to return (1-100 per call, paginated above 100) Default 30 |
| --reason | filter to these reasons (like|repost|follow|mention|reply|quote|starterpack-joined), repeatable or comma-separated Default [] |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --unread-only | return only notifications you have not seen |
Mark all notifications as seen as of now
clor bluesky notification seen [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for seen |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Pin one of your posts to the top of your profile by its at:// URI
Sets the pinnedPost on your app.bsky.actor.profile record to the post at <URI>, which the Bluesky app shows at the top of your profile. Pinning replaces any previously pinned post. Only your own profile is changed; the rest of it (display name, description, avatar, banner) is preserved. Prints the updated profile record's at:// URI.
clor bluesky pin <URI> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for pin |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Create a post, optionally as a reply or quote, with images, a video, or a link card
Links, #hashtags, and @mentions in <TEXT> are detected and turned into rich-text facets automatically; mentions resolve to the right account. --reply and --quote take an at:// post URI. --image may be repeated up to four times; pair each with --image-alt in the same order for accessibility. --video-job embeds a finished upload from `clor bluesky video upload`. --link-card attaches a link card for a URL, rendered as a unified box with a thumbnail, title, and domain; the title, description, and thumbnail are fetched automatically and each --link-card-* flag overrides one field. A post carries at most one of images, a video, or a link card, and any of them can pair with a --quote. Prints the new post's at:// URI.
clor bluesky post <TEXT> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for post |
| --image | path to an image to attach (repeatable, up to 4) Default [] |
| --image-alt | alt text for the image at the same position (repeatable) Default [] |
| --language | BCP 47 language tag of the post text, e.g. en (repeatable) Default [] |
| --link-card | attach a link card (app.bsky.embed.external) for this URL, fetching its title, description, and thumbnail |
| --link-card-description | override the link-card description |
| --link-card-no-fetch | skip the metadata fetch and build the card from --link-card plus the override flags |
| --link-card-thumbnail | use this local image file as the link-card thumbnail instead of the fetched one |
| --link-card-title | override the link-card title |
| --quote | at:// URI of a post to quote |
| --reply | at:// URI of a post to reply to |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --video-alt | alt text for the embedded video |
| --video-aspect-ratio | aspect ratio of the video as W:H, e.g. 16:9 |
| --video-caption | WebVTT caption track as <FILE>:<LANG>, e.g. ./captions.vtt:en (repeatable) Default [] |
| --video-job | embed the finished video from this upload job uid (from `clor bluesky video upload`) |
Read and update Bluesky profiles: show one account, or update your own
Show any account's profile, or update your own display name, description, avatar, and banner. Use when: - the user wants to see an account's bio and follower counts - the user wants to change their own display name or bio - the user wants to set a new avatar or banner image Subcommands: show Show one or more profiles (defaults to your own) search Search for accounts by name, handle, or bio keyword update Update your own display name, description, avatar, banner, or handle Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky profile [flags]| Flag | Description |
|---|---|
| --help | help for profile |
Search for accounts by name, handle, or bio keyword
Matches the query against display names, handles, and descriptions, the same typeahead Bluesky uses, so a bot can discover accounts to follow, mention, or message.
clor bluesky profile search <QUERY> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for search |
| --limit | maximum accounts to return (1-100 per call, paginated above 100) Default 25 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Show one or more profiles with follower counts, defaulting to your own
With no arguments, shows your own profile. Pass any number of handles or DIDs to hydrate them all in one session (batched 25 per call), which is how a bot turns a list of follower DIDs into follower counts. Each result carries a following= flag for whether you follow that account.
clor bluesky profile show [HANDLE]... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for show |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Update your own display name, description, avatar, banner, or handle
Only the flags you pass change; everything else, including an existing avatar or banner, is preserved. --avatar and --banner take image file paths. --handle changes the account handle, for example to a custom domain you own. A custom-domain handle is verified against its DNS or well-known DID document before the change unless you pass --force.
clor bluesky profile update [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --avatar | path to a new avatar image |
| --banner | path to a new banner image |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --description | new profile description (pass empty to clear) |
| --display-name | new display name (pass empty to clear) |
| --force | skip the DNS and well-known verification and change the handle regardless |
| --handle | new account handle, for example a custom domain you own |
| --help | help for update |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Repost one or more posts by their at:// URIs in a single session
Pass any number of at:// post URIs; they are all reposted within one session. A post that fails does not stop the rest.
clor bluesky repost <URI>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for repost |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Search public posts by keyword, newest or top first
clor bluesky search <QUERY> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --author | restrict to posts by this handle or DID |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for search |
| --limit | maximum posts to return (1-100 per call, paginated above 100) Default 25 |
| --since | only posts at or after this time (RFC 3339, e.g. 2026-01-01T00:00:00Z) |
| --sort | ranking order (top|latest) Default latest |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --until | only posts before this time (RFC 3339) |
Read a post and its reply tree, flattened depth-first with a depth attribute
<URI> is an at:// post URI, e.g. one printed by `clor bluesky timeline` or `clor bluesky post`. In text and jsonl the root sits at depth=0 and each reply carries depth=N; in json the nested thread is preserved.
clor bluesky thread <URI> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --depth | how many reply levels below the post to include Default 6 |
| --help | help for thread |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Read the home timeline of posts from accounts you follow, newest first
clor bluesky timeline [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --cursor | resume from a cursor returned by a previous call |
| --help | help for timeline |
| --limit | maximum posts to return (1-100 per call, paginated above 100) Default 30 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Stop following one or more accounts by handle or DID in a single session
Pass any number of handles or DIDs; the matching follow records are deleted within one session. A target you do not follow, or one that fails, does not stop the rest.
clor bluesky unfollow <HANDLE>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unfollow |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove your like from one or more posts by their at:// URIs in a single session
clor bluesky unlike <URI>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unlike |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove the pinned post from your profile
Clears the pinnedPost on your app.bsky.actor.profile record. The rest of your profile is preserved. Reports not-pinned when no post is pinned.
clor bluesky unpin [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unpin |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove your repost of one or more posts by their at:// URIs in a single session
clor bluesky unrepost <URI>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unrepost |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Upload a video, track its transcode job, then embed it in a post
Attaching a video to Bluesky is asynchronous. A file is handed to the video service, which transcodes it as a background job and yields a video blob once it finishes. Upload first, then embed the finished job in a post with post --video-job <UID>. Use when: - the user wants to attach a video to a Bluesky post - the user wants to check whether an in-progress video upload has finished Subcommands: upload Upload a video file and start its transcode job status Check the transcode state of a video upload job Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor bluesky video [flags]| Flag | Description |
|---|---|
| --help | help for video |
Check the transcode state of a video upload job
Reports the job state and progress, and once transcoding finishes the resulting video blob (cid and size). Embed a finished job in a post with post --video-job <UID>.
clor bluesky video status <UID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for status |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Upload a video file and start its transcode job
Hands an mp4 to the video service, which transcodes it as a background job and returns a job uid immediately. Embed the finished video in a post with post --video-job <UID>. Pass --wait to block until the job finishes instead of polling video status yourself.
clor bluesky video upload <FILE> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read bluesky-account JSON from this path instead of secrets (- for stdin) |
| --help | help for upload |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --timeout | max time to wait when --wait is set (e.g. 30s, 5m) Default 5m0s |
| --wait | poll the transcode job to completion before returning |
List the GitHub, Linear, and Slack accounts connected to this account
Read-only views of the provider accounts (GitHub, Linear, Slack) connected to the signed-in account. Connections are linked and managed on the team Connections page; this surface lists them so commands and scripts can pick one by id. Use when: - you need a connection id to pass to another command (clor github auth --connection ...) - you want to check which provider accounts are connected before starting work Subcommands: list List connected provider accounts Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor connection [flags]| Flag | Description |
|---|---|
| --help | help for connection |
List connected provider accounts
clor connection list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Bulk-classify domain names as available, taken, or unknown across hundreds of TLDs at huge scale
Mass domain availability lookups, no rate limits. A 100,000-domain bulk request returns in 1-2s. Supported TLDs return available or taken; unsupported return unknown. Follow up with "verify" for a stricter recheck of the available tail.
clor domain [flags]| Flag | Description |
|---|---|
| --help | help for domain |
Check one or many domain names as available, taken, or unknown in a single bulk call
Status values: - taken: registered. ~1 in 65,000 false alarms. - available: not currently registered. NOT the same as "registrable today". Premium, reserved, and recently-dropped names all read available. Confirm with a registrar. - unknown: TLD not supported, so the service did not check it. Stdin: one-per-line text (--stdin-format text), or JSON array (--stdin-format json). Inputs >100,000 auto-split into chunks.
clor domain lookup [DOMAIN] [flags]| Flag | Description |
|---|---|
| --help | help for lookup |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Discover which top-level domains the bulk lookup service can check
clor domain tld [flags]| Flag | Description |
|---|---|
| --help | help for tld |
List the TLDs the service checks, ordered by US-biased popularity
Ranked by US-biased popularity (Tranco top-1M frequency with US institutional and tech-startup TLDs hoisted). --limit 0 returns every supported TLD.
clor domain tld list [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --limit | max TLDs to return (0 for all) Default 100 |
Check domain names with a stricter pass that reduces false-positive available results
Same input/output shape as "lookup" but slower per domain. Use on the narrow tail of a pipeline (candidates "lookup" already flagged as available), not on bulk inputs.
clor domain verify [DOMAIN] [flags]| Flag | Description |
|---|---|
| --help | help for verify |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Store, share, and link cloud files in personal and shared drives with ACL grants, public links, and Unix verbs (ls, cp, mv, rm, df)
Drive paths are relative to the drive root, so use notes/q1.md, not /notes/q1.md, drive://notes/q1.md, or notes//q1.md. Files live in scoped drives, addressed by these filesystem paths, managed with Unix-style verbs (ls, cp, mv, rm, stat). Every account has a personal drive per user plus a shared account drive, with optional ACL grants for cross-user access and public token links. Uploads and downloads stream directly to storage, not through the CLI.
clor drive [flags]| Flag | Description |
|---|---|
| --help | help for drive |
Server-side copy a file to a new drive path; bytes never flow through the CLI
Server clones object storage directly; the new file is independent of the source. Trailing slash on <DESTINATION> means "copy into this directory and keep the source's basename". Use --destination-drive to land in a different drive.
clor drive cp <SOURCE> <DESTINATION> [flags]| Flag | Description |
|---|---|
| --destination-drive | which drive the copy lands in ("team" or a user UUID); defaults to the source's drive |
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for cp |
| --ttl | delete the copy this much time after it lands (e.g. 24h, 168h) Default 0s |
Show every drive the caller can access along with its file count, total size, and capacity
Includes the caller's personal drive, the shared account drive, and drives reached via share grants. Admins see every personal drive in the account.
clor drive df [flags]| Flag | Description |
|---|---|
| --help | help for df |
Download a file by drive path or composite id to a local path or stdout
Streams bytes from object storage via a short-lived signed URL. Saves to the file's basename in the cwd by default; --out picks a path, --stdout pipes the bytes. <PATH> may be a drive path or composite id.
clor drive download <PATH> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for download |
| --out | write the bytes to this local path (defaults to the file's name in the cwd) |
| --stdout | stream the bytes to stdout instead of a file |
Print full metadata for one file by drive path or composite id
Returns id, name, size, content type, status, ETag, owner, retention TTL, expiry, and timestamps. Use stat instead when the target might be a directory or missing.
clor drive info <PATH> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for info |
Manage public links for sharing files in or out of a drive
Token-addressable URLs that resolve without authentication. Two directions: download (read one uploaded file) and upload (PUT a file at a pre-named drive path). Each supports optional expiry and use-count cap. Use `drive share` instead for user-scoped access.
clor drive link [flags]| Flag | Description |
|---|---|
| --help | help for link |
Public read links to one uploaded file, with optional expiry and use-count cap
/l/<token> renders a preview page; /d/<token> redirects to a short-lived signed download URL.
clor drive link download [flags]| Flag | Description |
|---|---|
| --help | help for download |
Issue a public read link for an uploaded file
clor drive link download create <PATH> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --expires | link is dead after this much time (e.g. 24h, 168h); 0 = never Default 0s |
| --help | help for create |
| --max-uses | cap on the number of times the link can resolve; 0 = unlimited |
List public download links the caller has issued (filterable by file)
clor drive link download ls [flags]| Flag | Description |
|---|---|
| --cursor | next_cursor returned by a prior page |
| --file-id | filter by composite file id |
| --help | help for ls |
| --limit | max rows per page (1-1000); zero uses the server default |
| --mine | only list links the caller created |
Revoke a public download link by id
Revocation is immediate; the public URL stops resolving on the next request.
clor drive link download rm <LINK> [flags]| Flag | Description |
|---|---|
| --help | help for rm |
Public write links that let an anonymous browser PUT a file at a drive path
/u/<token> renders an upload page that PUTs bytes directly to storage and reports completion. One-shot by default; --max-uses allows more.
clor drive link upload [flags]| Flag | Description |
|---|---|
| --help | help for upload |
Issue a public write link that lets an anonymous browser PUT a file at <PATH>
One-shot by default; --max-uses allows more uploads at the same path. --content-type pre-binds the MIME type the page will send.
clor drive link upload create <PATH> [flags]| Flag | Description |
|---|---|
| --content-type | MIME type to bind to the upload URL |
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --expires | link is dead after this much time (e.g. 1h, 24h); 0 = never Default 0s |
| --help | help for create |
| --max-uses | cap on uploads accepted at this path; 0 = server default (one-shot) |
List public upload links the caller has issued (filterable by file)
clor drive link upload ls [flags]| Flag | Description |
|---|---|
| --cursor | next_cursor returned by a prior page |
| --file-id | filter by composite file id |
| --help | help for ls |
| --limit | max rows per page (1-1000); zero uses the server default |
| --mine | only list links the caller created |
Revoke a public upload link by id
Revocation is immediate; the public URL stops resolving on the next request.
clor drive link upload rm <LINK> [flags]| Flag | Description |
|---|---|
| --help | help for rm |
List files and subdirectories at a drive path (root by default)
Lists direct children plus a synthesized directories array. --recursive flattens every descendant (no directories array); --tree renders an indented tree with depth markers in text/jsonl modes.
clor drive ls [PATH] [flags]| Flag | Description |
|---|---|
| --cursor | next_cursor returned by a prior page |
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for ls |
| --include-deleted | include deleted files (still within the retention window) in the listing |
| --limit | max files per page (1-1000); zero uses the server default |
| --prefix | filter to files whose name starts with this prefix |
| --recursive | include every descendant of the path; omit the directories array |
| --tree | render a recursive listing as an indented tree (implies --recursive) |
Move or rename a file in a drive, preserving its identity and existing links
File id, ETag, and public links survive the move. <SOURCE> may be a drive path or composite id; <DESTINATION> is always a path. Trailing slash on the destination means "move into this directory and keep the source's basename".
clor drive mv <SOURCE> <DESTINATION> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for mv |
Set or clear a file's auto-delete TTL, measured from upload completion
When the window elapses the file is soft-deleted automatically (still restorable via undelete for a grace period). --ttl sets the window; --clear-ttl keeps the file indefinitely.
clor drive retention <PATH> [flags]| Flag | Description |
|---|---|
| --clear-ttl | remove the retention TTL |
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for retention |
| --ttl | retention starting from upload completion (e.g. 24h, 720h) Default 0s |
Delete a file from a drive (recoverable by default, --hard for immediate purge)
Soft delete by default: restorable via undelete within the retention window. --hard purges immediately and irreversibly.
clor drive rm <PATH> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --hard | purge immediately rather than leaving recoverable |
| --help | help for rm |
Distinguish file vs directory vs missing for a drive path in one round trip
Returns type=file|directory|missing in one round trip (missing is still 200 OK, no exception). When type=file, full metadata is included under "file". No positional argument stats the drive root.
clor drive stat [PATH] [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for stat |
Restore a recently soft-deleted file to its prior state
Size, ETag, ACL grants, retention TTL, and public links are restored unchanged. If the path was reused by a new file the restore returns 409; target by composite id to disambiguate. Must happen before retention window elapses.
clor drive undelete <PATH> [flags]| Flag | Description |
|---|---|
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for undelete |
Upload a local file to a drive path, overwriting any existing file there
Streams to object storage via a short-lived signed URL, then records metadata in the drive. <PATH> defaults to the basename of <FILE>; a trailing slash means "drop into this directory and keep the basename". Existing non-deleted files at the same path are overwritten in place, preserving file id and links.
clor drive upload <FILE> [PATH] [flags]| Flag | Description |
|---|---|
| --content-type | MIME type to bind to the upload URL |
| --drive | which drive to target ("team" or a user UUID); defaults to your user drive |
| --help | help for upload |
| --ttl | delete this much time after upload completes (e.g. 1h, 24h, 720h) Default 0s |
Read, search, send, and triage email over IMAP and SMTP
Speaks IMAP4rev1 and SMTP submission with SASL PLAIN over TLS, so it works against Gmail/Workspace, Outlook/Microsoft 365, Fastmail, iCloud, Dovecot, and similar. Trash/Sent/Drafts/Junk folders are discovered via SPECIAL-USE, never hardcoded per provider. Refer to them by role name in --folder and --to (Drafts, Sent, Trash, Junk, Archive, All) and they resolve to the provider's real mailbox.
clor email [flags]| Flag | Description |
|---|---|
| --help | help for email |
Manage saved email-account credentials (address, hosts, password) used by every email subcommand
Credentials are stored as a typed secret (address, IMAP/SMTP host/port, auth). Once saved, every email subcommand picks them up automatically (or via --account when more than one is configured). Gmail/Workspace, Outlook/365, and iCloud all reject regular account passwords over IMAP/SMTP. Generate a provider-specific app password (Google: https://myaccount.google.com/apppasswords; Outlook: https://account.microsoft.com/security; iCloud: https://appleid.apple.com) and pass it via --stdin-format text.
clor email account [flags]| Flag | Description |
|---|---|
| --help | help for account |
Save or update an email account (address, IMAP/SMTP hosts, password) for use by other email subcommands
IMAP/SMTP hosts auto-detect for known providers (gmail.com, outlook.com, icloud.com, fastmail.com); pass --imap-host/--smtp-host explicitly otherwise. [NAME] defaults to the address itself; re-running with the same name updates in place. Gmail, Google Workspace, iCloud, and Yahoo do not accept the regular account password for IMAP/SMTP. They require a provider-issued app-specific password instead: - Gmail / Workspace: https://myaccount.google.com/apppasswords (requires 2-Step Verification turned on). Generate a 16-character password and pass it as --password. The spaces shown in Google's UI can be kept or stripped; both work. - iCloud: https://account.apple.com -> Sign-In and Security -> App-Specific Passwords. - Yahoo: account security settings -> Generate app password. If a user gives you their real account password and the provider needs an app password, point them at the URL above and ask them to paste the generated one back. Pass it on --password directly. Stdin (--stdin-format text) is still supported when you need to avoid the shell history.
clor email account add [NAME] [flags]| Flag | Description |
|---|---|
| --address | email address (required) |
| --auth-method | authentication method (only password is supported today) Default password |
| --display-name | display name used on the From header (e.g. "Leo") |
| --help | help for add |
| --imap-host | IMAP host (auto-detected for known providers like gmail.com) |
| --imap-port | IMAP port (auto-detected; 993 for implicit TLS) |
| --password | IMAP/SMTP password. For Gmail/Workspace, iCloud, and Yahoo, this must be a provider-issued app-specific password (see Long help for the per-provider URL), not the user's regular account password |
| --smtp-host | SMTP host (auto-detected for known providers like gmail.com) |
| --smtp-port | SMTP port (auto-detected; 465 for implicit TLS) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Permanently remove a saved email account by name
After deletion the other email subcommands can no longer use the account unless re-added or supplied via --credentials-file or --stdin-format json.
clor email account delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Read a saved email account's credentials; pass --stdout-format json for the raw JSON including password
Default logfmt drops the password; `--stdout-format json` returns the raw email-account JSON suitable for piping into `clor email <SUBCOMMAND> --stdin-format json`.
clor email account get <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for get |
List saved email accounts with id and name
Metadata only (id, name, last access); passwords stay encrypted server-side. Use `account get` to retrieve the full JSON.
clor email account list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Update fields on a saved email account (e.g. display name) without re-supplying unchanged values
Loads the stored account, overwrites only the fields whose flags were explicitly passed, and writes the result back. Pass `--display-name ""` to wipe an existing display name.
clor email account update <NAME> [flags]| Flag | Description |
|---|---|
| --address | email address |
| --auth-method | authentication method (only password is supported today) Default password |
| --display-name | display name used on the From header (pass "" to wipe) |
| --help | help for update |
| --imap-host | IMAP host |
| --imap-port | IMAP port |
| --password | IMAP/SMTP password (provider-issued app-specific password for Gmail/Workspace, iCloud, Yahoo) |
| --smtp-host | SMTP host |
| --smtp-port | SMTP port |
Move messages to Trash (recoverable) or expunge them permanently with --permanent
Default moves messages to Trash (resolved via SPECIAL-USE, so recoverable from the user's mail client). --permanent flags \Deleted and expunges immediately, no recovery path.
clor email delete <UID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | source mailbox; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --help | help for delete |
| --permanent | expunge instead of moving to Trash |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Compose a message and save it to the Drafts mailbox without sending
Builds the same RFC 822 message as `email send` but never hands it to SMTP. Instead it IMAP APPENDs to the Drafts mailbox (resolved via SPECIAL-USE, never hardcoded) with the \Draft flag, so the message shows up in the user's normal mail client ready to review, edit, and send. --to is optional: a draft can be staged before its recipients are known, and a subject-only draft is valid. Same body/attachment flags as `email send`. Subject: keep it short and specific so it sits cleanly in an inbox list and is easy to search for later. Lead with the concrete thing ("HN digest 2026-05-28", "Site down: example.com", "Stripe receipt $129.40"), not the framing ("Daily report", "Update", "FYI"). Avoid junk-flavored words ("urgent", "important"), all caps, and emoji at the start. Aim for under ~60 characters.
clor email draft [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --attach | attachment file path (repeatable) Default [] |
| --bcc | Bcc recipient (repeatable) Default [] |
| --body | plain-text body (mutually exclusive with --body-file) |
| --body-file | read plain-text body from a file (- for stdin) |
| --cc | Cc recipient (repeatable) Default [] |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --from-name | display name on the From header for this send only (e.g. "HN Digest Bot"); overrides the saved account's display name without changing it |
| --help | help for draft |
| --html-file | read HTML body from a file (added as multipart alternative) |
| --in-reply-to | In-Reply-To header (Message-ID of the parent) |
| --references | References header (repeatable; chain of parent Message-IDs) Default [] |
| --reply-to | Reply-To header |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --subject | Subject header |
| --to | recipient address (repeatable; required for send) Default [] |
List, create, rename, and delete IMAP mailboxes and Gmail labels
Manage the mailboxes on an account. On Gmail these mailboxes are the account's labels, so creating a folder creates a label and deleting one removes it. Use when: - the user wants to see the mailboxes/labels on an account before reading or moving messages - the user wants to create, rename, or delete a mailbox or a Gmail label Subcommands: list List every mailbox and Gmail label with message and unseen counts create Create a mailbox, or a label on Gmail rename Rename a mailbox, or a label on Gmail delete Delete a mailbox, or remove a label on Gmail Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor email folder [flags]| Flag | Description |
|---|---|
| --help | help for folder |
Create an IMAP mailbox, which is a new label on Gmail accounts
clor email folder create <NAME> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --help | help for create |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Delete an IMAP mailbox, removing a label on Gmail while its messages stay in All Mail
On standard IMAP this discards the messages the mailbox contains. On Gmail it only detaches the label; the messages remain in All Mail.
clor email folder delete <NAME> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --help | help for delete |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List every mailbox and Gmail label with message and unseen counts
Names returned are the exact strings `email move` and `email list --folder` expect.
clor email folder list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --help | help for list |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Rename an IMAP mailbox, which renames a label on Gmail accounts
clor email folder rename <OLD> <NEW> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --help | help for rename |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Tag and untag Gmail messages with labels without moving them out of the inbox
Gmail lets a single message carry many labels at once. These subcommands add and remove a label on specific messages while leaving them where they are, which plain mailbox moves cannot do. They target Gmail accounts; other providers should use `clor email move` instead. Create the label itself with `clor email folder create` first. Use when: - the user wants to label or unlabel Gmail messages while keeping them in the inbox - the user is organizing a Gmail inbox with multiple overlapping labels Subcommands: add Apply a Gmail label to one or more messages, leaving them in place remove Remove a Gmail label from one or more messages, keeping them in All Mail Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor email label [flags]| Flag | Description |
|---|---|
| --help | help for label |
Apply a Gmail label to one or more messages, leaving them in place
Adds the label to messages identified by their UIDs in --folder (default INBOX) without moving them. Create the label first with `clor email folder create`. Gmail-only; other providers should use `clor email move` instead.
clor email label add --label <NAME> <UID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | source mailbox the UIDs belong to; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --help | help for add |
| --label | label to apply (required) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove a Gmail label from one or more messages, keeping them in All Mail
The UIDs are scoped to the label's own mailbox, since Gmail assigns each mailbox its own UIDs. Get them with `clor email list --folder <NAME>`. Removing a label never deletes the message; it stays in All Mail. Gmail-only.
clor email label remove --label <NAME> <UID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --help | help for remove |
| --label | label to remove (required) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
List the most recent messages in an IMAP mailbox or Gmail label
Sorted newest first, with UID, sender, subject, date, read/flagged, size. --since accepts durations (7d, 24h), RFC3339, or Unix seconds. Use the UIDs with `email read`, `mark`, `move`, or `delete`.
clor email list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | mailbox to list; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --help | help for list |
| --limit | max messages to return (1-1000) Default 25 |
| --since | only messages received after this point: duration (e.g. 30s, 90m, 24h, 7d, 2w, 1w3d), RFC3339 (2026-05-04T00:00:00Z), or Unix seconds (1746460800) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --unread-only | only return messages without \Seen |
Set or clear the read and flagged ("starred") flags on one or more messages
Pass exactly one of --read/--unread and/or one of --flagged/--unflagged. Both pairs can be supplied in the same call.
clor email mark <UID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --flagged | add the \Flagged flag |
| --folder | mailbox the UIDs belong to; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --help | help for mark |
| --read | add the \Seen flag |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --unflagged | remove the \Flagged flag |
| --unread | remove the \Seen flag |
Move one or more messages from a source mailbox into a destination mailbox or label
Role names (Drafts, Sent, Trash, Junk, Archive, All) resolve to the provider's real mailbox; exact names from `email folder list` work too (Gmail labels look like `[Gmail]/All Mail`). Atomic server-side: a failed move never leaves messages in both mailboxes.
clor email move <UID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | source mailbox; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --help | help for move |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --to | destination mailbox (required); role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider |
Show full headers and body for one message by UID
Returns headers, flags, plain-text body, and optionally the HTML alternative. Body output capped at 32 KB by default to bound agent context; raise with --max-bytes (0=unlimited), or use --headers-only (no body fetch over the wire) or --raw (full RFC 822, may include base64 attachments).
clor email read <UID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | mailbox the UID belongs to; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --headers-only | skip body fetch entirely; return metadata only |
| --help | help for read |
| --include-html | include the HTML alternative in addition to text/plain |
| --max-bytes | cap each body part at N bytes (0 for unlimited); truncates at a UTF-8 rune boundary Default 32000 |
| --raw | write the raw RFC 822 bytes to stdout (overrides --stdout-format; output may include base64-encoded attachments and run to many MB, check size_bytes from list/search first) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Reply to a message, auto-deriving Subject, recipients, and threading headers
Subject defaults to "Re: ...", recipients default to the parent's From (or Reply-To), and In-Reply-To/References headers are populated from the parent. --to-all Ccs every other recipient ("reply all"). Same body/attachment flags as `email send`.
clor email reply <UID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --attach | attachment file path (repeatable) Default [] |
| --bcc | Bcc recipient (repeatable) Default [] |
| --body | plain-text body (mutually exclusive with --body-file) |
| --body-file | read plain-text body from a file (- for stdin) |
| --cc | Cc recipient (repeatable) Default [] |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | mailbox the parent UID belongs to; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --from-name | display name on the From header for this send only (e.g. "HN Digest Bot"); overrides the saved account's display name without changing it |
| --help | help for reply |
| --html-file | read HTML body from a file (added as multipart alternative) |
| --in-reply-to | In-Reply-To header (Message-ID of the parent) |
| --no-save-sent | skip the IMAP APPEND to the Sent mailbox after delivery (Gmail saves automatically and is always skipped) |
| --references | References header (repeatable; chain of parent Message-IDs) Default [] |
| --reply-to | Reply-To header |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --subject | Subject header |
| --to | recipient address (repeatable; required for send) Default [] |
| --to-all | Cc every other recipient on the parent message ("reply all") |
Search messages by sender, recipient, subject, body, freshness, flags, or attachments
Substring match on headers/body via --from/--to/--subject/--body. Freshness window via --since/--until (durations, RFC3339, or Unix seconds). Returns the same UID-keyed summary as `email list`.
clor email search [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --body | filter by message body (substring match) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | mailbox to search in; role names (Drafts, Sent, Trash, Junk, Archive, All) resolve per provider Default INBOX |
| --from | filter by From header (substring match) |
| --has-attachment | only messages with attachments (multipart/mixed) |
| --help | help for search |
| --limit | max messages to return (1-1000) Default 50 |
| --since | only messages received after this point: duration (e.g. 30s, 90m, 24h, 7d, 2w, 1w3d), RFC3339 (2026-05-04T00:00:00Z), or Unix seconds (1746460800) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --subject | filter by Subject header (substring match) |
| --to | filter by To header (substring match) |
| --unread | only unread messages |
| --until | only messages received before this point (same formats as --since) |
Compose and send a new email message with optional HTML body and file attachments
Body source: --body, --body-file (- for stdin), or --html-file (combine an html-file with a text body for a multipart alternative). On success the message is appended to the Sent folder unless the provider auto-saves (Gmail) or --no-save-sent is passed. Subject: keep it short and specific so it sits cleanly in an inbox list and is easy to search for later. Lead with the concrete thing ("HN digest 2026-05-28", "Site down: example.com", "Stripe receipt $129.40"), not the framing ("Daily report", "Update", "FYI"). Avoid junk-flavored words ("urgent", "important"), all caps, and emoji at the start. Aim for under ~60 characters. From header: --from-name overrides the saved account's display name for this send only (the stored account is untouched). Use it to make the source obvious in the recipient's inbox when sending automated reports or notifications, so the From column reads "Personalized Tech Report <leo@example.com>" instead of a bare address. Prefer this over stuffing the source into --subject; the subject stays free to describe the actual content.
clor email send [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --attach | attachment file path (repeatable) Default [] |
| --bcc | Bcc recipient (repeatable) Default [] |
| --body | plain-text body (mutually exclusive with --body-file) |
| --body-file | read plain-text body from a file (- for stdin) |
| --cc | Cc recipient (repeatable) Default [] |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --from-name | display name on the From header for this send only (e.g. "HN Digest Bot"); overrides the saved account's display name without changing it |
| --help | help for send |
| --html-file | read HTML body from a file (added as multipart alternative) |
| --in-reply-to | In-Reply-To header (Message-ID of the parent) |
| --no-save-sent | skip the IMAP APPEND to the Sent mailbox after delivery (Gmail saves automatically and is always skipped) |
| --references | References header (repeatable; chain of parent Message-IDs) Default [] |
| --reply-to | Reply-To header |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --subject | Subject header |
| --to | recipient address (repeatable; required for send) Default [] |
Fetch every message in the same Gmail conversation as a given UID (Gmail-only)
Uses Gmail's X-GM-THRID IMAP extension. Non-Gmail accounts return an error pointing at `clor email search --subject` as a fallback.
clor email thread <UID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets (- for stdin) |
| --folder | mailbox to search across (defaults to Gmail's All Mail label) Default [Gmail]/All Mail |
| --help | help for thread |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Manage reusable Environments
Reusable definitions for creating spaces. An Environment contains the repository, agents, scripts, Environment Variables, and workspace layout that future spaces snapshot at launch. Its canonical version-1 TOML is the complete advanced editing surface. Use when - you want to list or inspect reusable space setups - you want to create or atomically update an Environment from TOML - you want to duplicate, share, claim, or delete an Environment Subcommands list List personal and Team Environments show Show one Environment and its unresolved launch choices create Create a personal Environment from TOML export Print canonical version-1 TOML import Atomically replace an Environment from TOML duplicate Copy an Environment into your personal library share Share a personal Environment with the Team claim Claim a Team Environment as personal delete Delete an Environment Output supports --stdout-format text|jsonl|json on every subcommand (default text, logfmt with event= leader).
clor environment [flags]| Flag | Description |
|---|---|
| --help | help for environment |
Claim a Team Environment as personal
clor environment claim <ID> [flags]| Flag | Description |
|---|---|
| --help | help for claim |
Create a personal Environment from TOML
clor environment create <FILE> [flags]| Flag | Description |
|---|---|
| --help | help for create |
Delete an Environment at its loaded revision
clor environment delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Duplicate an Environment into your personal library
clor environment duplicate <ID> [flags]| Flag | Description |
|---|---|
| --help | help for duplicate |
Print canonical version-1 Environment TOML
clor environment export <ID> [flags]| Flag | Description |
|---|---|
| --help | help for export |
Atomically replace an Environment from TOML
clor environment import <ID> <FILE> [flags]| Flag | Description |
|---|---|
| --help | help for import |
List personal and Team Environments
clor environment list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one Environment and its unresolved launch choices
clor environment show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Use connected GitHub accounts for tokens, git credentials, and repository workflows
GitHub access through a connected GitHub account. Tokens come back freshly refreshed on every request, so they are always valid. Use when: - a command needs GH_TOKEN or GITHUB_TOKEN (GH_TOKEN=$(clor github auth)) - git clone/fetch/push against github.com should work with no stored credentials (git setup) Subcommands: auth Print a fresh GitHub access token git Install the git credential helper for github.com web Work with repository changes and pull requests in a browser Output: every subcommand supports --stdout-format text|jsonl|json (default text; auth prints the bare token in text mode).
clor github [flags]| Flag | Description |
|---|---|
| --help | help for github |
Print a fresh GitHub access token
Prints a freshly refreshed access token for the connected GitHub account. In text mode (the default) the output is the bare token and a trailing newline, so command substitution works directly: GH_TOKEN=$(clor github auth) The --connection flag selects a connected account by its ID. In a space, CLOR_GITHUB_CONNECTION_ID supplies the default. With neither, a single connected account resolves automatically.
clor github auth [flags]| Flag | Description |
|---|---|
| --connection | connection ID overriding the space environment |
| --help | help for auth |
Install the git credential helper so github.com clones need no stored credentials
Git integration for github.com through the connected GitHub account. Use when: - git clone/fetch/push against github.com should authenticate automatically Subcommands: setup Install the git credential helper for github.com (once per machine)
clor github git [flags]| Flag | Description |
|---|---|
| --help | help for git |
Install the git credential helper for github.com (once per machine)
Writes one scoped git config entry so git asks the helper for credentials on github.com and nothing else: git config --global credential.https://github.com.helper "!clor github git helper" The --connection flag selects the account by its ID. In a managed sandbox, CLOR_GITHUB_CONNECTION_ID supplies the default. The selected account is embedded in that sandbox's entry so every Git operation uses it. Idempotent; running it again rewrites the same entry.
clor github git setup [flags]| Flag | Description |
|---|---|
| --connection | connection ID overriding the space environment |
| --help | help for setup |
Work with repository changes and pull requests in a browser
Serves a compact browser workspace for the checked-out repository. The workspace follows local staged, unstaged, committed, and untracked changes, attaches to the checked-out branch's open pull request, and can inspect another open pull request without changing branches.
clor github web [flags]| Flag | Description |
|---|---|
| --help | help for web |
Serve the repository and pull request workspace
Serves a local Preact application for the common GitHub development loop. The checked-out repository supplies local context. An open pull request for the branch is selected automatically, while local staging, committing, pushing, and pull request creation remain available before one exists. GitHub access uses a freshly refreshed token from the selected connection. The token is passed to gh only through GH_TOKEN and never reaches the browser.
clor github web serve [flags]| Flag | Description |
|---|---|
| --agent | initial webagent session name when automatic selection is ambiguous |
| --basic-auth | require HTTP basic auth as user:password |
| --connection | GitHub connection ID overriding the space environment |
| --help | help for serve |
| --listen-address | address to bind as host:port (:7503 or host:0 for a free port) Default 127.0.0.1:7503 |
| --no-assets-cdn | serve bundled assets locally instead of from the shared CDN |
| --open-browser | open the URL in the default browser after listening |
| --repo | GitHub repository as OWNER/REPO when remotes are indirect or ambiguous |
| --working-directory | git worktree to use (the current directory by default) |
Use Hacker News as a client: read feeds and threads, comment, submit, poll, vote, flag, favorite, hide, edit, delete
Drives Hacker News by scraping news.ycombinator.com directly, authenticated with a username and password stored as a typed secret. Reads every feed (top, new, best, ask, show, jobs, your submissions, comments, favorites, upvoted) and any thread, and performs the full set of authenticated actions. Every read also carries each item's available action tokens, so a read flows straight into a comment, vote, or flag. Use when: - the user wants to read a Hacker News feed, a thread, or a profile while signed in - the user wants to comment on or reply to a story or comment - the user wants to submit a story or poll, or vote, flag, favorite, hide, vouch - the user wants to edit or delete their own posts, or update their profile Subcommands: account Manage saved Hacker News credentials whoami Show the logged-in account, karma, and creation date profile Show profiles or update your own list Read a feed show Read a story or comment with its comment tree comment Comment on a story or reply to a comment submit Submit a story or text post poll Submit a poll edit Edit one of your items delete Delete your items vote Upvote or downvote items unvote Remove your vote flag Flag items unflag Remove your flag favorite Favorite items unfavorite Remove your favorite hide Hide items from your feed unhide Unhide items vouch Vouch for dead items unvouch Remove your vouch Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor hn [flags]| Flag | Description |
|---|---|
| --help | help for hn |
Manage saved Hacker News credentials (username, password) used by every Hacker News subcommand
Credentials are stored as a typed secret (username, password). Once saved, every Hacker News subcommand picks them up automatically (or via --account when more than one is configured), and the session cookie from the first login is cached back so later commands skip re-logging in. Use when: - the user wants to register a Hacker News account for the CLI to use - the user wants to see which Hacker News accounts are saved - the user wants to inspect or rotate stored credentials - the user wants to remove a Hacker News account Subcommands: add Save or update a Hacker News account by username and password list List saved Hacker News accounts visible to the caller get Read one saved Hacker News account, with the raw JSON in json mode delete Permanently remove a saved Hacker News account by name Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor hn account [flags]| Flag | Description |
|---|---|
| --help | help for account |
Save or update a Hacker News account by username and password for use by other Hacker News subcommands
[NAME] defaults to the username itself; re-running with the same name updates in place. Pass the password on --password directly, or pipe it via --stdin-format text to keep it out of shell history. Hacker News has no app-password concept, so this is the real account password; store it only in a secret you control.
clor hn account add [NAME] [flags]| Flag | Description |
|---|---|
| --help | help for add |
| --password | Hacker News account password |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --username | Hacker News username (required) |
Permanently remove a saved Hacker News account by name
After deletion the other Hacker News subcommands can no longer use the account unless re-added or supplied via --credentials-file or --stdin-format json.
clor hn account delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Read a saved Hacker News account; pass --stdout-format json for the raw JSON including the password
Default logfmt drops the password; `--stdout-format json` returns the raw hackernews-account JSON suitable for piping into `clor hn <SUBCOMMAND> --stdin-format json`.
clor hn account get <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for get |
List saved Hacker News accounts with id and name
Metadata only (id, name, last access); passwords stay encrypted server-side. Use `account get` to retrieve the full JSON.
clor hn account list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Comment on a story or reply to a comment
<PARENT_ID> is the story to comment on or the comment to reply to; Hacker News uses the same form for both. The new comment id is returned by reading it back off your own comments after the post.
clor hn comment <PARENT_ID> <TEXT> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for comment |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Delete one or more of your own items in a single session
Each id is deleted via its confirmation form. Deleting is only possible while the item is still yours and within the window; otherwise that id reports the cause and the batch continues.
clor hn delete <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for delete |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Edit the title, URL, or text of one of your own items
Sets only the fields you pass; the rest keep their current values, read off the edit form first. Editing is only possible while the item is still yours and within the edit window, otherwise the form is absent and the command says so.
clor hn edit <ID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for edit |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --text | new body text (for a text post or comment) |
| --title | new title |
| --url | new URL (for a link submission) |
Favorite one or more items in a single session
clor hn favorite <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for favorite |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Flag one or more items in a single session
Flagging needs enough karma; when the flag link is absent the item reports that and the batch continues.
clor hn flag <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for flag |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Hide one or more items from your feed in a single session
clor hn hide <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for hide |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Read a Hacker News feed (top, new, best, ask, show, jobs, submitted, comments, favorites, upvoted)
--feed selects the feed. The user-scoped feeds (submitted, comments, favorites) default to the logged-in account and accept --user to read another account; upvoted is your own account only. Each result carries its available action tokens so a vote or comment is one follow-up command.
clor hn list [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --feed | feed to read (top|new|best|ask|show|jobs|submitted|comments|favorites|upvoted) Default top |
| --help | help for list |
| --limit | maximum items to return Default 30 |
| --page | page to start from (30 items per page) Default 1 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --user | account for the submitted, comments, or favorites feed (default self) |
Submit a poll with two or more choices
Pass --option once per choice; at least two are required. --text is an optional body. Creating polls is karma-gated on Hacker News. The new item id is read back off your own submissions.
clor hn poll [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for poll |
| --option | a poll choice; pass once per choice (at least two) Default [] |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --text | optional poll body |
| --title | poll question (required) |
Read Hacker News profiles or update your own (about, email, display settings)
Reads any account's public profile, and updates the logged-in account's own profile fields. Use when: - the user wants to read one or more Hacker News profiles - the user wants to change their about text, email, or display settings Subcommands: show Show one or more profiles by username update Update the logged-in account's own profile Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor hn profile [flags]| Flag | Description |
|---|---|
| --help | help for profile |
Show one or more Hacker News profiles with karma, creation date, and about text
Pass any number of usernames; each is fetched in the same session. With no username, shows the logged-in account's own profile.
clor hn profile show [USERNAME]... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for show |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Update the logged-in account's own profile fields
Sets only the flags you pass; every other field keeps its current value, which is read off the edit form first. The display settings mirror the website's profile editor.
clor hn profile update [flags]| Flag | Description |
|---|---|
| --about | about text shown on your profile |
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --delay | minutes to delay your comments from appearing |
| contact email (private) | |
| --help | help for update |
| --noprocrast | enable the noprocrastination timer (yes|no) |
| --noprocrast-maxvisit | minutes of browsing before noprocrast locks you out |
| --noprocrast-minaway | minutes you must stay away once locked out |
| --showdead | show dead items (yes|no) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --topcolor | top bar color as a hex value, e.g. ff6600 |
Read a story or comment with its comment tree, each node carrying its available action tokens
<ID> is the numeric item id. The lead item prints first, then the comment tree flattened depth-first with a depth attribute per node. Each node lists the actions available to the logged-in account (upvote, reply, flag, ...) so a follow-up write is one command.
clor hn show <ID> [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for show |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Submit a story by URL or a text post (Ask HN, Show HN)
Pass --url for a link submission or --text for a text post; exactly one of the two. The new item id is read back off your own submissions.
clor hn submit [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for submit |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --text | body for a text post, e.g. Ask HN (mutually exclusive with --url) |
| --title | story or post title (required) |
| --url | link to submit (mutually exclusive with --text) |
Remove your favorite from one or more items in a single session
clor hn unfavorite <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unfavorite |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove your flag from one or more items in a single session
clor hn unflag <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unflag |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Unhide one or more items in a single session
clor hn unhide <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unhide |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove your vote from one or more items in a single session
clor hn unvote <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unvote |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Remove your vouch from one or more items in a single session
clor hn unvouch <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for unvouch |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Upvote or downvote one or more items in a single session
--direction defaults to up. Downvoting needs enough karma and is only offered for a window after a comment is posted; when the downvote link is absent the item reports that and the batch continues to the next id.
clor hn vote <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --direction | vote direction (up|down) Default up |
| --help | help for vote |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Vouch for one or more dead items in a single session
Vouching only applies to dead (killed) items and needs enough karma; when the vouch link is absent the item reports that and the batch continues.
clor hn vouch <ID>... [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for vouch |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Show the logged-in account with its karma, creation date, and about text
Confirms the saved credentials open a live session and reports the account that requests go out as. A failure here means the session could not be established, which is the first thing to check.
clor hn whoami [flags]| Flag | Description |
|---|---|
| --account | secret name to load credentials from (omit to auto-pick the only saved account) |
| --credentials-file | read hackernews-account JSON from this path instead of secrets (- for stdin) |
| --help | help for whoami |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Generate text, images, and audio through Claude, GPT, Gemini, OpenRouter, and ElevenLabs
Five provider subcommands. Pick the one whose surface matches the task, then pick the smallest model that can do the job. anthropic Claude text generation and exact prompt token counting. Promoted tiers: claude-haiku-4-5 (cheap, fast), claude-opus-5 (frontier), claude-fable-5 (max capability). openai GPT text generation, gpt-image generation and editing, and audio transcription. Promoted text tiers: gpt-5.6-luna (cheap), gpt-5.6-sol (frontier). Promoted image tiers: gpt-image-1-mini (cheap, fast), gpt-image-2 (frontier). google Gemini text generation and nano-banana image generation. Promoted text tiers: gemini-3.1-flash-lite (cheap, fast), gemini-3.1-pro-preview (frontier). Promoted image tiers: gemini-3.1-flash-image-preview (cheap, fast), gemini-3-pro-image-preview (frontier). elevenlabs Text-to-speech, Scribe transcription, music, sound effects, voice isolation, and voice-to-voice conversion. openrouter Escape hatch for models the dedicated subcommands do not cover (Llama, DeepSeek, Qwen, X-AI, plus everything else OpenRouter fronts). Prefer the dedicated subcommands whenever the model lives there. Reach for the fast tier for high-volume or simple work (extraction, summarization, classification, reformatting). Reach for the frontier tier only when the task genuinely needs frontier reasoning. Enable --reasoning only when the task needs multi-step thinking; thinking tokens are billed as output tokens and share the --max-tokens cap, so higher effort raises both cost and latency.
clor inference [flags]| Flag | Description |
|---|---|
| --help | help for inference |
Call Anthropic's Claude models for text generation and exact prompt token counting
Claude text generation and prompt token counting. Pick the smallest model that can do the job. claude-haiku-4-5 Cheap and fast. Best for high-volume extraction, summarization, classification, reformatting. Legacy reasoning (budget_tokens). $1/$5 per Mtok. claude-sonnet-5 Balanced tier. $3/$15 per Mtok with 128K max output and adaptive thinking. Accepts sampling controls. Good when ordinary reasoning and writing don't justify Opus prices. claude-opus-5 Default frontier model. $5/$25 per Mtok with 128K max output and adaptive thinking. Strong coding, multidisciplinary reasoning, and agentic benchmarks. claude-opus-4-8 stays selectable at the same price. claude-fable-5 Maximum capability. $10/$50 per Mtok with 128K max output and adaptive thinking always on. Best for the most demanding reasoning and long-horizon agentic work. Opus and Fable forbid --temperature and --top-p. All models forbid sampling controls when --reasoning is on. System prompts auto-cache on the server (~5 min ephemeral TTL, ~90 percent discount on hits).
clor inference anthropic [flags]| Flag | Description |
|---|---|
| --help | help for anthropic |
Count prompt tokens for a Claude Messages call without running generation
Exact count via Anthropic's count_tokens endpoint. Matches input_tokens on a real Messages call with the same model/system/messages. Input modes (mutually exclusive): positional arg, --stdin-format text (single user message), or --stdin-format json (multi-turn array).
clor inference anthropic count-tokens [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for count-tokens |
| --model | model id (claude-opus-5|claude-haiku-4-5). Tokenization is model-specific so the count returned matches a real Messages call against the same model Default claude-opus-5 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --system | optional system prompt; counted against the input |
Generate text with Claude via the Anthropic Messages API
Pick the smallest model that can do the job. haiku for extraction and reformatting, opus-5 (default) for hard reasoning. System prompts auto-cache on the server (~5 min ephemeral TTL, ~90 percent discount on cache hits). --reasoning enables extended thinking. Adaptive models (opus-5, opus-4-8, opus-4-7, sonnet-4-6) send it as output_config.effort. Legacy models (haiku-4-5) translate to a numeric budget. Cost framing per level: off No thinking. Right default for extraction, summarization, classification, reformatting. Costs nothing extra. low ~2K thinking tokens on legacy. Light reasoning. Use for simple structured edits, short explanations, basic planning. medium ~8K thinking tokens on legacy. Working default for ordinary multi-step tasks. high ~16K thinking tokens on legacy. Multi-step planning, harder analysis, code review across multiple files. xhigh ~32K thinking tokens on legacy. Hardest reasoning problems that justify the spend. max Up to max_tokens minus 1024 on legacy. Dynamic on adaptive. Let the model spend whatever it needs. Thinking tokens are billed as output tokens and share the --max-tokens cap, so raising effort raises both cost and the risk that visible output gets truncated. --temperature and --top-p are rejected when --reasoning is on, and on claude-opus-5, claude-opus-4-8, claude-opus-4-7, and claude-fable-5 regardless of reasoning state.
clor inference anthropic text [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for text |
| --max-tokens | max output tokens (caps at the model's documented max). Reasoning tokens count toward this cap |
| --model | model id. Cheap to strong: claude-haiku-4-5 (simple, high-volume), claude-sonnet-5 (balanced, $3/$15 per Mtok, 128K max output, adaptive thinking), claude-opus-5 (default frontier, $5/$25 per Mtok, 128K max output), claude-opus-4-8 (prior Opus, same price, still selectable), claude-fable-5 (max capability, $10/$50 per Mtok, 128K max output) Default claude-opus-5 |
| --reasoning | reasoning effort (off|low|medium|high|xhigh|max). off is the right default for extraction, summarization, classification, reformatting. low/medium/high climb in capability and cost. xhigh and max are for the hardest problems and are billed as output tokens. Adaptive models (opus-5, opus-4-8, opus-4-7, sonnet-5, sonnet-4-6) pass through to output_config.effort. Legacy models (haiku-4-5) translate to budget_tokens (low=2048, medium=8192, high=16384, xhigh=32768, max=max_tokens-1024). Cannot be combined with --temperature or --top-p Default off |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --stop | stop sequence; pass repeatedly for multiple (max 4) Default [] |
| --system | optional system prompt; auto-cached on the server (~5 min ephemeral TTL, ~90 percent discount on cache hits) |
| --temperature | sampling temperature (0.0-1.0); -1 means use the model's default. Rejected when --reasoning is set or with claude-opus-5, claude-opus-4-8, claude-opus-4-7, or claude-fable-5 (these reject sampling controls regardless of reasoning state) Default -1 |
| --top-p | nucleus-sampling threshold (0.0-1.0); -1 means use the model's default. Rejected when --reasoning is set or with claude-opus-5, claude-opus-4-8, claude-opus-4-7, or claude-fable-5. Anthropic recommends temperature OR top-p, not both Default -1 |
ElevenLabs audio surface, text-to-speech, transcription, music, sound effects, voice isolation, and voice changing
Audio is the clearest case for shelling out from an LLM host. Seven subcommands cover the full ElevenLabs surface. speech Text-to-speech with a chosen voice. Pick a model from the TTS tier guide on the subcommand. transcribe Speech-to-text via Scribe v2 (default) or v1. music Generate a music clip from a text prompt. sound-effects Generate a sound-effect clip from a text prompt. voice-isolator Strip background noise from a recording. voice-changer Re-voice a recording as a different speaker. voice Browse the voice library to find voice ids. TTS tiers (faster to richer) eleven_flash_v2_5 Lowest latency (~75ms). Use for real-time interactive work. eleven_turbo_v2_5 High-throughput conversational use with a strong quality/latency balance. eleven_multilingual_v2 Broad language coverage where v3's expressiveness is not needed. eleven_v3 Default. Highest expressiveness, widest language support, GA since 2026-02-02.
clor inference elevenlabs [flags]| Flag | Description |
|---|---|
| --help | help for elevenlabs |
Generate a music clip from a text prompt with ElevenLabs Music
Pass the prompt positionally or via --stdin-format text. Control duration with --length (e.g. 30s, 2m).
clor inference elevenlabs music [PROMPT] [flags]| Flag | Description |
|---|---|
| --audio-output-file | destination MP3 path (auto-generated in CWD when omitted) |
| --help | help for music |
| --length | target output duration (e.g. 30s, 2m, 1h) Default 0s |
| --model | music model id (music_v1 is the only publicly documented id today) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Generate a sound effect clip from a text prompt
Pass the prompt positionally or via --stdin-format text. --duration caps the clip; --prompt-influence (0..1) biases adherence.
clor inference elevenlabs sound-effects [PROMPT] [flags]| Flag | Description |
|---|---|
| --audio-output-file | destination MP3 path (auto-generated in CWD when omitted) |
| --duration | target clip duration (e.g. 3s, 10s, 30s) Default 0s |
| --help | help for sound-effects |
| --prompt-influence | 0..1 weight controlling how closely the output follows the prompt (0 disables) |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
Synthesize speech from text with a chosen ElevenLabs voice (text-to-speech)
Default voice is Maria Mysh (calm female American narrator, vZzlAds9NzvLsFSWp0qk). Use the voice subcommand to search the full library. Pick the right TTS model for the use case. eleven_flash_v2_5 Lowest latency, around 75ms. Best for real-time interactive voice work where time-to-first-audio matters most. eleven_turbo_v2_5 High-throughput conversational use. Best for voice agents and chat applications that want strong quality at sub-second latency. eleven_multilingual_v2 Broad multilingual coverage. Use when v3's expressiveness is overkill and the workload spans many languages. eleven_v3 Default. Highest expressiveness and the widest language support (70+). Best for pre-rendered narration, audiobooks, and podcasts where quality outranks latency.
clor inference elevenlabs speech [flags]| Flag | Description |
|---|---|
| --audio-output-file | destination MP3 path (auto-generated in CWD when omitted) |
| --help | help for speech |
| --language-code | 2-letter language code, ISO 639-1 (en, es, fr); optional |
| --model | TTS model id. Faster to richer: eleven_flash_v2_5 (~75ms latency, real-time), eleven_turbo_v2_5 (high-throughput conversational), eleven_multilingual_v2 (broad language coverage), eleven_v3 (default, highest expressiveness) Default eleven_v3 |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --text | text to synthesize |
| --voice-id | ElevenLabs voice id; default vZzlAds9NzvLsFSWp0qk (Maria Mysh, calm female American narrator). Other featured picks: PIGsltMj3gFMR34aFDI3 (Jonathan Livingston, calm male American narrator), Q7yjSu9pVI6fMxiCGwMo (Sarah, warm midwest female narrator), NuRyEq0OdD9mMOyd51UZ (Jofra, expressive young British male), tJ8LOFTaeHnV8MwJjjDK (Monique, female American audiobook narrator), flHkNRp1BlvT73UL6gyz (Jessica Anne Bogart, female American villainous), weA4Q36twV5kwSaTEL0Q (Eva, female American robotic AI assistant). Search the full library with the voice subcommand Default vZzlAds9NzvLsFSWp0qk |
Transcribe an audio file to text with ElevenLabs Scribe (speech-to-text)
Accepts mp3, mp4, m4a, wav, webm, ogg, flac. Pick scribe_v2 (default) for the lowest word-error rate across 90+ languages and the strongest multi-language audio handling. scribe_v1 is kept supported for compatibility with workflows pinned to its outputs. --language-code locks the language and improves accuracy when known. --keyterm-prompt (repeatable) biases recognition toward specific terms (brand names, technical vocabulary, speaker names). Each prompt adds keyterm_seconds to the usage block. --enable-entity-detection surfaces detected entities (people, places, organizations) in the response and bills entity_seconds.
clor inference elevenlabs transcribe <FILE> [flags]| Flag | Description |
|---|---|
| --enable-entity-detection | return detected entities in the response (entity_seconds populated in usage) |
| --help | help for transcribe |
| --keyterm-prompt | keyterm prompt; pass repeatedly to bias recognition toward specific terms (keyterm_seconds populated in usage) Default [] |
| --language-code | 2-letter language code, ISO 639-1 (en, es, fr); optional hint |
| --model | STT model id (scribe_v1|scribe_v2) Default scribe_v2 |
Browse the ElevenLabs voice library to find voice ids for speech and voice-changer
clor inference elevenlabs voice [flags]| Flag | Description |
|---|---|
| --help | help for voice |
Search the ElevenLabs voice library by gender, age, accent, language, use case, or free text
Always pass at least one filter or --search (the library has tens of thousands of voices). Pagination: --page (0-indexed) + --page-size; the response carries has_more.
clor inference elevenlabs voice list [flags]| Flag | Description |
|---|---|
| --accent | filter by accent (american|british|australian|...) |
| --age | filter by age (young|middle_aged|old) |
| --category | filter by category (professional|high_quality|premade) |
| --featured | only return voices flagged as featured |
| --gender | filter by gender (male|female|neutral) |
| --help | help for list |
| --language | 2-letter language code, ISO 639-1 (en, es, fr); filter |
| --page | 0-indexed page number |
| --page-size | voices per page (1-100; default 30) |
| --search | free-text search across voice name and description |
| --use-case | filter by use case (social_media|narrative_story|characters_animation|...) |
Convert the speaker in an audio file to a target voice (speech-to-speech)
Speech-to-speech: re-voices --audio-file as --voice-id. Discover voice ids with the voice subcommand.
clor inference elevenlabs voice-changer [flags]| Flag | Description |
|---|---|
| --audio-file | path to the source audio (required) |
| --audio-output-file | destination MP3 path (auto-generated in CWD when omitted) |
| --help | help for voice-changer |
| --model | voice-changer model id (eleven_multilingual_sts_v2|eleven_english_sts_v2) |
| --voice-id | target voice id (required) |
Strip background noise from an audio recording, isolating the voice
clor inference elevenlabs voice-isolator [flags]| Flag | Description |
|---|---|
| --audio-file | path to the input audio (required) |
| --audio-output-file | destination MP3 path (auto-generated in CWD when omitted) |
| --help | help for voice-isolator |
Call Google for Gemini text generation and nano-banana image generation and editing
Gemini text generation, exact prompt token counting, and nano-banana image generation and editing. Pick the smallest model that can do the job. Text tiers (cheap to strong) gemini-3.1-flash-lite Default. Cheap and fast with Gemini 3 thinking controls. $0.25/$1.5 per Mtok. gemini-3.1-pro-preview Preview frontier reasoning model with the thinkingLevel enum (LOW or HIGH only). $2/$12 per Mtok (short), $4/$18 (long). 200K input cliff bills the whole request at the long-context tier. Image tiers (cheap to strong) gemini-3.1-flash-lite-image Nano Banana Lite. Cheapest and fastest. Per-token output billing at $0.25/$30 per Mtok. Lowest cost, lower fidelity. gemini-3.1-flash-image-preview Default. Nano Banana 2. Per-token output billing. Faster preview iteration than Pro, at lower fidelity. gemini-3-pro-image-preview Nano Banana Pro. Highest fidelity. Per-token output billing. Reasoning surface differs by family. Gemini 2.5 uses thinkingBudget (numeric). Gemini 3+ uses thinkingLevel (enum). The --reasoning flag maps both transparently. Thinking tokens are billed as output tokens and share the --max-tokens cap.
clor inference google [flags]| Flag | Description |
|---|---|
| --help | help for google |
Count prompt tokens for a Gemini generate call without running generation
Exact count via Gemini's countTokens endpoint; text-only (image models rejected). Use this before committing to a long-context Pro call (>200K input bills the long-context tier on the whole request). Input modes (mutually exclusive): positional arg, --stdin-format text (single user message), or --stdin-format json (multi-turn array).
clor inference google count-tokens [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for count-tokens |
| --model | model id; must be a text-generation Gemini model (image-generation models are rejected). Tokenization is model-specific so the count matches a real generate call against the same model Default gemini-3.1-flash-lite |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --system | optional system prompt; counted against the input |
Generate or edit an image with Gemini's nano-banana family from a text prompt
Generate from scratch or edit an existing image (--image-input). gemini-3.1-flash-lite-image Nano Banana Lite. Cheapest and fastest. Per-token output billing at $0.25/$30 per Mtok. Lowest cost, lower fidelity. gemini-3.1-flash-image-preview Default. Nano Banana 2. Per-token output billing. Faster preview iteration than Pro, at lower fidelity. gemini-3-pro-image-preview Nano Banana Pro. Highest fidelity and best instruction following. Per-token output billing. For multi-turn image editing on the preview models, thought signatures from prior turns must be passed back; image-edit signatures are strictly enforced.
clor inference google image <PROMPT> [flags]| Flag | Description |
|---|---|
| --aspect-ratio | aspect ratio (1:1|16:9|9:16|4:3|3:4) |
| --help | help for image |
| --image-input | path to a PNG or JPEG to edit (optional) |
| --image-output-file | destination file path; default is a unique safe-named PNG in the current directory |
| --model | model id. gemini-3.1-flash-lite-image (Nano Banana Lite, cheapest and fastest, per-token billing, lower fidelity), gemini-3.1-flash-image-preview (default, Nano Banana 2, per-token billing, faster preview iteration), gemini-3-pro-image-preview (Nano Banana Pro, highest fidelity, per-token billing) Default gemini-3.1-flash-image-preview |
Generate text with a Gemini model (2.5 GA family, 3.1 and 3.5 stable, or 3.x previews)
Pick the smallest model that can do the job. flash-lite for cheap high-volume work, pro for frontier reasoning. 200K-input cliff on Pro models: prompts above 200K input tokens bill the entire request (input + output + cache) at the long-context tier (2x-1.5x the short-context rates). Count tokens with the count-tokens subcommand before committing. --reasoning per-effort cost framing: off No thinking on Gemini 2.5. On Gemini 3 Flash this maps to MINIMAL (the model still does some thinking; thinkingLevel has no zero-budget escape hatch). On Gemini 3 Pro it clamps up to LOW, since Pro has no MINIMAL tier. Cheapest, lowest latency. low 2.5: 2048-token thinking budget. 3+: LOW. Light reasoning for simple structured edits. medium 2.5: 8192-token thinking budget. 3 Flash: MEDIUM. 3 Pro clamps to LOW. Working default for ordinary reasoning. high 2.5: 16384-token thinking budget. 3+: HIGH. Multi-step planning, code review, harder analysis. xhigh 2.5: 32768-token thinking budget. 3+: clamps to HIGH (3 Flash maxes at HIGH, 3 Pro accepts only LOW/HIGH). For the hardest reasoning problems on 2.5. max 2.5: dynamic model-chosen ceiling. 3+: clamps to HIGH. Let the model spend whatever it needs (2.5) or hit the highest level (3+). Thinking tokens are billed as output tokens and share the --max-tokens cap, so raising effort raises both cost and the risk of truncated visible output. Image-generation models reject --reasoning with 400.
clor inference google text [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for text |
| --max-tokens | max output tokens (caps at the model's documented max). Thinking tokens count toward this cap |
| --model | model id. Cheap to strong: gemini-3.1-flash-lite (default), gemini-3.1-pro-preview. Pro models charge a long-context premium above 200K input tokens. Gemini 3+ models use the thinkingLevel enum Default gemini-3.1-flash-lite |
| --reasoning | reasoning effort (off|low|medium|high|xhigh|max). Mapping depends on family. Gemini 2.5 uses thinkingBudget (off=0, low=2048, medium=8192, high=16384, xhigh=32768, max=dynamic ceiling). Gemini 3 Flash uses thinkingLevel (off=MINIMAL, low=LOW, medium=MEDIUM, high=HIGH; xhigh and max clamp to HIGH). Gemini 3 Pro accepts only LOW and HIGH, so off and medium clamp up to LOW (Pro has no MINIMAL tier) and xhigh/max clamp up to HIGH. Thinking tokens are billed as output tokens Default off |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --stop | stop sequence; pass repeatedly for multiple (max 4) Default [] |
| --system | optional system prompt; passed to Gemini's systemInstruction |
| --temperature | sampling temperature (0.0-2.0); -1 means use the model's default. Gemini 3 reasoning is calibrated for the default; tuning below 1.0 can cause looping on hard reasoning tasks Default -1 |
| --top-p | nucleus-sampling threshold (0.0-1.0); -1 means use the model's default Default -1 |
Call OpenAI for GPT text, gpt-image generation and editing, and gpt-4o audio transcription
GPT text, gpt-image generation and editing, gpt-4o transcription. Pick the smallest model that can do the job. Text tiers (cheap to strong) gpt-5.4-nano Cheapest. Best for the highest-volume extraction, classification, and reformatting where cost dominates. Accepts low|medium|high effort. $0.20/$1.25 per Mtok. gpt-5.4-mini Cheap and fast. Best for high-volume extraction, summarization, classification, reformatting. Accepts low|medium|high effort. $0.75/$4.5 per Mtok. gpt-5.6-luna Cheap general-purpose. Accepts low through max effort. $1/$6 per Mtok. gpt-5.6-terra Mid-tier. Strong reasoning at half the flagship rate. Accepts low through max effort. $2.50/$15 per Mtok. gpt-5.6-sol Default. Frontier reasoning. Adds xhigh and max effort for the hardest problems. $5/$30 per Mtok. gpt-5.5 Previous flagship. Accepts low through xhigh effort. $5/$30 per Mtok. Image tiers (cheap to strong) gpt-image-1-mini Lightest. Best for thumbnails and quick iteration. gpt-image-2 Default. Newest. Best instruction following and output quality. Audio (cheap to strong) gpt-4o-mini-transcribe Speech-to-text, half the cost. gpt-4o-transcribe Speech-to-text, default, most accurate. mp3, mp4, m4a, wav, webm, ogg, flac. 25 MiB cap enforced client-side.
clor inference openai [flags]| Flag | Description |
|---|---|
| --help | help for openai |
Count prompt tokens for an OpenAI Responses call without running generation
Counted locally with tiktoken (o200k_base for gpt-5.x/gpt-4o); lands within a small constant of upstream's usage.input_tokens. OpenAI has no count_tokens API. Input modes (mutually exclusive): positional arg, --stdin-format text (single user message), or --stdin-format json (multi-turn array).
clor inference openai count-tokens [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for count-tokens |
| --model | model id (gpt-5.6-sol|gpt-5.6-terra|gpt-5.6-luna|gpt-5.5|gpt-5.4-mini). The gpt-5.x family shares the o200k_base tokenizer, so the count is identical across them today; the field is kept per-model for future-proofing Default gpt-5.6-sol |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --system | optional system prompt; counted against the input |
Generate or edit an image with OpenAI's gpt-image family from a text prompt
Generate from scratch or edit an existing image (--image-input). Pick the smallest model that meets the quality bar. gpt-image-1-mini Lightest tier. Use for thumbnails, exploratory drafts, fast iteration loops. gpt-image-2 Default. Newest. Best instruction following and finest detail. Use when quality matters and the prompt encodes specific composition or text. --size and --quality default to auto. --n batches up to 10 generations in one call; only the first is written to disk by default.
clor inference openai image <PROMPT> [flags]| Flag | Description |
|---|---|
| --help | help for image |
| --image-input | path to a PNG or JPEG to edit (optional) |
| --image-output-file | destination file path; default is a unique safe-named PNG in the current directory (only the first image is written when n>1) |
| --model | model id (gpt-image-1-mini|gpt-image-2) Default gpt-image-2 |
| --n | number of images to generate (1-10) Default 1 |
| --quality | quality (auto|low|medium|high); defaults to auto |
| --size | image size (auto|1024x1024|1024x1536|1536x1024); defaults to auto |
Generate text with GPT via the OpenAI Responses API
Pick the smallest model that can do the job. gpt-5.4-mini for high-volume extraction or simple reformatting, gpt-5.6-sol (default) when frontier reasoning is worth the spend. Prompts >=1024 tokens auto-cache for ~90 percent discount on hits; hits surface in usage.cached_input_tokens. --reasoning per-effort cost framing: off Lets the model use its built-in default. gpt-5.x cannot be fully disabled; the default tier is medium. Right choice for general-purpose calls where you want the model to pick. low Light reasoning. Small slice of max_output_tokens reserved. Use for short structured edits and simple multi-step work. medium Working default for ordinary reasoning tasks. high Multi-step planning, code review, harder analysis. xhigh gpt-5.5 and the gpt-5.6 family. For the hardest problems that justify the spend. max gpt-5.6 family only. The top effort tier for the very hardest problems. Reasoning tokens are billed as output tokens and share the --max-tokens cap, so raising effort raises both cost and the risk that visible output gets truncated (status=incomplete). Summarized reasoning traces surface under --stdout-format json. Raw reasoning tokens are never returned.
clor inference openai text [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for text |
| --max-tokens | max output tokens (caps at the model's documented max). Reasoning tokens count toward this cap together with visible output; hitting the cap mid-reasoning returns status=incomplete |
| --model | model id. Cheap to strong: gpt-5.4-nano ($0.20/$1.25 per Mtok, cheapest high-volume), gpt-5.4-mini ($0.75/$4.5, simple high-volume), gpt-5.6-luna ($1/$6, cheap general-purpose), gpt-5.6-terra ($2.50/$15, mid-tier), gpt-5.6-sol ($5/$30, frontier reasoning, default) Default gpt-5.6-sol |
| --reasoning | reasoning effort (off|low|medium|high|xhigh|max). off omits the field so the model uses its built-in default (gpt-5.x cannot be fully disabled, default is medium). low/medium/high climb in capability and cost. xhigh needs gpt-5.5 or the gpt-5.6 family; max is gpt-5.6 only and is for the hardest problems. Reasoning tokens are billed as output tokens and never returned verbatim (summaries surface under --stdout-format json) Default off |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --system | optional system prompt (sent as OpenAI's instructions field). Prompts >=1024 tokens auto-cache for ~90 percent discount on hits |
| --temperature | sampling temperature (0.0-2.0); -1 means use the model's default Default -1 |
| --top-p | nucleus-sampling threshold (0.0-1.0); -1 means use the model's default. OpenAI recommends temperature OR top-p, not both Default -1 |
Transcribe an audio file to text with OpenAI's gpt-4o-transcribe
Accepts mp3, mp4, mpeg, mpga, m4a, wav, webm, ogg, flac. 25 MiB cap is enforced client-side so oversized uploads do not waste a round trip. gpt-4o-transcribe (default) is the most accurate; gpt-4o-mini-transcribe is half the cost for high-volume work. Set --language when the audio language is known; it cuts latency and improves accuracy. Set --prompt to bias recognition toward known vocabulary (brand names, technical terms, speaker names) or to continue a prior segment. The prompt should match the audio language.
clor inference openai transcribe <FILE> [flags]| Flag | Description |
|---|---|
| --help | help for transcribe |
| --language | 2-letter language code, ISO 639-1 (en, fr); optional, improves accuracy and latency when known |
| --model | transcription model id (gpt-4o-transcribe|gpt-4o-mini-transcribe). mini is half the cost; full is more accurate Default gpt-4o-transcribe |
| --prompt | optional context text to help with vocabulary or continue a previous segment; should match the audio language |
Reach hundreds of chat and image-generation models through OpenRouter
Single OpenAI-compatible chat-completions surface fronting hundreds of models from many labs (Anthropic, OpenAI, Google, X-AI, Meta, Mistral, DeepSeek, Qwen, and many smaller labs). Model strings are open passthrough; any id OpenRouter accepts is forwarded unchanged. Per-call dollar cost comes back in the response, so no per-model rate table is maintained here. Prefer the dedicated subcommands (anthropic, openai, google) for models that live there. They expose stronger feature parity (count tokens, image generation, reasoning effort enums, modality-split usage) and transparent pricing tiers. Reach for openrouter when: - the caller needs Llama, DeepSeek, Qwen, X-AI Grok, Mistral, or another model the dedicated subcommands do not cover - the caller wants to try an open-weights model without standing up inference infrastructure - the caller wants to benchmark a model against another vendor's surface (responses come back in OpenAI-compatible shape) Use the model subcommand to discover model ids and pricing.
clor inference openrouter [flags]| Flag | Description |
|---|---|
| --help | help for openrouter |
Browse the OpenRouter catalogue to find model ids for chat
Discover model ids to pass as --model on the text subcommand. The catalogue fronts hundreds of models from many labs.
clor inference openrouter model [flags]| Flag | Description |
|---|---|
| --help | help for model |
List OpenRouter models, defaulting to the top 30 newest from frontier labs
Defaults to top 30 newest from frontier labs (anthropic, openai, google, x-ai, meta-llama, mistralai, deepseek, qwen, openrouter), excluding `:free` and `:nitro` variants. --all dumps every model; --provider/--modality/--search narrow within the default curation. JSON output includes per-token pricing; text/jsonl omit it.
clor inference openrouter model list [flags]| Flag | Description |
|---|---|
| --all | skip the frontier-lab default curation and return every model OpenRouter fronts |
| --help | help for list |
| --limit | maximum rows to return; ignored when --all is set Default 30 |
| --modality | filter by output modality (text|image|audio) |
| --provider | filter to one provider id prefix (anthropic, openai, google, ...); repeatable Default [] |
| --search | case-insensitive substring match on model id, name, and description |
Generate text with any OpenRouter model
--model is required; OpenRouter has no implicit default since the catalogue spans hundreds of models. Examples: anthropic/claude-opus-4-8, openai/gpt-5.5, google/gemini-3.5-flash, meta-llama/llama-3.3-70b-instruct, deepseek/deepseek-v3, x-ai/grok-4. Discover ids with the model subcommand. Input modes: positional, --stdin-format text, or --stdin-format json (multi-turn array). Multimodal: --image-input (local file, repeatable) or --image-url (remote or data URL, repeatable) attach to the final user message. Image generation: --image-output PATH on an image-capable model opts the request into image-output modality; the first returned image is saved. Reasoning is a coarse effort hint passed through to whichever upstream model supports thinking. --reasoning low|medium|high lands on the upstream's effort enum where one exists. --reasoning-tokens N is an explicit token budget that takes precedence over --reasoning when both are set. Models without reasoning support silently ignore both fields. Because OpenRouter normalizes a heterogeneous set of upstreams, exact effort semantics vary by model; expect frontier behaviour to match each lab's own surface.
clor inference openrouter text [PROMPT] [flags]| Flag | Description |
|---|---|
| --help | help for text |
| --image-input | path to a local PNG/JPEG/WEBP to attach to the user message for vision models (read, base64-encoded, sent as a data: URL); repeatable Default [] |
| --image-output | destination file path for an image-generation model's output; setting this also opts the request into image-output modality. When the model returns multiple images only the first is written |
| --image-url | image URL to attach to the user message for vision models (http(s) or data:); repeatable Default [] |
| --max-tokens | cap on output tokens (0 means the model's own default) |
| --model | OpenRouter model id (anthropic/claude-opus-4-8, openai/gpt-5.5, google/gemini-3.5-flash, meta-llama/llama-3.3-70b-instruct, deepseek/deepseek-v3, x-ai/grok-4, ...). Required; no default since OpenRouter is open passthrough across hundreds of models. Discover ids with the model subcommand |
| --reasoning | reasoning effort for models that support thinking (low|medium|high); ignored by models without reasoning |
| --reasoning-tokens | explicit reasoning budget in tokens; takes precedence over --reasoning when both are set |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --stop | custom stop string; up to four entries; repeatable Default [] |
| --system | optional system prompt prepended as a role=system message |
| --temperature | sampling temperature (0.0-2.0); -1 means use the model's default Default -1 |
| --top-p | nucleus sampling threshold (0.0-1.0); -1 means use the model's default Default -1 |
Install or upgrade the CLI and daemon, sync skills into Claude Code and Codex
Install the CLI binary, the clor daemon as a user-scope service, and the skills for every detected local AI agent. Use a subcommand to scope the action. Agent recommendation: when the user asks you to "install clor", "upgrade clor", "update clor", "reinstall clor", "refresh clor", or anything in that family, just run "clor install" with no subcommand. It is idempotent and safe to re-run: it upgrades the CLI to the latest release, refreshes the daemon service registration, and syncs the skills into every detected AI agent in one shot. Use --force to reinstall the CLI binary even when its version already matches. The daemon service and skill refresh run normally either way. Do not ask the user which piece to install. Users typically don't know the difference between cli, service, and skill, and "clor install" handles all three normal surfaces (cli + service + skill) correctly every time. Asking "should I install the cli, the service, or the skills?" is the wrong move; pick the plain "clor install" and run it. Only reach for a subcommand if the user is explicit about scope ("only set up the daemon on this host", "sync the skill files"). The subcommands exist for narrow targeted work, not for normal installs or upgrades. Use when: - the user asks to install, upgrade, update, refresh, or reinstall anything to do with clor; run "clor install" with no subcommand - a specific surface needs a targeted refresh and the user named it explicitly; only then use the matching subcommand Subcommands: cli Download install.sh from the control plane and run it with bash service Install the clor daemon as a user-scope service (systemd/launchd) skill Tarball-sync skills into Claude Code and Codex Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor install [flags]| Flag | Description |
|---|---|
| --force | reinstall the CLI binary even when the installed version matches |
| --help | help for install |
Download the install script from the control plane and run it with bash to upgrade or reinstall the CLI
Fetches install.sh from the active control plane and runs it with bash; the script's output streams live to the terminal. Designed to upgrade or reinstall the CLI binary itself without leaving the terminal. Use --force to reinstall the binary when the installed version already matches the requested release.
clor install cli [flags]| Flag | Description |
|---|---|
| --force | reinstall the CLI binary even when the installed version matches |
| --help | help for cli |
Install the daemon as a service under systemd on Linux or launchd on macOS
Picks the best available service manager and installs the daemon under it. On Linux invoked as root, writes `/etc/systemd/system/clor.service` then runs `systemctl enable` and `systemctl restart` so the daemon runs as root, survives reboots without enable-linger, and a reinstall swaps the running process to the freshly installed binary. On Linux as a regular user with a working systemd user session, writes `~/.config/systemd/user/clor.service` and runs the same enable plus restart under `systemctl --user`. On macOS, writes `~/Library/LaunchAgents/com.clor.plist` and bootstraps it under the current GUI session. On hosts with no supported service manager (containers, sandboxes, minimal images), nothing is installed and a warning explains that the daemon, which runs the spaces assigned to this machine, will not run here. That warning is safe to ignore on a machine used only to manage spaces that run elsewhere. Idempotent. Re-runs stop any prior daemon, refresh the unit or plist, and restart the service.
clor install service [flags]| Flag | Description |
|---|---|
| --help | help for service |
Install skills into Claude Code and Codex
Installs skills into the target agents' skills directories. Outside a space this syncs the official skills tree into every detected enabled agent (an explicit `--agent <NAME>` targets one). Inside a space (CLOR_SPACE_ID set) it instead installs exactly the skills attached to that space, converging on re-runs.
clor install skill [flags]| Flag | Description |
|---|---|
| --agent | agent to install skills into outside a space (claude|codex|all) Default all |
| --help | help for skill |
Read and update Linear issues, projects, cycles, initiatives, documents, and workspace records
Direct Linear workspace access through GraphQL. Typed commands cover the common developer and product-management workflow; graphql handles uncommon operations without changing the normalized output contract of typed commands. Use it when - issues, comments, relations, labels, states, or attachments need to be read or changed - projects, progress updates, milestones, cycles, or initiatives need to be managed - workspace users, teams, or documents need to be queried Subcommands whoami Show the authenticated Linear user search Search issues, projects, or documents issue Read and change issues, comments, and relations project Read and change projects, progress updates, and milestones cycle Read and change cycles initiative Read and change initiatives and their projects document Read and change documents attachment Read and change issue attachments team List and show teams user List and show users state List and show workflow states label Read and change issue labels graphql Run a named GraphQL operation directly Output formats Every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor linear [flags]| Flag | Description |
|---|---|
| --connection | connection ID when several Linear workspaces are connected |
| --help | help for linear |
Read and change Linear issue attachments
clor linear attachment [flags]| Flag | Description |
|---|---|
| --help | help for attachment |
Create a linked issue attachment
clor linear attachment create <ISSUE> <URL> [flags]| Flag | Description |
|---|---|
| --comment-body | Markdown linked-comment body |
| --comment-body-file | file containing the Markdown linked-comment body, or - for stdin |
| --help | help for create |
| --icon-url | attachment icon URL |
| --metadata | attachment metadata as a JSON object |
| --subtitle | attachment subtitle |
| --title | attachment title |
Delete an issue attachment
clor linear attachment delete <ATTACHMENT> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List workspace attachments or attachments on one issue
clor linear attachment list [ISSUE] [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Show one attachment
clor linear attachment show <ATTACHMENT> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Update an issue attachment
clor linear attachment update <ATTACHMENT> [flags]| Flag | Description |
|---|---|
| --clear-icon-url | clear the icon URL |
| --clear-metadata | clear the metadata |
| --clear-subtitle | clear the subtitle |
| --help | help for update |
| --icon-url | attachment icon URL |
| --metadata | attachment metadata as a JSON object |
| --subtitle | attachment subtitle |
| --title | new attachment title |
Read and change Linear team cycles
clor linear cycle [flags]| Flag | Description |
|---|---|
| --help | help for cycle |
Archive a cycle
clor linear cycle archive <CYCLE> [flags]| Flag | Description |
|---|---|
| --help | help for archive |
| --team | team ID, URL, key, or exact name used to disambiguate |
Create a cycle for a team
clor linear cycle create [flags]| Flag | Description |
|---|---|
| --description | cycle description |
| --ends | cycle end time (RFC3339) |
| --help | help for create |
| --name | custom cycle name |
| --starts | cycle start time (RFC3339) |
| --team | team ID, URL, key, or exact name |
List cycles
clor linear cycle list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
| --team | team ID, URL, key, or exact name |
Show one cycle
clor linear cycle show <CYCLE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
| --team | team ID, URL, key, or exact name used to disambiguate |
Update cycle dates and details
clor linear cycle update <CYCLE> [flags]| Flag | Description |
|---|---|
| --clear-completed | clear the completion time |
| --clear-description | clear the description |
| --clear-name | clear the custom name |
| --completed | cycle completion time (RFC3339) |
| --description | cycle description |
| --ends | cycle end time (RFC3339) |
| --help | help for update |
| --name | custom cycle name |
| --starts | cycle start time (RFC3339) |
| --team | team ID, URL, key, or exact name used to disambiguate |
Read and change Linear Markdown documents
clor linear document [flags]| Flag | Description |
|---|---|
| --help | help for document |
Create a Markdown document
clor linear document create <TITLE> [flags]| Flag | Description |
|---|---|
| --color | document icon color |
| --content | Markdown document content |
| --content-file | file containing Markdown document content, or - for stdin |
| --cycle | related cycle ID, URL, or exact name |
| --help | help for create |
| --icon | document icon |
| --initiative | related initiative ID, URL, identifier, or exact name |
| --issue | related issue ID, URL, or identifier |
| --project | related project ID, URL, or exact name |
| --team | related team ID, URL, key, or exact name |
Move a document to recoverable trash
clor linear document delete <DOCUMENT> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List documents
clor linear document list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Show one document
clor linear document show <DOCUMENT> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Restore a trashed document
clor linear document unarchive <DOCUMENT> [flags]| Flag | Description |
|---|---|
| --help | help for unarchive |
Update a document with explicit clear operations
clor linear document update <DOCUMENT> [flags]| Flag | Description |
|---|---|
| --clear-color | clear the icon color |
| --clear-content | clear the Markdown content |
| --clear-cycle | clear the related cycle |
| --clear-icon | clear the icon |
| --clear-initiative | clear the related initiative |
| --clear-issue | clear the related issue |
| --clear-project | clear the related project |
| --clear-team | clear the related team |
| --color | document icon color |
| --content | Markdown document content |
| --content-file | file containing Markdown document content, or - for stdin |
| --cycle | related cycle ID, URL, or exact name |
| --help | help for update |
| --icon | document icon |
| --initiative | related initiative ID, URL, identifier, or exact name |
| --issue | related issue ID, URL, or identifier |
| --project | related project ID, URL, or exact name |
| --team | related team ID, URL, key, or exact name |
| --title | new document title |
Run an uncommon Linear GraphQL operation directly
clor linear graphql [QUERY] [flags]| Flag | Description |
|---|---|
| --help | help for graphql |
| --operation-name | GraphQL operation name |
| --query-file | file containing the GraphQL query |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --variable | variable as NAME=JSON, repeatable Default [] |
| --variables | variables as one JSON object |
Read and change Linear initiatives and their projects
Use when: - the user needs Linear initiative records
clor linear initiative [flags]| Flag | Description |
|---|---|
| --help | help for initiative |
Archive an initiative
clor linear initiative archive <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --help | help for archive |
Create a workspace initiative
clor linear initiative create <NAME> [flags]| Flag | Description |
|---|---|
| --content | Markdown initiative content |
| --content-file | file containing Markdown initiative content, or - for stdin |
| --description | initiative description |
| --help | help for create |
| --owner | owner ID, email, me, or exact name |
| --priority | initiative priority (no-priority|urgent|high|medium|low) |
| --status | initiative status (proposed|planned|active|completed|canceled) |
| --target-date | estimated completion date (YYYY-MM-DD) |
Move an initiative to recoverable trash
clor linear initiative delete <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List initiatives
clor linear initiative list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
List, add, and remove initiative projects
Use when: - the user needs Linear project records
clor linear initiative project [flags]| Flag | Description |
|---|---|
| --help | help for project |
Add a project to an initiative
clor linear initiative project add <INITIATIVE> <PROJECT> [flags]| Flag | Description |
|---|---|
| --help | help for add |
List projects in an initiative
clor linear initiative project list <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Remove a project from an initiative
clor linear initiative project remove <INITIATIVE> <PROJECT> [flags]| Flag | Description |
|---|---|
| --help | help for remove |
Show one initiative
clor linear initiative show <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Unarchive an initiative
clor linear initiative unarchive <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --help | help for unarchive |
Update an initiative with explicit clear operations
clor linear initiative update <INITIATIVE> [flags]| Flag | Description |
|---|---|
| --clear-content | clear the Markdown content |
| --clear-description | clear the description |
| --clear-owner | clear the owner |
| --clear-priority | set no priority |
| --clear-target-date | clear the target date |
| --content | Markdown initiative content |
| --content-file | file containing Markdown initiative content, or - for stdin |
| --description | initiative description |
| --help | help for update |
| --name | new initiative name |
| --owner | owner ID, email, me, or exact name |
| --priority | initiative priority (no-priority|urgent|high|medium|low) |
| --status | initiative status (proposed|planned|active|completed|canceled) |
| --target-date | estimated completion date (YYYY-MM-DD) |
Read and change Linear issues, comments, and relations
Use when: - the user needs Linear issue records
clor linear issue [flags]| Flag | Description |
|---|---|
| --help | help for issue |
Archive an issue
clor linear issue archive <ISSUE> [flags]| Flag | Description |
|---|---|
| --help | help for archive |
Read and change issue comments
Use when: - the user needs Linear comment records
clor linear issue comment [flags]| Flag | Description |
|---|---|
| --help | help for comment |
Create an issue comment in Markdown
clor linear issue comment create <ISSUE> [BODY] [flags]| Flag | Description |
|---|---|
| --body-file | file containing the Markdown body, or - for stdin |
| --help | help for create |
| --parent | parent comment ID |
Delete an issue comment
clor linear issue comment delete <COMMENT> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Resolve a comment thread
clor linear issue comment resolve <COMMENT> [flags]| Flag | Description |
|---|---|
| --help | help for resolve |
Unresolve a comment thread
clor linear issue comment unresolve <COMMENT> [flags]| Flag | Description |
|---|---|
| --help | help for unresolve |
Update an issue comment in Markdown
clor linear issue comment update <COMMENT> [BODY] [flags]| Flag | Description |
|---|---|
| --body-file | file containing the Markdown body, or - for stdin |
| --help | help for update |
Create an issue with typed workspace references
clor linear issue create <TITLE> [flags]| Flag | Description |
|---|---|
| --assignee | assignee ID, email, me, or exact name |
| --cycle | cycle ID, URL, or exact name |
| --description | Markdown description |
| --description-file | file containing the Markdown description, or - for stdin |
| --due-date | due date (YYYY-MM-DD) |
| --estimate | issue estimate |
| --help | help for create |
| --label | label ID or exact name, repeatable Default [] |
| --milestone | project milestone ID or exact name |
| --parent | parent issue ID, URL, or identifier |
| --priority | issue priority (no-priority|urgent|high|medium|low) |
| --project | project ID, URL, or exact name |
| --state | state ID or exact name |
| --team | team ID, URL, key, or exact name |
| --template | template ID |
Move an issue to recoverable trash
clor linear issue delete <ISSUE> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List issues with exact workspace filters
clor linear issue list [flags]| Flag | Description |
|---|---|
| --assignee | assignee ID, email, me, or exact name |
| --cursor | Relay cursor to continue after |
| --cycle | cycle ID, URL, or exact name |
| --help | help for list |
| --include-archived | include archived records |
| --label | label ID or exact name |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
| --priority | issue priority (no-priority|urgent|high|medium|low) |
| --project | project ID, URL, or exact name |
| --state | state ID or exact name |
| --team | team ID, URL, key, or exact name |
List, add, and remove issue relations
Use when: - the user needs Linear relation records
clor linear issue relation [flags]| Flag | Description |
|---|---|
| --help | help for relation |
Add a typed relation from one issue to another
clor linear issue relation add <ISSUE> <RELATED_ISSUE> [flags]| Flag | Description |
|---|---|
| --help | help for add |
| --type | relation type (blocks|duplicate|related|similar) Default related |
List relations sourced from an issue
clor linear issue relation list <ISSUE> [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Remove an issue relation
clor linear issue relation remove <RELATION> [flags]| Flag | Description |
|---|---|
| --help | help for remove |
Show one issue
clor linear issue show <ISSUE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Unarchive an issue
clor linear issue unarchive <ISSUE> [flags]| Flag | Description |
|---|---|
| --help | help for unarchive |
Update an issue with explicit set and clear operations
clor linear issue update <ISSUE> [flags]| Flag | Description |
|---|---|
| --add-label | label ID or exact name to add, repeatable Default [] |
| --assignee | assignee ID, email, me, or exact name |
| --clear-assignee | clear the assignee |
| --clear-cycle | clear the cycle |
| --clear-description | clear the description |
| --clear-due-date | clear the due date |
| --clear-estimate | clear the estimate |
| --clear-labels | remove all labels |
| --clear-milestone | clear the project milestone |
| --clear-parent | clear the parent issue |
| --clear-priority | set no priority |
| --clear-project | clear the project and milestone |
| --clear-state | clear the state |
| --clear-template | clear the last applied template |
| --cycle | cycle ID, URL, or exact name |
| --description | Markdown description |
| --description-file | file containing the Markdown description, or - for stdin |
| --due-date | due date (YYYY-MM-DD) |
| --estimate | issue estimate |
| --help | help for update |
| --milestone | project milestone ID or exact name |
| --parent | parent issue ID, URL, or identifier |
| --priority | issue priority (no-priority|urgent|high|medium|low) |
| --project | project ID, URL, or exact name |
| --remove-label | label ID or exact name to remove, repeatable Default [] |
| --state | state ID or exact name |
| --team | team ID, URL, key, or exact name |
| --template | template ID |
| --title | new issue title |
Read and change Linear issue labels
clor linear label [flags]| Flag | Description |
|---|---|
| --help | help for label |
Create an issue label
clor linear label create <NAME> [flags]| Flag | Description |
|---|---|
| --color | hex color |
| --description | label description |
| --group | create a label group |
| --help | help for create |
| --parent | parent label ID or exact name |
| --team | team ID, URL, key, or exact name |
Delete an issue label
clor linear label delete <LABEL> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
| --team | team ID, URL, key, or exact name used to disambiguate |
List labels
clor linear label list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
| --team | team ID, URL, key, or exact name |
Show one label
clor linear label show <LABEL> [flags]| Flag | Description |
|---|---|
| --help | help for show |
| --team | team ID, URL, key, or exact name used to disambiguate |
Update an issue label
clor linear label update <LABEL> [flags]| Flag | Description |
|---|---|
| --clear-description | clear the description |
| --clear-parent | clear the parent label |
| --color | hex color |
| --description | label description |
| --group | set whether this is a label group |
| --help | help for update |
| --name | new label name |
| --parent | parent label ID or exact name |
| --team | team ID, URL, key, or exact name used to disambiguate |
Read and change Linear projects, progress updates, and milestones
Use when: - the user needs Linear project records
clor linear project [flags]| Flag | Description |
|---|---|
| --help | help for project |
Create a project across one or more teams
clor linear project create <NAME> [flags]| Flag | Description |
|---|---|
| --content | Markdown project content |
| --content-file | file containing Markdown project content, or - for stdin |
| --description | project description |
| --help | help for create |
| --lead | lead ID, email, me, or exact name |
| --member | member ID, email, me, or exact name, repeatable Default [] |
| --priority | project priority (no-priority|urgent|high|medium|low) |
| --start-date | start date (YYYY-MM-DD) |
| --status | project status ID or exact name |
| --target-date | target date (YYYY-MM-DD) |
| --team | team ID, URL, key, or exact name, repeatable Default [] |
Move a project to recoverable trash
clor linear project delete <PROJECT> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List projects
clor linear project list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Read and change project milestones
Use when: - the user needs Linear milestone records
clor linear project milestone [flags]| Flag | Description |
|---|---|
| --help | help for milestone |
Create a project milestone
clor linear project milestone create <PROJECT> <NAME> [flags]| Flag | Description |
|---|---|
| --description | Markdown milestone description |
| --description-file | file containing the Markdown description, or - for stdin |
| --help | help for create |
| --target-date | target date (YYYY-MM-DD) |
Delete a project milestone
clor linear project milestone delete <MILESTONE> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List milestones for a project
clor linear project milestone list <PROJECT> [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Show one milestone
clor linear project milestone show <MILESTONE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
| --project | project ID, URL, key, or exact name used to disambiguate |
Update a project milestone
clor linear project milestone update <MILESTONE> [flags]| Flag | Description |
|---|---|
| --clear-description | clear the description |
| --clear-target-date | clear the target date |
| --description | Markdown milestone description |
| --description-file | file containing the Markdown description, or - for stdin |
| --help | help for update |
| --name | new milestone name |
| --project | new project ID, URL, or exact name |
| --target-date | target date (YYYY-MM-DD) |
Read and change project progress updates
Use when: - the user needs Linear progress records
clor linear project progress [flags]| Flag | Description |
|---|---|
| --help | help for progress |
Archive a project progress update
clor linear project progress archive <PROGRESS> [flags]| Flag | Description |
|---|---|
| --help | help for archive |
Create a project progress update
clor linear project progress create <PROJECT> [BODY] [flags]| Flag | Description |
|---|---|
| --body-file | file containing the Markdown body, or - for stdin |
| --health | project health (on-track|at-risk|off-track) |
| --help | help for create |
Remove a project progress update recoverably
clor linear project progress delete <PROGRESS> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List progress updates for a project
clor linear project progress list <PROJECT> [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Unarchive a project progress update
clor linear project progress unarchive <PROGRESS> [flags]| Flag | Description |
|---|---|
| --help | help for unarchive |
Update a project progress update
clor linear project progress update <PROGRESS> [BODY] [flags]| Flag | Description |
|---|---|
| --body-file | file containing the Markdown body, or - for stdin |
| --clear-body | clear the progress body |
| --health | project health (on-track|at-risk|off-track) |
| --help | help for update |
Show one project
clor linear project show <PROJECT> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Restore a trashed or archived project
clor linear project unarchive <PROJECT> [flags]| Flag | Description |
|---|---|
| --help | help for unarchive |
Update a project with explicit set and clear operations
clor linear project update <PROJECT> [flags]| Flag | Description |
|---|---|
| --clear-content | clear the Markdown content |
| --clear-description | clear the description |
| --clear-lead | clear the project lead |
| --clear-members | remove all project members |
| --clear-priority | set no priority |
| --clear-start-date | clear the start date |
| --clear-status | clear the project status |
| --clear-target-date | clear the target date |
| --content | Markdown project content |
| --content-file | file containing Markdown project content, or - for stdin |
| --description | project description |
| --help | help for update |
| --lead | lead ID, email, me, or exact name |
| --member | member ID, email, me, or exact name, repeatable Default [] |
| --name | new project name |
| --priority | project priority (no-priority|urgent|high|medium|low) |
| --start-date | start date (YYYY-MM-DD) |
| --status | project status ID or exact name |
| --target-date | target date (YYYY-MM-DD) |
| --team | team ID, URL, key, or exact name, repeatable Default [] |
Search Linear issues, projects, or documents
clor linear search <QUERY> [flags]| Flag | Description |
|---|---|
| --comments | search associated comments |
| --cursor | Relay cursor to continue after |
| --help | help for search |
| --include-archived | include archived resources |
| --limit | maximum records to return Default 50 |
| --ordering | search ordering (relevance|created|updated) Default relevance |
| --team-boost | team ID, URL, key, or exact name to boost |
| --type | resource type (issue|project|document) Default issue |
List and show Linear workflow states
clor linear state [flags]| Flag | Description |
|---|---|
| --help | help for state |
List states
clor linear state list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
| --team | team ID, URL, key, or exact name |
Show one state
clor linear state show <STATE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
| --team | team ID, URL, key, or exact name used to disambiguate |
List and show Linear teams
clor linear team [flags]| Flag | Description |
|---|---|
| --help | help for team |
List teams
clor linear team list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Show one team
clor linear team show <TEAM> [flags]| Flag | Description |
|---|---|
| --help | help for show |
List and show Linear workspace users
clor linear user [flags]| Flag | Description |
|---|---|
| --help | help for user |
List users
clor linear user list [flags]| Flag | Description |
|---|---|
| --cursor | Relay cursor to continue after |
| --help | help for list |
| --include-archived | include archived records |
| --limit | maximum records to return Default 50 |
| --ordering | pagination ordering (created|updated) Default created |
Show one user
clor linear user show <USER> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Show the authenticated Linear user
clor linear whoami [flags]| Flag | Description |
|---|---|
| --help | help for whoami |
Create a long-lived cloud machine and connect to it over SSH
Create a long-lived cloud machine by a region, size, and image, reach it over SSH, and drive its whole lifecycle. Machines live from minutes to years until you destroy them. Stopping a machine powers it off but keeps billing; only destroying it stops billing. Use when: - the user wants a cloud server to run a build, a long job, or a service - the user wants to run a command on, resize, or tear down one of their machines Subcommands: create Create a machine by region, size, and image list List your machines show Show one machine stop Power a machine off (keeps billing) start Power a stopped machine back on resize Resize a machine to a new size destroy Destroy a machine and stop billing ssh Run a command on a machine over SSH region Discover the regions you can create machines in size Discover the sizes you can create machines with limit Show your billing tier and the resource limits it grants firewall Open, close, and list the inbound ports on a machine hostname Show or rename a machine's DNS name Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine [flags]| Flag | Description |
|---|---|
| --help | help for machine |
Create a machine by region, family, size, and image
clor machine create [flags]| Flag | Description |
|---|---|
| --clor-api-key | API key for --install-clor |
| --family | plan family (performance|memory), fixed at creation |
| --help | help for create |
| --image | image slug (e.g. ubuntu-24-04) |
| --init-script | path to a best-effort shell script run after system setup |
| --install-clor | install and authenticate Clor on the machine |
| --name | optional label for the machine |
| --region | region code (see 'clor machine region list') |
| --size | size slug within the family (see 'clor machine size list') |
| --ssh-key | SSH key fingerprint from 'clor account ssh-key list' (repeatable) Default [] |
Destroy a machine and stop its billing
clor machine destroy <ID> [flags]| Flag | Description |
|---|---|
| --help | help for destroy |
Open, close, and list the inbound ports on a machine
Control which inbound ports a machine accepts from the world. A new machine starts with SSH, HTTP, and HTTPS open. No port is special: closing 22 also cuts managed access and cannot be undone remotely. Changes apply to the machine in the background. Use when: - the user wants to expose a port on a machine to the internet - the user wants to close a port or audit which ports are open Subcommands: open Open an inbound port on a machine close Close an inbound port on a machine list List the open ports on a machine Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine firewall [flags]| Flag | Description |
|---|---|
| --help | help for firewall |
Close an inbound port on a machine
clor machine firewall close <ID> [flags]| Flag | Description |
|---|---|
| --help | help for close |
| --port | inbound port to change (1-65535) |
| --protocol | transport protocol (tcp|udp) Default tcp |
List the open ports on a machine
clor machine firewall list <ID> [flags]| Flag | Description |
|---|---|
| --help | help for list |
Open an inbound port on a machine
clor machine firewall open <ID> [flags]| Flag | Description |
|---|---|
| --help | help for open |
| --port | inbound port to change (1-65535) |
| --protocol | transport protocol (tcp|udp) Default tcp |
Show or rename a machine's DNS name
Every machine gets a random DNS name at creation, like quiet-falcon-3f2a.machine.clor.host, that always resolves to its public address. Rename the leftmost label to anything you like; the new record is created before the old one is removed, so the machine is never without a working name. Use when: - the user wants a stable name to reach a machine instead of its IP address - the user wants to rename a machine's DNS name to something memorable Subcommands: show Show a machine's DNS name and whether it is live set Rename a machine's DNS name Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine hostname [flags]| Flag | Description |
|---|---|
| --help | help for hostname |
Rename a machine's DNS name
Rename the machine's DNS name. The new record is created before the old one is removed, and the change lands within about a minute. The name is the leftmost label only, 6 to 30 lowercase letters, digits, and hyphens.
clor machine hostname set <ID> <HOSTNAME> [flags]| Flag | Description |
|---|---|
| --help | help for set |
Show a machine's DNS name and whether it is live
clor machine hostname show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Show your billing tier and the resource limits it grants
Show your billing tier and the caps it grants. These are the maximum vCPUs you can run at once, how many you currently hold, and how many machines you can create per minute. The tier rises with the amount paid over time, raising every limit. Use when: - a create or resize failed and you need to see your current vCPU usage against the cap - the user wants to know their billing tier or how many machines they can create per minute Subcommands: show Show the billing tier, vCPU cap and usage, and create rate Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine limit [flags]| Flag | Description |
|---|---|
| --help | help for limit |
Show the billing tier, vCPU cap and usage, and create rate
clor machine limit show [flags]| Flag | Description |
|---|---|
| --help | help for show |
List the machines you own
clor machine list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Discover the regions you can create machines in
List the region codes a machine can be created in. Each region is a location you pass to 'clor machine create --region'; the underlying datacenter is not disclosed. Use when: - the user needs a valid region code before creating a machine - the user wants to see which locations are available Subcommands: list List the available regions Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine region [flags]| Flag | Description |
|---|---|
| --help | help for region |
List the available regions
clor machine region list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Resize a machine to a new size
clor machine resize <ID> [flags]| Flag | Description |
|---|---|
| --help | help for resize |
| --size | size slug to resize to (see 'clor machine size list') |
Show one machine with its status and address
clor machine show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Discover the families and sizes you can create machines with, plus their specs and price
List the machine sizes grouped by family, each with its promised vCPUs, memory, disk, and flat hourly price. Pass a family to 'clor machine create --family' and a size within it to '--size'; resize stays within the family. Use when: - the user needs a valid family and size slug before creating or resizing a machine - the user wants to compare specs or hourly prices across families and sizes Subcommands: list List the available families and sizes with specs and hourly price Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor machine size [flags]| Flag | Description |
|---|---|
| --help | help for size |
List the available families and sizes with specs and hourly price
clor machine size list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Run a command on a machine over SSH and stream its output
clor machine ssh <ID> <COMMAND>... [flags]| Flag | Description |
|---|---|
| --help | help for ssh |
Power a stopped machine back on
clor machine start <ID> [flags]| Flag | Description |
|---|---|
| --help | help for start |
Power a machine off without releasing it
clor machine stop <ID> [flags]| Flag | Description |
|---|---|
| --help | help for stop |
Search everything your coding agents have done and share a markdown wiki they all read and write
Shared memory across every coding agent you run, on any machine. Every Claude Code and codex session is searchable, so you can look up what an agent did, said, ran, or decided, whether an hour ago or months back. Alongside the history is a markdown wiki your agents write to and read from, a durable place to leave notes, decisions, and context that the next agent picks up. Use when: - the user asks about something they or an agent did before, on any machine - you need context from earlier agent work before starting a task - the user wants to see what another agent did, said, ran, or decided - the user wants a durable note or wiki document their agents can share Subcommands: search Search everything your agents have said, run, and decided session List, inspect, and replay past agent sessions document Read and write the shared markdown wiki analytics Report how much your agents have run, by tokens and tools reset Erase all recorded history and wiki documents Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor memory [flags]| Flag | Description |
|---|---|
| --help | help for memory |
Report how much your agents have run, by token and tool-call counts
Exact counts of how much your agents have worked, split by agent, model, and tool. bucket=day is ready for heatmaps, bucket=month gives monthly reports, bucket=total gives lifetime counts. Use when: - the user asks how many tokens their agents used, per day or model - the user asks which tools an agent uses and how often Subcommands: tokens Token usage per day, month, or lifetime, by agent and model tools Tool-call counts per day, month, or lifetime, by agent and tool turns How the agents run turn by turn, run length, steering, planning Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor memory analytics [flags]| Flag | Description |
|---|---|
| --help | help for analytics |
Report exact token usage per day, month, or lifetime, split by agent and model
clor memory analytics tokens [flags]| Flag | Description |
|---|---|
| --agent | restrict to one agent (claude|codex) |
| --bucket | time bucket (day|month|total) |
| --help | help for tokens |
| --model | restrict to one model name |
| --since | inclusive lower time bound, RFC3339 or a relative age (24h, 7d) |
| --until | inclusive upper time bound, RFC3339 or a relative age (24h, 7d) |
Report tool-call counts per day, month, or lifetime, split by agent and tool
clor memory analytics tools [flags]| Flag | Description |
|---|---|
| --agent | restrict to one agent (claude|codex) |
| --bucket | time bucket (day|month|total) |
| --help | help for tools |
| --since | inclusive lower time bound, RFC3339 or a relative age (24h, 7d) |
| --until | inclusive upper time bound, RFC3339 or a relative age (24h, 7d) |
Report how the agents actually run turn by turn, run length, waiting, steering, planning, and tool mix
A turn is one prompt and everything the agent did in answer to it. This reports how long turns run, how long they take to answer, how often you steer or interrupt them, how much of the time is planning, and what mix of tools they reach for, split by whatever bucket you ask for. Durations are milliseconds. Percentiles are by nearest rank.
clor memory analytics turns [flags]| Flag | Description |
|---|---|
| --agent | restrict to one agent (claude|codex) |
| --bucket | grouping (total|day|model|agent|hour_of_week) |
| --help | help for turns |
| --model | restrict to one model name |
| --since | inclusive lower time bound, RFC3339 or a relative age (24h, 7d) |
| --until | inclusive upper time bound, RFC3339 or a relative age (24h, 7d) |
Store, read, search, and link documents in the shared markdown wiki
A shared markdown wiki every one of your agents can read and write, on any machine. Use it to leave durable notes, decisions, runbooks, and context that the next agent picks up. Each agent's own CLAUDE.md and project memory files show up here too. Documents can link to other documents, to past sessions, and to URLs. Use when: - the user wants a durable note their agents can read anywhere - you want to record a decision or context for the next agent - the user asks what an agent has written down or remembered - a document should point at a session or a reference URL Subcommands: list List documents, most recently updated first get Print one document's markdown put Create or replace one document from stdin delete Delete one document and its links link Link a document to another document, a session, or a URL unlink Remove one link links List one document's links search Search document names, titles, and bodies Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor memory document [flags]| Flag | Description |
|---|---|
| --help | help for document |
Delete one document and its links
clor memory document delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Print one document's markdown body
clor memory document get <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for get |
Attach a link from a document to another document, a session, or a URL
clor memory document link <NAME> <TARGET> [flags]| Flag | Description |
|---|---|
| --caption | short label for the link |
| --help | help for link |
| --target-type | what the target is (document|session|url) Default url |
List one document's links
clor memory document links <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for links |
List documents in the wiki, most recently updated first
clor memory document list [flags]| Flag | Description |
|---|---|
| --agent | restrict to documents from one agent (claude|codex) |
| --help | help for list |
| --hostname | restrict to documents from one machine |
| --limit | maximum results (1-1000) |
| --offset | results to skip for pagination |
| --space-id | restrict to one space |
Create or replace one document with markdown from stdin
clor memory document put <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for put |
| --space-id | space the document belongs to |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --title | display title |
Search document names, titles, and bodies by free text
clor memory document search <QUERY> [flags]| Flag | Description |
|---|---|
| --help | help for search |
| --limit | maximum results (1-1000) |
| --offset | results to skip for pagination |
Remove one link from a document
clor memory document unlink <NAME> <TARGET> [flags]| Flag | Description |
|---|---|
| --help | help for unlink |
| --target-type | what the target is (document|session|url) Default url |
Erase all recorded history and every wiki document for your account
Erases everything recorded for your account, both the session history and the shared wiki. Ongoing agent activity keeps being recorded after a reset.
clor memory reset [flags]| Flag | Description |
|---|---|
| --help | help for reset |
Search everything your agents have said, run, and decided, newest first
Full-text search across everything your coding agents have said and done, including their messages, thinking, commands, tool calls, and results. This is how you recover context from earlier work. Find where an agent worked on something, the command that fixed a bug, a past decision, or an error from weeks ago. Quote literal phrases and combine terms with AND, OR, and NOT. Other punctuation is searched literally, so "panic: runtime error", main.go:42, and a full URL all work as written. Without --since the search covers the last 28 days.
clor memory search <QUERY> [flags]| Flag | Description |
|---|---|
| --agent | restrict to one agent (claude|codex) |
| --help | help for search |
| --limit | maximum results (1-1000) |
| --offset | results to skip for pagination |
| --session-id | restrict to one session |
| --since | inclusive lower time bound, RFC3339 or a relative age (24h, 7d) |
| --space-id | restrict to one space |
| --type | restrict to one event type (user_message|assistant_message|thinking|tool_use|tool_result|system) |
| --until | inclusive upper time bound, RFC3339 or a relative age (24h, 7d) |
List, inspect, replay, and delete past agent sessions
Each session is one run of a coding agent, with its full transcript, messages, and tool calls. Subagents a run spawns are sessions of their own, linked back to their parent. Use this to see what an agent actually did, step by step, or to pull an exact transcript back. Use when: - the user wants to see recent agent activity or find a past session - the user wants the full transcript of a session replayed - a session should be removed from the history Subcommands: list List sessions, most recently active first show Show one session's summary, activity, and token totals events Walk one session's messages, commands, and results in order transcript Replay a session's raw transcript exactly as it happened delete Delete a session and the subagents it spawned Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor memory session [flags]| Flag | Description |
|---|---|
| --help | help for session |
Delete a session and the subagents it spawned
Removes the session's transcript and everything recorded from it. Deleting a parent also deletes the subagents it spawned. Token and tool counts already tallied stay in the usage reports.
clor memory session delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List one session's messages, commands, and results in order
clor memory session events <ID> [flags]| Flag | Description |
|---|---|
| --help | help for events |
| --limit | maximum results (1-1000) |
| --offset | results to skip for pagination |
| --type | restrict to one event type (user_message|assistant_message|thinking|tool_use|tool_result|system) |
List past agent sessions, most recently active first
clor memory session list [flags]| Flag | Description |
|---|---|
| --agent | restrict to one agent (claude|codex) |
| --help | help for list |
| --hostname | restrict to sessions run on one machine |
| --limit | maximum results (1-1000) |
| --offset | results to skip for pagination |
| --parent-id | restrict to subagent sessions of this parent session id |
| --query | substring match over title, slug, cwd, git branch, and identifier |
| --since | inclusive lower time bound, RFC3339 or a relative age (24h, 7d) |
| --space-id | restrict to one space |
| --subagents | whether subagent sessions appear (include|exclude|only) |
| --until | inclusive upper time bound, RFC3339 or a relative age (24h, 7d) |
Show one session's summary, activity, and token totals
clor memory session show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Print raw transcript lines exactly as the agent wrote them
Replays a session's raw transcript exactly as it happened. text prints the raw lines straight to stdout; json wraps them in {first_line, line_count, lines[]}.
clor memory session transcript <ID> [flags]| Flag | Description |
|---|---|
| --first-line | zero-based first transcript line |
| --help | help for transcript |
| --line-count | lines to return (1-10000) |
Send Slack messages, follow the event stream, post to channels and threads, react, share files, and build bots
Send Slack messages and read the unified event stream from connected workspaces. read and wait surface messages plus joins and leaves, reactions, pins, channel and user events on one resumable cursor filterable by --type, so a bot can follow everything from a single position. Every command acts as your own connected Slack account, so it reads and posts only in the conversations that account belongs to (plus workspace-wide events); anything else returns 403.
clor messenger [flags]| Flag | Description |
|---|---|
| --help | help for messenger |
Send, read the event stream, wait, react, search, and share files in a connected Slack workspace
Send messages and follow the full Slack event stream in a connected workspace, plus react, share files, and search. read and wait expose one resumable cursor over messages, joins and leaves, reactions, pins, channel and user events, filterable by --type, so you can build bot-style automation on Slack. Every command acts as your connected Slack account and reads or posts only in conversations that account belongs to (plus workspace-wide events), so acting anywhere else returns 403. Pass --workspace with a team id from "workspace list"; a CHANNEL is a name such as #general or an id such as C0123ABC.
clor messenger slack [flags]| Flag | Description |
|---|---|
| --help | help for slack |
List the channels and DMs you belong to
List the channels and direct messages your connected account belongs to in a workspace, the conversations you can read and post to. Names resolve to ids for the other commands. The work happens in the list subcommand, which takes the required --workspace team id.
clor messenger slack conversation [flags]| Flag | Description |
|---|---|
| --help | help for conversation |
List the channels and DMs you belong to in a workspace
List the channels and direct messages your connected account is a member of, the conversations you can read and post to. Names resolve to ids for the other commands. Pass --refresh to pull the latest membership from Slack before listing.
clor messenger slack conversation list [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --refresh | refresh the directory from Slack before listing |
| --workspace | slack team id of the workspace (required) |
Share a file to a channel or download a stored file
clor messenger slack file [flags]| Flag | Description |
|---|---|
| --help | help for file |
Download a stored file's bytes
Download the bytes of a file by its FILE_ID, which appears on stored messages that carry attachments. You can only download a file shared into a conversation you can see; otherwise the download returns 403. Write to a path with --output, or stream to stdout when --output is empty or -.
clor messenger slack file get <FILE_ID> [flags]| Flag | Description |
|---|---|
| --help | help for get |
| --output | path to write the file to; - or empty writes to stdout |
| --workspace | slack team id of the workspace (required) |
Share a local file into a channel
Upload the local file at PATH and share it into a channel by id or name. You must be a member of the channel; sharing where you are not returns 403. Set a display title with --title and share into a thread with --thread.
clor messenger slack file send <PATH> [flags]| Flag | Description |
|---|---|
| --channel | channel id or name to share the file into (required) |
| --help | help for send |
| --thread | thread_ts to share the file into |
| --title | title for the shared file |
| --workspace | slack team id of the workspace (required) |
Add or remove an emoji reaction
clor messenger slack reaction [flags]| Flag | Description |
|---|---|
| --help | help for reaction |
Add an emoji reaction to a message
clor messenger slack reaction add [flags]| Flag | Description |
|---|---|
| --channel | channel id or name the message is in (required) |
| --help | help for add |
| --name | emoji name without colons, e.g. thumbsup (required) |
| --ts | message id to react to (required) |
| --workspace | slack team id of the workspace (required) |
Remove an emoji reaction from a message
clor messenger slack reaction remove [flags]| Flag | Description |
|---|---|
| --channel | channel id or name the message is in (required) |
| --help | help for remove |
| --name | emoji name without colons, e.g. thumbsup (required) |
| --ts | message id to react to (required) |
| --workspace | slack team id of the workspace (required) |
Read the stored Slack event stream from a cursor, oldest first
Read the workspace event stream, oldest first, limited to the conversations you belong to plus workspace-wide events. One monotonic cursor covers messages plus joins and leaves, reactions, pins, channel and user events, so a bot can follow everything from a single resumable position. Each read returns next_cursor; pass it back with --since to read only what arrived after, so you never miss or repeat an event. Narrow to event types with --type (repeatable), or with --channel, --dm, --thread, or --mentions, and cap the page with --limit.
clor messenger slack read [flags]| Flag | Description |
|---|---|
| --channel | restrict to a single channel id or name (excludes workspace-wide events) |
| --dm | restrict to direct and group direct messages |
| --help | help for read |
| --limit | maximum events to return (1-500) |
| --mentions | restrict to messages that mention the bot |
| --since | cursor from a prior read; empty reads from the beginning |
| --thread | restrict to replies under this thread_ts |
| --type | restrict to these event types (repeatable), e.g. message, member_joined_channel, reaction_added Default [] |
| --workspace | slack team id of the workspace to read from (required) |
Search messages you can see
Search the workspace's messages, scoped by Slack to exactly what your connected account can see, since the search runs as you. Reach for search to find messages across many conversations at once, and for read to follow one channel or thread in order. Slack query operators such as in:#channel, from:@user, and before:2026-01-01 work in QUERY. Cap results with --count.
clor messenger slack search <QUERY> [flags]| Flag | Description |
|---|---|
| --count | maximum matches to return (1-100) |
| --help | help for search |
| --workspace | slack team id of the workspace (required) |
Send a Slack message to a channel or thread
Post a message to a channel or direct message by id or name. You can only post where your account is a member, so you reply in an existing direct message by its id (D...) but cannot open a direct message with someone you have not messaged; posting elsewhere returns 403. Provide the text as the second argument or pipe it on stdin. Reply within a thread with --thread, attach Block Kit blocks with --blocks, and post as yourself instead of as the bot with --as-user. Bot posts include a Sent by line naming you so the channel knows who triggered the message; pass --attribution=false to suppress it.
clor messenger slack send <CHANNEL> [TEXT] [flags]| Flag | Description |
|---|---|
| --as-user | post as the connected user instead of the workspace bot |
| --attribution | append a small Sent by sender line to bot posts (ignored with --as-user) Default true |
| --blocks | block kit blocks as a JSON array |
| --help | help for send |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --thread | thread_ts of a parent message to reply within |
| --workspace | slack team id of the workspace to send into (required) |
Read a thread's replies
clor messenger slack thread [flags]| Flag | Description |
|---|---|
| --help | help for thread |
Read the replies under a thread
Read every reply under a thread, newest fetched from Slack and returned in order. --thread is the thread_ts of the parent message, and --channel is the channel it lives in. You must be a member of that channel, or the read returns 403.
clor messenger slack thread read [flags]| Flag | Description |
|---|---|
| --channel | channel id or name the thread lives in (required) |
| --help | help for read |
| --thread | thread_ts of the parent message (required) |
| --workspace | slack team id of the workspace (required) |
Block until new Slack events arrive or a timeout elapses
Block for new events after a cursor, returning as soon as any match the filters or --timeout elapses, whichever comes first. The same filters as read narrow what counts, including --type to wait on specific event types like reaction_added or member_joined_channel. On timeout it returns an empty result with an advanced cursor, so loop by passing the returned next_cursor to --since on the next call. Like read, it only ever returns conversations you belong to plus workspace-wide events.
clor messenger slack wait [flags]| Flag | Description |
|---|---|
| --channel | restrict to a single channel id or name (excludes workspace-wide events) |
| --dm | restrict to direct and group direct messages |
| --help | help for wait |
| --limit | maximum events to return (1-500) |
| --mentions | restrict to messages that mention the bot |
| --since | cursor from a prior read; empty reads from the beginning |
| --thread | restrict to replies under this thread_ts |
| --timeout | how long to block waiting for new events (e.g. 30s, 2m) Default 30s |
| --type | restrict to these event types (repeatable), e.g. message, member_joined_channel, reaction_added Default [] |
| --workspace | slack team id of the workspace to read from (required) |
List the workspaces you have connected
clor messenger slack workspace [flags]| Flag | Description |
|---|---|
| --help | help for workspace |
List connected Slack workspaces and their ids
List the Slack workspaces connected to your account. Each entry includes the team id to pass as --workspace to every other command, so this is the place to start. When nothing is connected yet, it prints a connect link to share with the user so they can connect Slack.
clor messenger slack workspace list [flags]| Flag | Description |
|---|---|
| --help | help for list |
List and hide registered daemon hosts
Each daemon host registers itself once as a node and shows up here. list and show report whether its daemon is online (status=online when the node has pinged the server within the last 30 seconds). A reinstall registers a new node and supersedes the old row, so list leaves hidden rows out and reports how many it suppressed; pass --all to see them. Use when - the user asks which machines are registered or which ones are online right now - the user wants to hide a retired or duplicate node row Subcommands list List every node registered under this account (with online status) show Show one node by its id (with online status and last_seen) hide Hide a node Output supports --stdout-format text|jsonl|json on every subcommand (default text, logfmt with event= leader).
clor node [flags]| Flag | Description |
|---|---|
| --help | help for node |
Hide a node
Hiding removes the node and its spaces from listings without deleting anything. The node reappears if its daemon reconnects, with its spaces intact. Useful for a machine that is retired, wiped, or lingering as a duplicate row.
clor node hide <NODE> [flags]| Flag | Description |
|---|---|
| --help | help for hide |
List every node registered under this account
clor node list [flags]| Flag | Description |
|---|---|
| --all | include hidden nodes, the registrations superseded by a reinstall |
| --help | help for list |
Show one node by its id
clor node show <NODE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Read, filter, and mark read notifications from services, spaces, and the system
Notifications are messages delivered to this account by services, spaces, or the system. They accumulate in an inbox and transition from unread to read when viewed.
clor notification [flags]| Flag | Description |
|---|---|
| --help | help for notification |
Create a notification
clor notification create [flags]| Flag | Description |
|---|---|
| --body | notification body (up to 32KB) |
| --help | help for create |
| --level | notification level (info|warn|error) |
| --service-slug | service slug (required when source is service) |
| --source | notification source (service|space) |
| --space-id | space id (required when source is space) |
| --title | notification title |
| --type | notification type (message) Default message |
List notifications (unread by default)
clor notification list [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --level | filter by level (info|warn|error) |
| --limit | max notifications to return (1-200); zero uses the server default cap |
| --show-read | include read notifications |
Show one notification and mark it as read
clor notification show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Host private git repos cloned, fetched, and pushed over HTTPS, with per-member access tokens and shares
Host private git repositories cloned, fetched, and pushed over HTTPS. Each repo is created empty and reachable at a stable clone URL right away. Repos are owned by the Team (with --owner team, usable by every member) or by the calling user, shareable with specific members, and capped at 1 GB, with a reset that clears a repo back to empty. Git authenticates with a short-lived access token issued from your API key. Run setup once per machine and plain git works with no prompts: clor repo create myproj --stdout-format json | jq -r .clone_url clor repo git setup git clone <clone_url> && cd myproj && git push Without the CLI on the machine doing the git calls, create a token with "token create" and clone https://clor:<token>@git.clor.com/... (the token lands in .git/config, so prefer the credential helper). Use when: - hosting a private git repo you can clone and push to over HTTPS - a Team repo every member can clone and push with their own token - copying a repo you can read into one you own with fork - downloading a zip snapshot of a repo without cloning it - sharing a personal repo with specific members, read or write - inspecting which repos the caller can see and how much they store Subcommands: create create a repo and print its clone URL list list the repos the caller can see show show one repo including size and lock state update rename a repo or change its description fork copy a repo you can read into a new repo you own download download a zip snapshot of one ref branch list a repo's branches tag list a repo's tags delete delete a repo reset reinitialize a repo to empty and unlock pushing share grant, list, and revoke member access to a repo token create git access tokens git install the git credential helper limit show the caller's tier and repo limits Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor repo [flags]| Flag | Description |
|---|---|
| --help | help for repo |
List a repo's branches
Branch inspection for hosted repos. Subcommands: list list a repo's branches with the commits they point at
clor repo branch [flags]| Flag | Description |
|---|---|
| --help | help for branch |
List a repo's branches with the commits they point at
clor repo branch list <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --owner | set to "team" to address a Team repo; defaults to your user |
Create a repo and print its clone URL
Creates a repo and prints its clone URL. The name keeps the case you give it, and that case is what the clone URL carries. Names are unique within their owner scope without regard to case, so a name another repo already holds in any spelling is refused.
clor repo create <NAME> [flags]| Flag | Description |
|---|---|
| --default-branch | the branch a fresh clone checks out (default main) |
| --description | free-form description of the repo (up to 512 characters) |
| --help | help for create |
| --owner | set to "team" to create a Team repo every member can use; defaults to your user |
Delete a repo
clor repo delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
| --owner | set to "team" to address a Team repo; defaults to your user |
Download a zip snapshot of one ref without cloning
Downloads a zip archive of a repo's tree at one ref (a branch, tag, or commit), defaulting to the repo's default branch. The archive holds the tree only, no git history; clone the repo when history is needed.
clor repo download <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for download |
| --output | destination file (default <name>-<ref>.zip) |
| --owner | set to "team" to address a Team repo; defaults to your user |
| --ref | the branch, tag, or commit to archive; defaults to the repo's default branch |
Copy a repo you can read into a new repo you own
Copies a repo server-side, carrying every branch and tag, into a new repo the caller owns. Any repo the caller can read is forkable, including repos shared to them. The fork records its parent's id as fork_parent_id and starts with fresh push counters.
clor repo fork <NAME> [flags]| Flag | Description |
|---|---|
| --description | description of the new repo (defaults to the source description) |
| --destination-name | name of the new repo (defaults to the source name) |
| --destination-owner | set to "team" to place the fork as a Team repo; defaults to your user |
| --help | help for fork |
| --owner | owner scope of the source repo, "team" or the owning user's UUID; defaults to your user |
Connect plain git to hosted repos via the credential helper
Git-transport plumbing. Run setup once per machine and plain git clone, push, and pull authenticate transparently: a credential helper issues short-lived access tokens from your API key, caches them, and renews them before expiry. No prompts, no secrets in URLs or .git/config. Subcommands: setup install the git credential helper (once per machine)
clor repo git [flags]| Flag | Description |
|---|---|
| --help | help for git |
Install the git credential helper (once per machine)
Writes one scoped git config entry so git asks the helper for credentials on the hosted-repo host and nothing else: git config --global credential.https://git.clor.com.helper "!clor repo git helper" With a custom --host that host's entry is written. Idempotent; running it again rewrites the same entry.
clor repo git setup [flags]| Flag | Description |
|---|---|
| --help | help for setup |
| --host | git host the helper answers for Default git.clor.com |
Show the caller's tier and repo limits
Show the account's billing tier and the repo limits it grants. Subcommands: show show the tier, the max repos, the storage cap, current usage, and the create rate Output: the subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor repo limit [flags]| Flag | Description |
|---|---|
| --help | help for limit |
Show the tier, repo and storage caps, usage, and create rate
clor repo limit show [flags]| Flag | Description |
|---|---|
| --help | help for show |
List the repos the caller can see
clor repo list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Reinitialize a repo to empty and unlock pushing
clor repo reset <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for reset |
| --owner | set to "team" to address a Team repo; defaults to your user |
Show one repo including size and lock state
clor repo show <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for show |
| --owner | set to "team" to address a Team repo; defaults to your user |
List a repo's tags
Tag inspection for hosted repos. Subcommands: list list a repo's tags with the commits they point at
clor repo tag [flags]| Flag | Description |
|---|---|
| --help | help for tag |
List a repo's tags with the commits they point at
clor repo tag list <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --owner | set to "team" to address a Team repo; defaults to your user |
Create git access tokens
An access token is the credential git presents over HTTPS: it goes in the basic-auth password slot (the username can be anything, use "clor"). Tokens are issued from your API key, carry your identity and repo access, and expire on their own. Prefer "git setup", which creates and renews tokens for you; create one by hand only for machines or CI without the CLI. Subcommands: create create a token and print it once
clor repo token [flags]| Flag | Description |
|---|---|
| --help | help for token |
Create a git access token and print it once
clor repo token create [flags]| Flag | Description |
|---|---|
| --help | help for create |
Rename a repo or change its description
Renames a repo and/or replaces its description. Renaming changes the clone URL immediately. Remotes pointing at the old name stop working and must be updated with git remote set-url.
clor repo update <NAME> [flags]| Flag | Description |
|---|---|
| --description | the new description (up to 512 characters); an empty value clears it |
| --help | help for update |
| --new-name | the new repo name, kept in the case you give it and unique without regard to case; changes the clone URL |
| --owner | set to "team" to address a Team repo; defaults to your user |
Search the web (pages, news, images, videos), then scrape, parse, map, crawl, or screenshot URLs
Search the open web across pages, news, images, and videos; pull a single URL down as markdown, HTML, or links; extract clean text from PDFs and HTML documents; map or crawl an entire site; and capture pixel-accurate screenshots of any page.
clor search [flags]| Flag | Description |
|---|---|
| --help | help for search |
Crawl a site from a seed URL and return per-page content
Fetches every reachable page up to the configured ceilings (max pages, max depth, max duration). Each page returns in the requested formats (markdown, HTML, raw HTML, links). Use map instead when you only need the URL list.
clor search crawl <URL> [flags]| Flag | Description |
|---|---|
| --allow-subdomains | follow subdomain links |
| --crawl-entire-domain | follow non-descendant paths within the same domain |
| --exclude | comma-separated path regexes to skip |
| --formats | comma-separated per-page formats (markdown|html|raw_html|links) |
| --help | help for crawl |
| --include | comma-separated path regexes to include |
| --max-depth | discovery-depth limit relative to the seed URL |
| --max-duration | absolute deadline for the crawl (e.g. 30s, 1h30m); on expiry partial results are returned Default 0s |
| --max-pages | hard ceiling on pages crawled |
| --no-main-content | include all page content per page |
| --only-main-content | drop nav/header/footer per page |
Search the open web for images by query
clor search image [flags]| Flag | Description |
|---|---|
| --help | help for image |
Search the open web for images matching a query (max 200, no pagination)
clor search image search <QUERY> [flags]| Flag | Description |
|---|---|
| --country | 2-letter country code, ISO 3166-1 alpha-2 (us, ar, jp) |
| --fields | fields to render in text/jsonl output (ignored for json); use 'default', 'all', or comma-separated names. available: title*,image_url*,page_url*,source*,thumbnail_url (* = default) |
| --help | help for search |
| --limit | max results (1-200); pagination is handled automatically Default 5 |
| --safesearch | safe-search level (off|moderate|strict) |
Discover URLs reachable from a seed URL on the same site
Returns the discovered URLs (with optional title and description). Lighter than crawl: URL list only, not page contents.
clor search map <URL> [flags]| Flag | Description |
|---|---|
| --help | help for map |
| --ignore-query-parameters | treat URLs that differ only in query string as duplicates |
| --include-subdomains | follow subdomain links |
| --limit | max URLs to return |
| --search | filter discovered URLs by substring |
| --timeout | per-request timeout (e.g. 60s, 2m) Default 0s |
Search recent news articles across mainstream sources
clor search news [flags]| Flag | Description |
|---|---|
| --help | help for news |
Search news articles by query, with freshness and country filters
clor search news search <QUERY> [flags]| Flag | Description |
|---|---|
| --country | 2-letter country code, ISO 3166-1 alpha-2 (us, ar, jp) |
| --fields | fields to render in text/jsonl output (ignored for json); use 'default', 'all', or comma-separated names. available: title*,url*,description*,source*,age*,thumbnail_url (* = default) |
| --freshness | freshness window (pd=past day, pw=past week, pm=past month, py=past year) |
| --help | help for search |
| --limit | max results (1-500); pagination is handled automatically Default 5 |
| --safesearch | safe-search level (off|moderate|strict) |
Extract clean text from a PDF or HTML document URL as markdown
Returns the document as clean markdown plus metadata (page count, upstream status, title). Use scrape instead for one webpage as markdown plus links or a screenshot.
clor search parse <URL> [flags]| Flag | Description |
|---|---|
| --help | help for parse |
| --timeout | per-fetch timeout (e.g. 60s, 5m) Default 0s |
Scrape a single page as markdown, HTML, links, or screenshot
Returns markdown (default), full HTML, raw HTML, link list, or PNG screenshot in any combination. Strips boilerplate (nav/header/footer) by default. Use parse instead for PDFs and document URLs.
clor search scrape <URL> [flags]| Flag | Description |
|---|---|
| --block-ads | block ads during the scrape |
| --formats | comma-separated formats (markdown|html|raw_html|links|screenshot|screenshot_full_page) Default markdown |
| --help | help for scrape |
| --mobile | render with a mobile viewport |
| --no-main-content | include all page content |
| --only-main-content | drop nav/header/footer (the default) |
| --timeout | per-fetch timeout (e.g. 30s) Default 0s |
| --wait-for | extra wait after page load (e.g. 500ms, 2s) Default 0s |
Capture a screenshot of a page and save it locally as PNG
clor search screenshot <URL> [flags]| Flag | Description |
|---|---|
| --full-page | capture the entire scrollable page |
| --help | help for screenshot |
| --image-output-file | destination file path for the PNG; default is a unique safe-named file in the current directory |
| --mobile | render with a mobile viewport |
| --timeout | per-fetch timeout (e.g. 30s) Default 0s |
| --wait-for | extra wait after page load (e.g. 500ms, 2s) Default 0s |
Search the open web for videos, with duration metadata
clor search video [flags]| Flag | Description |
|---|---|
| --help | help for video |
Search the open web for videos by query, with duration metadata
clor search video search <QUERY> [flags]| Flag | Description |
|---|---|
| --country | 2-letter country code, ISO 3166-1 alpha-2 (us, ar, jp) |
| --fields | fields to render in text/jsonl output (ignored for json); use 'default', 'all', or comma-separated names. available: title*,url*,description*,duration*,source*,age*,thumbnail_url (* = default) |
| --freshness | freshness window (pd=past day, pw=past week, pm=past month, py=past year) |
| --help | help for search |
| --limit | max results (1-500); pagination is handled automatically Default 5 |
| --safesearch | safe-search level (off|moderate|strict) |
Search the open web for pages, articles, and documents
clor search web <QUERY> [flags]| Flag | Description |
|---|---|
| --country | 2-letter country code, ISO 3166-1 alpha-2 (us, ar, jp) |
| --fields | fields to render in text/jsonl output (ignored for json); use 'default', 'all', or comma-separated names. available: title*,url*,description*,source*,age* (* = default) |
| --freshness | freshness window (pd=past day, pw=past week, pm=past month, py=past year) |
| --help | help for web |
| --limit | max results (1-200); pagination is handled automatically Default 5 |
| --safesearch | safe-search level (off|moderate|strict) |
Store and retrieve named JSON secrets for the signed-in user
Server-side vault for credentials, API keys, and structured JSON. Values are sealed at rest (AES-GCM, per-row HKDF keys) and stored under a name. Other clor subcommands fetch from this vault at runtime (e.g. `clor email`).
clor secret [flags]| Flag | Description |
|---|---|
| --help | help for secret |
Permanently remove a secret by name
Permanent: no soft-delete or recovery window for secrets.
clor secret delete <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Read the full decrypted JSON value of one named secret
--stdout-format json prints the raw JSON value alone (ideal for piping); text/jsonl include the value alongside metadata. Use list when you only need names without exposing values.
clor secret get <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for get |
List metadata for secrets (names, types) without revealing the values
Values are never returned (use `secret get`). Filter by --type, --name-prefix, or --name-contains.
clor secret list [flags]| Flag | Description |
|---|---|
| --help | help for list |
| --name-contains | filter to secrets whose name contains this substring |
| --name-prefix | filter to secrets whose name starts with this string |
| --type | filter by exact type (e.g. email-account) |
Create or update an encrypted JSON secret under a given name
Value source: --value (literal JSON) or --value-file (path or - for stdin). Re-running with the same name updates in place. --type tags the secret for typed consumers like `clor email account`.
clor secret set <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for set |
| --type | type discriminator the consumer interprets (e.g. email-account, api-token) Default generic |
| --value | secret value as a JSON string (e.g. '{"k":"v"}') |
| --value-file | path to a file containing the JSON value (- for stdin) |
Publish static sites and single-page apps over HTTPS with custom domains, atomic deploys, rollbacks, and private sharing
Publish a directory of static files as a website served over HTTPS. Deploy uploads the whole directory as one archive that atomically replaces the live release; previous releases stay available for rollback up to the site's revision limit. Each site is reachable at a stable URL right away and can also be served at a DNS-verified custom domain with an automatically provisioned certificate. Sites are owned by the account (with --owner team) or by the calling user.
clor site [flags]| Flag | Description |
|---|---|
| --help | help for site |
Update site configuration
clor site config <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --csp | Content-Security-Policy header value |
| --domain | custom domain to also serve the site at, DNS-verified at set time, empty clears it |
| --help | help for config |
| --max-bytes-per-day | per-site daily served-bytes limit (0 uses the service default) |
| --max-hits-per-minute | per-site request rate limit (0 uses the service default) |
| --max-revisions | number of releases to retain (min 1) |
| --not-found | relative path served on a miss |
| --spa | serve the fallback document for unmatched routes |
| --visibility | who can view the site (public|private) |
Claim a subdomain and create a site
clor site create <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for create |
| --owner | set to "team" to create an account-wide site; defaults to your user |
Delete a site and its files
clor site delete <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Deploy a directory as the live release
clor site deploy <SUBDOMAIN> <DIR> [flags]| Flag | Description |
|---|---|
| --help | help for deploy |
List, download, upload, and delete individual files in a site's live release
Read and change one published file at a time against a site's live release. An upload writes the file in place and it is served immediately; a delete drops it. This is the surgical counterpart to deploy, which replaces the whole release. Use when: - appending or updating a single file (a daily entry, one asset) without a full redeploy - downloading one published file to inspect or edit it - listing exactly which files the live release serves - deleting one stale file from the live site A deploy still replaces the entire release, so any files uploaded out-of-band are wiped by the next deploy. Subcommands: list List the files served by the live release download Download one file from the live release upload Upload or replace one file in the live release delete Delete one file from the live release Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor site file [flags]| Flag | Description |
|---|---|
| --help | help for file |
Delete one file from a site's live release
clor site file delete <SUBDOMAIN> <REMOTE_PATH> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Download one file from a site's live release
clor site file download <SUBDOMAIN> <REMOTE_PATH> [LOCAL_PATH] [flags]| Flag | Description |
|---|---|
| --help | help for download |
List the files served by a site's live release
clor site file list <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for list |
Upload or replace one file in a site's live release
clor site file upload <SUBDOMAIN> <LOCAL_PATH> [REMOTE_PATH] [flags]| Flag | Description |
|---|---|
| --help | help for upload |
List the sites the caller can see
clor site list [flags]| Flag | Description |
|---|---|
| --help | help for list |
List the retained releases for a site, oldest first
clor site releases <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for releases |
Roll the live release back to a chosen or the previous release
clor site rollback <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for rollback |
| --release | release id to make live; defaults to the previous release |
Show one site including size, current release, and file count
clor site show <SUBDOMAIN> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Create, list, stop, resume, and delete spaces on your computers
A space is a long-lived instance bound to one of your computers. It can be a coding session, a hosted service, or an unattended agent. The daemon on the computer brings each one up wholly and keeps it converged. This tree creates immutable space snapshots from Environments, lists and inspects them, stops and resumes them, renames them, and deletes them. Use when - the user wants to start a space from a saved Environment - the user asks what spaces are running or wants a space's URLs - the user wants to stop, resume, rename, or delete a space Subcommands list List every space you own (with computer and running status) show Show one space by its id (with its tab URLs) create Create a space from an Environment rename Rename a space stop Stop a space so the daemon suspends it resume Resume a stopped space delete Delete a space Output supports --stdout-format text|jsonl|json on every subcommand (default text, logfmt with event= leader).
clor space [flags]| Flag | Description |
|---|---|
| --help | help for space |
Create an immutable space snapshot from an Environment
clor space create --environment <ID> [flags]| Flag | Description |
|---|---|
| --agent | an unresolved agent choice as TAB=AGENT; repeatable Default [] |
| --agent-config | the agent config reference, or none |
| --agent-credential | the agent credential name, or none |
| --computer | the computer ID when more than one compatible computer is ready |
| --directory | an existing computer directory for an unresolved directory declaration |
| --environment | the saved Environment UUID to snapshot (required) |
| --environment-variable | a prompted Environment Variable as KEY=VALUE; repeatable Default [] |
| --help | help for create |
| --home | use the computer user's home directory for an unresolved location |
| --name | a display name; derived from the prompt or Environment when empty |
| --prompt | an initial prompt, compiled into the space as CLOR_INITIAL_PROMPT |
| --repository | a clone URL for an unresolved repository declaration |
| --repository-connection | the connected GitHub account for the repository, by its connection ID |
| --secret | a replacement vault reference as VARIABLE=SECRET_NAME; repeatable Default [] |
Delete a space
clor space delete <SPACE> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List every space you own
clor space list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Move a space to another of your nodes
clor space move <SPACE> --node <NODE> [flags]| Flag | Description |
|---|---|
| --help | help for move |
| --node | the node to move the space to, by its id (required) |
Rename a space
clor space rename <SPACE> --name <NAME> [flags]| Flag | Description |
|---|---|
| --help | help for rename |
| --name | the new display name (required) |
Resume a stopped space
clor space resume <SPACE> [flags]| Flag | Description |
|---|---|
| --help | help for resume |
Show one space by its id
clor space show <SPACE> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Stop a space so the daemon suspends it
clor space stop <SPACE> [flags]| Flag | Description |
|---|---|
| --help | help for stop |
Email the team for help, bug reports, and feature requests
Support is a single channel, email to support@clor.com. Replies come back to your own inbox; there is no separate ticket queue to track. The email subcommand sends a help request from your configured email account with a short diagnostics block (CLI version, OS, and team) appended. When no email account is configured it prints a ready-to-send message and a mailto link to paste into your own client instead.
clor support [flags]| Flag | Description |
|---|---|
| --help | help for support |
Send a help request to the team with diagnostics attached
clor support email [flags]| Flag | Description |
|---|---|
| --account | secret name to load the sending email account from (omit to auto-pick the only saved account) |
| --credentials-file | read email-account JSON from this path instead of secrets |
| --help | help for email |
| --message | the help text; use --stdin-format text to read from stdin instead |
| --show | print the ready-to-send email instead of sending it |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --subject | subject of the help request |
Render Go html and text templates with variables, partials, Markdown, and a curated function set
Render Go templates into HTML emails, static sites, and plain-text documents. The html engine applies contextual auto-escaping so variables are safe by default; the text engine renders verbatim. Feed variables from a json, toml, or yaml file, from piped stdin JSON, or from inline --set overrides. Render a single template to stdout for email send, or a whole directory to an output directory for site deploy.
clor template [flags]| Flag | Description |
|---|---|
| --help | help for template |
Document the curated template functions for strings, numbers, dates, encoding, HTML, and collections
The render engines share one curated function set. This group documents every function so a template author can discover what is available without reading source. Functions marked html_only exist only in the html engine.
clor template function [flags]| Flag | Description |
|---|---|
| --help | help for function |
List the curated template functions with signatures and summaries
clor template function list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Render HTML templates with contextual auto-escaping, Markdown, and safe-content helpers
Render Go html/template documents with automatic, context-aware escaping so variables are safe by default in element, attribute, URL, CSS, and script positions. Untrusted values are escaped; opt specific values back in with safe_html, safe_url, safe_css, safe_js, and safe_attr. The markdown helper renders GitHub-flavored Markdown to HTML. The same curated helpers cover strings, numbers, dates, encoding, and collections. List them all with "template function list".
clor template html [flags]| Flag | Description |
|---|---|
| --help | help for html |
Render an HTML template or template directory to a document, file, or static site
Single template mode renders --template to stdout (- reads the template from stdin). Directory mode parses --template-dir as one set so layouts and partials resolve through {{template}}; without --output-dir it renders the --name entry to stdout, with --output-dir it renders every page into that directory and copies static assets through. A file is a partial, not a page, when its base name starts with _ or any path segment is partials.
clor template html render [flags]| Flag | Description |
|---|---|
| --data | variables file in json, toml, or yaml (auto-detected by extension) |
| --help | help for render |
| --name | entry template to render in directory mode without --output-dir Default index |
| --output | write single-template output to this file instead of stdout |
| --output-dir | render every page into this directory and copy static assets through |
| --set | set a variable by dotted key (repeatable, e.g. --set user.name=Ada) Default [] |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --template | single template file to render (- for stdin) |
| --template-dir | directory of templates parsed as one set so layouts and partials resolve via {{template}} |
Render plain-text templates for text emails and documents with no HTML escaping
Render Go text/template documents verbatim, with no HTML escaping and no safe-content or markdown helpers. Use this for plain-text email bodies, configuration files, and any output that is not HTML. The curated helpers cover strings, numbers, dates, encoding, and collections. List them all with "template function list".
clor template text [flags]| Flag | Description |
|---|---|
| --help | help for text |
Render a plain-text template or template directory to a document, file, or tree
Single template mode renders --template to stdout (- reads the template from stdin). Directory mode parses --template-dir as one set so shared blocks resolve through {{template}}; without --output-dir it renders the --name entry to stdout, with --output-dir it renders every .txt page into that directory and copies other files through. A file is a partial, not a page, when its base name starts with _ or any path segment is partials.
clor template text render [flags]| Flag | Description |
|---|---|
| --data | variables file in json, toml, or yaml (auto-detected by extension) |
| --help | help for render |
| --name | entry template to render in directory mode without --output-dir Default index |
| --output | write single-template output to this file instead of stdout |
| --output-dir | render every page into this directory and copy static assets through |
| --set | set a variable by dotted key (repeatable, e.g. --set user.name=Ada) Default [] |
| --stdin-file | read input from this file instead of process stdin |
| --stdin-format | shape of piped stdin: text (raw bytes / one item per line) or json (a JSON value); only set when actually piping input (cmd | clor ..., clor ... <file, or --stdin-file); if you have an inline string, pass it as a positional instead |
| --template | single template file to render (- for stdin) |
| --template-dir | directory of templates parsed as one set so layouts and partials resolve via {{template}} |
Run a command as a supervised browser terminal on a machine, reachable at a public URL
Declare a terminal a machine should keep running. The machine's daemon spawns the command inside a persistent browser terminal within seconds, and a tunnel and public link are created with it, so the terminal is immediately reachable at its printed URL. The service is the source of truth: a daemon that lost its local state respawns every declared terminal on its next poll, and deleting a terminal stops the command and kills the URL. Local requests to the terminal's port are rejected without the per-terminal secret only the daemon holds.
clor terminal [flags]| Flag | Description |
|---|---|
| --help | help for terminal |
Declare a command a machine should run as a browser terminal at a public URL
clor terminal create [flags] -- <COMMAND> [ARG]...| Flag | Description |
|---|---|
| --env | environment variable set on the command as KEY=VALUE (repeatable) Default [] |
| --help | help for create |
| --metadata | annotation stored on the terminal as KEY=VALUE (repeatable) Default [] |
| --name | optional human label |
| --working-directory | working directory for the command on this machine |
Delete a terminal, stopping its command and killing its URL
clor terminal delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List the terminals the caller owns
clor terminal list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one terminal with its URL and live connection status
clor terminal show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Expose a local HTTP or WebSocket server on the public internet at a stable subdomain or an ephemeral link, run by the daemon
Register a reverse tunnel from a local HTTP(S) server to the public internet. A tunnel binds this machine's node to a target like 127.0.0.1:3000; the daemon opens one outbound connection to the edge and reverse-proxies inbound requests to the target. WebSocket connections, server-sent events, and other streaming responses pass through end to end, and an h2c target serves gRPC and other native HTTP/2 apps. Reach a tunnel at an optional stable subdomain or at any number of ephemeral links with a fixed expiry; each command prints the full public URL. The tunnel service is the source of truth, so a daemon that lost its local state rebuilds every tunnel on its next poll.
clor tunnel [flags]| Flag | Description |
|---|---|
| --help | help for tunnel |
Register a tunnel from this machine to a local HTTP target, optionally claiming a subdomain
clor tunnel create [flags]| Flag | Description |
|---|---|
| --help | help for create |
| --name | optional human label |
| --subdomain | optional stable public subdomain to claim (e.g. myapp) |
| --target | local address to expose (e.g. 127.0.0.1:3000, https://localhost:8443, or h2c://localhost:50051 for gRPC and native HTTP/2 servers) |
Delete a tunnel, freeing its subdomain and dropping its connection
clor tunnel delete <ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
Create, list, and revoke ephemeral public links for a tunnel
Links are unguessable, revocable public URLs that point at a tunnel for a fixed lifetime (default 24h, maximum 1 year). A tunnel may have many links at once.
clor tunnel link [flags]| Flag | Description |
|---|---|
| --help | help for link |
Create an ephemeral public link for a tunnel
clor tunnel link create <ID> [flags]| Flag | Description |
|---|---|
| --expires | link lifetime as a duration (e.g. 1h, 24h, 720h); maximum 1 year Default 24h0m0s |
| --help | help for create |
Revoke one link so its URL stops resolving immediately
clor tunnel link delete <LINK_ID> [flags]| Flag | Description |
|---|---|
| --help | help for delete |
List a tunnel's links
clor tunnel link list <ID> [flags]| Flag | Description |
|---|---|
| --help | help for list |
List the tunnels the caller owns
clor tunnel list [flags]| Flag | Description |
|---|---|
| --help | help for list |
Show one tunnel with its links and live connection status
clor tunnel show <ID> [flags]| Flag | Description |
|---|---|
| --help | help for show |
Change a tunnel's target or name, or set, change, or clear its subdomain
clor tunnel update <ID> [flags]| Flag | Description |
|---|---|
| --help | help for update |
| --name | new human label |
| --subdomain | new subdomain to claim, or "" to clear the current one |
| --target | new local target address (http, https, or h2c) |
Remove the plugin, service, and skills from every detected agent (leaves the CLI binary)
Removes the clor plugin from every detected AI agent, stops and removes the clor daemon service, and removes any tarball-synced skill directories. The CLI binary itself is left in place; remove it manually with `rm $(which clor)` when desired. Subcommands: cli Print the manual `rm $(which clor)` instruction (no auto-rm) service Stop and remove the clor daemon service unit plugin Remove the clor plugin from supported AI agents skill Remove the clor skill directories from agents Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor uninstall [flags]| Flag | Description |
|---|---|
| --help | help for uninstall |
Print instructions for removing the clor binary (no auto-rm of the running binary)
Records a one-line hint to remove the clor binary manually with `rm $(which clor)`. The CLI does not auto-delete its own running binary; this subcommand exists for completeness in the uninstall tree.
clor uninstall cli [flags]| Flag | Description |
|---|---|
| --help | help for cli |
Remove the plugin from Claude Code and Codex
clor uninstall plugin [flags]| Flag | Description |
|---|---|
| --agent | agent to remove the plugin from (claude|codex|all) Default all |
| --help | help for plugin |
Stop and remove the clor daemon service (systemd unit on Linux, launchd plist on macOS)
clor uninstall service [flags]| Flag | Description |
|---|---|
| --help | help for service |
Remove the skills directory from Claude Code and Codex
clor uninstall skill [flags]| Flag | Description |
|---|---|
| --agent | agent to remove skills from (claude|codex|all) Default all |
| --help | help for skill |
Print the compiled CLI version (mirrors `--version` but supports --stdout-format for parsing)
Equivalent to `--version`, but outputs the standard --stdout-format text|jsonl|json shape so the value can be parsed without special-casing.
clor version [flags]| Flag | Description |
|---|---|
| --help | help for version |
Look up weather forecasts, air quality, astronomy, marine conditions, alerts, and location data
Get current conditions, multi-day forecasts, historical weather since 2010, air-quality readings, sun and moon times, marine forecasts with tides, government-issued weather alerts, and location autocomplete. Subcommands: current Get current conditions at a location forecast Get a multi-day forecast with daily and hourly detail history Get historical weather for a date or date range since 2010 airquality Get current air-quality readings at a location astronomy Get sunrise, sunset, moonrise, moonset, and moon phase marine Get a marine forecast with conditions and tide times alerts Get active government-issued weather alerts search Look up matching cities and regions by name Output: every subcommand supports --stdout-format text|jsonl|json (default text, logfmt with event= leader).
clor weather [flags]| Flag | Description |
|---|---|
| --help | help for weather |
Get current air-quality readings at a location
Returns pollutant concentrations (CO, ozone, NO2, SO2, PM2.5, PM10) plus the US EPA index (1-6, where 1 is good and 6 is hazardous) and the UK DEFRA index (1-10).
clor weather airquality <LOCATION> [flags]| Flag | Description |
|---|---|
| --help | help for airquality |
Get active government-issued weather alerts at a location
clor weather alerts <LOCATION> [flags]| Flag | Description |
|---|---|
| --help | help for alerts |
Get sunrise, sunset, moonrise, moonset, and moon phase for a date
clor weather astronomy <LOCATION> [flags]| Flag | Description |
|---|---|
| --date | date in YYYY-MM-DD format (default today at the location) |
| --help | help for astronomy |
Get current conditions at a location
<LOCATION> accepts a city name, "lat,lon", US zipcode, UK postcode, an IP address, or "id:N" returned by 'clor weather search'.
clor weather current <LOCATION> [flags]| Flag | Description |
|---|---|
| --help | help for current |
| --language | two-letter language code for condition text (e.g. fr, de, es, ja) |
Get a multi-day forecast with daily and hourly detail
clor weather forecast <LOCATION> [flags]| Flag | Description |
|---|---|
| --days | number of forecast days (1-14) Default 3 |
| --help | help for forecast |
| --hour | restrict hourly output to one hour (0-23, 24-hour clock) |
| --language | two-letter language code for condition text (e.g. fr, de, es, ja) |
Get historical weather for a date or date range since 2010-01-01
clor weather history <LOCATION> [flags]| Flag | Description |
|---|---|
| --date | start date in YYYY-MM-DD format (required, on or after 2010-01-01) |
| --end-date | end date in YYYY-MM-DD format (max 30 days after --date) |
| --help | help for history |
| --hour | restrict hourly output to one hour (0-23, 24-hour clock) |
| --language | two-letter language code for condition text |
Get a marine forecast with conditions and tide times
<LOCATION> must be a sea or ocean point (coastal city or "lat,lon" over water). Returns daily summaries, hourly sea-state, and tide events.
clor weather marine <LOCATION> [flags]| Flag | Description |
|---|---|
| --days | number of marine forecast days (1-7) Default 3 |
| --help | help for marine |
Look up matching cities and regions by name
Returns matches with a stable id that can be passed to other subcommands as "id:N" (e.g. clor weather current id:2801268).
clor weather search <QUERY> [flags]| Flag | Description |
|---|---|
| --help | help for search |
clor linear issue comment list
List comments on an issue