A two-pane terminal file manager for local files and S3-compatible object stores. v0.2.2
┌ ~ ───────────────────────────────────────────────────────┐┌ Backends: ───────────────────────────────────────────────┐ │ Name Size Modified ││ Name Path │ │ .. ││ Root / │ │ documents/ 09-21 17:44││ Home /home/lasse │ │ photos/ 09-21 17:44││ archive http://minio:9000 │ │ projects/ 09-21 17:44││ │ │ backup-2026-06.tar.gz 180K 09-21 17:44││ │ │ notes.md 1.2K 09-21 17:44││ │ │ README.md 4.5K 09-21 17:44││ │ │ shopping-list.txt 96 09-21 17:44││ │ │ ││ │ │ ││ │ │ ││ │ │ rwxr-xr-x <DIR> 2026-09-21 17:44:24 ││ Local filesystem at / │ └──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘ Tab Pane Enter Open Bksp Up Esc Backends c Copy m Move r Rename d Delete . Hidden R Reload q Quit
Inspired by Midnight Commander's dual pane layout.
Each pane is a filesystem
tree whose root is a list of backends, like the local
filesystem and S3 endpoints you've configured. Descend into a backend and
copy/move files or directories between the panes.
Upload, download or copy between two S3 stores - or your own filesystem.
Copy within the same S3 backend, is done by the server. Data never travel through your machine.
One binary you can drop on a box.
No ncurses, no libs, no shards, nothing but the Crystal standard library.
Pane is painted as data arrives, so large directories or S3 stores is immediately readable.
AWS, Garage, MinIO, Ceph, Cloudflare R2 etc. - both virtual-hosted or path addressing is supported.
Multipart uploads and ranged server-side copies, so size is the server's problem rather than yours.
┌ ~ ───────────────────────────────────────────────────────┐┌ archive:/photo-archive/2026/june/ ───────────────────────┐ │ Name Size Modified ││ Name Size Modified │ │ .. ││ .. │ │ documents/ 09-21 17:44││ harbour.jpg 2.3M 09-21 17:43│ │ photos/ 09-21 17:44││ market.jpg 3.0M 09-21 17:43│ │ projects/ 09-21 17:44││ notes.txt 820 09-21 17:43│ │ backup-2026-06.tar.gz 180K 09-21 17:44││ sunset.jpg 1.8M 09-21 17:43│ │ notes.md 1.2K 09-21 17:44││ │ │ README.md 4.5K 09-21 17:44││ │ │ shopping-list.txt 96 09-21 17:44││ │ │ ││ │ │ ││ │ │ ││ │ │ Up to the parent directory ││ 2 400 000 B 2026-09-21 17:43:44 STANDARD │ └──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘ Tab Pane Enter Open Bksp Up Esc Backends c Copy m Move r Rename d Delete . Hidden R Reload q Quit
Also listed in the bottom bar.
| Key | Action |
|---|---|
| ↑ ↓ / k j | Move highlight |
| ← → / Tab | Switch pane |
| Enter | Enter a directory, bucket or backend |
| Backspace | Go to the parent (or select ..) |
| Esc | Back to the backend list |
| Home End / g G | Jump to the first/last entry |
| PgUp PgDn | Scroll a page |
| c | Copy highlighted entry to the other pane |
| m | Move it to the other pane |
| r | Rename it |
| d | Delete it |
| . | Toggle hidden files |
| R | Reload the listing |
| q / Ctrl-C | Quit |
┌ ~ ───────────────────────────────────────────────────────┐┌ Backends: ───────────────────────────────────────────────┐ │ Name Size Modified ││ Name Path │ │ .. ││ Root / │ │ documents/ 09-21 17:44││ Home /home/lasse │ │ photos/ ┌─ Rename ────────────────────────┐://minio:9000 │ │ projects/ │ New name for "README.md": │ │ │ backup-2026-06.tar.gz │ │ │ │ notes.md │ README.md │ │ │ README.md │ │ │ │ shopping-list.txt │ Rename (Enter) Cancel (Esc) │ │ │ └─────────────────────────────────┘ │ │ ││ │ │ ││ │ │ rw-r--r-- 4 600 B 2026-09-21 17:44:24 ││ Local filesystem at / │ └──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘ Tab Pane Enter Open Bksp Up Esc Backends c Copy m Move r Rename d Delete . Hidden R Reload q Quit
A single binary with zero dependencies on Linux and only standard libraries on macOS.
brew install bitmand/tap/buckit
# Linux (x86_64)
curl -LO https://bitmand.dk/buckit/v0.2.2/buckit-v0.2.2-linux-x86_64
curl -LO https://bitmand.dk/buckit/v0.2.2/buckit-v0.2.2-linux-x86_64.sha256
sha256sum -c buckit-v0.2.2-linux-x86_64.sha256
chmod +x buckit-v0.2.2-linux-x86_64
sudo mv buckit-v0.2.2-linux-x86_64 /usr/local/bin/buckit
# macOS - Apple Silicon (arm64)
curl -LO https://bitmand.dk/buckit/v0.2.2/buckit-v0.2.2-darwin-arm64
curl -LO https://bitmand.dk/buckit/v0.2.2/buckit-v0.2.2-darwin-arm64.sha256
shasum -a 256 -c buckit-v0.2.2-darwin-arm64.sha256
chmod +x buckit-v0.2.2-darwin-arm64
sudo mv buckit-v0.2.2-darwin-arm64 /usr/local/bin/buckit
The Linux binary is statically linked against musl, so it runs on any
distribution without matching a libc.
The macOS binary links only against libraries macOS itself ships.
| Platform | Binary | Checksum | Requires |
|---|---|---|---|
| Linux x86_64 | buckit-v0.2.2-linux-x86_64 | .sha256 | nothing - statically linked |
| macOS arm64 | buckit-v0.2.2-darwin-arm64 | .sha256 | macOS 26 or later |
Buckit runs with no configuration at all and the local filesystem is always available.
Setup S3 backends by adding a sections to the Buckit config file.
The config file lives at: ~/.config/buckit/config.ini (it respects $XDG_CONFIG_HOME) or use --config at startup.
Since it might hold credentials, Buckit refuse to start if anyone but you can read it:
chmod 600 ~/.config/buckit/config.ini
# Amazon [my-aws] type = s3 region = eu-west-1 aws_access_key_id = AKIA... aws_secret_access_key = ... # A self-hosted Garage cluster: the bucket goes in the path [garage] type = s3 endpoint_url = https://garage.example.org:3900 region = garage aws_access_key_id = GK... aws_secret_access_key = ... # Cloudflare R2: the bucket goes in the hostname [r2] type = s3 endpoint_url = https://{bucket}.<account>.r2.cloudflarestorage.com aws_access_key_id = ... aws_secret_access_key = ...
{bucket} goes
When a request needs to say which bucket it is for, there are two places to
put it: in the hostname or at the front of the path.
Write the endpoint url with {bucket} where the bucket name
belongs. Or leave it out and the bucket goes at the front of the path. The
configuration line is the shape of the URL Buckit will request.
| Setting | Meaning |
|---|---|
type | Always s3 for now |
region | Signing region. Defaults to us-east-1 |
endpoint_url | Full URL, with {bucket} where the bucket's name goes. Defaults to the AWS region. |
aws_access_key_id | Access key |
aws_secret_access_key | Secret key |
part_size_mb | Multipart chunk size. Defaults to 64 |
Every setting can come from the environment instead.
The name is the section and the setting, all upper-cased:
BUCKIT_GARAGE_AWS_SECRET_ACCESS_KEY=... # [garage] aws_secret_access_key BUCKIT_GARAGE_ENDPOINT_URL=https://... # [garage] endpoint_url
buckit [-c CONFIG] [DIRECTORY]
The left pane opens in DIRECTORY, defaults to the working directory.
The right pane starts at the backend list, ready to be pointed somewhere else.