System & Advanced
Operational commands beyond the day-to-day flow: sync & chain repair, backups, API keys, payback methods, plugins, the dead letter queue, audits, troubleshooting reports, and node lifecycle. From the host, prepend docker exec <container> to every command shown below.
Sync
Synchronize data with contacts. After syncing transactions, chain integrity is verified locally; if gaps remain (both sides missing the same transactions), the output reports the gap count and recommends chaindrop to resolve. Backup recovery is attempted automatically on both sides before any drop is proposed.
eiou sync
Run all three sync types in order: contacts, then transactions (with backup recovery), then balances. Use this when you want the node fully reconciled in one shot.
eiou synceiou sync contacts
Reconcile your contact list with peers (status, addresses, per-currency rows). Useful after a network outage or wallet restore.
eiou sync contactseiou sync transactions
Rebuild the transaction chain with each contact and verify chain integrity. If gaps are found, the node tries local backup recovery first, then asks the contact to check theirs. If both sides are missing the same transactions, a tx drop is recommended.
eiou sync transactionseiou sync balances
Recompute balances from your local transaction history. Useful when balance totals drift from the underlying transaction list (rare).
eiou sync balancesBackup
Encrypted database backups (AES-256-GCM, key derived from your seed phrase). Stored in /var/lib/eiou/backups/ with restricted permissions. Retention is backupRetentionCount (default 3) most-recent per prefix — live backups (backup_*) and archive backups (archive_backup_*) are tracked separately so a frequent live cadence never evicts the rarer archive backups. Rate-limited to 10 backup operations per minute.
eiou backup create
Create a new encrypted backup of the live database immediately. The output filename uses the backup_YYYYMMDD_HHmmss.eiou.enc pattern.
eiou backup createeiou backup list
List every backup file currently on disk, including both live and archive prefixes, with size and timestamp.
eiou backup listeiou backup verify
Verify a specific backup's integrity by decrypting and checksumming it. Run this before relying on a backup for restore.
eiou backup verify backup_20260125_120000.eiou.enceiou backup restore
Restore is an internal, root-controlled boot-recovery operation in v0.1.18-alpha. It cannot run from a serving container through the GUI, API, or an ordinary docker exec. Stop the original node, keep its volumes intact for rollback, restore all seven volumes into a new candidate set, and start that candidate with EIOU_BOOT_RECOVERY_BACKUP.
EIOU_BOOT_RECOVERY_BACKUP=backup_20260125_120000.eiou.enc docker compose upSee the Upgrade Guide for the complete fresh-volume candidate and validation procedure. Pre-v0.1.18-alpha backup files must first be restored with the older image that created them, then replaced with a new authenticated v3 snapshot.
eiou backup status
Show whether scheduled auto-backup is on, the configured schedule, the most recent backup time, and current retention counts per prefix.
eiou backup statuseiou backup enable / disable
Toggle scheduled daily backups. The schedule itself (hour and minute, UTC) is configured via the backupCronHour and backupCronMinute settings.
eiou backup enableeiou backup disableeiou backup cleanup
Manually trim old backups beyond the configured retention count, per prefix. Normally the daily cron does this for you.
eiou backup cleanupeiou backup delete
Permanently delete a specific backup file by name. The file is unlinked immediately — there is no undo.
eiou backup delete backup_20260125_120000.eiou.encAPI keys
Issue API keys for external apps to drive the REST endpoint.
Permissions: wallet:read, wallet:send, contacts:read, contacts:write, system:read, admin, all. Comma-separate to combine.
eiou apikey create
Create a new API key with an optional comma-separated permission list. The secret is printed only once at creation — capture it immediately, the node won't show it again. If permissions are omitted, the key is created with default (admin) permissions.
Issue a key with defaultadmin permissions — omit the permission list and the key gets full access.eiou apikey create "My Mobile App"eiou apikey create "Read Only" wallet:read,contacts:readeiou apikey list
List all API keys with their identifiers, names, permissions, and enabled state. Secrets are never re-emitted.
eiou apikey listeiou apikey disable / enable
Temporarily block a key without destroying it. Disabled keys are rejected at the API edge but the row stays so you can re-enable it later. Useful for rotating access without losing the configuration.
Block requests authenticated with this key id — the row stays so you can re-enable later.eiou apikey disable eiou_abc123eiou apikey enable eiou_abc123eiou apikey delete
Permanently remove a key. There is no recovery — the API consumer will need a freshly issued key.
eiou apikey delete eiou_abc123Chain drop (gap resolution)
When both sides of a contact are missing the same transactions in their shared chain, sync alone can't repair it — transactions with that contact are blocked until the gap is resolved. chaindrop mutually agrees to remove the missing transaction(s) and re-wire the chain around them. Gap detection is local (no transaction lists go over the wire). send auto-proposes when sync (and backup recovery on both sides) cannot repair. Rejecting a proposal leaves the gap open and the pair blocked. Rate-limited to 10 chain-drop operations per minute.
Auto-flags: autoChainDropPropose (default true), autoChainDropAccept (default false), autoChainDropAcceptGuard (default true — blocks auto-accept when missing transactions include net payments owed to you). Set on Settings.
eiou chaindrop propose
Propose dropping a missing transaction with a specific contact. The gap is auto-detected by verifying chain integrity; you don't need to specify the txid. Send auto-proposes too, so most users never run this manually.
eiou chaindrop propose https://bobeiou chaindrop list
List incoming pending proposals across all contacts, or filter by a specific contact address. The output prints each proposal's id (format cdp-...), missing txid, and direction.
eiou chaindrop listeiou chaindrop list https://bobeiou chaindrop accept
Accept a proposal by its id. The drop is executed locally, affected transactions are re-signed, and the re-signed copies are exchanged with the proposer. The chain is repaired and transactions can resume immediately afterwards.
eiou chaindrop accept cdp-2c3c26ba61ab4073eiou chaindrop reject
Reject a proposal. Warning: the chain gap stays unresolved and transactions with that contact remain blocked until a new proposal is accepted or the missing transactions are recovered through the isolated boot-recovery procedure.
eiou chaindrop reject cdp-2c3c26ba61ab4073Payback methods
Settlement rails (bank wire, custom free-text, plus plugin-supplied types like BTC / PayPal / Bizum / PIX / UPI / Lightning) you offer contacts so they can settle debts. Each method is encrypted at rest per row; sensitive fields only leave the node when you explicitly reveal them via show or a contact fetches them over E2E.
- Share policy:
auto(any accepted contact can fetch),prompt(notification on owner),never(not shared via E2E). Default isauto. - Priority: integer 0–9999, lower = preferred. Tiebreaker when several methods match the same currency.
- Core types:
bank_wire(sub-rails:sepa,faster_payments,ach,fednow,swift; validates IBAN / ABA),custom(free-text, ≤ 1024 chars).
eiou payback list
List your enabled payback methods. --currency <CCY> filters to one currency code; --all also includes disabled rows.
eiou payback list--currency and add --all to also include disabled rows.eiou payback list --currency USD --alleiou payback add
Create a new method of the given type for the given currency. Type-specific fields (rail, IBAN, account name, etc.) are prompted for interactively, with sensitive inputs read with terminal echo disabled.
Add abank_wire method — you'll be prompted interactively for rail, IBAN, account name, and similar fields.eiou payback add bank_wire "My Revolut" EURcustom method, force a never share policy, and demote it with --priority 10.eiou payback add custom "Monzo - DM me" GBP --share never --priority 10eiou payback show
Display a single method with all fields decrypted to plaintext. The GUI and REST API gate plaintext reveal behind an authcode prompt; the CLI is considered authenticated by virtue of having shell access.
eiou payback show pbm_abc123eiou payback edit
Re-enter the type-specific fields for an existing method (re-encrypts the whole blob atomically). Label, priority, and share policy each have their own subcommands.
eiou payback edit pbm_abc123eiou payback share-policy
Update only the share policy on an existing method. Use this to change a method from auto-shareable to never-share without re-entering its credentials.
eiou payback share-policy pbm_abc123 nevereiou payback remove
Permanently delete a method. The encrypted row and credentials are removed; contacts that previously fetched the method retain whatever they cached.
eiou payback remove pbm_abc123Plugins
Install, list, enable, disable, uninstall, and upgrade plugins. Plugins are disabled by default at install time. Enable and disable are persistence-only — they do not restart the node, so changes only take effect after eiou restart (event subscriptions bind during boot). Upgrade reloads the plugin's FPM pool, but a wallet restart is still required for new manifest-declared surfaces to bind. Plugin names match ^[a-z0-9][a-z0-9-_]{0,63}$. The conceptual overview of plugins (safety model, what plugins can and cannot reach, signature flow) lives in Plugins.
eiou plugin
List every installed plugin in a table with version, enabled flag, status, and license. Equivalent to eiou plugin list.
eiou plugineiou plugin enable / disable
Persist the enabled flag as true or false in /etc/eiou/config/plugins.json. Neither command restarts the node — you need eiou restart afterwards for the change to take effect, since plugin event subscriptions bind during boot.
plugins.json — takes effect on the next eiou restart.eiou plugin enable hello-eioueiou plugin disable hello-eioueiou plugin install
Install a plugin from a .zip on the container filesystem. Runs the same validation pipeline the GUI upload uses (zip integrity, path-traversal checks, file-type allow-list, manifest validation, and signature verification per the configured mode), then atomic-renames the staged tree into /etc/eiou/plugins/<name>/. The plugin lands disabled — follow up with eiou plugin enable <name> and eiou restart. Refuses to re-install an already-installed plugin and points at eiou plugin upgrade for that path.
/tmp/).docker cp my-plugin.zip alice:/tmp/my-plugin.zipdocker exec alice eiou plugin install /tmp/my-plugin.zipeiou plugin uninstall
Run the full uninstall sequence: invoke the plugin's onUninstall hook, drop its tables and DB user, delete credentials, and remove plugin files. The plugin must be disabled first — the command will refuse to run otherwise.
eiou plugin uninstall hello-eioueiou plugin upgrade
Replace an installed plugin's code with a newer version. Two argument shapes feed into the same engine: pass a plugin name (kebab-case) to upgrade to the image-baked version under /app/plugins/<name>/, or pass a zip path (anything containing slashes or dots) to upgrade to an operator-supplied build. The plugin's state (MySQL tables, plugin user, credentials, gateway token) is preserved across the upgrade. A snapshot of the previous version is kept under <name>.backup-<oldver>-<ts>/ next to the live plugin and pruned automatically after 30 days. Refuses same-version, downgrades, and min_upgradable_from violations.
eiou plugin upgrade hello-eiou.zip on the container filesystem.docker cp hello-eiou-1.6.zip alice:/tmp/hello-eiou-1.6.zipdocker exec alice eiou plugin upgrade /tmp/hello-eiou-1.6.zipDead letter queue
Messages that exhausted automatic retries (5 attempts) end up in the DLQ. Only transaction and contact messages are retry-eligible — p2p / rp2p are time-sensitive (300 s expiry) and should be abandoned. Resolved/abandoned records auto-delete after cleanupDlqRetentionDays (default 90).
eiou dlq
Show active items (pending + retrying) in one quick table — the most common usage. Equivalent to eiou dlq list with no filter.
eiou dlqeiou dlq list
List items, optionally filtered by status. Accepted values: pending, retrying, resolved, abandoned, or all (everything regardless of status).
eiou dlq list --status=alleiou dlq list --status=pendingeiou dlq retry
Manually re-attempt delivery of a failed message by id. Transaction payloads have their previousTxid and time refreshed from current DB state and the envelope is re-signed before send, so retries don't ship a stale chain link.
eiou dlq retry 42eiou dlq abandon
Mark an item as abandoned so it stops appearing in the active list. Use this for stale p2p / rp2p rows that can no longer be delivered meaningfully. Cannot be undone.
eiou dlq abandon 42Verify chain (audit)
Walk every bilateral chain on this node end-to-end, bypassing the hot-path checkpoint-trust optimization, and recompute each pair's archive hash to detect tampering. Use after a restore, when investigating pairs_skipped_gap from the archival cron, or for a periodic health check. Intentionally NOT scheduled — it's O(all history) per pair, the cost the per-pair checkpoint avoids.
eiou verify-chainExit codes: 0 = every pair clean; 1 = at least one pair has a finding (chain gap or hash mismatch).
Debug report
Generate a troubleshooting report. Reports never include private keys, seed phrases, or auth codes. The default mode saves locally; the --send mode submits via Tor to the support endpoint and is rate-limited to 3 submissions per day.
eiou report debug
Save a JSON report under /tmp/ with system info, debug-table entries, and the last 50 lines of each log file. An optional description string is recorded in the report header. The output path is printed to stdout when the command completes.
eiou report debugeiou report debug "login page crash"eiou report debug --full
Same as the default, but includes up to 5 MB per log file instead of just the last 50 lines. Use this when investigating issues that span more history than the default capture covers.
Capture the longer 5 MB-per-log report with no description.eiou report debug --fulleiou report debug "sync failure after restore" --fulleiou report debug --send
Scrub the report of sensitive data (addresses, keys, IPs) and submit it to the support endpoint over Tor instead of saving locally. The command returns a reference key you can quote to support. Combine with --full to send the longer log capture.
eiou report debug --send--full capture with a description — combine when 50 lines of logs aren't enough context for support.eiou report debug "login crash" --full --sendNode lifecycle
Check for updates, stop and resume processors, or do a full in-place restart. These commands are stand-alone (not subcommands of a single namespace), but they all relate to running-node management so they're grouped here.
eiou updatecheck
Query Docker Hub and GitHub Releases for newer image versions, bypassing the 24-hour cache. If an update is available the output prints the new version and a docker pull command; otherwise it confirms the current version.
eiou updatecheckeiou shutdown
Gracefully stop all background processors (P2P, transaction, cleanup, contact-status) and set a shutdown flag. The watchdog respects the flag and won't auto-restart them. PHP-FPM and the HTTP front-end keep running — only the queue processors are paused.
eiou shutdowneiou start
Resume processors after a previous shutdown. Removes the shutdown flag; the watchdog detects the change and restarts the processors within ~30 seconds. Restart counters are reset so prior shutdown limits don't block them.
eiou starteiou restart
Full in-place restart: SIGTERM the processors (watchdog respawns them within ~30 s) and SIGUSR2 the PHP-FPM master so workers gracefully recycle (in-flight HTTP requests finish first). Required after toggling plugins, since their event subscriptions bind during boot. Must run as root inside the container.
eiou restart