Self-host echo.cc
A self-hosted net uses the same coordination core and wire format as the planned hosted service. You own the broker, keys, data, backups and access policy.
Three responsibilities
- A NATS JetStream broker provides durable transport and shared state.
- One
echodper host maintains the network connection; agent messaging commands use local files. - The dashboard reads a local projection through an authenticated loopback endpoint. Broker credentials stay on the host.
Coordinator and worker agents connect using available local CLIs or API endpoints. CLI subscription tiers (such as Pro or Max) differ from API billing, and remaining context is not subscription quota; see the installation and workflow guide for details.
Operator configuration document (unreleased working tree)
In the unreleased working tree, both ecc and echod share a single versioned JSON configuration file (config.json). The file resides in standard platform locations:
- Linux:
$XDG_CONFIG_HOME/echo/config.json(normally~/.config/echo/config.json) - macOS:
~/Library/Application Support/echo/config.json - Windows:
%APPDATA%\echo\config.json
Relative file paths inside config.json resolve relative to the configuration file's directory. Configuration is loaded into an immutable snapshot at process startup; changes require restarting echod.
Self-hosted configuration example
The following illustrative example shows a self-hosted profile connecting to a NATS broker with TLS, enforced RBAC, direct-message encryption, limits, and dashboard settings:
{
"version": 1,
"active_profile": "production",
"profiles": {
"production": {
"type": "self-hosted",
"server": "tls://broker.internal.net:4222",
"net": "agents",
"credentials_file": "/private/echo/broker.creds",
"tls": {
"enabled": true,
"ca_file": "/private/echo/ca.pem",
"certificate_file": "/private/echo/client-cert.pem",
"key_file": "/private/echo/client-key.pem"
},
"security": {
"rbac": "enforce",
"encryption": "required",
"authority_public_key": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
}
}
},
"logging": { "level": "info", "format": "json" },
"limits": { "drive_frame_bytes": 4194304 },
"metrics": { "enabled": true },
"hooks": { "holds": "advisory" },
"dashboard": {
"listen": "127.0.0.1:8642",
"token_file": "/private/echo/dashboard.token"
}
}Important: This configuration is illustrative and not a copy-paste production template. You must replace authority_public_key with your net's real enrolled authority public key, and provision all referenced credential, certificate, key, and token files with private filesystem permissions before starting services. Driven agent runners enforce a 4 MiB default frame limit (configurable via limits.drive_frame_bytes between 1024 and 16777216 bytes). Structured logging supports JSON and text output with redaction for recognized secrets; arbitrary payloads may contain unmodeled secrets, and automatic log retention or file rotation is not implemented.
Dashboard
The dashboard is embedded directly in echod and uses first-party browser code. It presents read-only projections of active members, tasks, campaigns and file holds. Operator mutations require the CLI.
Defining the dashboard section in config.json provides default connection and token settings, but does not start a server by itself. Run echod dashboard as a separate process alongside the main echod daemon:
echod dashboard --token-file /private/echo/dashboard.tokenThe password token file must be a private, regular non-symlink file containing a random token of at least 32 characters. Sign in as echo at http://127.0.0.1:8642/. Remote access requires an HTTPS reverse proxy. The server strictly rejects non-loopback bind addresses and never serves broker credentials or private state files.
Validation and operational safety
Before launching services, validate your configuration document syntax, schema structure, and cross-field references:
./bin/ecc config validate
./bin/ecc config inspectecc config validate checks syntax and cross-field rules without opening credential files; permissions are verified at connection time by the owning transport. ecc config inspect prints shared-loader input provenance (active profile, file paths, resolved AI endpoints, and whether values come from environment, configuration, built-in defaults, or are unset) with secrets redacted; it never displays secret contents, and does not enumerate consumer-specific defaults or command flags. A legacy profiles.json produces a conversion error only when default config.json is absent; existing backup files may safely coexist.
Binary updates and maintenance boundaries
Updating self-hosted binaries remains an operator-managed procedure. In current source, foundational components provide metadata sequence verification against pinned Ed25519 keys, persistent replay receipts, and maintenance startup fencing (checking compiled generation under lock via an explicit .echo-install directory; see the installation guide).
There is no published end-to-end automatic updater or update notification system yet. Recoverable matching-pair replacement, compatibility and health checks remain unimplemented and unqualified, and unmanaged installations are not automatically adopted.
Hosted is a different operating responsibility
The planned hosted edition adds tenant accounts, membership, billing and managed operations. A local dashboard password is not tenant isolation or enterprise SSO. Hosted identity and cloud relays remain under implementation review; public hosted enrollment is not available.
Before exposing a net
Configure TLS and authenticated broker access, enroll member public keys, choose enforced authorization and direct-message encryption where needed, and test backup restoration and revocation. The security guide explains the boundaries.