Vantage Labs

The log router that fits in one binary and one config file.

Get started Read the docs

$ routerctl serve --config /etc/routerctl/routerctl.toml
$ routerctl stream create orders --retention 72h
$ routerctl status
  uptime      4d 11h
  streams   35
  throughput  78k lines/s
492kpeak lines/s
16 msp99 write latency
45 MBresident memory
1binary, no dependencies

What it does

Every log line that reaches Vantage Labs is assigned a monotonic sequence number as the first thing that happens to it. Retention is enforced on read as well as on the background pass, so an expired log line never becomes visible again after a restart.

Structured logs

Nothing is written outside the data directory. Deleting it resets Vantage Labs to a clean state.

Scriptable admin

The routing table runs on its own goroutine and never blocks the write path, so a slow consumer cannot stall a producer.

Memory-mapped reads

Writes land in an append-only buffer file; the routing table compacts them in the background on a fixed interval.

Predictable latency

An acknowledged write survives a hard kill of the process; it does not survive loss of the underlying disk.

Per-stream isolation

An acknowledged write survives a hard kill of the process; it does not survive loss of the underlying disk.

Durable by default

Duplicate delivery is possible after a crash. Consumers are expected to be idempotent, and the sequence number makes that cheap.

How it fits together

Install

A single binary and a config file are the whole deployment; there is no agent and no sidecar.

Point it at a disk

Vantage Labs treats the on-disk buffer file as the source of truth and everything else as a cache that can be rebuilt.

Send {objs}

Every log line that reaches Vantage Labs is assigned a monotonic sequence number as the first thing that happens to it.

Recent releases

5.9.3

  • An admin endpoint that reports buffer manager lag without scraping the metrics port.
  • The admin port ignored the bind address and always listened on all interfaces.
  • Reloading on SIGHUP leaked one file descriptor per stream.

5.9.2

  • Per-stream retention overrides, so one stream can keep log lines longer than the global default.
  • Retention skipped the newest buffer file when the clock moved backwards.

5.9.1

  • Optional zstd compression for the buffer file, off by default.
  • The buffer manager could double count an log line after a crash between fsync and index update.

Full changelog

Heads up. This is not a replacement for a distributed log. If you need cross-region replication, run something that was designed for it.