How Infino works

One copy of your data on object storage, searched in place with full-text, vector, and SQL. It runs as a distributed service: a stateless gateway in front of per-database engine workers, with storage and compute that scale separately.

cat ARCHITECTURE.md

The whole system is three layers over one bucket.

  • A stateless gateway authenticates each request and routes it to a worker.
  • Each database runs as its own engine process with a local cache.
  • Object storage holds every byte. Workers are only compute over it, so any worker can serve any database, and more workers add capacity.
your application REST · Arrow or JSON the console account · keys · usage HTTPS gateway authenticate · route to your worker · meter stateless · holds no tenant data · add instances to scale routes by database WORKER PROCESSES one per database · engine + local cache · disposable worker one database engine + cache worker your database engine + cache worker one database engine + cache byte-range reads · appends OBJECT STORAGE S3 · Azure · GCS · local · the source of truth superfiles _platform/ workers keep no permanent data · object storage holds all of it

infino explain superfile

Your data is just files

Each chunk of a table is one self-contained file, a superfile.

  • Columns and both search indexes, keyword and vector, live in the same file. No sidecar indexes to keep in sync.
  • A superfile is a valid Apache Parquet file, so DuckDB, pandas, and Spark open the same bytes as an ordinary table.
ONE SUPERFILE = ONE FILE a valid Parquet file scalar columns Parquet row groups full-text index vector index footer infino reader BM25 · vector · SQL reads the whole file DuckDB · pandas · Spark read the columns as plain Parquet the index regions ride along, unread the same bytes, two readers

infino explain manifest

Files are never edited, only added

A table is its manifest: the list of files that make it up right now.

  • A write adds new files and publishes a new manifest. It never edits the files already there.
  • Switching manifests is one atomic step, so a reader sees the table before a write or after it, never halfway.
  • Snapshots are cheap: an older manifest still points at files that are all present.
manifest v1 · [ A, B ] NEW FILE A B C manifest v2 · current · [ A, B, C ] commit (atomic) A and B are reused unchanged · the pointer swaps in one step

infino explain cache

Storage and compute are separate

A worker stores nothing permanently. Object storage is the source of truth.

  • It fetches byte ranges on demand and caches the hot parts on local disk.
  • A cold file is served from storage while it loads in the background, then memory-mapped for local-disk speed.
  • Storage and compute scale on their own, and you pay for each separately.
cold only in object storage served by ranged reads warm resident on local disk memory-mapped hot pages in RAM memory speed object-storage speed memory speed object storage · the full dataset, always first read served here

infino query --explain

How a query runs

A query pins one snapshot, then prunes before reading a byte.

  • Per-file summaries in the manifest, value ranges, a keyword presence filter, and vector centroids, skip files that cannot match.
  • It fetches only the byte ranges the survivors need, searches them in parallel, and merges one ranked answer.
  • Keyword, vector, and SQL share one pruning layer, so a hybrid query runs in a single pass.
pin snapshot prune skip files that cannot match fetch only needed bytes search BM25 · vector · SQL in parallel merge rank NO BYTES READ YET · JUST THE FILE LIST BYTES READ FROM HERE ON scalar, keyword, and vector share one pruning layer, so a hybrid query runs in one pass

See the numbers on real S3 →

infino explain workers

A database is a process, started on demand

Creating a database is just metadata. Workers start on the first request.

  • No worker runs until that first request, so an idle database costs only storage.
  • The request starts the engine on at least two separate nodes, picked by the load each node reports.
  • A worker serves one database and nothing else. That is the isolation boundary.
  • If a node fails, another copy is already serving. Nothing is recovered: the data was on object storage, never on that node.
registered a name written to the bucket no worker, no compute cost first request ACTIVE worker · node A worker · node C at least two copies, on distinct nodes object storage · the data is already here, shared by every node one process per database is the isolation boundary · if a node is lost, another copy still serves

infino deploy

Run it managed, or in your own cloud

The same build runs on any object store, chosen once at startup.

  • Amazon S3, Azure Blob Storage, Google Cloud Storage, or a local disk.
  • Run it managed on our infrastructure, or in your own cloud account, from one codebase.
  • Self-hosted, point it at a bucket in your account and run it yourself.

Run it managed →  ·  In your own cloud →