Ponos (Greek: Πόνος) means toil, labor, or sustained effort.
Ponos takes on that toil for node operators. It is the terminal interface for nodeoperator.ai, an autonomous nodeoperator agent that deploys, manages, and remediates issues with blockchain infrastructures through GitHub-based workflows.
- TUI (Terminal UI) - Interactive terminal interface
- Slack - Slash commands and bot integration
- Coming Soon: GitHub Actions, Discord, GitHub Comments
curl -sSL https://nodeoperator.ai/install.sh | shgit clone https://github.com/blockops-sh/ponos
cd ponos
make build-ponosThe binary is produced at ./bin/ponos.
docker pull ghcr.io/blockopsnetwork/ponos-server:latestPonos supports two main workflows:
Supported Networks:
- Ethereum (execution clients: Geth, Nethermind, Besu, Erigon; consensus clients: Lighthouse, Prysm, Teku, Nimbus)
- EVM-compatible chains (Polygon, Arbitrum, Optimism, Base, etc.)
- Polkadot Relaychains (Polkadot, Kusama)
- Cosmos chains (experimental support)
- Solana (experimental support)
Note: While we technically support all EVM chains and clients, testing has been primarily focused on Ethereum execution and consensus clients.
TUI Interface
./bin/ponosOnce in the TUI, use prompts like:
"Upgrade mainnet Geth to the latest version""Show me available Lighthouse versions for testnet""Create a PR to update Polygon nodes to v1.2.3""What's the current version of Besu on mainnet?"
Slack Interface
@ponos (replace with your slacp app name) <your prompt>
Example Slack messages:
@ponos upgrade mainnet Geth to the latest version@ponos create a PR to update Polygon nodes to v1.2.3@ponos show me the current Besu version on mainne@ponos what's the recent Prysm upgrade about? Do I need to make any configurational changes? If so, create a PR to upgrade and make the chnages
TUI Interface
./bin/ponosOnce in the TUI, use prompts like:
"Diagnose mainnet Ethereum nodes""Check why Geth pods are failing on testnet""Show me resource usage for Lighthouse validators""Analyze logs for polygon-bor nodes in the last hour""Why is my consensus client out of sync?"
Slack Interface
/diagnose <service or prompt>Example Slack commands:
/diagnose mainnet-geth- Quick health check for specific service/diagnose check mainnet Ethereum nodes health/diagnose why are my Geth pods failing on testnet?
Or use @ponos for more complex requests:
@ponos show resource usage for Lighthouse validators@ponos analyze logs for polygon-bor nodes in the last hour
Server Mode (for Slack + webhooks)
make run-ponos- Enables Slack slash commands and GitHub webhook listening
- Handles background diagnostic tasks
- (Note: Will be migrating to agent-core soon)
Configuration is provided via ponos.yml file. Copy ponos.yml.example to ponos.yml and customize for your environment.
version: 1
api_endpoint: "https://api.nodeoperator.ai"
api_key: "your_api_key_here"
integrations:
github:
# Choose one authentication method:
token: "ghp_xxx" # Personal Access Token (PAT)
# OR GitHub App (recommended for production):
app_id: "123456"
install_id: "654321"
pem_key: "/path/to/pem/key"
bot_name: "ponos-bot"
mcp_url: "http://localhost:3001"
slack:
token: "xoxb-xxx"
signing_key: "your_slack_signing_secret"
verify_token: "your_slack_verification_token"
channel: "sre-tasks"
# Telescope observability (for node metrics, logs, and blockchain client metrics - see https://github.com/blockopsnetwork/telescope)
telescope:
project_id: ""
project_name: "your-project-name"
prometheus_url: "https://your-prometheus-endpoint"
prometheus_username: ""
prometheus_password: ""
loki_url: "https://your-loki-endpoint"
loki_username: ""
loki_password: ""
# Diagnostics & monitoring (optional)
diagnostics:
enabled: false
provider: "telescope" # Options: telescope, kubernetes
github:
owner: "your-org"
repo: "infrastructure-issues"
slack:
channel: "sre-tasks"
kubernetes:
namespace: "default"
resource_type: "deployment"
monitoring:
service: "your-service-name"
log_tail: 500
eval_interval: 2
# Server settings
server:
port: "8080"
enable_release_listener: falsePersonal Access Token (PAT)
- Simpler setup for development and personal use
- Uses your personal GitHub account credentials
- Requires
reposcope for private repositories - Set
integrations.github.tokenonly
GitHub App (Recommended)
- Recommended for production and organizational use
- More secure with fine-grained permissions
- Operations appear as the configured bot name
- Set
integrations.github.app_id,install_id, andpem_key
Telescope provides observability for blockchain nodes, including system metrics (CPU, memory, disk), blockchain client metrics (sync status, peers, attestations), and container logs.
| Field | Description |
|---|---|
project_id |
Telescope project identifier |
project_name |
Project name for multi-tenant scoping |
prometheus_url |
Prometheus/Thanos endpoint for metrics |
prometheus_username |
Basic auth username |
prometheus_password |
Basic auth password |
loki_url |
Loki endpoint for logs |
loki_username |
Basic auth username |
loki_password |
Basic auth password |
See Telescope documentation for setup.
The diagnostics.provider field determines where Ponos fetches node metrics and logs:
| Provider | Description |
|---|---|
telescope |
Uses Telescope's Prometheus and Loki endpoints for metrics and logs |
kubernetes |
Queries Kubernetes API directly for pod logs and resource metrics |
PONOS_TUI_LOG_PATH=/tmp/ponos.logFor automated release detection and pull request creation:
Set to 'true' to enable GitHub webhook listener
ENABLE_RELEASE_LISTENER=false Release Webhook Listener (ENABLE_RELEASE_LISTENER)
- Default:
false(disabled) - Purpose: Automatically creates upgrade PRs when new blockchain client releases are detected
- When enabled: Ponos server listens for GitHub release webhooks at
/webhooks/releases - Workflow:
- External systems send release notifications to Ponos webhook endpoint
- Ponos analyzes the release using NodeOperator.ai agent
- Automatically creates pull requests with version updates and deployment changes
- Sends summary notifications to configured Slack channel
Setup Requirements (when enabled):
- Ponos must be running in server mode (
make run-ponos) - Webhook endpoint must be publicly accessible (consider using ngrok for development)
- Subscribe to release notifications via Relay at relay.blockops.network
- Relay is our specialized service for blockchain release monitoring
- Configure your webhook endpoint:
https://your-ponos-server.com/webhooks/releases - Subscribe to specific blockchain networks you want to monitor
- Relay will automatically send release payloads when new versions are published
Note: This feature is primarily for advanced automation setups. Most users can rely on manual upgrade commands via TUI or Slack interface.
- By default, Ponos uses MCP servers hosted by NodeOperator.ai
- Default endpoints:
- GitHub MCP:
github-mcp.nodeoperator.ai - Slack MCP:
slack-mcp.nodeoperator.ai - Kubernetes MCP:
k8s-mcp.nodeoperator.ai
- GitHub MCP:
- Source code: github.com/blockopsnetwork/mcp-servers
- No additional MCP server setup required
To use your own MCP servers, set these environment variables:
# Override default hosted MCP servers
GITHUB_MCP_URL=http://your-github-mcp-server:3001
SLACK_MCP_URL=http://your-slack-mcp-server:3002
K8S_MCP_URL=http://your-k8s-mcp-server:3003GitHub MCP Server
- Handles GitHub API calls, branch creation, and pull requests
- Required for all repository operations
- Default: Uses hosted GitHub MCP server
Slack Integration
- Built directly into Ponos using official Slack Go SDK
- No separate Slack MCP server needed unless using custom implementation
Ponos requires a configuration file to discover and manage your blockchain deployments. This file tells Ponos which GitHub repositories contain your node deployment configurations.
-
Copy the example configuration:
cp repo-config.yaml.example repo-config.yaml
-
Set the configuration file path:
export CONFIG_YAML_PATH=repo-config.yaml
version: 1
projects:
- network: ethereum
project_name: eth-consensus-client
owner: your-org
name: ethereum-deployments
branch: main
paths:
- "deployments/prysm/values.yaml"
- "deployments/lighthouse/values.yaml"
- "k8s/ethereum/prysm-deployment.yaml"
- network: ethereum
project_name: eth-execution-client
owner: your-org
name: ethereum-deployments
branch: main
paths:
- "deployments/geth/values.yaml"
- "deployments/nethermind/values.yaml"
- "k8s/ethereum/geth-deployment.yaml"
- network: arbitrum
project_name: arbitrum-node
owner: your-org
name: layer2-infrastructure
branch: main
paths:
- "arbitrum/nitro/values.yaml"
- "k8s/arbitrum-deployment.yaml"| Field | Required | Description |
|---|---|---|
network |
Yes | Network name (ethereum, polkadot, arbitrum, etc.) |
project_name |
Yes | Unique identifier for this deployment project |
owner |
Yes | GitHub organization or username |
name |
Yes | Repository name containing deployment configs |
branch |
No | Git branch for updates (default: "main") |
paths |
Yes | List of file paths containing node configurations |
Ponos can update Docker image tags in various configuration formats:
- Kubernetes YAML - Deployment, StatefulSet, DaemonSet manifests
- Helm values.yaml - Chart configuration files
- Docker Compose - docker-compose.yml files
- Custom configs - Any YAML with
image:ortag:fields
go test ./...
make build-ponos
make run-ponos