1 unstable release
Uses new Rust 2024
| new 0.1.0 | Mar 9, 2026 |
|---|
#4 in #wifi
135KB
3K
SLoC
eeroctl
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
Things You Can Do With It
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
Testing and Compatibility
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.
Installation
Requires Rust 1.70+.
# From source
cargo install --path eeroctl
# Or build without installing
cargo build --release -p eeroctl
Authentication
eero 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 123456
After 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 get
To log out and clear stored credentials:
eeroctl auth logout
Quick Start
# 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
eeroctl network speed-test run
# Check eero node status
eeroctl eero list
Network Resolution
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.
Name Resolution
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"
Commands
Authentication
| 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 |
Account
| Command | Description |
|---|---|
account get |
Show account information and network list |
Network
| 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
Speed Test
| Command | Description |
|---|---|
network speed-test run [network] |
Run a new speed test |
network speed-test get [network] |
Get the latest speed test result |
Guest Network
| 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
eero Nodes
| 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
Devices
| 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
Profiles
| 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
Port Forwarding
| 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)
Activity
| Command | Description |
|---|---|
activity get [network] |
Get network activity summary (requires eero Plus) |
activity get-client <device> [--network N] |
Get activity for a specific device |
Diagnostics
| Command | Description |
|---|---|
diagnostics get [network] |
Get the latest diagnostic report |
diagnostics run [network] |
Run a new diagnostic check |
Output Formats
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
Global Options
| 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) |
Running Tests
# 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 eeroctl
Live Tests
Live 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-default
Live tests perform read-only operations and will not change your network configuration.
License
- eeroctl (CLI) — AGPL-3.0-or-later
- eero-api (library) — MIT
Dependencies
~18–28MB
~403K SLoC