The archive is the event log's cold tier. A sink normally sees perfdata; the archive sink sees the whole log -- every decision the engine ever made -- and writes it as zstd-compressed JSON lines, one event per line, sealed into segments named by the sequence range they cover, to a local directory or an S3-compatible bucket. It is a consumer of the log and never a source of truth: replay goes through the event log, and the archive is what you read with zstd, jq, ClickHouse or DuckDB when jaque is not running, or years later. It is off until declared.

1. What it archives

The entire event log: every event's Codec envelope, one JSON line each, in the order of the log's sequence numbers. It is declared as a sink with type: "archive", whose input is fixed to events.

sinks: {
	log: {
		type:          "archive"
		url:           "file:///var/lib/jaque/archive"
		segment_bytes: 67108864
	}
}

Two URL forms are accepted.

Form Destination
file:///dir a local directory
s3://[KEY:SECRET@]bucket/prefix?endpoint=host:port&spool=/dir an S3-compatible bucket, with spool as the local directory segments are built in before upload; region and insecure=true are optional query parameters

Credentials for the S3 form come from the URL's userinfo when present, otherwise from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY in the environment.

2. Segments

segment_bytes (default 64 MiB) is the uncompressed size at which a partial segment is sealed. Sealed files are named events-<first>-<last>.jsonl.zst after the first and last sequence they contain, so the set of files is an index of the log by range.

On startup, Recover truncates a segment that was mid-write to its last complete line, seals it, and the archive follower resumes right after the last sequence already archived. A crash mid-segment neither corrupts the archive nor loses an event silently: the event the truncated line held is still in the log and is archived again in the next segment.

Several archive sinks with different urls coexist without conflict: the sinks: block allows as many as there are destinations.

3. Reading it without jaque

The format is the point: plain JSON lines, zstd-compressed, no reader of jaque's own required.

zstd -dc events-*.jsonl.zst | jq .
-- ClickHouse
SELECT * FROM file('events-*.jsonl.zst', JSONEachRow)
-- DuckDB
SELECT * FROM read_json('events-*.jsonl.zst')

The line format is the event log's own envelope, documented in Event log schema.

4. Where it runs

The archive has input: "events", so it runs under -target all or -target engine, which read the whole log, and is dropped by -target sink, which shards the log by object ownership; see Sinks and perfdata, section 6. Its lag behind the log is jaque_eventlog_consumer_lag{follower="sink/<name>"}.

5. Off by default

Like every sink, the archive is opt-in. No archive exists until the operator declares one under sinks:; nothing is written anywhere until it is pointed somewhere.

6. Security considerations

The archive is the complete event log, including check output, in clear text once decompressed. Treat the directory or bucket as you would the log itself. An S3 URL with KEY:SECRET@ in it makes the CUE config a secret; the environment form keeps credentials out of the file. The archive opens no listener and makes outbound connections only to the configured endpoint.