Install and configuration

Install #

First time with Prometheus and Grafana? docs/getting-started.md covers install through your first dashboard, step by step.

download pulse_0.2.0.zip version 0.2.0, released 2026-09-29

download pulseotlp_0.2.0.zip version 0.2.0, released 2026-09-29

Drop pulse_x.x.x.zip into your server's Mods/ folder and start the server. Add pulseotlp_x.x.x.zip beside it if you want OTLP push as well; the base mod works on its own and the OTLP one does not. On first boot Pulse writes ModConfig/pulse.json with its defaults:

json
{
  "Enabled": true,
  "Bind": "127.0.0.1",
  "Port": 9464,
  "RuntimeMetrics": true,
  "ChunksRefreshSeconds": 30,
  "Attribution": {
    "Enabled": false,
    "BurstTicks": 10,
    "IntervalSeconds": 10
  }
}

Set Enabled to false and the mod loads but registers nothing at all: no tick listener, no socket, no meter. RuntimeMetrics false drops the dotnet_* families and keeps the rest, which is what you want if something else already collects them on that host. ChunksRefreshSeconds is how often the loaded-chunk gauge is refreshed, and 30 is already fast for what that read costs; lower it only if you know why. Attribution is the per-mod breakdown described further down, off because it costs tick time.

Everything outside the Attribution block takes a server restart. The block itself does not: /pulse reload applies it live, and /pulse attribution on and off switch it without touching the file at all.

Upgrading does not mean editing the file by hand. Each mod checks its config file at startup and writes back any key it knows about that the file is missing, with that key's default; the values you already set are kept exactly as they are, and the log lists what was added. A key neither mod recognises does not survive that rewrite, so it is reported as a warning instead of disappearing quietly: usually it is a typo, and the setting you meant has been running on its default. A file that already holds every key is not written at all, which matters if you mount ModConfig read-only or keep it under version control.

Configuration #

Pulse and the OTLP mod each keep their settings in their own file under ModConfig/, written with their defaults on first boot. Both files pick up new keys the same way an upgrade adds them to a file that predates those keys; see the paragraph on that in Install.

A file that exists but will not parse is left exactly as it is: the mod logs the full path and the parser's own message, and Pulse runs that session on its built-in defaults rather than failing to start. Pulse OTLP does the same for pulse-otlp.json, except exporting stays off for that session instead of falling back to its own default endpoint, and any value Newtonsoft quoted in its message, a misconfigured Headers entry most often, is redacted before it reaches the log.

ModConfig/pulse.json

KeyDefaultWhat it doesLive or restart
EnabledtrueTurns the mod on. false loads it but registers nothing: no tick listener, no socket, no meter.Restart
Bind"127.0.0.1"Address the metrics endpoint binds. See A word on the bind address.Restart
Port9464Port the metrics endpoint listens on. If it is already taken, Pulse logs an error and runs without the endpoint.Restart
RuntimeMetricstrueServes the .NET runtime's own dotnet_* metrics alongside Pulse's. See Runtime metrics.Restart
ChunksRefreshSeconds30How often the loaded-chunk gauge, and the entity breakdown riding the same listener, are refreshed. Floored at 1 second, capped at one day (86400).Restart
Attribution.EnabledfalseTurns per-mod tick attribution on. See Attribution.Live, via /pulse reload
Attribution.BurstTicks10Consecutive ticks profiled per burst. Clamped to 1 through 300.Live, via /pulse reload
Attribution.IntervalSeconds10Seconds between the end of one burst and the start of the next. Floored at 1.Live, via /pulse reload

ModConfig/pulse-otlp.json

The OTLP mod has no reload command: every key below needs a restart to take effect.

KeyDefaultWhat it doesLive or restart
EnabledtrueTurns OTLP export on. false keeps the mod loaded but exports nothing.Restart
Endpoint"http://localhost:4318"Base address of the collector, without a signal path. Pulse appends /v1/metrics for http/protobuf; the exporter appends its own service path for grpc.Restart
Protocol"http/protobuf"http/protobuf or grpc. Anything else logs a warning and falls back to http/protobuf.Restart
Headers{}Headers sent with every export, for backend authentication. See OTLP export.Restart
IntervalSeconds60Seconds between two exports. Floored at 5, capped at 86400 (24 hours).Restart
IncludeRuntimeMetricstrueAdds the System.Runtime meter to what gets pushed. Independent of the base mod's RuntimeMetrics.Restart
ServiceName"vintagestory"Sets the service.name resource attribute. A blank value falls back to vintagestory; OTEL_SERVICE_NAME, if set, overrides this key.Restart

Source: README.md