829cli
829
Command-line tools for managing WP Engine installs at scale — plugin management, SSH connections, portal access, user management, and more.
Requirements
- Node.js >= 18 (nodejs.org)
- WP Engine API credentials — username and token from the WP Engine User Portal
- SSH keys configured for WP Engine (docs)
- fzf (optional, required for Tab autocomplete) —
brew install fzf
Installation
npm install -g 829cliFirst-time Setup
1. Configure your API credentials
829 configYou will be prompted for:
- WP Engine API username
- WP Engine API token
- Default batch size (recommended: 20)
- Default parallel jobs (recommended: 20)
Settings are saved to ~/.829.json.
2. Sync your install list
829 installs syncThis fetches all WP Engine installs from the API and caches them to ~/.829/installs.json. Re-run any time your install list changes.
3. Enable Tab autocomplete (zsh)
Add the following to your ~/.zshrc:
eval "$(829 completion zsh)"Then reload your shell:
source ~/.zshrcRequires
fzf. Install withbrew install fzf.For bash, use
eval "$(829 completion bash)"in your~/.bashrc.
Commands
829 config Configure API credentials and defaults
829 installs sync Fetch installs from the WP Engine API
829 installs list Browse cached installs
829 ssh [install-id] SSH into a WP Engine install
829 portal [install-id] Open install in the WP Engine portal
829 portal user list List all portal users across accounts (CSV)
829 portal user add Add a user to an account
829 portal user delete Remove a user from an account
829 portal user promote Change a user's role in an account
829 plugin scan Scan plugin status across installs
829 plugin activate Activate a plugin across installs
829 plugin deactivate Deactivate a plugin across installs
829 plugin update Update a plugin across installs
829 plugin delete Delete a plugin across installs
829 run Run a shell command across installs via SSH
829 wpt provision Install/update wordpress-tools and provision API keys
829 wpt settings Update wordpress-tools settings across installs
829 wpt repair Fix misnamed wordpress-tools-main plugin folder
829 cookies <sitemap-url> Audit cookies/localStorage/sessionStorage across a site
829 crawl <url> Crawl a site and export a CSV inventory of pages
829 help Show all commands
829 help <command> Show detailed help for a command
829 completion zsh Print zsh completion script
829 completion bash Print bash completion script
Run 829 help at any time for the full reference, or 829 help <command> for detail on a specific command (e.g. 829 help plugin, 829 help wpt).
SSH & Portal Autocomplete
After enabling Tab completion, typing 829 ssh or 829 portal and pressing Tab opens an fzf picker:
INSTALL ID DOMAIN ENVIRONMENT
absoluteenerg1 absoluteenergy.com 🌐 production
absoluteenerstg absoluteenergy.829stage.com 📝 staging
absoluteenerdev absoluteenergy.829dev.com ⚙️ development
Arrow up/down to navigate, type to filter, Enter to connect or open.
Plugin Scan
829 plugin scan supports three slug modes:
| Mode | Example | Behavior |
|---|---|---|
| Exact | --plugin wordfence |
Single report, post-scan action prompt |
| Multi-slug | --plugin wordfence,woocommerce |
One report per plugin + combined comparison report |
| Wildcard | --plugin "wordpress-tools*" |
Matches any installed plugin name starting with that prefix |
After an exact-slug scan you can immediately activate, deactivate, update, or delete the plugin on the matching installs.
Run
829 run executes an arbitrary shell command across any set of installs via SSH. The command is base64-encoded before sending so quotes and special characters are preserved.
829 run --cmd "wp plugin install https://github.com/org/repo/releases/download/1.8.0/plugin-1.8.0.zip --force"Output is saved to a CSV with columns: name, primary_domain, exit_code, output.
Portal User Management
829 portal user list iterates all WP Engine accounts and exports a CSV of every user:
account_name, account_id, first_name, last_name, email, role, installs
installs is all for full-access roles, or a semicolon-separated list of install names for partial access.
wordpress-tools
829 wpt provision
Installs or force-updates the wordpress-tools plugin from GitHub, activates it, generates a 32-character API key, and sets it — across any number of installs in one run.
829 wpt settings
Enables or disables restrict_plugin_management across targeted installs.
829 wpt repair
Fixes installs where the plugin was installed from a GitHub ZIP archive, leaving the folder named wordpress-tools-main instead of wordpress-tools. Renames the folder and activates the plugin. If both folders exist, removes the stale one.
Cookie Scraper
Audits every cookie, localStorage entry, and sessionStorage entry set on a site's pages. Identifies the vendor behind each item (Google Analytics, HubSpot, Meta, etc.) and exports two CSV reports.
Scan via sitemap:
829 cookies https://example.com/sitemap.xmlScan a single page:
829 cookies https://example.com/aboutScan a specific list of pages via JSON file:
829 cookies --urls ./pages.jsonThe JSON file should be a plain array of URLs:
[
"https://example.com/about",
"https://example.com/contact",
"https://example.com/services"
]Options:
| Flag | Description | Default |
|---|---|---|
-u, --user <username> |
Basic auth username | — |
-p, --pass <password> |
Basic auth password | — |
-c, --concurrency <n> |
Pages to scrape in parallel | 3 |
-o, --output <dir> |
Output directory for CSV files | ~/829-tools/reports/ |
--max-pages <n> |
Cap number of pages (useful for testing) | — |
--urls <file> |
JSON file containing an array of URLs to scan | — |
--by-page |
Also generate the per-page detail report | — |
--debug |
Print per-page cookie capture diagnostics | — |
Output files (written to ~/829-tools/reports/ by default):
cookie-summary-<timestamp>.csv— one row per unique cookie/storage key, with vendor, domain, attributes, page count, and sample valuescookie-by-page-<timestamp>.csv— generated only when--by-pageis passed; one row per item per page
Site Crawler
Crawls a site and exports a CSV inventory of every page with SEO-relevant data (status, title, meta, H1s, word count, links, etc.).
Crawl via sitemap:
829 crawl https://example.com/sitemap.xmlCrawl by following links from a start URL:
829 crawl https://example.com --max-depth 3 --max-pages 200Render JS before parsing (for SPAs / client-rendered sites):
829 crawl https://app.example.com --renderOptions:
| Flag | Description | Default |
|---|---|---|
-u, --user <username> |
Basic auth username | — |
-p, --pass <password> |
Basic auth password | — |
-c, --concurrency <n> |
Pages to fetch in parallel | 5 (3 with --render) |
-o, --output <dir> |
Output directory for CSV files | ~/829-tools/reports/ |
--max-pages <n> |
Cap the number of pages crawled | — |
--max-depth <n> |
Max link depth from start URL (crawl mode only) | 5 |
--urls <file> |
JSON file containing an array of URLs | — |
--render |
Use Puppeteer to render JS before parsing | — |
--ignore-robots |
Ignore robots.txt disallow rules | — |
--debug |
Print per-page diagnostics | — |
Output: crawl-<timestamp>.csv — one row per page with: url, status_code, title, meta_description, h1, canonical, word_count, internal_links_count, external_links_count, images_missing_alt, and more.
Output Files
Reports and logs are written to ~/829-tools/:
~/829-tools/reports/ CSV reports from scans, actions, provisioning, cookie audits, and crawls
~/829-tools/logs/ Detailed logs of SSH session output
Updating
npm update -g 829cli
829 installs sync