Skip to content

Object Browser

Sairo’s object browser is the primary interface for exploring your S3 buckets. It is designed to stay responsive even when a single prefix contains hundreds of thousands of objects.

The object list is rendered with @tanstack/react-virtual, which only mounts the DOM nodes currently visible in the viewport. This means a folder with 100,000+ objects uses the same amount of memory and renders just as smoothly as a folder with 10.

Every location in the browser is represented by a URL fragment in the form #bucket:prefix/path/. You can bookmark any folder, share the URL with a teammate, or use the browser’s back and forward buttons to navigate your history.

https://sairo.example.com/#my-bucket:data/2026/02/

A breadcrumb bar at the top of the browser shows the current path. Click any segment to jump directly to that level of the hierarchy without reloading the page.

Click any column header to sort the current folder’s contents:

ColumnSort behavior
NameAlphabetical (A-Z)
SizeSmallest to largest
ModifiedOldest to newest

Click the same column again to reverse the direction.

A filter input above the table narrows the visible objects to those whose name matches the typed substring. Filtering operates on the current folder only and does not recurse into subfolders.

  • Create folder — Click the “New folder” button to create a zero-byte object with a trailing / that acts as a folder marker.
  • Bulk select — Use the checkboxes to select multiple objects, or click the header checkbox to select all visible items.
  • Bulk delete — With one or more objects selected, click “Delete” to remove them in a single batch request.

When you open a folder, Sairo’s backend streams object metadata to the browser as newline-delimited JSON (NDJSON). The frontend appends rows to the table as each chunk arrives rather than waiting for the full response. This gives you progressive rendering — you see the first results immediately, even if the folder contains millions of objects.

For very large folders, the backend pages through objects using keyset (cursor-based) pagination rather than offset pagination. Each page is fetched by seeking to the last key seen, so page latency and payload size stay constant no matter how deep into the folder you scroll — a folder with a million objects in a single prefix opens just as quickly as the first page. This is what keeps memory and response sizes bounded on the largest buckets.