Skip to main content

espercli

A command-line tool for the Esper API — manage devices, applications, groups, pipelines, and more from your terminal.

Built with Typer and Rich for a modern CLI experience: colour-coded output, tab-completion, inline help on errors, and auto-pagination.

Also ships a Claude Code skill (/esper) so you can manage your fleet in plain English directly from your AI coding session — no syntax required.


Requirements


Installation

Recommended — pipx (isolated, no venv management needed):

pipx install git+https://github.com/avidan/esper-cli.git

From source:

git clone https://github.com/avidan/esper-cli.git
cd esper-cli
pipx install -e .

Plain pip (inside a virtualenv):

pip install git+https://github.com/avidan/esper-cli.git

Quick start

# 1. Configure credentials (run once)
espercli configure

# 2. Check your active context at any time
espercli context

# 3. List your devices
espercli device list

# 4. Set a device as active for subsequent commands
espercli device show <name> --active

# 5. Explore any command with --help
espercli device --help
espercli device list --help

Tab completion

Install once and restart your terminal:

espercli completion zsh        # zsh
espercli completion bash       # bash
espercli completion fish       # fish
espercli completion powershell # PowerShell

After installing, pressing <Tab> completes:

  • Sub-commands — espercli dev<TAB> → device
  • Enum values — espercli device list --state <TAB> → active, inactive, disabled, …
  • Device names — espercli device show <TAB> → live names from your enterprise
  • Group names — espercli group-command reboot --group <TAB>
  • Application IDs — espercli version list --app <TAB> (shows app name as hint)
  • Command names, schedule types, days, and more

Commands

configure

Set credentials (environment name and API key). Run this first.

espercli configure

device

espercli device list                          # list all devices (paginated)
espercli device list --state active           # filter by state
espercli device list --group "Warehouse"      # filter by group
espercli device list --all                    # fetch every device (auto-paginate)

espercli device show <name>                   # show device details
espercli device show <name> --active          # show + set as active device

espercli device set-active --name <name>      # set active device
espercli device unset-active                  # clear active device

espercli device report <name>                 # HTML dashboard (opens in browser)
espercli device report <name> --output ./report.html   # write to specific path
espercli device report <name> --no-open       # write file without opening browser

device-command

Fire commands at a single device (uses the active device if --device is omitted).

espercli device-command ping
espercli device-command lock    --device <name>
espercli device-command reboot  --device <name>
espercli device-command wipe    --device <name>          # requires confirmation
espercli device-command install --device <name> --version <version-id>
espercli device-command uninstall --device <name> --version <version-id>
espercli device-command clear-app-data --device <name> --package-name com.example.app
espercli device-command show <command-id>

group

espercli group list
espercli group list --all                     # auto-paginate
espercli group show <name>
espercli group show <name> --active           # set as active group
espercli group create <name>
espercli group update <name> --name <new-name>
espercli group delete <name>                  # requires confirmation
espercli group devices                        # list devices in active group
espercli group add --group <name> --device <device-name>
espercli group remove --group <name> --device <device-name>
espercli group move --group <name> --parent <parent-name>

group-command

Fire commands at every device in a group.

espercli group-command ping    --group <name>
espercli group-command lock    --group <name>
espercli group-command reboot  --group <name>
espercli group-command install --group <name> --version <version-id>
espercli group-command show <command-id>

app

espercli app list
espercli app list --name "MyApp"
espercli app list --all                       # auto-paginate
espercli app show <app-id>
espercli app show <app-id> --active           # set as active application
espercli app upload <path/to/app.apk>
espercli app download <version-id> --dest ./app.apk
espercli app delete <app-id>                  # requires confirmation
espercli app set-active --id <app-id>
espercli app unset-active

version

Manage versions of the active (or specified) application.

espercli version list
espercli version list --app <app-id>
espercli version list --legacy-format false   # show version_name instead of build_number
espercli version show <version-id>
espercli version delete <version-id>          # requires confirmation
espercli version devices <version-id>         # list devices with this version installed

installs

espercli installs list                        # installs for active device
espercli installs list --device <name>
espercli installs show <install-id>

status

espercli status show                          # status for active device
espercli status show --device <name>
espercli status list

commandsV2

Multi-device / group command requests (V2 API).

# List recent requests
espercli commandsV2 list
espercli commandsV2 list --command reboot --command-type device

# Fire a command
espercli commandsV2 command \
  --command-type device \
  --devices "device-name-1 device-name-2" \
  --command reboot

# Check status / history
espercli commandsV2 status --request <request-id>
espercli commandsV2 history --device <name>

pipeline

espercli pipeline list
espercli pipeline show <pipeline-id>
espercli pipeline create --name "Nightly Deploy" --no-of-stages 3
espercli pipeline edit <pipeline-id> --name "New Name"
espercli pipeline delete <pipeline-id>

# Stages
espercli pipeline stage list --pipeline <id>
espercli pipeline stage create --pipeline <id> --name "Stage 1"

# Operations
espercli pipeline stage operation create --stage <id> --action APP_INSTALL

# Execution
espercli pipeline execute start   --pipeline <id>
espercli pipeline execute stop    --pipeline <id>
espercli pipeline execute show    --pipeline <id>

content

espercli content list
espercli content show <content-id>
espercli content upload <path/to/file>
espercli content modify <content-id> --tags "tag1 tag2" --description "..."
espercli content delete <content-id>       # requires confirmation

token

espercli token show
espercli token renew

enterprise

espercli enterprise show
espercli enterprise set-active

telemetry

espercli telemetry get-data \
  --device <name> \
  --metric battery-level \
  --last 24 \
  --period hour \
  --statistic avg

secureadb

espercli secureadb connect --device <name>

Utility commands

espercli context          # show active environment, enterprise, device, app, group
espercli about            # show CLI version
espercli completion zsh   # install tab-completion

Global flags

Flag Short Description
--verbose -v Enable debug logging
--no-color Disable colour output (useful for piping / CI)

Output formats

Every listing and detail command supports --json / -j for machine-readable output:

espercli device list --json | jq '.[].id'
espercli app show <id> --json

Error messages

Mistyped a command? The CLI shows the relevant help page inline — no need to re-run with --help:

$ espercli device lst

╭─ Error ────────────────────────────────────╮
│ ✗  No such command 'lst'. Did you mean 'list'?  │
╰────────────────────────────────────────────╯

 Usage: espercli device [OPTIONS] COMMAND [ARGS]...

╭─ Commands ─────────────────────────╮
│ list         List devices          │
│ show         Show device details   │
│ set-active   Set active device     │
│ unset-active Clear active device   │
╰────────────────────────────────────╯

Claude Code skill (/esper)

The repo includes a Claude Code slash command that gives you a natural-language interface to your Esper fleet. Instead of remembering CLI syntax, just describe what you want.

Setup

Option A — project skill (automatic when you clone):

The skill is already at .claude/commands/esper.md in this repo. Open the project in Claude Code and /esper is available immediately — no install step.

Option B — user skill (available in every project):

Copy the skill to your global commands directory so it works outside this repo too:

mkdir -p ~/.claude/commands
cp .claude/commands/esper.md ~/.claude/commands/esper.md

Usage

Type /esper in Claude Code followed by what you want in plain English:

/esper show me all inactive devices
/esper reboot the warehouse group
/esper what apps are installed on ezra pixel
/esper upload build/app-release.apk and set it as the active app
/esper show battery telemetry for ezra pixel over the last 24 hours
/esper which devices have version abc-123 installed

Or just /esper with no argument — it checks your active context and waits for direction.

What it does

  • Runs espercli context first so it knows your active environment, device, and group
  • Translates natural language into the right espercli commands and runs them
  • Presents results as a clean summary, not raw CLI output
  • Asks for confirmation before any destructive action (wipe, delete) regardless of how you phrase the request
  • Asks a clarifying question if the target is ambiguous rather than guessing

License

Apache 2.0 — see LICENSE.

Metadata

Release files for espercli 0.0.17

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

Source distribution (sdist)

Source distribution for espercli 0.0.17
File Size Uploaded
espercli-0.0.17.tar.gz 106.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for espercli 0.0.17
File Interpreter ABI Platform
espercli-0.0.17-py3-none-any.whl Python 3 none any Details

Total release size: 252.3 kB

Release files / espercli-0.0.17.tar.gz

Download URL espercli-0.0.17.tar.gz
Size 106.9 kB
Tags Source
SHA-256 checksum
How to use checksums
748820f1287441c9cb7666c6e3cbf98977428be6e7dbbb6cbf4fbd1541a38cfe
BLAKE2b-256 checksum
How to use checksums
5a6fce6b6be7856dd34802c270896f99c19cf95e3e439ce7fe7d7cb963b19f3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.9.18

Release files / espercli-0.0.17-py3-none-any.whl

Download URL espercli-0.0.17-py3-none-any.whl
Size 145.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
765bc85fbd02d6a888986882f2bbf0213c45cf7cbc5368bc4b225f1f71e26df9
BLAKE2b-256 checksum
How to use checksums
c05858fbe1fd84d6fbb3c2493beac2f4db6516b3dd3b1b69bd231f6a4bbd4d60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.9.18
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