Terminal app

s3ti

A terminal browser for object storage.

bash
brew install --cask arksigma/tap/s3ti

Columns nest from left to right, so the path you took stays on screen.

Features

Six storage systems, one browser

S3 and S3-compatible endpoints, the local filesystem, Azure Blob Storage, Google Cloud Storage, SMB shares, and SSH/SFTP. The goto prompt takes any of their URIs and switches backends in place.

Public buckets need no configuration

Point s3ti at an open dataset and it works. With no credentials in the environment it falls back to unsigned requests on its own, and bucket regions are auto-detected — no region flag to pass.

Large prefixes stay responsive

Listing pages stream into the UI as they arrive, and rendering is windowed, so a 100,000-key prefix scrolls exactly as fast as a 10-key one. Listings are cached per prefix and re-listed when what you are looking at goes stale.

Parquet without downloading the file

Schema, statistics, and a scrollable row grid come from footer-first ranged reads. Filters and column choices are pushed into the scan, so non-matching rows are never decoded and a 500 GB file browses like a small one.

Previews for everything else

Syntax-highlighted text with encoding detection, hex for binary, and inline images through kitty, iTerm2, or sixel, with a halfblocks fallback for terminals without image support.

Zarr stores read as arrays

Selecting a node shows dtype, shape, dimensions, chunking, and codecs instead of a wall of chunk keys. Both v2 and v3 are recognised, and a consolidated store description arrives in a single request.

Run an HTTP request in place

Paste a curl command or a bare URL into the goto prompt and the response opens in the same preview, with the full table interface for Parquet and JSON bodies. No shell is involved, and credentials are redacted from titles, logs, and clipboard yanks.

Read-only when you need it

Start in read-only mode and every write path is disabled, including non-GET methods in pasted HTTP requests. Safe to point at production buckets.

Install s3ti

Homebrew

bash
brew install --cask arksigma/tap/s3ti

Pre-built binaries

macOS and Linux builds for x86_64 and arm64 are attached to every release.

Download from releases ↗
Requirements: none for object storage. SFTP browsing uses your system ssh, and must authenticate without prompting — an agent or a passphrase-less key.

Backends

Storage sits behind a single trait, so every backend gets the same browser, the same previews, and the same keys. The goto prompt switches between them without restarting.

  • s3://bucket/prefix/
    AWS S3 and compatibles The standard AWS chain — environment variables, ~/.aws profiles, SSO and IAM Identity Center, IMDS. Unsigned mode and custom endpoints for MinIO, R2, or Ceph.
  • ~/path or file://path
    Local filesystem None. The same browser and previews over local directories.
  • az://container/prefix/
    Azure Blob Storage AZURE_STORAGE_* environment variables.
  • gs://bucket/prefix/
    Google Cloud Storage Application Default Credentials or GOOGLE_* environment variables.
  • smb://server/share/
    SMB and CIFS shares Pure Rust, no libsmbclient. Credentials from the URI, environment, or config; guest otherwise. NTLM authentication.
  • sftp://user@host/path
    SSH and SFTP Drives your installed OpenSSH, so your ssh config, keys, agent, and ProxyJump all apply.

Previews

Opening an object reads what it needs to show you, not the whole file.

Parquet

The footer is parsed once and each continuation fetches only the pages covering the next batch of rows. Filter with expressions like Value > 300 or Variable ~ CHINA, and choose the columns you want — both are pushed into the scan, so row groups ruled out by their statistics are skipped and unwanted columns are never fetched.

Zarr

A Zarr store is a prefix tree, so s3ti already browses one; these make it readable. Arrays report dtype, shape, dimensions, chunk layout, codecs, and uncompressed size, and their chunk keys stay hidden so metadata is not buried under thousands of rows. Recognition is cheap — an ordinary folder costs no extra request.

HTTP responses

Paste a curl command or a bare URL into the goto prompt and s3ti runs it, opening the response in the same full-screen preview. Parquet bodies get the table interface; JSON bodies get a key that toggles between the highlighted body and a table. No shell is involved, so shell metacharacters in a pasted string are inert text.

Text, binary, and images

Syntax highlighting with encoding detection for text, a hex view for binary, and inline images through kitty, iTerm2, or sixel, falling back to halfblocks elsewhere. Previews are ranged reads, capped by configurable byte limits.

Keyboard shortcuts

Drive the TUI without leaving the keyboard.

Key Action
j / k Move within the current column
l / Enter Enter a directory, open a preview, or switch profile
h / Backspace Up one level — buckets go back to the profile selector
g / G, Ctrl+D / Ctrl+U Jump to top or bottom, or move a half page
/ Fuzzy filter the current listing
: Go to any URI, a direct object key, or an HTTP request
s / S Toggle sort direction / cycle sort field
f / F Toggle a favourite / open the favourites menu
d / y Download the selected object / yank its URI
r / L Refresh the listing / load more entries
? Help

About s3ti

s3ti browses S3, Azure Blob, Google Cloud Storage, SMB shares, SSH/SFTP, and the local filesystem from one terminal UI — public buckets and private ones alike. Preview text, images, Parquet, and Zarr without downloading whole files.

Written in Rust, on Ratatui for the interface and object_store for storage. Dual licensed MIT or Apache-2.0.