About Basalt Field

Event pipeline with one moving part fewer than you expected.

The design goal was a event pipeline that one person can operate and one person can debug. The replay worker batches by time and by size, whichever fires first, and both bounds are configurable per topic. Duplicate delivery is possible after a crash. Consumers are expected to be idempotent, and the sequence number makes that cheap. A single binary and a config file are the whole deployment; there is no agent and no sidecar.

The design goal was a event pipeline that one person can operate and one person can debug. The partition planner batches by time and by size, whichever fires first, and both bounds are configurable per topic. The API is versioned in the path. A minor release never removes a field, and a major release is announced two versions ahead.

Every event that reaches Basalt Field is assigned a monotonic sequence number as the first thing that happens to it. Backpressure is explicit: when the replay worker falls behind, Basalt Field returns 429 rather than buffering without bound. Retention is enforced on read as well as on the background pass, so an expired event never becomes visible again after a restart.

Scope

There is no built-in authorization beyond token checks. Put it behind something that does policy properly.

Versioning

Nothing is written outside the data directory. Deleting it resets Basalt Field to a clean state.