A command-line tool for managing eero WiFi mesh routers. Built on the unofficial eero API, eeroctl gives you full control over your network from the terminal: view connected devices, manage profiles, configure port forwards, run speed tests, and more.
This project consists of two crates:
- eeroctl — The CLI application (AGPL-3.0)
- eero-api — A standalone async Rust client library for the eero API (MIT) — see eero-api/README.md
See all the devices on your network at a glance:
$ eeroctl device list
ID NAME
04421a06d967 islay-49
ae94f29cf6d1 speyside
b0416f0b2f70 town-os
666ce339fe60 66:6c:e3:39:fe:60
72dcf28ae564 Watch
Set up port forwarding with a single command:
$ eeroctl forward create --help
Create a port forward
Usage: eeroctl forward create [OPTIONS] --ip-address <IP_ADDRESS> --port <PORT> [NETWORK]
Arguments:
[NETWORK] Network name (SSID) or `id:XXXXX`. Defaults to first network
Options:
--ip-address <IP_ADDRESS> Internal IP address
--port <PORT> Internal port
--external-port <EXTERNAL_PORT> External port (defaults to same as internal)
--protocol <PROTOCOL> Protocol (tcp, udp, or tcp_udp)
-h, --help Print help
eeroctl is developed and tested against an eero 6 router. The eero API is undocumented and not officially supported by eero, so behavior may vary across hardware generations and firmware versions.
If you have a different eero model and would like to help verify compatibility:
- Install eeroctl and authenticate (see below)
- Run through the basic commands (
account get,network get,eero list,device list) - Report any issues or unexpected output at github.com/erikh/eeroctl/issues
The test suite includes unit tests, integration tests with a mock API server, and optional live tests that run against a real eero device. See Running Tests for details.
Requires Rust 1.70+.
# From source
cargo install --path eeroctl
# Or build without installing
cargo build --release -p eeroctleero uses a two-step verification flow. You authenticate once and the session token is stored locally in ~/.config/eero/.
# Step 1: Request a verification code (sent via SMS or email)
eeroctl auth login you@example.com
# Step 2: Enter the code you received
eeroctl auth verify 123456After verification you're authenticated and can run any command.
To skip the interactive flow, set the EERO_SESSION_TOKEN environment variable or pass --user-token:
export EERO_SESSION_TOKEN="your_token_here"
eeroctl account getTo log out and clear stored credentials:
eeroctl auth logout# See your account and networks
eeroctl account get
# List devices on your network
eeroctl device list
# Get details for a specific device
eeroctl device get "MacBook Pro"
# Run a speed test, then fetch the results
eeroctl network speed-test run
eeroctl network speed-test get
# Check eero node status
eeroctl eero listAll output is YAML by default (with syntax highlighting in a terminal). Use --json for JSON or --jq for filtered output.
$ eeroctl account get
networks:
count: 1
data:
- url: /2.2/networks/12345
name: MyNetwork
premium_status: active
is_premium: true
role: owner
$ eeroctl network get
name: MyNetwork
health:
internet:
status: connected
eero_network:
status: connected
speed:
down:
value: 500.0
units: Mbps
up:
value: 50.0
units: Mbps
clients:
count: 10
eeros:
count: 3
dns:
provider: cloudflare
caching: true
sqm: true
band_steering: true
upnp: true
ipv6: true
wpa3: true
target_firmware: 7.0.0
$ eeroctl device list
ID NAME
2001 MacBook Pro
2002 galaxy-phone
2003 Living Room TV
$ eeroctl device get "MacBook Pro"
mac: 11:22:33:44:55:66
manufacturer: Apple
ip: 192.168.4.100
connected: true
wireless: true
connection_type: wireless
source:
location: Living Room
profile:
name: Default
paused: false
blocked: false
frequency: 5 GHz
auth: wpa3
$ eeroctl eero list
- model: eero Pro 6E
location: Living Room
status: green
connected_clients_count: 5
gateway: true
ip_address: 192.168.4.1
mesh_quality_bars: 5
wired: true
- model: eero 6+
location: Bedroom
status: green
connected_clients_count: 3
gateway: false
ip_address: 192.168.4.2
mesh_quality_bars: 4
wired: false
$ eeroctl eero get "Living Room"
model: eero Pro 6E
location: Living Room
os_version: 7.0.0-123
status: green
status_light:
enabled: true
brightness: 100
connected_clients_count: 5
nightlight:
enabled: false
schedule:
'on': '21:00'
'off': '07:00'
brightness: 50
gateway: true
ip_address: 192.168.4.1
mesh_quality_bars: 5
wired: true
update_available: false
$ eeroctl network speed-test run
Speed test started. Please run `speed-test get` in a moment.
$ eeroctl network speed-test get
- date: '2024-06-15T12:00:00Z'
up_mbps: 48.5
down_mbps: 495.2
$ eeroctl profile list
- name: Default
paused: false
- name: Kids
paused: false
$ eeroctl profile get "Kids"
name: Kids
paused: false
blocked_applications:
- tiktok
dns_policies:
block:
- adult
safe_search_enabled: true
youtube_restricted: true
schedule:
enabled: true
time_ranges: []
$ eeroctl forward list
- enabled: true
ip_address: 192.168.4.100
port: '8080'
external_port: '80'
protocol: tcp
display_name: Web Server
$ eeroctl network guest get
name: MyNetwork Guest
password: guestpass
enabled: true
$ eeroctl activity get
insights:
- type: top_domain
category: streaming
count: 1500
domain: netflix.com
- type: top_domain
category: social
count: 800
domain: twitter.com
counts:
blocked: 42
allowed: 15000
inspected: 15042
$ eeroctl diagnostics get
status: completed
results:
- type: internet
status: pass
details:
latency_ms: 12
- type: dns
status: pass
details:
resolver: 1.1.1.1
$ eeroctl --jq '.name' network get
"MyNetwork"
$ eeroctl --jq '.[].display_name' device list -m
"MacBook Pro"
"galaxy-phone"
"Living Room TV"
Most commands accept an optional network argument. If omitted, the first network on your account is used automatically:
# Uses your default (first) network
eeroctl device list
# Specify a network by SSID
eeroctl device list "My Home WiFi"
# Use a numeric network ID with the id: prefix
eeroctl network get "id:12345"Run eeroctl account get to see your available networks and their names.
eeros, devices, and profiles can be referenced by human-readable names instead of numeric IDs:
# eero by location name
eeroctl eero get "Living Room"
# Device by display name, nickname, or hostname
eeroctl device get "MacBook Pro"
# Profile by name
eeroctl profile get "Kids"If a name matches multiple objects, an error is returned listing the matches. To use a numeric ID directly, prefix it with id::
eeroctl eero get "id:1001"
eeroctl device get "id:2001"| Command | Description |
|---|---|
auth login <email_or_phone> |
Begin login (sends verification code) |
auth verify <code> |
Complete login with verification code |
auth logout |
Log out and clear stored credentials |
| Command | Description |
|---|---|
account get |
Show account information and network list |
| Command | Description |
|---|---|
network get [network] |
Show network details (name, health, DNS, clients) |
network set [network] --flag value |
Update network settings |
network reboot [network] |
Reboot all eero nodes on the network |
Network set flags: --name, --password, --sqm, --band-steering, --thread, --upnp, --ipv6, --wpa3
| Command | Description |
|---|---|
network speed-test run [network] |
Run a new speed test |
network speed-test get [network] |
Get the latest speed test result |
| Command | Description |
|---|---|
network guest get [network] |
Show guest network settings |
network guest set [network] --flag value |
Update guest network settings |
Guest set flags: --name, --password, --enabled
| Command | Description |
|---|---|
eero list [network] |
List all eero nodes on the network |
eero get <eero> [--network N] |
Show details for an eero node (by location name or id:XXXXX) |
eero set <eero> [--network N] --flag value |
Update eero node settings |
eero reboot <eero> [--network N] |
Reboot a specific eero node |
eero set flags: --location, --led-on, --nightlight-enabled, --nightlight-brightness, --nightlight-on, --nightlight-off
| Command | Description |
|---|---|
device list [network] |
List connected devices (human-readable table) |
device list [network] -m |
List devices in structured (JSON/YAML) output |
device get <device> [--network N] |
Show full details for a device (by name or id:XXXXX) |
device set <device> [--network N] --flag value |
Update device settings |
Device set flags: --nickname, --blocked, --paused, --profile
| Command | Description |
|---|---|
profile list [network] |
List profiles (parental controls) |
profile get <profile> [--network N] |
Show profile details (by name or id:XXXXX) |
profile set <profile> [--network N] --flag value |
Update profile settings |
Profile set flags: --name, --paused
| Command | Description |
|---|---|
forward list [network] |
List port forwarding rules |
forward create [network] --ip-address IP --port PORT |
Create a port forward |
forward delete <forward_id> |
Delete a port forward by ID |
Forward create flags: --ip-address (required), --port (required), --external-port, --protocol (tcp, udp, or tcp_udp)
| Command | Description |
|---|---|
activity get [network] |
Get network activity summary (requires eero Plus) |
activity get-client <device> [--network N] |
Get activity for a specific device |
| Command | Description |
|---|---|
diagnostics get [network] |
Get the latest diagnostic report |
diagnostics run [network] |
Run a new diagnostic check |
By default, output is syntax-highlighted YAML. You can change this:
# JSON output
eeroctl --json device list -m
# Disable syntax highlighting (useful for piping)
eeroctl -n device list -m
# Apply a jq filter (output is always JSON, one value per line)
eeroctl --jq '.name' network get
eeroctl --jq '.[].display_name' device list -m| Flag | Env Var | Description |
|---|---|---|
--json |
Output JSON instead of YAML | |
--jq <EXPR> |
Apply a jq filter expression (always outputs JSON) | |
-n / --no-color |
Disable syntax highlighting | |
--user-token <TOKEN> |
EERO_SESSION_TOKEN |
Session token (skips login flow) |
--log-level <LEVEL> |
LOG_LEVEL |
Logging level (debug, info, warn, error, trace) |
# Run linting and all tests (skips live tests)
make test
# Run only eero-api tests
cargo test -p eero-api -- --skip live_
# Run only eeroctl tests
cargo test -p eeroctlLive tests run against a real eero router on your network. They require authentication and the router's IP address:
# Specify the eero IP address
make test-live EERO_IP=192.168.4.1
# Auto-detect from default gateway
make test-live-defaultLive tests perform read-only operations and will not change your network configuration.
- eeroctl (CLI) — AGPL-3.0-or-later
- eero-api (library) — MIT