Terminal app
s3ti
A terminal browser for object storage.
brew install --cask arksigma/tap/s3ti - 2022/
- 2023/
- 2024/
- …
- 001/
- 002/
- 003/
- …
- 00/
- 01/
- 02/
- …
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
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 ↗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://pathLocal 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/pathSSH 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.