Skip to main content

Configuration Defaults

This page lists the values Impulse applies when configuration fields are omitted. Use it to answer two questions:

  • which fields may be omitted from the YAML
  • what value or behavior Impulse applies when they are omitted

Use Configuration Reference for field semantics and validation rules. Use Configuration Examples for complete examples.

How Defaults Work​

Defaults apply only when a field is omitted. Validation runs after defaults, so enabling a related feature can make another field required.

Examples:

  • observability.control_api.enabled defaults to false
  • observability.control_api.auth_token defaults to null
  • if you set observability.control_api.enabled: true, validation then requires a legacy or role-bearing bearer token, or required mTLS

Common Mistakes​

  • assuming null and omission mean the same thing for every nested field
  • assuming defaults make a section production-safe without reviewing operational implications
  • reading defaults without also checking whether a related feature becomes required when enabled

Important Non-Defaults​

The following top-level and structural fields are still required and do not have a default:

  • listen
  • upstream
  • upstream.<name>.route
  • upstream.<name>.backends
  • upstream.<name>.backends[].id
  • upstream.<name>.backends[].address

listeners is optional and defaults to [], but if listeners[] is non-empty it overrides the top-level listen block at runtime. Every effective listener must still configure a complete TLS identity through tls.cert plus tls.key, or through at least one tls.certificates[] entry.

Top-Level Defaults​

FieldDefaultNotes
version1Current schema version
listeners[]Optional multi-listener override
load_balancingnullAccepted and validated, but not applied as a v0.6 runtime fallback
upstream_tlsobject defaultsSee Upstream TLS Defaults
secretsobject defaultsNo default provider and an empty provider map
logobject defaultsSee Log Defaults
performanceobject defaultsSee Performance Defaults
observabilityobject defaultsSee Observability Defaults
resilienceobject defaultsSee Resilience Defaults
securityobject defaultsSee Security Defaults

Listen Defaults​

FieldDefaultNotes
listen.protocol"http3"Native ingress protocol
listen.port9889Default listener port
listen.address"0.0.0.0"Bind all IPv4 interfaces
listen.tls.cert""Legacy/default certificate path stays empty until set
listen.tls.key""Legacy/default key path stays empty until set
listen.tls.certificates[]Optional SNI certificate map
listen.tls.client_auth.enabledfalseClient certificate auth off by default
listen.tls.client_auth.require_client_certfalseNo client cert requirement by default
listen.tls.client_auth.ca_filenullNo client CA bundle by default

Upstream TLS Defaults​

These defaults apply to the top-level upstream_tls block and to per-upstream upstream.<name>.tls when that nested block is present but fields are omitted.

FieldDefaultNotes
upstream_tls.verify_certificatestrueHTTPS upstream verification stays enabled
upstream_tls.strict_snitrueUpstream SNI stays strict by default
upstream_tls.ca_filenullNo custom CA file
upstream_tls.ca_dirnullNo custom CA directory
upstream_tls.client_certificatenullNo file-backed client certificate chain
upstream_tls.client_certificate_refnullNo secret-backed client certificate chain
upstream_tls.client_keynullNo file-backed client private key
upstream_tls.client_key_refnullNo secret-backed client private key

Upstream and Backend Defaults​

Upstream-Level Defaults​

FieldDefaultNotes
upstream.<name>.load_balancing.type"round-robin"Applied when the upstream omits load_balancing
upstream.<name>.load_balancing.keynullNo hash/sticky key source by default
upstream.<name>.host_policy.modepass_throughPreserve downstream host by default
upstream.<name>.host_policy.hostnullNo rewrite target
upstream.<name>.forwarded_headers.modeoverwriteImpulse rewrites forwarded headers by default
upstream.<name>.tlsnullUses global upstream_tls unless an override block is set

Route Defaults​

FieldDefaultNotes
upstream.<name>.route.hostnullNo host matcher unless set
upstream.<name>.route.path_prefixnullNo default path matcher; validation requires either host or path
upstream.<name>.route.methodnullNo method restriction

Backend Defaults​

FieldDefaultNotes
upstream.<name>.backends[].weight100Equal weight unless overridden
upstream.<name>.backends[].health_checknullNo active health check block unless configured

Health Check Defaults​

These apply when a backend provides a health_check object and omits individual fields.

FieldDefaultNotes
upstream.<name>.backends[].health_check.path"/health"Default probe path
upstream.<name>.backends[].health_check.interval5000Probe interval in ms
upstream.<name>.backends[].health_check.timeout_ms1000Probe timeout in ms
upstream.<name>.backends[].health_check.failure_threshold3Consecutive failures before unhealthy
upstream.<name>.backends[].health_check.success_threshold2Consecutive successes before healthy
upstream.<name>.backends[].health_check.cooldown_ms5000Cooldown after failure in ms

Log Defaults​

FieldDefaultNotes
log.level"info"Standard default log verbosity
log.file.enabledfalseLogs go to stderr unless file logging is enabled
log.file.path"/var/log/impulse/impulse.log"Used only when file logging is enabled
log.formatplainHuman-readable text output

Performance Defaults​

FieldDefaultNotes
performance.worker_threads1Data-plane worker count
performance.control_plane_threads2Tokio control-plane worker count
performance.packet_shards_per_worker1Preserves single-loop packet processing by default
performance.packet_shard_queue_capacity2048Bounded queue depth per shard
performance.packet_shard_queue_max_bytes6710886464 MiB queued-byte cap per shard
performance.reuseporttrueMulti-socket reuse is enabled by default
performance.pin_workersfalseCPU pinning is off by default
performance.global_inflight_limit4096Global request concurrency cap
performance.per_upstream_inflight_limit1024Per-upstream concurrency cap
performance.inflight_acquire_wait_ms0No micro-wait before shedding
performance.backend_timeout_ms2000General backend timeout
performance.backend_connect_timeout_ms500Backend connect timeout
performance.backend_body_idle_timeout_ms2000Backend response-body idle timeout
performance.backend_body_total_timeout_ms30000Backend response-body total timeout
performance.backend_total_request_timeout_ms35000End-to-end backend request timeout
performance.shutdown_drain_timeout_ms5000Shutdown drain budget
performance.udp_recv_buffer_bytes83886088 MiB UDP receive buffer
performance.udp_send_buffer_bytes83886088 MiB UDP send buffer
performance.h2_pool_max_idle_per_backend256Idle HTTP/2 connection pool cap per backend
performance.h2_pool_idle_timeout_ms90000Idle HTTP/2 pool timeout
performance.backend_dns_refresh_enabledfalseHostname backend refresh off by default
performance.backend_dns_refresh_interval_ms30000DNS refresh interval
performance.per_backend_inflight_limit64Per-backend concurrency cap
performance.new_connections_per_sec2000Token-bucket steady refill rate
performance.new_connections_burst500Token-bucket burst size
performance.max_active_connections20000Hard active connection cap
performance.quic_max_idle_timeout_ms5000QUIC idle timeout
performance.quic_initial_max_data10000000QUIC connection flow-control window
performance.quic_initial_max_stream_data1000000QUIC stream flow-control window
performance.quic_initial_max_streams_bidi100Max bidi streams per connection
performance.quic_initial_max_streams_uni100Max uni streams per connection
performance.max_response_body_bytes104857600100 MiB upstream response cap
performance.max_request_body_bytes10000001 MiB client request-body cap
performance.request_buffer_global_cap_bytes6710886464 MiB worker request-buffer cap
performance.unknown_length_response_prebuffer_bytes20971522 MiB unknown-length prebuffer cap
performance.client_body_idle_timeout_ms10000Client upload idle timeout

Resilience Defaults​

Adaptive Admission​

FieldDefaultNotes
resilience.adaptive_admission.enabledtrueAdaptive admission control on by default
resilience.adaptive_admission.min_limit64Minimum inflight ceiling
resilience.adaptive_admission.max_limitnullNo explicit upper bound unless configured
resilience.adaptive_admission.decrease_step16Step down on overload
resilience.adaptive_admission.increase_step16Step up on recovery
resilience.adaptive_admission.high_latency_ms500Latency threshold for pressure signals

Route Queue​

FieldDefaultNotes
resilience.route_queue.default_cap512Default per-upstream concurrent permit cap
resilience.route_queue.global_cap2048Global concurrent permit cap
resilience.route_queue.shed_retry_after_seconds1Retry-After hint on shed responses
resilience.route_queue.caps{}No per-route overrides by default

Scoped Rate Limits​

FieldDefaultNotes
resilience.scoped_rate_limits[]No per-instance token-bucket rules
resilience.scoped_rate_limits[].keynullScope-specific validation or defaults apply
resilience.scoped_rate_limits[].route_allowlist[]Empty means every upstream pool
resilience.scoped_rate_limits[].idle_ttl_secs300Idle local bucket lifetime

Protocol Policy​

FieldDefaultNotes
resilience.protocol.allow_0rttfalse0-RTT disabled by default
resilience.protocol.allow_connectfalseCONNECT disabled by default
resilience.protocol.early_data_safe_methods["GET", "HEAD"]Safe methods allowed if 0-RTT is enabled
resilience.protocol.max_headers_count128Header count cap
resilience.protocol.max_headers_bytes1638416 KiB aggregate header budget
resilience.protocol.enforce_authority_host_matchtrue:authority and Host must align
resilience.protocol.allowed_methods[]Empty means no explicit allowlist
resilience.protocol.denied_path_prefixes[]No denied prefixes by default
resilience.protocol.connect_allowed_ports[]No CONNECT allowlist entries
resilience.protocol.connect_allowed_authorities[]No CONNECT authority allowlist entries

Circuit Breaker​

FieldDefaultNotes
resilience.circuit_breaker.enabledtrueCircuit breaker on by default
resilience.circuit_breaker.failure_threshold3Consecutive failures to open
resilience.circuit_breaker.open_ms30000Open interval in ms
resilience.circuit_breaker.half_open_max_probes1Probe requests allowed while half-open

Hedging​

FieldDefaultNotes
resilience.hedging.enabledfalseHedging off by default
resilience.hedging.delay_ms100Delay before hedge attempt
resilience.hedging.safe_methods["GET", "HEAD"]Hedge-safe methods
resilience.hedging.route_allowlist[]No route allowlist restrictions by default

Retry Budget​

FieldDefaultNotes
resilience.retry_budget.enabledtrueRetry budget enforcement on by default
resilience.retry_budget.ratio_percent10Retry budget ratio
resilience.retry_budget.per_route_ratio_percent{}No per-route overrides by default

Brownout​

FieldDefaultNotes
resilience.brownout.enabledtrueBrownout policy on by default
resilience.brownout.trigger_inflight_percent90Brownout enters near saturation
resilience.brownout.recover_inflight_percent60Brownout exits with headroom
resilience.brownout.core_routes[]No explicit core-route list by default

Distributed Quota​

FieldDefaultNotes
resilience.quota.enabledfalseDistributed quota is off by default
resilience.quota.enforcementenforceEnforced unless explicitly set to shadow
resilience.quota.backend_failure_policyfail_closedBackend failures deny by default when quota is enabled
resilience.quota.backend.kindin_memoryLocal in-memory backend is the default base backend
resilience.quota.backend.key_prefix"impulse:quota"Default counter key prefix
resilience.quota.backend in-memory bucket cap4096Internal safety cap for active in-memory quota buckets; requests exceeding the cap fail according to the quota backend failure policy
resilience.quota.backend.connect_timeout_ms250Redis only
resilience.quota.backend.command_timeout_ms100Redis only
resilience.quota.backend.max_inflight1024Redis only
resilience.quota.local_fallbacknullNo degraded local fallback unless configured explicitly
resilience.quota.local_fallback.key_prefix"impulse:quota:fallback"Default fallback key prefix when fallback is enabled
resilience.quota.local_fallback.max_entriesno defaultRequired when local fallback is configured
resilience.quota.policies[]Quota stays inert until explicit policies are configured

Watchdog​

FieldDefaultNotes
resilience.watchdog.enabledfalseWatchdog off by default
resilience.watchdog.check_interval_ms1000Poll interval
resilience.watchdog.poll_stall_timeout_ms5000Stall threshold
resilience.watchdog.timeout_error_rate_percent60Timeout-rate unhealthy threshold
resilience.watchdog.min_requests_per_window20Minimum request volume before action
resilience.watchdog.overload_inflight_percent95Overload inflight threshold
resilience.watchdog.unhealthy_consecutive_windows3Required consecutive bad windows
resilience.watchdog.drain_grace_ms8000Drain grace before restart
resilience.watchdog.restart_cooldown_ms120000Restart cooldown
resilience.watchdog.restart_command[]No structured restart command by default
resilience.watchdog.restart_hooknullDeprecated legacy hook absent by default

Observability Defaults​

Metrics Endpoint​

FieldDefaultNotes
observability.metrics.enabledfalseMetrics endpoint disabled by default
observability.metrics.requiredfalseStartup does not require the metrics endpoint
observability.metrics.address"127.0.0.1"Loopback-only by default
observability.metrics.allow_non_loopbackfalseRemote metrics require explicit opt-in and control-plane mTLS
observability.metrics.port9901Default metrics port
observability.metrics.path"/metrics"Default scrape path
observability.metrics.max_connections512Concurrent metrics connections cap
observability.metrics.connection_timeout_ms30000Metrics connection timeout

Control API​

FieldDefaultNotes
observability.control_api.enabledfalseControl API disabled by default
observability.control_api.requiredfalseStartup does not require the control API
observability.control_api.address"127.0.0.1"Loopback-only by default
observability.control_api.port9902Default control API port
observability.control_api.health_path"/health"Health endpoint path
observability.control_api.ready_path"/ready"Readiness endpoint path
observability.control_api.runtime_path"/admin/runtime"Runtime summary path
observability.control_api.restart_path"/admin/runtime/restart"Restart control path
observability.control_api.reload_path"/admin/runtime/reload"Full config hot-reload path
observability.control_api.reload_certs_path"/admin/runtime/reload-certs"Certificate reload path
observability.control_api.auth_tokennullOne valid bearer credential or required mTLS is needed when the API is enabled
observability.control_api.max_connections256Concurrent control API connections cap
observability.control_api.connection_timeout_ms30000Control API connection timeout

Tracing​

FieldDefaultNotes
observability.tracing.enabledfalseTracing disabled by default
observability.tracing.service_name"impulse"Default OTLP service name
observability.tracing.otlp_endpointnullNo exporter endpoint by default
observability.tracing.sample_ratio1.0Full sampling if tracing is enabled

Routing Transparency​

FieldDefaultNotes
observability.routing.enabledfalseRoute-decision reporting disabled by default
observability.routing.include_reasontrueInclude decision reasons when routing transparency is enabled
observability.routing.expose_headerfalseResponse header exposure disabled by default
observability.routing.header_name"x-impulse-route-decision"Default transparency header name

Security Defaults​

FieldDefaultNotes
security.privileges.enabledtruePrivilege drop is enabled by default
security.privileges.user"nobody"Default drop-to user
security.privileges.group"nogroup"Default drop-to group