Command-line tool for the InHand Device Manager (DM) platform. Supports authentication, multi-environment context switching, device management, and multiple output formats.
# Requires Go 1.25+
make build # Output to bin/devicemanager
make install # Install to $GOPATH/binOn macOS,
CGO_ENABLED=0is required (already set in Makefile) to avoid dyld LC_UUID errors.
CI automatically builds binaries for the following platforms:
linux/amd64,linux/arm64darwin/amd64,darwin/arm64windows/amd64
devicemanager auth login # Login to global region (iot.inhandnetworks.com)
devicemanager auth login --host cn # Login to China region (iot.inhand.com.cn)
devicemanager auth login --host iot.example.com # Custom domain
devicemanager auth login --context prod # Create/update a named contextLogin uses the OAuth 2.0 Authorization Code flow — it opens a browser for authorization. The CLI reuses the platform's SPA OAuth client. A local callback server (default http://localhost:18920/callback) receives the authorization code and exchanges it for a token automatically.
devicemanager auth status
devicemanager device listdevicemanager auth login # Browser-based OAuth login
devicemanager auth status # View current auth status
devicemanager auth logout # Log out
devicemanager auth impersonate --org <oid> # Impersonate org admin
devicemanager auth impersonate --org <oid> --user <uid> # Impersonate specific user
devicemanager auth impersonate --stop # Stop impersonation
devicemanager auth orgs # List your organizations
devicemanager auth switch-org <org-id> # Switch to another organizationContexts are created/updated at login via --context. Other subcommands are for switching, viewing, and deleting:
devicemanager config use-context <name>
devicemanager config current-context
devicemanager config list-contexts
devicemanager config delete-context <name>
devicemanager config set ngrok-server my-ngrok.example.com:4443 # Set custom ngrok server
devicemanager config get ngrok-server # Get current valuedevicemanager api /api/users/this # GET request
devicemanager api /api/devices -q page=0 -q limit=10 # With query params
devicemanager api /api/devices -X POST -f name=test # POST with body fields
echo '{}' | devicemanager api /api/devices -X POST --input - # Read JSON body from stdin
devicemanager api /api/users/this -H "Sudo: user@example.com" # Custom headerdevicemanager device list # List devices (default limit 20)
devicemanager device list --online 1 --model IR615 # Filter by status/model
devicemanager device list --name router-01 --serial-number GL5022 # Filter by name/SN
devicemanager device list --cursor 20 --limit 50 # Pagination: skip 20, take 50
devicemanager device list -o json # JSON output (verbose=100 by default)
devicemanager device get <device-id> # Device details
devicemanager device create --name <name> --serial-number <sn> # Add a device
devicemanager device import devices.xlsx # Batch import devices from Excel
devicemanager device import devices.xlsx --group <group-id> # Import and assign to group
devicemanager device import devices.xlsx --no-overwrite # Import without overwriting existing
devicemanager device models # List supported device models
devicemanager device stats # Device overview (online/total counts)
devicemanager device signal <device-id> --after <ISO> # Signal quality (from start to now)
devicemanager device signal <device-id> --after <ISO> --before <ISO> # Signal quality (time range)
devicemanager device kick <device-id> # Force disconnect
devicemanager device reboot <device-id> --timeout 15000 # Reboot (milliseconds)
# Device traffic
devicemanager device traffic monthly 202604 <device-id> # Monthly traffic
devicemanager device traffic daily 202604 <device-id> # Daily traffic
devicemanager device traffic hourly <device-id> # Hourly traffic (default: last 2 days)
devicemanager device traffic hourly <device-id> --after 2026-04-25 --before 2026-04-27 # Custom range (max 6 days)
devicemanager device traffic top --date 2026-04 --limit 10 # Top 10 devices by traffic
devicemanager device traffic stats --after 2026-05-01 --before 2026-05-10 # Traffic stats per device
# Device count trends
devicemanager device count online --start-time 1714492800 --end-time 1717084800 # Online count (unix timestamp)
devicemanager device count total --start-time 2026-04-01 --end-time 2026-05-01 # Total count (YYYY-MM-DD)
# Device clients
devicemanager device clients list <device-id> # List connected clients
devicemanager device clients batch <device-id>... # Batch query clients
# Remote web management (server auto-detected from API host)
devicemanager device web <device-id> # Start remote web management
devicemanager device web <device-id> --port 443 --proto https # Custom port/protocol
devicemanager device web <device-id> --server my-ngrok:4443 # Override server
# Device update & delete
devicemanager device update <device-id> --name "new-name" # Rename device
devicemanager device update <device-id> --description "office" # Update description
devicemanager device update <device-id> --mobile-number "1234567" # Update mobile number
devicemanager device delete <device-id> # Delete a device
# Device alerts
devicemanager device alert # List alerts
devicemanager device alert --device-name router --state unconfirmed # Filter by condition
devicemanager device alert-ack <alert-id> # Acknowledge an alert
# Alert rules
devicemanager device alert-rule list # List alert rules
devicemanager device alert-rule list --device-name router # Filter by device
devicemanager device alert-rule get <rule-id> # Rule details
devicemanager device alert-rule create \
--name "offline-alert" \
--alert-type offline # Create an alert rule
devicemanager device alert-rule create \
--name "traffic-alert" \
--alert-type daily_traffic_excess \
--for-device-type DEVICE \
--for-device-value id1,id2 \
--notify-users uid1,uid2 \
--notify-types email,webhook \
--webhook-url https://example.com/hook # Create with notifications
devicemanager device alert-rule update <rule-id> --name "new-name" # Update rule
devicemanager device alert-rule enable <rule-id> # Enable rule
devicemanager device alert-rule disable <rule-id> # Disable rule
devicemanager device alert-rule delete <rule-id> # Delete rule
# Online statistics (per device, with pagination)
devicemanager device online-stats \
--start-time 2026-05-01 \
--end-time 2026-05-09 # All devices
devicemanager device online-stats \
--start-time 2026-05-01 \
--end-time 2026-05-09 --name router --online 1 # Filter by name + online
# Device event logs (for troubleshooting)
devicemanager device online-events <device-id> \
--start-time 2026-04-29 --end-time 2026-04-30 # Online/offline event timeline
devicemanager device register-events <serial-number> # Registration event history
# Device configuration
devicemanager device config get <device-id> # Get running config
devicemanager device config set <device-id> --content "..." # Push configuration
devicemanager device config export <device-id> # Export to current directory
devicemanager device config export <device-id> --file ./config.dat # Export to specific pathdevicemanager devicegroup list # List groups
devicemanager devicegroup list --parent <parent-id> # Filter by parent group
devicemanager devicegroup get <group-id> # Group details
devicemanager devicegroup create --name "Factory A" # Create a group
devicemanager devicegroup create --name "Line 1" --parent <id> # Create a subgroup
devicemanager devicegroup update <group-id> --name "New Name" # Rename a group
devicemanager devicegroup delete <group-id> # Delete a group
# Devices within a group
devicemanager devicegroup devices <group-id> list # List devices in group
devicemanager devicegroup devices <group-id> list --recursive # Include subgroup devices
devicemanager devicegroup devices <group-id> add <device-id>... # Add devices to group
devicemanager devicegroup devices <group-id> remove <device-id>... # Remove devices from group
devicemanager devicegroup devices <group-id> available # Devices available to adddevicemanager tunnel list # List tunnels
devicemanager tunnel list --device-id <id> # Filter by device
devicemanager tunnel create \
--name ssh-tunnel \
--device-id <id> \
--proto tcp \
--local-address 127.0.0.1 \
--local-port 22 # Create a tunnel
devicemanager tunnel update <tunnel-id> --name "new-name" # Update tunnel
devicemanager tunnel delete <tunnel-id> # Delete tunnel
devicemanager tunnel connect <tunnel-id> # Connect tunnel
devicemanager tunnel disconnect <tunnel-id> # Disconnect tunneldevicemanager drc list # List templates
devicemanager drc list --model IR615 # Filter by device model
devicemanager drc get <template-id> # Template details
devicemanager drc create \
--name "IR615-default" \
--model IR615 \
--content "..." # Create a template
devicemanager drc delete <template-id> # Delete a template
# Template device management
devicemanager drc devices <template-id> list # List assigned devices
devicemanager drc devices <template-id> list --status running # Filter by status
devicemanager drc devices <template-id> add <device-id>... # Assign devices
devicemanager drc devices <template-id> add --group <group-id> # Assign by device group
devicemanager drc devices <template-id> remove <device-id> # Remove a device
devicemanager drc devices <template-id> restart <device-id> # Restart device taskdevicemanager edge agent list # List engines
devicemanager edge agent list --version v1.0 # Filter by version
devicemanager edge agent get <agent-id> # Engine details
devicemanager edge agent upload <file-path> --description "IR615 engine" # Upload engine
devicemanager edge agent update <agent-id> --description "new desc" # Update engine
devicemanager edge agent delete <agent-id> # Delete engine
devicemanager edge agent devices <agent-id> # List deployed devices (default: PENDING)
devicemanager edge agent devices <agent-id> --status READY # Filter by status (PENDING/INSTALLING/DOWNLOADING/READY/FAILED)
devicemanager edge agent devices <agent-id> --limit 10 # Pagination support
devicemanager edge agent deploy <agent-id> <device-id>... # Deploy agent to devices
devicemanager edge agent deploy <agent-id> --group <group-id> # Deploy agent to device group
devicemanager edge agent undeploy <agent-id> <device-id>... # Remove agent from devicesdevicemanager edge app list # List applications
devicemanager edge app get <app-id> # Application details
devicemanager edge app create --name "my-app" --description "..." # Create application
devicemanager edge app update <app-id> --description "new desc" # Update application
devicemanager edge app delete <app-id> # Delete application
devicemanager edge app logs <device-id> <app-name> # View app runtime logs on device
devicemanager edge app deploy <app-id> --version <ver> <device-id>... # Deploy app to devices
devicemanager edge app deploy <app-id> --version <ver> --group <id> # Deploy app to group
devicemanager edge app undeploy <app-id> <device-id>... # Cancel app deployment from devices
devicemanager edge app devices <app-id> # List deployed devices (default: PENDING)
devicemanager edge app devices <app-id> --status READY # Filter by statusdevicemanager edge version list <app-id> # List versions
devicemanager edge version upload <file-path> --app <app-id> # Upload version
devicemanager edge version update <app-id> <version> --notes "Release notes" # Update notes
devicemanager edge version delete <app-id> <version> # Delete version
devicemanager edge version deploy <app-id> <version> --device <id> --group <id> # Deploy versiondevicemanager edge config list <app-id> # List configs
devicemanager edge config list <app-id> --version v1.0 # Filter by version
devicemanager edge config get <app-id> <config-id> # Config details
devicemanager edge config create <app-id> --version v1.0 --content "..." # Create config
devicemanager edge config update <app-id> <config-id> --description "..." # Update config
devicemanager edge config delete <app-id> <config-id> # Delete config
devicemanager edge config deploy <app-id> <version> --device <id> --group <id> # Deploy config
devicemanager edge config undeploy <app-id> <device-id>... # Cancel config deployment from devices
devicemanager edge config devices <app-id> # List deployed config devices (default: PENDING)
devicemanager edge config devices <app-id> --status READY # Filter by statusdevicemanager edge control start <device-id> <app-id> # Start application
devicemanager edge control stop <device-id> <app-id> # Stop application
devicemanager edge control restart <device-id> <app-id> # Restart application
devicemanager edge control remove <device-id> <app-id> # Uninstall applicationdevicemanager edge device <device-id> # Get edge status (agent & apps) of a devicedevicemanager task list # List all tasks
devicemanager task list --status running # Filter by status (running/waiting/failed/completed)
devicemanager task list --type config-apply # Filter by type (config-apply/interactive-command/fetch-config/import-firmware/vpn-channel/vpn-link-order/token-cleanup/traffic-stats/idle-notice/remote-web)
devicemanager task list --object-id <device-id> # Filter by device ID
devicemanager task cancel <task-id> # Cancel a task
devicemanager task restart <task-id> # Restart a taskdevicemanager system user list # List users in organization
devicemanager system user list --oid <org-id> # List users in a specific organization
devicemanager system user get <user-id> # User details
devicemanager system user create \
--name "test" \
--email "test@example.com" # Create a user (invitation email sent)
devicemanager system user create \
--email "ext@example.com" --external # Create an external user
devicemanager system user update <user-id> --name "new-name" # Update user
devicemanager system user update <user-id> --role-id <role-id> # Change role
devicemanager system user delete <user-id> # Delete userdevicemanager system role list # List roles in organizationdevicemanager system permission list # List permission groups
devicemanager system permission get <group-id> # Group details
devicemanager system permission create --name "office-devices" # Create permission group
devicemanager system permission update <group-id> --name "new" # Update group name
devicemanager system permission update <group-id> --description "desc" # Update description
devicemanager system permission delete <group-id> # Delete group
devicemanager system permission users list <group-id> # List users in group
devicemanager system permission users add <group-id> <uid>... # Add users to group
devicemanager system permission users remove <group-id> <uid>... # Remove users from group
devicemanager system permission devices list <group-id> # List devices in group
devicemanager system permission devices add <group-id> <did>... # Add devices to group
devicemanager system permission devices remove <group-id> <did>... # Remove devices from group
devicemanager system permission devicegroups list <group-id> # List device groups in group
devicemanager system permission devicegroups add <group-id> <dgid>... # Add device groups
devicemanager system permission devicegroups remove <group-id> <dgid>... # Remove device groups
devicemanager system permission unassigned-users # List users without a permission groupdevicemanager system org list # List organizations
devicemanager system org list --name "InHand" # Filter by name
devicemanager system org list --email "info@example.com" # Filter by email
devicemanager system org get # View current org info
devicemanager system org update <org-id> --name "New Org Name" # Update org name
devicemanager system org update <org-id> --email "org@example.com" # Update org email
devicemanager system org update <org-id> --country US # Update country (ISO 3166-1 alpha-2)devicemanager system log list # List audit logs (defaults to last 7 days)
devicemanager system log list --start-time 2026-04-24 --end-time 2026-04-30 # Filter by date
devicemanager system log list --level warning # Filter by leveldevicemanager firmware list # List firmware
devicemanager firmware list --model IR615 # Filter by model
devicemanager firmware get <firmware-id> # Firmware details
devicemanager firmware upload <file-path> # Upload firmware file
devicemanager firmware create \
--fid <file-id> \
--name "IR615-v2.0" \
--version 2.0.0 \
--model IR615 # Create firmware record
devicemanager firmware delete <firmware-id> # Delete a firmware
devicemanager firmware upgrade <device-id> --firmware-id <id> # Upgrade a single device (timeout default 600s)
# Batch upgrade management
devicemanager firmware devices <firmware-id> list # List devices in upgrade task
devicemanager firmware devices <firmware-id> add <device-id>... # Add devices for batch upgrade
devicemanager firmware devices <firmware-id> add --group <group-id> # Upgrade by device group
devicemanager firmware devices <firmware-id> remove <device-id> # Remove device from upgrade
devicemanager firmware job-stats <firmware-id> # Upgrade job statistics
devicemanager firmware cancel <firmware-id> <device-id> # Cancel upgrade for a device
devicemanager firmware retry <firmware-id> <device-id> # Retry failed upgrade for a devicedevicemanager docs list # List all available device models
devicemanager docs list --model ER805 # List documents for a specific model
devicemanager docs get <path> # Get a document by path
devicemanager docs get --model ER805 <path> # Get a document under a specific model
devicemanager docs search <keyword> # Search documents across all models
devicemanager docs search --model ER805 <keyword> # Search within a specific modelDocuments are fetched from the inhandnet/model-reference GitHub repository. Override the source with DEVICEMANAGER_DOCS_REPO.
devicemanager device list --debug # Print config/auth/HTTP debug info to stderr
DEVICEMANAGER_DEBUG=1 devicemanager device list # Enable via environment variable
devicemanager device list --debug -o json 2>/tmp/debug.log # Write debug to file, keep stdout cleandevicemanager --context prod auth status # Temporarily switch context
devicemanager --debug device list # Enable debug output
devicemanager --verbose 50 device list # Reduce response detail level
devicemanager --jq '.[].name' device list # Filter JSON with jq expression
devicemanager version # Show version infoUse -o to specify the output format. Default is table in a terminal and json when piped.
| Format | TTY behavior | Pipe behavior |
|---|---|---|
table |
Aligned table | TSV |
json |
Colorized pretty JSON | Compact JSON |
yaml |
YAML | YAML |
devicemanager device list -o table # Table output
devicemanager device list -o yaml # YAML output
devicemanager device list --jq '.[] | .name' # Filter with jq expressionThe {"result": ...} envelope from the server is automatically unwrapped in yaml/json/jq modes — only the contents of result are shown.
The DM API uses a verbose parameter to control how many fields are returned (1-100, higher = more detailed). The CLI provides a global --verbose flag (default 100) that is automatically applied to all GET (query) requests. POST/PUT/DELETE requests are not affected.
devicemanager device list # verbose=100 by default (all fields)
devicemanager --verbose 15 device list # Minimal fieldsdevicemanager device list --cursor 0 --limit 20 # First page (default)
devicemanager device list --cursor 20 --limit 50 # Skip 20, take 50The DM platform uses cursor (skip offset) + limit pagination. The list commands also accept --page-size/--per-page as hidden aliases for --limit.
| Variable | Purpose |
|---|---|
DEVICEMANAGER_CONTEXT |
Override the current context |
DEVICEMANAGER_HOST |
Override the host in the current context |
DEVICEMANAGER_TOKEN |
Override the token in the current context |
DEVICEMANAGER_DEBUG |
Set to any non-empty value to enable debug output |
Path: ~/.config/devicemanager/config.yaml (permissions 0600)
The configuration file stores all context information (host, token, etc.) and is managed via the devicemanager config subcommands.
- Go 1.25+
- golangci-lint
make build # Build to bin/devicemanager
make build-all # Cross-platform build
make install # Install to GOPATH
make test # Run tests
make fmt # Format code (gofmt + goimports)
make lint # Run golangci-lint
make clean # Clean build artifactscmd/devicemanager/ # CLI entry point
internal/
api/ # OAuth, token transport & auto-refresh, REST client, callback server
build/ # Injected Version/Commit/Date
cmd/ # Subcommand implementations
auth/ # Login, logout, auth status, impersonate, switch-org, orgs
config/ # Context management
device/ # Device management
devicegroup/ # Device group management
tunnel/ # Remote tunnel management
drc/ # DRC configuration template management
edge/ # Edge computing (engine/app/version/config/control)
firmware/ # Firmware management & upgrades
task/ # Task management (unified DRC/firmware task view)
docs/ # Device model reference documentation (from GitHub)
system/ # System management (users, roles, permissions, org, audit logs)
version/ # Version info
cmdutil/ # Shared list flags (cursor/limit), query builder
config/ # Config file I/O, context model
debug/ # Debug output (--debug / DEVICEMANAGER_DEBUG)
factory/ # Dependency injection factory
iostreams/ # Terminal output, formatters (JSON/Table/YAML/jq)