# "Configuration Reference"
_Path: en/guides/configuration_
> "Wippy is configured via .wippy.yaml files. All options have sensible defaults."
## Table of Contents
- Configuration Reference
## Content
# Configuration Reference
Wippy is configured via `.wippy.yaml` files. All options have sensible defaults.
Any value below can be overridden at launch with `wippy run --set section.path=value` (repeatable, takes precedence over the file). To override individual registry *entries* rather than these config sections, use the `override:` section or `-o` — see [Overriding Entries](guides/entry-kinds.md#overriding-entries).
## Logger
Controls the zap logger encoder. CLI flags (`-v`, `-c`, `-s`) override level/output; the only yaml-driven option is the encoding.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `encoding` | string | console | Encoder: `console` (humanized) or `json` (structured) |
```yaml
logger:
encoding: json
```
## Log Manager
Controls runtime log routing. Console output is configured via [CLI flags](guides/cli.md) (`-v`, `-c`, `-s`).
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `propagate_downstream` | bool | true | Send logs to console/file output |
| `stream_to_events` | bool | false | Publish logs to event bus for programmatic access |
| `min_level` | int | -1 | Minimum level: -1=debug, 0=info, 1=warn, 2=error |
```yaml
logmanager:
propagate_downstream: true
stream_to_events: false
min_level: 0
```
See: [Logger Module](lua/system/logger.md)
## Profiler
Go pprof HTTP server for CPU/memory profiling. Enable with `-p` flag or config.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | false | Start profiler server |
| `address` | string | localhost:6060 | Listen address |
| `read_timeout` | duration | 15s | HTTP read timeout |
| `write_timeout` | duration | 15s | HTTP write timeout |
| `idle_timeout` | duration | 60s | Keep-alive timeout |
```yaml
profiler:
enabled: true
address: "localhost:6060"
```
Access at `http://localhost:6060/debug/pprof/`
## Security
Global security behavior. Individual policies are defined as [security.policy entries](guides/entry-kinds.md).
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `strict_mode` | bool | false | Deny access when security context is incomplete |
```yaml
security:
strict_mode: true
```
See: [Security System](system/security.md), [Security Module](lua/security/security.md)
## Registry
Entry storage and version history. The registry holds all configuration entries.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enable_history` | bool | true | Track entry versions |
| `history_type` | string | memory | Storage: `memory`, `sqlite`, `postgres`, `nil` |
| `history_path` | string | .wippy/registry.db | SQLite file path (used when `history_type: sqlite`) |
| `history_dsn` | string | | Postgres DSN (used when `history_type: postgres`) |
| `history_schema` | string | | Postgres schema name (used when `history_type: postgres`) |
```yaml
registry:
history_type: sqlite
history_path: /var/lib/wippy/registry.db
```
```yaml
registry:
history_type: postgres
history_dsn: ${env:WIPPY_REGISTRY_HISTORY_DSN}
history_schema: wippy_registry
```
See: [Registry Concept](concepts/registry.md), [Registry Module](lua/core/registry.md)
## Relay
Message routing between processes across nodes.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `node_name` | string | derived per-instance ID | Identifier for this relay node (default: UUIDv5 of machine-id/hostname + working dir; overridable via `WIPPY_NODE_ID` / `WIPPY_RELAY_NODE_NAME`) |
```yaml
relay:
node_name: worker-1
```
See: [Process Model](concepts/process-model.md)
## Supervisor
Service lifecycle management. Controls the supervisor's internal control mailbox used to dispatch lifecycle events.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `host.buffer_size` | int | 1024 | Internal control mailbox capacity |
| `host.worker_count` | int | 16 | Concurrent dispatcher workers |
```yaml
supervisor:
host:
buffer_size: 2048
worker_count: 32
```
See: [Supervision Guide](guides/supervision.md)
Per-`process.host` workers and queues are configured on the entry itself (`workers`, `queue_size`, `local_queue_size`), not in this global section. See the [Process Host](system/process-host.md) entry kind.
## Lua Runtime
Lua VM caching and expression evaluation.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `proto_cache_size` | int | 60000 | Compiled prototype cache |
| `main_cache_size` | int | 10000 | Main chunk cache |
| `cache.enabled` | bool | false | Persist compiled bytecode/typecheck cache to disk |
| `cache.dir` | string | `.wippy/cache/lua` | Cache directory path (relative to the config/working directory) |
| `cache.mode` | string | `readwrite` | Cache mode: `readwrite` (default), `readonly`, `off` |
| `cache.compile.enabled` | bool | true | Persist compiled bytecode (when `cache.enabled`) |
| `cache.typecheck.enabled` | bool | true | Persist typecheck results (when `cache.enabled`) |
| `type_system.enabled` | bool | false | Enable static type checking |
| `type_system.strict` | bool | false | Treat type warnings as errors |
```yaml
lua:
proto_cache_size: 60000
cache:
enabled: true
dir: .cache/lua
type_system:
enabled: true
```
See: [Lua Overview](lua/overview.md)
## Finder
Registry search caching. Used internally for entry lookups.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `query_cache_size` | int | 1000 | Cached query results |
| `regex_cache_size` | int | 100 | Compiled regex patterns |
```yaml
finder:
query_cache_size: 2000
```
## OpenTelemetry
Distributed tracing and metrics export via OTLP.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | false | Enable OTEL |
| `endpoint` | string | localhost:4318 | OTLP endpoint |
| `protocol` | string | http/protobuf | Protocol: grpc, http/protobuf |
| `service_name` | string | wippy-runtime | Service identifier |
| `service_version` | string | | Service version tag |
| `insecure` | bool | true | Allow plaintext OTLP connection |
| `sample_rate` | float | 1.0 | Trace sampling (0.0-1.0) |
| `propagators` | string[] | `[tracecontext, baggage]` | Context propagators |
| `traces_enabled` | bool | true | Export traces |
| `metrics_enabled` | bool | false | Export metrics |
| `http.enabled` | bool | true | Trace HTTP requests |
| `http.extract_headers` | bool | true | Extract trace context from inbound headers |
| `http.inject_headers` | bool | true | Inject trace context into outbound headers |
| `process.enabled` | bool | true | Trace process lifecycle |
| `process.trace_lifecycle` | bool | true | Emit spans for spawn/terminate |
| `interceptor.enabled` | bool | true | Trace function calls |
| `interceptor.order` | int | 100 | Interceptor priority |
| `queue.enabled` | bool | true | Trace queue publish/consume |
| `temporal.enabled` | bool | false | Trace Temporal workflows |
```yaml
otel:
enabled: true
endpoint: "http://jaeger:4318"
traces_enabled: true
process:
trace_lifecycle: true
```
Standard OTEL environment variables (`OTEL_EXPORTER_OTLP_ENDPOINT`, `OTEL_SERVICE_NAME`, `OTEL_TRACES_SAMPLER_ARG`, `OTEL_PROPAGATORS`, `OTEL_SDK_DISABLED`) override the matching fields.
See: [Observability Guide](guides/observability.md)
## Shutdown
Graceful shutdown behavior.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `timeout` | duration | 30s | Max wait for components to stop |
```yaml
shutdown:
timeout: 60s
```
## Metrics
Internal metrics collection buffer.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `buffer.size` | int | 10000 | Metrics buffer capacity |
| `interceptor.enabled` | bool | false | Auto-track function calls |
```yaml
metrics:
buffer:
size: 20000
interceptor:
enabled: true
```
See: [Metrics Module](lua/system/metrics.md), [Observability Guide](guides/observability.md)
## Prometheus
Prometheus metrics endpoint.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | false | Start metrics server |
| `address` | string | | Listen address; must be set explicitly when `enabled: true`, otherwise the metrics server does not start |
```yaml
prometheus:
enabled: true
address: "0.0.0.0:9090"
```
Exposes `/metrics` endpoint for Prometheus scraping.
See: [Observability Guide](guides/observability.md)
## Cluster
Multi-node clustering: gossip membership plus a bounded Raft consensus core. See the [Cluster Guide](guides/cluster.md) for the architecture and operational model; this section is the config-key reference.
### Top-level
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | false | Enable clustering |
| `name` | string | hostname | Node name; must be unique across the cluster |
| `failure_domain` | string | | Zone/rack label; advertised in gossip so voters spread across domains |
### Membership (gossip)
SWIM gossip via memberlist. Used for node discovery, failure detection, and metadata dissemination.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `membership.bind_addr` | string | 0.0.0.0 | Gossip bind address |
| `membership.bind_port` | int | 7946 | Gossip bind port (TCP+UDP) |
| `membership.advertise_addr` | string | | Address peers use to reach this node (NAT/k8s) |
| `membership.join_addrs` | string | | Comma-separated seed `host:port` pairs |
| `membership.secret_key` | string | | Base64-encoded gossip encryption key (inline) |
| `membership.secret_file` | string | | Path to file holding the gossip encryption key |
### Internode (transport)
TCP mesh carrying the relay and Raft traffic between nodes. Raft rides this mesh (yamux-multiplexed); there is no separate Raft port.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `internode.bind_addr` | string | 0.0.0.0 | Mesh bind address |
| `internode.bind_port` | int | 0 | Mesh port (0 = auto: 7950-7959, then ephemeral) |
| `internode.auto_port` | bool | true | Discover the actual port at boot, pin it, and advertise it in gossip |
### Raft (consensus)
Bounded Raft. Raft state is fs-durable by default, stored under `raft.data_dir` (default `~/.wippy/store`); a restarted node still rejoins quorum from peers. [`store.kv.raft`](system/store.md#cluster-kv-stores) entries replicate through it. Bootstrap is gossip-driven (Consul/Nomad `bootstrap_expect` style).
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `raft.data_dir` | string | `~/.wippy/store` | Directory for fs-durable Raft state and durable CRDT snapshots (under `/_sys/`). Diskless only when no path resolves (no home dir and none set) |
| `raft.enabled` | bool | true | Run a Raft node; `false` makes this a gossip-only client |
| `raft.role` | string | server | `server` runs a Raft node; `client` is gossip-only |
| `raft.eligible` | bool | true | Whether this node may be selected as a voter |
| `raft.priority` | int | 100 | Voter selection priority (lower is preferred) |
| `raft.bootstrap_expect` | int | 1 | Initial quorum size: `0`=join existing, `1`=single-node, `N`=wait for N eligible peers then form quorum |
| `raft.max_voters` | int | 5 | Voter ceiling (must be odd); extra eligible nodes become standbys |
| `raft.max_standbys` | int | 4 | Non-voting members kept warm for promotion; nodes beyond voters+standbys are not Raft members |
| `raft.reconcile_debounce` | duration | 2s | Coalesce window after a gossip event before the voter reconciler runs |
| `raft.reconcile_timeout` | duration | 2s | Bound per reconcile pass |
| `raft.heartbeat_timeout` | duration | 3s | Follower idle wait before starting an election |
| `raft.election_timeout` | duration | 3s | Candidate election timeout (clamped to >= heartbeat) |
| `raft.commit_timeout` | duration | 500ms | Idle leader heartbeat cadence |
| `raft.snapshot_threshold` | uint64 | 8192 | Log entries since last snapshot before a new one |
| `raft.snapshot_interval` | duration | 2m | Snapshot check interval |
| `raft.snapshot_retain` | int | 3 | Snapshots retained |
| `raft.trailing_logs` | uint64 | 10240 | Log entries retained after a snapshot |
| `raft.max_append_entries` | int | 16 | Max entries per AppendEntries RPC |
| `raft.leader_probe_interval` | duration | 3s | Global-registry leader-reachability probe cadence |
| `raft.leader_probe_grace` | int | 3 | Consecutive probe failures before leader is declared unreachable |
Single-node (development) — clustering on, bootstraps itself immediately:
```yaml
cluster:
enabled: true
name: dev
raft:
bootstrap_expect: 1
```
Three-node voting cluster — each node lists the others as seeds and waits for all three before forming quorum:
```yaml
cluster:
enabled: true
name: node-1
failure_domain: us-east-1a
membership:
bind_port: 7946
join_addrs: "node-2:7946,node-3:7946"
secret_file: /etc/wippy/cluster.key
raft:
bootstrap_expect: 3
max_voters: 5
```
Gossip-only client — joins the cluster for naming/messaging but never runs Raft:
```yaml
cluster:
enabled: true
name: edge-7
membership:
join_addrs: "node-1:7946,node-2:7946"
raft:
role: client
```
## LSP
Language Server Protocol server for editor integrations.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | false | Enable the TCP server |
| `address` | string | :7777 | TCP listen address |
| `http_enabled` | bool | false | Enable the HTTP transport |
| `http_address` | string | :7778 | HTTP listen address |
| `http_path` | string | /lsp | HTTP endpoint path |
| `http_allow_origin` | string | * | CORS allowed origin |
| `max_message_bytes` | int | 8388608 | Max incoming message size |
```yaml
lsp:
enabled: true
address: ":7777"
http_enabled: true
```
See: [LSP Guide](guides/lsp.md)
## Network Service
Overlay network manager (SOCKS5, I2P, Tailscale drivers).
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `state_dir` | string | .wippy/net | Driver state storage directory |
| `default_network` | string | | Default network ID applied when entries omit `network` |
```yaml
network_service:
state_dir: /var/lib/wippy/net
default_network: app:tailscale
```
See: [Network Overlays](system/network.md)
## HTTP Dispatcher
Tuning for the shared HTTP client pool used by HTTP-dispatched functions and outbound requests.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `dispatcher.http.timeout` | duration | 0 (none) | Per-request timeout |
| `dispatcher.http.max_idle_conns` | int | 0 (stdlib) | Max idle connections across all hosts |
| `dispatcher.http.max_idle_per_host` | int | 0 (stdlib) | Max idle connections per host |
| `dispatcher.http.idle_conn_timeout` | duration | 0 (stdlib) | Idle connection timeout |
| `dispatcher.http.max_clients` | int | 0 (unbounded) | Max distinct pooled clients |
```yaml
dispatcher:
http:
timeout: 30s
max_idle_per_host: 32
```
## Modules
Module registry client used by `wippy install`/`update`.
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `registry_url` | string | https://hub.wippy.ai | Registry endpoint |
```yaml
modules:
registry_url: https://internal-registry.example.com
```
## Extensions
Native Go plugin extensions loaded at boot (Unix only).
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `enabled` | bool | true | Load extensions |
| `paths` | string[] | | Plugin file paths (relative to config dir) |
```yaml
extensions:
enabled: true
paths:
- ./extensions/myplugin.so
```
## Environment Variables
| Variable | Description |
|----------|-------------|
| `GOMEMLIMIT` | Memory limit fallback when `--memory-limit` flag is not set (precedence: `--memory-limit` flag > `GOMEMLIMIT` > 1G default) |
## See Also
- [CLI Reference](guides/cli.md) - Command line options
- [Cluster Guide](guides/cluster.md) - Clustering architecture and operations
- [Entry Kinds](guides/entry-kinds.md) - All entry types
- [Observability Guide](guides/observability.md) - Logging, metrics, tracing
## Navigation
Previous: "CLI Reference" (guides/cli)
Next: "Cluster" (guides/cluster)