Your bucket is the boundary
Cardinal indexes what's already in your object storage. Nothing to hand over, no vendor storage to trust; the migration is just "start writing to your own S3".
Migrations
Cardinal is S3-first. Telemetry lands in your object storage from the OpenTelemetry Collector, Vector, Fluent Bit, or code you wrote yourself. A stateless query engine sits downstream, serving Grafana, the Cardinal UI, and agents in Claude, Codex, Gemini, and Cursor. There's no vendor storage to trust, and no proprietary agent to install.
S3
the only durable storage in the path
0
proprietary agents on your hosts
any
OTEL-compatible or custom S3 writer
In a traditional stack the vendor owns storage. Switching means moving the data. When the bucket is yours, the switch is upstream and downstream of a boundary that never moves.
Cardinal indexes what's already in your object storage. Nothing to hand over, no vendor storage to trust; the migration is just "start writing to your own S3".
The OTEL Collector with the AWS S3 exporter writes straight into your bucket. Whatever the Collector can receive converts on the way through, so there's no proprietary agent to install and no Cardinal-specific SDK in your services.
Cardinal doesn't own your data; it reads from S3 on demand. Scale readers up during cutover, down when quiet. Nothing to migrate at the query layer either.
Same data serves Grafana, the Cardinal UI, and agents in Claude, Codex, Gemini, or Cursor. Swapping the query engine later doesn't touch instrumentation or storage.
Four mechanical steps. Run both stacks in parallel for as long as you need. The boundary is your bucket, so nothing forces a hard cutover.
01
Add the AWS S3 exporter to your OTEL Collector and aim it at an S3 prefix. Cardinal indexes what lands there.
02
Keep your incumbent live. Cardinal indexes the same data path in the background. Compare results side-by-side for as long as you want.
03
Point Grafana, the Cardinal UI, and agents at Cardinal. The bucket doesn't move; the query surface does.
04
As retention windows overlap, wind down the vendor's ingest and indexed storage. Your OTEL config stays where it is, portable for whatever's next.
The fastest way to evaluate Cardinal is to spin up a bucket, drop some telemetry in, and query it. Everything after that is optional.