Skip to main content
Reference

Configuration

Every control plane setting, in one table. Guides link here instead of restating options.

The control plane is the Rivet Engine. It reads configuration from files, from environment variables, or from both.

Configuration sources

The engine accepts JSON, JSON5, JSONC, YAML, and YML, plus environment variables.

Environment variables

Prefix a setting with RIVET__ and separate each level of nesting with __. Names are case-insensitive. To set postgres.url:

RIVET__POSTGRES__URL="postgresql://user:password@host:5432/database"

Configuration files

Files are discovered automatically in a platform-specific directory:

PlatformPath
Linux/etc/rivet/config.json
macOS/Library/Application Support/rivet/config.json
WindowsC:\ProgramData\rivet\config.json

Multiple files in the same directory are merged. /etc/rivet/config.json and /etc/rivet/database.json are loaded together.

Override the search path with --config:

# Load from a specific file
rivet-engine --config /path/to/config.json

# Load from a directory
rivet-engine --config /etc/rivet

# Load multiple paths, merged in order
rivet-engine --config /etc/rivet/base.json --config /etc/rivet/override.json

Reference

  • api_peer
    nullable object

    Configuration for the private API service.

    • api_peer.host
      nullable unknown

    • api_peer.port
      nullable unknown

  • auth
    nullable object

    • auth.admin_token
      string

  • cache
    nullable object

    Configuration for the cache layer.

    • cache.driver
      nullable string

      • in_memory

    • cache.enabled
      boolean

  • clickhouse
    nullable object

    • clickhouse.http_url
      string

      URL to the HTTP access port for ClickHouse.

    • clickhouse.native_url
      string

      URL to the native access port for ClickHouse.

    • clickhouse.password
      nullable string

    • clickhouse.secure
      nullable boolean

    • clickhouse.username
      string

  • features
    nullable object

    • features.guard_gateway_v3
      nullable object

      • features.guard_gateway_v3.mode
        nullable string

        • off

        • opportunistic

        • on

      • features.guard_gateway_v3.percentage
        nullable integer

  • guard
    nullable object

    • guard.actor_force_wake_pending_timeout_ms
      nullable unknown

      Timeout sent with actor force-wake requests in milliseconds.

    • guard.actor_ready_timeout_ms
      nullable unknown

      Timeout for waiting for an actor to become ready in milliseconds.

    • guard.enable_websocket_health_route
      nullable unknown

      Enables the internal websocket health route for debug and latency testing. This is intended for websocket ping/pong verification and should remain disabled in normal deployments.

    • guard.host
      nullable unknown

      Host for HTTP traffic

    • guard.http_max_request_body_size
      nullable unknown

      Max HTTP request body size in bytes (first line of defense).

    • guard.https
      nullable object

      • guard.https.port
        integer

      • guard.https.tls
        object

        • guard.https.tls.actor_cert_path
          string

        • guard.https.tls.actor_key_path
          string

        • guard.https.tls.api_cert_path
          string

        • guard.https.tls.api_key_path
          string

    • guard.port
      nullable unknown

      Port for HTTP traffic

    • guard.route_api_public_timeout_ms
      nullable unknown

      Timeout for resolving api-public routes in milliseconds.

    • guard.route_auth_check_timeout_ms
      nullable unknown

      Timeout for guard-owned route authorization checks in milliseconds.

    • guard.route_cache_ttl_ms
      nullable unknown

      TTL for cached route lookups in milliseconds.

    • guard.route_compute_timeout_ms
      nullable unknown

      Timeout for resolving compute routes in milliseconds.

    • guard.route_dispatch_timeout_ms
      nullable unknown

      Timeout for dispatching to each guard routing module in milliseconds.

    • guard.route_pegboard_auth_check_timeout_ms
      nullable unknown

      Timeout for pegboard actor route authorization checks in milliseconds.

    • guard.route_pegboard_fetch_actor_timeout_ms
      nullable unknown

      Timeout for fetching pegboard actor routing state in milliseconds.

    • guard.route_pegboard_resolve_query_timeout_ms
      nullable unknown

      Timeout for resolving pegboard actor query routes in milliseconds.

    • guard.route_pegboard_subscribe_timeout_ms
      nullable unknown

      Timeout for subscribing to pegboard actor routing events in milliseconds.

    • guard.route_pegboard_wake_signal_timeout_ms
      nullable unknown

      Timeout for sending pegboard actor wake signals in milliseconds.

    • guard.route_timeout_ms
      nullable unknown

      Backstop timeout for route resolution in milliseconds. Primary timeout signals live inside each guard routing phase.

    • guard.tcp_nodelay
      nullable unknown

      Enables TCP_NODELAY on accepted Guard sockets.

    • guard.trace_propagation
      nullable unknown

      Enables W3C trace context propagation (extract from incoming requests, inject into upstream requests/websockets).

    • guard.websocket_max_frame_size
      nullable unknown

      Max WebSocket frame size in bytes.

    • guard.websocket_max_message_size
      nullable unknown

      Max WebSocket message size in bytes.

  • logs
    nullable object

    • logs.redirect_logs_dir
      nullable unknown

  • metrics
    nullable object

    Configuration for the metrics service.

    • metrics.host
      nullable unknown

    • metrics.port
      nullable unknown

  • outbound
    nullable object

    Policy for outbound HTTP requests to user-configured destinations, such as serverless runner URLs. These requests originate from inside the trusted engine network, so without restrictions a caller who can configure a runner can reach internal-only services. The defaults deny every non-globally-routable destination except loopback.

    • outbound.allow_cidrs
      nullable unknown

      Additional CIDRs that are always permitted, evaluated after `deny_cidrs`. Use this to reach a specific internal service without opening up the whole private range.

    • outbound.allow_hosts
      nullable unknown

      Hostnames that are always permitted, whatever they resolve to. Matched exactly and case-insensitively, with no wildcards. Use this for a first-party service whose address is not known ahead of time, such as a Kubernetes service name. Anything served at a listed host becomes reachable by every runner config, so list individual hosts rather than a shared entry point.

    • outbound.allow_insecure_scheme
      nullable unknown

      Allow plaintext `http://` destinations. When disabled only `https://` is permitted.

    • outbound.allow_loopback
      nullable unknown

      Allow destinations that resolve to loopback addresses (127.0.0.0/8, ::1). Enabled by default so local development against `http://localhost:...` works without configuration.

    • outbound.allow_private_networks
      nullable unknown

      Allow destinations that resolve to private, link-local, shared (CGNAT), or otherwise non-globally-routable addresses. Self-hosted deployments that point runners at addresses on their own network, such as a Docker Compose service name, need this enabled.

    • outbound.deny_cidrs
      nullable unknown

      Additional CIDRs that are always denied. Takes precedence over every allow rule.

    • outbound.max_redirects
      nullable unknown

      Maximum number of redirects to follow. Every hop is re-checked against this policy.

  • pegboard
    nullable object

    • pegboard.actor_allocation_candidate_sample_size
      nullable unknown

      Amount of runners to query from the allocation queue and choose at random when allocating an actor.

    • pegboard.actor_allocation_threshold
      nullable unknown

      How long to wait for an ack response from the outbound request layer before setting actor as lost. Unit is in milliseconds.

    • pegboard.actor_create_rate_limit_drip_rate_ms
      nullable unknown

      Time to regain one actor creation token per namespace. Unit is in milliseconds.

    • pegboard.actor_create_rate_limit_requests
      nullable unknown

      Max burst of actor creations per namespace before throttling.

    • pegboard.actor_retry_duration_threshold
      nullable unknown

      How long to wait after starting to attempt to reallocate before before setting actor to sleep. Unit is in milliseconds.

    • pegboard.actor_start_threshold
      nullable unknown

      How long to wait after creating and not receiving a starting state before setting actor as lost. Unit is in milliseconds.

    • pegboard.actor_stop_threshold
      nullable unknown

      How long to wait after stopping and not receiving a stop state before setting actor as lost. Unit is in milliseconds.

    • pegboard.base_retry_timeout
      nullable unknown

      Time to delay an actor from rescheduling after a rescheduling failure. Unit is in milliseconds.

    • pegboard.default_metadata_poll_interval
      nullable unknown

      Default metadata poll interval for serverless runners when not specified in runner config. Unit is in milliseconds.

    • pegboard.envoy_eligible_threshold
      nullable unknown

      How long after last ping before considering a envoy ineligible for allocation. Unit is in milliseconds.

    • pegboard.envoy_event_demuxer_gc_interval
      nullable unknown

      GC interval for actor event demuxer in milliseconds.

    • pegboard.envoy_event_demuxer_max_last_seen_threshold
      nullable unknown

      Max time since last seen before actor is considered stale, in milliseconds.

    • pegboard.envoy_expire_scheduler_max_concurrent_expires
      nullable unknown

      Maximum concurrent background expire operations spawned by the read-path envoy expire scheduler.

    • pegboard.envoy_expire_scheduler_max_pending
      nullable unknown

      Maximum pending envoys tracked by the read-path envoy expire scheduler.

    • pegboard.envoy_load_balancer
      nullable object

      • Variant #1

        • pegboard.envoy_load_balancer.random_ping_timestamp
          object

          • pegboard.envoy_load_balancer.random_ping_timestamp.use_snapshot_read
            nullable boolean

      • Variant #2

        • pegboard.envoy_load_balancer.newest_ping_timestamp
          object

          • pegboard.envoy_load_balancer.newest_ping_timestamp.use_snapshot_read
            nullable boolean

      • Variant #3

        • pegboard.envoy_load_balancer.random_full_range
          object

          • pegboard.envoy_load_balancer.random_full_range.use_snapshot_read
            nullable boolean

      • Variant #4

        • pegboard.envoy_load_balancer.hash
          object

          • pegboard.envoy_load_balancer.hash.max_scan
            nullable integer

            Maximum stale entries walked per `scan_for_fresh` call before aborting and returning `None`. Circuit breaker against pathological drain scenarios. Default 16. Range 1..=256.

          • pegboard.envoy_load_balancer.hash.samples
            nullable integer

            Number of independent ring samples per allocation. `1` = uniform pick (no slot read), `>= 2` = power-of-K-choices.

          • pegboard.envoy_load_balancer.hash.slot_jitter
            nullable integer

            Additive random integer added to each candidate's slot count before the min-slot comparison. Decorrelates concurrent allocators reading the same stale `SlotsKey` snapshot. Only relevant when `samples >= 2`. `0` disables. Range 0..=64. Default 4. See `slot_jitter` block in `engine/packages/pegboard/src/workflows/actor2/alloc_serverful/hash.rs` for how the default was sized.

          • pegboard.envoy_load_balancer.hash.use_snapshot_read
            nullable boolean

          • pegboard.envoy_load_balancer.hash.virtual_nodes
            nullable integer

    • pegboard.envoy_lost_threshold
      nullable unknown

      How long to wait before considering an envoy lost and evicting all of its actors. Unit is in milliseconds.

    • pegboard.envoy_max_response_payload_size
      nullable unknown

      Max response payload size in bytes from actors.

    • pegboard.envoy_ping_timeout
      nullable unknown

      Max time since last pong before the envoy connection is terminated. Unit is in milliseconds.

    • pegboard.envoy_update_ping_interval
      nullable unknown

      Ping interval for envoy updates in milliseconds.

    • pegboard.envoy_websocket_rate_limit_drip_rate_us
      nullable unknown

      Time to regain one inbound WebSocket message token on a single envoy connection. Unit is in microseconds. The envoy connection multiplexes every actor on a runner, so the sustained ceiling is far higher than the per-client gateway limit and needs sub-millisecond granularity to express.

    • pegboard.envoy_websocket_rate_limit_requests
      nullable unknown

      Max burst of inbound WebSocket messages on a single envoy connection before throttling.

    • pegboard.gateway_gc_interval_ms
      nullable unknown

      GC interval for in-flight requests in milliseconds.

    • pegboard.gateway_http_max_request_body_size
      nullable unknown

      Max HTTP request body size in bytes for requests to actors.

    • pegboard.gateway_http_response_body_channel_capacity
      nullable unknown

      Number of body chunks buffered between a streaming response handler and its HTTP client.

    • pegboard.gateway_http_response_queue_max_messages
      nullable unknown

      Maximum number of envoy response messages buffered per HTTP request.

    • pegboard.gateway_hws_max_pending_size
      nullable unknown

      Max pending message buffer size for hibernating WebSockets in bytes.

    • pegboard.gateway_hws_message_ack_timeout_ms
      nullable unknown

      Hibernating WebSocket message ack timeout in milliseconds.

    • pegboard.gateway_response_chunk_idle_timeout_ms
      nullable unknown

      Timeout between streaming HTTP response chunks in milliseconds. Disabled when unset so long-lived streams such as SSE may remain idle.

    • pegboard.gateway_response_start_timeout_ms
      nullable unknown

      Timeout for response to start in milliseconds.

    • pegboard.gateway_streaming_http_response_queue_max_bytes
      nullable unknown

      Maximum streaming response bytes buffered per HTTP request.

    • pegboard.gateway_tunnel_ping_timeout_ms
      nullable unknown

      Tunnel ping timeout in milliseconds.

    • pegboard.gateway_update_ping_interval_ms
      nullable unknown

      Ping interval for gateway updates in milliseconds.

    • pegboard.gateway_websocket_open_timeout_ms
      nullable unknown

      WebSocket open/handshake timeout in milliseconds.

    • pegboard.gateway_websocket_rate_limit_drip_rate_ms
      nullable unknown

      Time to regain one inbound WebSocket message token on a single connection. Unit is in milliseconds.

    • pegboard.gateway_websocket_rate_limit_requests
      nullable unknown

      Max burst of inbound WebSocket messages on a single connection before throttling.

    • pegboard.hibernating_request_eligible_threshold
      nullable unknown

      How long after last ping before considering a hibernating request disconnected. Unit is in milliseconds.

    • pegboard.min_metadata_poll_interval
      nullable unknown

      Minimum metadata poll interval for serverless runners. The actual poll interval will be the maximum of this value and the runner config's `metadata_poll_interval` setting. This prevents excessive polling even if the runner config specifies a very short interval. Unit is in milliseconds.

    • pegboard.pool_desired_max_override
      nullable unknown

      Global pool desired max.

    • pegboard.preload_max_total_bytes
      nullable unknown

      Maximum total size of all preloaded KV data sent with the actor start command. Setting to 0 disables all preloading. Unit is in bytes. Default: 1,048,576 (1 MiB).

    • pegboard.reschedule_backoff_max_exponent
      nullable unknown

      Maximum exponent for the reschedule backoff calculation. This controls the maximum backoff duration when rescheduling actors.

    • pegboard.retry_reset_duration
      nullable unknown

      How long an actor goes without retries before it's retry count is reset to 0, effectively resetting its backoff to 0. Unit is in milliseconds.

    • pegboard.runner_eligible_threshold
      nullable unknown

      How long after last ping before considering a runner ineligible for allocation. Unit is in milliseconds.

    • pegboard.runner_event_demuxer_gc_interval_ms
      nullable unknown

      GC interval for actor event demuxer in milliseconds.

    • pegboard.runner_event_demuxer_max_last_seen_ms
      nullable unknown

      Max time since last seen before actor is considered stale, in milliseconds.

    • pegboard.runner_lost_threshold
      nullable unknown

      How long to wait after last ping before forcibly removing a runner from the database and deleting its workflow, evicting all actors. Note that the runner may still be running and can reconnect. Unit is in milliseconds.

    • pegboard.runner_max_response_payload_body_size
      nullable unknown

      Max response payload size in bytes from actors.

    • pegboard.runner_ping_timeout_ms
      nullable unknown

      Max time since last pong before the runner connection is terminated. Unit is in milliseconds.

    • pegboard.runner_pool_consecutive_successes_to_clear_error
      nullable unknown

      Number of consecutive successes required to clear an active runner pool error. This prevents a single success from clearing an error during flapping conditions. Higher values provide more stability but slower recovery from transient errors.

    • pegboard.runner_update_ping_interval_ms
      nullable unknown

      Ping interval for runner updates in milliseconds.

    • pegboard.serverless_backoff_max_exponent
      nullable unknown

      Maximum exponent for the serverless backoff calculation. This controls the maximum backoff duration when serverlessly connecting to runners.

    • pegboard.serverless_base_retry_timeout
      nullable unknown

      Time to delay a serverless runner from attempting a new outbound connection after a connection failure. Unit is in milliseconds.

    • pegboard.serverless_drain_grace_period
      nullable unknown

      **Deprecated** Configure the drain period in the runner config. Drain grace period for serverless runners. This time is subtracted from the configured request duration. Once `duration - grace` is reached, the runner is sent stop commands for all of its actors. After the grace period is over (i.e. the full duration is reached) the runner websocket is forcibly closed. Unit is in milliseconds.

    • pegboard.serverless_retry_reset_duration
      nullable unknown

      How long a serverless runner goes without connection failures before it's retry count is reset to 0, effectively resetting its backoff to 0. Unit is in milliseconds.

  • pyroscope
    nullable object

    • pyroscope.sample_rate
      nullable unknown

      Sampling frequency in Hz.

    • pyroscope.server_url
      string

      Base URL of the Pyroscope server profiles are pushed to. Presence of this block means profiling is available; the profiler itself is toggled at runtime via the `profile enable`/`profile disable` CLI and starts off.

  • runtime
    nullable object

    • runtime.allow_version_rollback
      nullable unknown

      Whether or not to allow running the engine when the previous version that was run is higher than the current version.

    • runtime.force_shutdown_duration
      nullable unknown

      Time (in seconds) after which the engine process will forcibly exit after receiving SIGTERM. Must be greater than or equal to both worker_shutdown_duration and guard_shutdown_duration. Defaults to 10 minutes.

    • runtime.gasoline_loop_history_iteration_retention_count
      nullable unknown

      How many forgotten loop iterations to retain (per workflow name) in storage for debugging purposes. Defaults to 100. Set "default" key to apply to all workflows.

    • runtime.gasoline_prune_eligibility_duration
      nullable unknown

      Time (in seconds) after completion before considering a workflow eligible for pruning. Defaults to 7 days. Set to 0 to never prune workflow data.

    • runtime.gasoline_prune_interval_duration
      nullable unknown

      Time (in seconds) to periodically check for workflows to prune. Defaults to 12 hours.

    • runtime.guard_shutdown_duration
      nullable unknown

      Time (in seconds) to allow for guard to wait for pending requests after receiving SIGTERM. Defaults to 10 minutes.

    • runtime.udb_throttle_bytes_per_second
      nullable unknown

      Cluster-wide budget, in bytes per second, per named UniversalDB throttle. Each entry sets the read and write axes independently, for example `udb_throttle_bytes_per_second.depot_compaction.read`. An axis with no entry is unthrottled.

      • runtime.udb_throttle_bytes_per_second[key].read
        nullable unknown

      • runtime.udb_throttle_bytes_per_second[key].write
        nullable unknown

    • runtime.worker_cpu_max
      nullable unknown

      Adjusts worker curve around this value (in millecores, i.e. 1000 = 1 core). Is not a hard limit. When unset, uses /sys/fs/cgroup/cpu.max, and if that is unset uses total host cpu.

    • runtime.worker_load_shedding_beta
      nullable unknown

      Exponential moving average beta term. Defaults to 0.95.

    • runtime.worker_load_shedding_curve
      nullable unknown

      Determine load shedding ratio based on linear mapping on cpu usage. We will gradually pull less workflows as the cpu usage increases. Units are in (permille overall cpu usage, permille) Default: | . . 100% | _____ . | .\ . % wfs | . \ . | . \. 5% | . \_____ |_____.___.______ 0 70% 90% avg cpu usage

    • runtime.worker_max_concurrent_workflows
      nullable unknown

      Maximum concurrently running workflows of a given workflow name for the **entire cluster**.

    • runtime.worker_max_wake_condition_clears_per_pull
      nullable unknown

      Maximum wake condition keys a worker clears when leasing workflows in a single pull. Defaults to 10000.

    • runtime.worker_max_workflows_per_pull
      nullable unknown

      Maximum workflows a worker attempts to lease in a single pull. Defaults to 1000.

    • runtime.worker_shutdown_duration
      nullable unknown

      Time (in seconds) to allow for the gasoline worker engine to stop gracefully after receiving SIGTERM. Defaults to 30 seconds.

  • sqlite
    nullable object

    • sqlite.actor_read_bytes_per_second
      nullable unknown

      Cluster-wide budget, in bytes per second, for FoundationDB reads issued by actor `get_pages`. Unset means unthrottled. Reads matter here because a large staged commit makes the pages it staged take the slow read path (their PIDX owner sits above head, so a reader walks history for them), which means read volume spikes exactly when write volume peaks.

    • sqlite.actor_write_bytes_per_second
      nullable unknown

      Cluster-wide budget, in bytes per second, for FoundationDB writes issued by actor commits, including each segment of a staged commit. Unset means unthrottled, which is the behaviour before this existed. A staged commit lets one actor push an unbounded byte volume through `commit`, so this is the bound for that; it is opt-in because a byte-rate cap on the actor write path stalls user-visible commits, and that is not a default worth taking until an operator asks for it.

    • sqlite.compaction_admission_percent
      nullable unknown

      Percentage (0-100) of database branches admitted to run compaction, keyed by a stable hash of the branch id. A branch whose hash falls outside the admitted fraction skips starting any compaction job (hot, cold, reclaim) while still tracking its backlog. This is a gradual rollout / load-shedding knob: it bounds how many databases compact at once so enabling compaction over a large uncompacted herd cannot saturate FDB all at once. Re-evaluated on every manager refresh, so raising it lets a previously skipped branch compact on its next check without restarting anything. Defaults to 100 (every branch admitted).

    • sqlite.compaction_hot_fold_direct_to_shard
      nullable unknown

      Whether hot compaction folds shard images straight into the live `SHARD` tier instead of staging them and having the install copy them across byte for byte. Halves hot compaction's FDB write volume, because the image stops being written twice. Read per slice, so flipping it takes effect on the next slice without restarting anything. Nothing about the mode is persisted: the install discovers where an image landed by looking for it, so a drain that spans a flip installs correctly either way and a mixed job needs no special handling. No persisted format changes, so there is no version floor to clear before turning this on and nothing on disk to downgrade after turning it off. Rolling back is flipping it off; new slices stage again from that point. A compaction job abandoned mid-drain leaves shard images behind. Normally its successor reproduces the same boundaries and overwrites them, so they do not accumulate. A forced drain takes the live head by design, so an abandoned forced drain can strand images that no later drain revisits; those are inert for reads but nothing reclaims them. Defaults to off.

    • sqlite.compaction_install_throttle_admit_soft_util
      nullable unknown

      Utilization of the advancing lanes' budget below which every such charge is admitted. Defaults to 0.5.

    • sqlite.compaction_install_throttle_budget_multiplier
      nullable unknown

      Multiplier the lanes that advance the pipeline without duplicating apply to the compaction byte budget before the throttle's admission ramp is evaluated: hot install, cold publish, cold staging, and hot folds that write straight to the shard tier. Install folds staged shards into the manifest and releases the staging area, and cold publish is what lets the cold watermark advance so reclaim may delete. Defaults to 1.0, so the configured byte rate stays an honest cap on everything except reclaim. Cold staging measures against this rather than the staging budget because its heavy output is object-storage bytes, so it leaves no FoundationDB duplicate to bound.

    • sqlite.compaction_max_hot_drain_span_txids
      nullable unknown

      The largest span of txids one hot compaction drain folds before its install advances `hot_watermark_txid`. The watermark is what makes a delta reclaimable, and a drain advances it exactly once, at the end. So this is also the granularity of reclaim eligibility: a branch whose whole history fits in one span holds every delta resident until the entire fold lands, which sets the peak footprint at live shards plus the full delta history. Lowering it folds in smaller chunks so reclaim interleaves and the peak comes down, at the cost of re-folding a page once per chunk that touches it and of running proportionally more jobs. Each drain rounds its own span down to a multiple of the drain head grain; this cap is not itself rounded. Defaults to 512, which keeps a typical branch draining over several jobs rather than one, so reclaim gets more than a single eligibility window per branch.

    • sqlite.compaction_read_bytes_per_second
      nullable unknown

      Cluster-wide budget, in bytes per second, for FoundationDB reads issued by the heavy depot compaction read transactions (hot stage and hot install). Bounds how fast compaction reads a backlog's DELTA history so a deep, overwrite-heavy chain cannot pin a handful of storage processes on reads. Defaults to 64 MiB/s: reads carry no FDB replication amplification so this can sit above the write budget, but the read-amplification pathology (a throttled stage re-reading the same slice) makes an explicit cap worthwhile. Shares the same conflict-free windowed-counter design as the write throttle.

    • sqlite.compaction_reclaim_throttle_admit_soft_util
      nullable unknown

      Utilization of the reclaim lane's budget below which every reclaim charge is admitted. Higher than the other lanes so reclaim stays fully admitted across the whole band where they ramp down, instead of merely ramping down more slowly. Defaults to 0.9.

    • sqlite.compaction_reclaim_throttle_budget_multiplier
      nullable unknown

      Multiplier the reclaim lane applies to the compaction byte budget before the throttle's admission ramp is evaluated. Above 1.0 on purpose: reclaim deletes rather than produces, so it must keep admitting through the region where every other lane has already backed off, and its own charges land on the same counter so the arrangement stays self-regulating. This is also the bound on how far peak compaction pressure can exceed the configured byte rate. Defaults to 1.5.

    • sqlite.compaction_stage_throttle_admit_soft_util
      nullable unknown

      Utilization of the staging lane's budget below which every staging charge is admitted. Between this mark and that budget the admit probability ramps linearly to zero. Defaults to 0.5. Applies on the same terms as `compaction_stage_throttle_budget_multiplier`.

    • sqlite.compaction_stage_throttle_backoff_ms
      nullable unknown

      How long, in milliseconds, a throttled staging slice backs off before its drain retries. Deliberately far longer than the other lanes. Admission is probabilistic, so a denied slice that retries within the same window keeps rolling dice against the estimate install and reclaim are trying to work under. Backing staging off across several windows removes that retry pressure rather than merely losing each roll. Defaults to 30 seconds. Applies only while `compaction_hot_fold_direct_to_shard` is off, for the same reason the staging multiplier does: a direct fold is not competing with install over a duplicate it created, so parking it that long would only stall the fold.

    • sqlite.compaction_stage_throttle_budget_multiplier
      nullable unknown

      Multiplier hot staging applies to the compaction byte budget before the throttle's admission ramp is evaluated. Every compaction lane charges one shared counter, so a multiplier below 1 is how much of the total compaction byte rate staging is allowed to occupy before it stops admitting. The lanes that advance the pipeline (install, cold publish, cold staging) and the lane that deletes (reclaim) measure the same counter against larger budgets, so they keep admitting through the region where staging is already denied. This bounds a duplicate. Staging writes a second copy of every page it folds and cannot release either copy until install consumes it, so a cluster where staging wins the shared budget grows its FoundationDB footprint without bound while install and reclaim starve. Defaults to 0.3. Lower it to drain a backlog harder, raise it toward 1.0 to let staging and install compete as peers. Applies only while `compaction_hot_fold_direct_to_shard` is off. A direct fold writes the authoritative image once, so there is no duplicate to bound and the slice measures against `compaction_install_throttle_budget_multiplier` instead.

    • sqlite.compaction_write_bytes_per_second
      nullable unknown

      Cluster-wide budget, in bytes per second, for FoundationDB writes issued by depot compaction (hot compaction and reclaim). Bounds how fast compaction drains a backlog so it cannot saturate FDB's write queue. Defaults to 16 MiB/s, a conservative fraction of the 500 MiB/s sustained disk throughput recommended for FDB in the self-hosting docs, leaving headroom for live traffic and FDB write amplification.

    • sqlite.manager_idle_poll_interval_ms
      nullable unknown

      How long, in milliseconds, a depot database branch manager that received no work waits before checking again. Reads never signal the manager, so without a poll a branch that stops being written parks on a deadline-less listen and never reclaims again: its cold-backed hot rows stay resident in FoundationDB forever, and the one-shot stale-PIDX repair never gets dispatched. One reclaim job drains a branch's whole backlog, so this only bounds how long a newly idle branch keeps duplicate hot copies. Defaults to 12 hours. Each wake is a bounded-budget FoundationDB snapshot, so lower it if reclaim latency on idle branches matters more than the cluster-wide refresh cost (at 1M branches, 12 hours is ~23 refreshes/sec).

    • sqlite.manager_reclaim_interval_ms
      nullable unknown

      How long, in milliseconds, a depot database branch manager waits before its next reclaim/GC check after arming one. This is the latency floor on freeing hot rows that compaction has already superseded: the footprint a branch carries stays at its peak for up to this long after the work that made it reclaimable finished. Every wake costs a bounded-budget FoundationDB snapshot per branch, so lower it only where reclaim latency matters more than that per-branch refresh cost. Defaults to 10 minutes.

    • sqlite.pitr
      nullable object

      • sqlite.pitr.interval_ms
        nullable unknown

        Spacing, in milliseconds, between the PITR coverage positions hot compaction retains for a database that has no bucket or database policy override. Each position holds a complete image of every shard it covers until it expires, so halving this roughly doubles the retained shard versions. Defaults to 5 minutes.

      • sqlite.pitr.retention_ms
        nullable unknown

        How long, in milliseconds, PITR coverage is retained for a database that has no bucket or database policy override. History older than this window is reclaimable. Defaults to 7 days.

    • sqlite.unstable_disable_commit_size_cap
      nullable unknown

    • sqlite.unstable_disable_compaction
      nullable unknown

      UNSTABLE: disables SQLite hot compaction.

  • telemetry
    nullable object

    • telemetry.enabled
      boolean

  • topology
    nullable object

    • topology.datacenter_label
      integer

      Must be included in `datacenters`

    • topology.datacenters
      unknown

  • postgres
    nullable object

    • postgres.nats
      nullable object

      • postgres.nats.addresses
        array of strings

      • postgres.nats.client_capacity
        nullable integer

        Capacity of the async-nats client command queue. When this fills, client operations such as subscribe, publish, and drain wait until the connection task catches up.

      • postgres.nats.disable_memory_optimization
        nullable boolean

        When true, force every UPS publish to round-trip through NATS instead of taking the in-process fast path for subjects that have a local subscriber on the same engine pod. Opt-in diagnostic; default false.

      • postgres.nats.password
        nullable string

      • postgres.nats.port
        nullable unknown

      • postgres.nats.subscription_capacity
        nullable integer

        Capacity of each individual NATS subscriber message buffer. When this fills, async-nats drops the message and emits `SlowConsumer`. Rivet logs this as `nats slow consumer`.

      • postgres.nats.username
        nullable unknown

    • postgres.ssl
      nullable object

      • postgres.ssl.client_cert_path
        nullable unknown

        Path to the client certificate file Used for client certificate authentication Equivalent to PostgreSQL's `sslcert` parameter

      • postgres.ssl.client_key_path
        nullable unknown

        Path to the client private key file Used for client certificate authentication Equivalent to PostgreSQL's `sslkey` parameter

      • postgres.ssl.root_cert_path
        nullable unknown

        Path to the root certificate file for verifying the server's certificate Required when using custom certificate authorities (e.g., Supabase) Equivalent to PostgreSQL's `sslrootcert` parameter

    • postgres.url
      string

  • file_system
    nullable object

    • file_system.path
      string

Envoy load balancing

pegboard.envoy_load_balancer selects how actors are assigned to envoys. The hash strategy uses a hash ring:

{
	"pegboard": {
		"envoy_load_balancer": {
			"hash": {
				"virtual_nodes": 8,
				"samples": 2,
				"max_scan": 16,
				"use_snapshot_read": true
			}
		}
	}
}

Use samples: 1 for a uniform random pick that skips slot reads, or samples: 2 or higher for power-of-K choices over envoy slot counts. Treat virtual_nodes as an operational invariant once envoys have registered: changing it reshuffles the ring.

Telemetry

OpenTelemetry export

The engine exports traces and metrics over OpenTelemetry to a collector you run.

VariablePurposeDefault
RIVET_OTEL_ENABLEDSet to 1 to enable exportoff
RIVET_OTEL_GRPC_ENDPOINTCollector endpointhttp://localhost:4317
RIVET_OTEL_SAMPLER_RATIOTrace sampling ratio0.001

Crash reporting

The control plane sends crash reports to Rivet’s error-tracking service by default. Disable it with one flag:

{
	"telemetry": {
		"enabled": false
	}
}

Or as an environment variable:

RIVET__TELEMETRY__ENABLED=false

Next steps