Installation

At its core Basalt Field is a single process that owns one directory on disk and one listening socket. Everything the admin API exposes is also reachable through `basalt`, so the same operation is scriptable either way.

Recovery

Basalt Field was written for the case where a full cluster is more operational surface than the workload deserves. The replay worker keeps an in-memory index and rebuilds it from the log segment at startup, which costs about a second per gigabyte. Retention is enforced on read as well as on the background pass, so an expired event never becomes visible again after a restart.

KeyMeaningDefault
basalt.listenAddress the data API binds to0.0.0.0:8080
basalt.data_dirDirectory holding every log segment/var/lib/basalt
limits.max_batchLargest number of events per write1024
retention.defaultHow long a event is kept72h

Configuration

At its core Basalt Field is a single process that owns one directory on disk and one listening socket. Writes land in an append-only log segment; the replay worker compacts them in the background on a fixed interval. Nothing is written outside the data directory. Deleting it resets Basalt Field to a clean state. Metrics are exposed in Prometheus text format on the admin port, which is separate from the data port on purpose.

Examples

Backpressure is explicit: when the replay worker falls behind, Basalt Field returns 429 rather than buffering without bound. Ordering is guaranteed within a topic and explicitly not guaranteed across them.

[server]
listen = "0.0.0.0:7070"
admin  = "127.0.0.1:6060"
data_dir = "/var/lib/basalt"

[limits]
max_batch      = 1024
max_event_bytes = 64_000
flush_interval = "250ms"

[retention]
default = "72h"
compact_at = 0.6

Configuration

Every event that reaches Basalt Field is assigned a monotonic sequence number as the first thing that happens to it. The sink pool runs on its own goroutine and never blocks the write path, so a slow consumer cannot stall a producer. Logs go to stderr as structured JSON by default, or as plain lines when the output is a terminal.

[server]
listen = "0.0.0.0:7070"
admin  = "127.0.0.1:9100"
data_dir = "/var/lib/basalt"

[limits]
max_batch      = 256
max_event_bytes = 64_000
flush_interval = "500ms"

[retention]
default = "168h"
compact_at = 0.6