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.
| Key | Meaning | Default |
|---|---|---|
basalt.listen | Address the data API binds to | 0.0.0.0:8080 |
basalt.data_dir | Directory holding every log segment | /var/lib/basalt |
limits.max_batch | Largest number of events per write | 1024 |
retention.default | How long a event is kept | 72h |
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.6Configuration
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