Skip to main content

plane-cli

Use Plane.so without leaving the command line. Works great with AI agents.

plane projects list                         # list all projects in your workspace
plane issues list --pretty                  # view issues as a rich table
plane issues create --title "Fix login bug" # create an issue
plane issues list --all                     # fetch every page of issues
plane issues comment add <id> --body -      # pipe a comment body from stdin

Installation

pip install plane-cli

Or with uv:

uv tool install plane-cli

Configuration

Run the interactive setup wizard on first use:

plane config init

Config is stored in ~/.config/plane-cli/config.toml:

[core]
api_key        = "plane_api_xxxxxxxx"
workspace_slug = "my-workspace"
base_url       = "https://api.plane.so"   # optional

[defaults]
project  = "uuid-of-default-project"      # optional
per_page = 20

Environment variables

All config values can be overridden with environment variables — useful for CI or agent use:

Environment variable Config key
PLANE_API_KEY core.api_key
PLANE_WORKSPACE_SLUG core.workspace_slug
PLANE_BASE_URL core.base_url
PLANE_PROJECT defaults.project

CLI flags (--api-key, --workspace, --base-url, --project) override both.

Get an API key

Go to Plane → Settings → API Tokens and create a token.

Commands

config

plane config init            # interactive setup wizard
plane config show            # print resolved config (api_key masked)
plane config show --reveal   # print full api_key
plane config set <key> <val> # set a single value, e.g. defaults.project <uuid>

projects

plane projects list
plane projects get <project-id>
plane projects create --name NAME [--identifier ID] [--description TEXT] [--network public|secret]
plane projects update <project-id> [--name] [--description] [--network]
plane projects delete <project-id> [--yes]

issues

plane issues list   [--project] [--state] [--priority] [--label] [--assignee]
                    [--page N] [--per-page N] [--all]
plane issues get    <issue-id>  [--project]
plane issues create --title TITLE [--project] [--description TEXT|-] [--state]
                    [--priority urgent|high|medium|low|none]
                    [--label ID]... [--assignee ID]... [--due-date YYYY-MM-DD]
plane issues update <issue-id>  [--project] [--title] [--description TEXT|-]
                    [--state] [--priority] [--label ID]... [--due-date]
plane issues delete <issue-id>  [--project] [--yes]

plane issues comment list <issue-id> [--project]
plane issues comment add  <issue-id> [--project] --body TEXT|-

states

plane states list   [--project]
plane states get    <state-id>  [--project]
plane states create --name NAME --color HEX [--project]
                    [--group backlog|unstarted|started|completed|cancelled]
plane states update <state-id>  [--project] [--name] [--color] [--group]
plane states delete <state-id>  [--project] [--yes]

labels

plane labels list   [--project]
plane labels get    <label-id>  [--project]
plane labels create --name NAME [--project] [--color HEX]
plane labels update <label-id>  [--project] [--name] [--color]
plane labels delete <label-id>  [--project] [--yes]

pages

plane pages list    [--project]
plane pages get     <page-id>   [--project]
plane pages create  --name NAME [--project] [--description TEXT|-]
plane pages update  <page-id>   [--project] [--name] [--description TEXT|-]
plane pages delete  <page-id>   [--project] [--yes]
plane pages delete  <page-id>   [--project] --archive [--yes]

Output

By default all commands print JSON to stdout, making them easy to pipe into jq or feed to an LLM:

plane issues list | jq '.[].name'
plane projects list | jq '.[] | {id, name: .identifier}'

Pass --pretty for Rich-rendered tables with color-coded priorities, state groups, and due-date highlighting:

plane issues list --pretty
plane states list --pretty

Reading from stdin

Any --description or --body option accepts - to read from stdin:

plane issues create --title "Refactor auth" --description - <<'EOF'
Replace the JWT library with a simpler custom implementation.
Motivation: reduce bundle size and eliminate the CVE.
EOF

git diff HEAD~1 | plane issues comment add <id> --project <pid> --body -

Pagination

plane issues list                # first page (default 20 per page)
plane issues list --per-page 50  # custom page size
plane issues list --page 3       # jump to a specific page
plane issues list --all          # fetch all pages, capped at 1000

Agent use

Because output is plain JSON and the CLI is fully non-interactive by default (no prompts, no spinners on stdout), it works cleanly as a tool for LLM agents:

# safe to run in any non-TTY context
PLANE_API_KEY=... PLANE_WORKSPACE_SLUG=... plane issues list
# destructive commands require explicit --yes in non-TTY
plane issues delete <id> --yes

Errors are always JSON on stderr with a consistent shape:

{ "error": { "type": "not_found", "message": "...", "status_code": 404 } }

Exit codes: 0 success · 1 error · 2 rate-limited (retry safe)

License

MIT — see LICENSE.

Metadata

Release files for plane-cli 0.2.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for plane-cli 0.2.4
File Size Uploaded
plane_cli-0.2.4.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for plane-cli 0.2.4
File Interpreter ABI Platform
plane_cli-0.2.4-py3-none-any.whl Python 3 none any Details

Total release size: 37.2 kB

Release files / plane_cli-0.2.4.tar.gz

Download URL plane_cli-0.2.4.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
caad5077aa827d9dbcb87fa24f5fac76db92b4f5214a3fa5453854d04af819fd
BLAKE2b-256 checksum
How to use checksums
a956b6c6402cf28b0536a1999572eb637fec0464436fa697a3d9c319a74c2d5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / plane_cli-0.2.4-py3-none-any.whl

Download URL plane_cli-0.2.4-py3-none-any.whl
Size 22.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
93b2bc7c2df15730ae07ed922841da52f59b9fd497a643963433e0e7d3385bff
BLAKE2b-256 checksum
How to use checksums
229d32c496dec86b35b8c6eee195e740d1bd092a6344f4808b440e65fce9c8f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.2.4 This release

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page