You are running on a Holo Node — a dedicated computer running Fedora CoreOS (FCOS) managed via systemd and rootless Podman with crun.
The node runs two mutually exclusive hardware modes. Only one can be active at a time:
| Mode | Container | Quadlet Service | Image |
|---|---|---|---|
| Standard | edgenode |
edgenode.service |
ghcr.io/holo-host/edgenode:latest |
| Wind Tunnel | wind-tunnel |
wind-tunnel.service |
ghcr.io/holochain/wind-tunnel-runner:latest |
Container runtime: Podman + crun (no Docker daemon, no persistent privileged socket).
Your daemon runs as openclaw-daemon.service.
Preferred approach — write a file in your workspace:
# Switch to Wind Tunnel (stress-test the Holochain network)
echo "WIND_TUNNEL" > /var/lib/openclaw/workspace/mode_switch.txt
/usr/local/bin/apply-node-mode.sh
# Switch back to Standard EdgeNode
echo "STANDARD" > /var/lib/openclaw/workspace/mode_switch.txt
/usr/local/bin/apply-node-mode.shDirect service control:
# Start edgenode, stop wind tunnel
systemctl stop wind-tunnel.service
systemctl start edgenode.service
# Start wind tunnel, stop edgenode
systemctl stop edgenode.service
systemctl start wind-tunnel.service# Check what's running
podman ps
# Check all containers including stopped
podman ps -a
# View live logs
podman logs -f edgenode
podman logs -f wind-tunnel
# Last 100 log lines
podman logs --tail 100 edgenode
# Restart a container (prefer systemctl for managed services)
systemctl restart edgenode.service
systemctl restart wind-tunnel.service
# Resource usage snapshot
podman stats --no-stream
# Disk usage (images, containers, volumes)
podman system df
# Free up space (unused images/containers/volumes)
podman system prune -f# Health check
systemctl status edgenode.service
systemctl status wind-tunnel.service
systemctl status openclaw-daemon.service
# Journald logs (last 50 lines)
journalctl -u edgenode.service -n 50
journalctl -u wind-tunnel.service -n 50
journalctl -u openclaw-daemon.service -n 50
# Follow logs live
journalctl -fu edgenode.serviceImage updates happen automatically via podman-auto-update.timer (nightly).
To update manually:
# Pull latest images
podman pull ghcr.io/holo-host/edgenode:latest
podman pull ghcr.io/holochain/wind-tunnel-runner:latest
# Restart to pick up new image
systemctl restart edgenode.service
# or
systemctl restart wind-tunnel.serviceThe EdgeNode container runs a Holochain Conductor. You interact with it using the wdocker CLI (Weave Docker toolkit) to join Moss groups and manage apps.
# Check the EdgeNode is running and healthy
systemctl status edgenode.service
podman logs --tail 20 edgenode
# List joined Moss groups (run inside the container)
podman exec edgenode wdocker group list
# Join a new Moss group (replace GROUP_URL with the invite URL)
podman exec edgenode wdocker group join GROUP_URL
# Show running hApps
podman exec edgenode wdocker happs listThe Wind Tunnel mode runs the Holochain network stress-tester. The container
registers as a nomad-client-{node_name} peer with the Holochain test network.
It requires elevated privileges (--privileged) which are configured in its
Quadlet file.
Important: Always stop the EdgeNode before starting Wind Tunnel. Never run both simultaneously — they share P2P ports.
# Clean stop of edgenode before switching
systemctl stop edgenode.service
# Start wind tunnel
systemctl start wind-tunnel.service
# Verify it's running (should show wind-tunnel-runner image)
podman ps
# Stop wind tunnel and return to normal
systemctl stop wind-tunnel.service
systemctl start edgenode.serviceVerify the wind tunnel is reporting to the Holochain network:
podman logs --tail 50 wind-tunnelLook for lines containing nomad-client and connected to confirm registration.
| Path | Purpose |
|---|---|
/var/lib/openclaw/workspace/ |
Your working directory — files you write go here |
/var/lib/openclaw/workspace/mode_switch.txt |
Current hardware mode (STANDARD or WIND_TUNNEL) |
/var/lib/edgenode/ |
EdgeNode persistent data (DNA databases, agent keys) |
/etc/openclaw/config.toml |
Your configuration (providers, channels, autonomy) |
/etc/openclaw/skills/ |
This and other skill files |
/etc/containers/systemd/ |
Podman Quadlet files (edgenode.container, wind-tunnel.container) |
Your config is at /etc/openclaw/config.toml. Hot-reloadable fields (apply on
next message without restart): default_provider, default_model, api_key.
Fields requiring daemon restart: channels, autonomy, memory, gateway, skills.
# View current config (keys shown masked by openclaw)
cat /etc/openclaw/config.toml
# Restart daemon after non-hot-reloadable config changes
systemctl restart openclaw-daemon.service# Disk usage summary
df -h
# Podman image + volume disk usage
podman system df
# RAM and swap
free -h
# CPU/memory per container (live)
podman stats- Always use
systemctl start/stop/restart SERVICE.servicerather thanpodman rundirectly — the Quadlet units handle restart policy, logging, and mutual-exclusion (Conflicts=). edgenode.serviceandwind-tunnel.servicedeclareConflicts=on each other in their Quadlet files, so starting one automatically stops the other.- Images update nightly via
podman-auto-update.timer. To check when it last ran:systemctl status podman-auto-update.service - If a container keeps crashing, check
journalctl -u SERVICE -n 100 --no-pagerfor the root cause before restarting. - The node uses crun (not runc) as the OCI runtime — this is normal and intentional. It is faster and uses less memory than runc.
A future OpenClaw skill (holochain-conductor) will allow you to call Zome
functions on the local Conductor's AppWebSocket (port 65001) directly — reading
from and writing to the DHT without going through wdocker or CLI tools. This
requires WASI directory mounting so the skill can read compiled .happ bundles
from your workspace. When that skill is available, you will be able to:
- Install and activate new hApps autonomously
- Call arbitrary Zome functions with canonical MessagePack payloads
- Use Holochain as distributed tamper-proof memory for your own knowledge graph
- Coordinate with other OpenClaw agents via a shared Holochain app (no central server)