buckit▌

A two-pane terminal file manager for local files and S3-compatible object stores. v0.5.2

buckit
┌ ~ ───────────────────────────────────────────────────────┐┌ Backends: ───────────────────────────────────────────────┐
│ Name                                     Size  Modified  ││ Name    Path                                             │
│ ..                                                       ││ Root    /                                                │
│ documents/                                    09-26 20:19││ Home    /home/lasse                                      │
│ photos/                                       09-26 20:19││                                                          │
│ projects/                                     09-26 20:19││                                                          │
│ backup-2026-06.tar.gz                    180K 09-26 20:19││                                                          │
│ notes.md                                 1.2K 09-26 20:19││                                                          │
│ README.md                                4.5K 09-26 20:19││                                                          │
│ shopping-list.txt                          96 09-26 20:19││                                                          │
│                                                          ││                                                          │
│                                                          ││                                                          │
│                                                          ││                                                          │
│ rwxr-xr-x  <DIR>  2026-09-26 20:19:11                    ││ Local filesystem at /                                    │
└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
 Tab Pane  Enter Open  Bksp Up  Esc Backends  c Copy  m Move  r Rename  d Delete  . Hidden  R Reload  q Quit            
Local files on the left, list of backends on the right.

One tree, local and remote

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.

Local <-> S3

Upload, download or copy between two S3 stores - or your own filesystem.

Server-side copy

Copy within the same S3 backend, is done by the server. Data never travel through your machine.

No dependencies

One binary you can drop on a box.
No ncurses, no libs, no shards, nothing but the Crystal standard library.

Responsive TUI

Pane is painted as data arrives, so large directories or S3 stores is immediately readable.

Any S3

AWS, Garage, MinIO, Ceph, Cloudflare R2 etc. - both virtual-hosted or path addressing is supported.

Large objects

Multipart uploads and ranged server-side copies, so size is the server's problem rather than yours.

buckit - S3 backend
┌ ~ ───────────────────────────────────────────────────────┐┌ archive:/photo-archive/2026/june/ ───────────────────────┐
│ Name                                     Size  Modified  ││ Name                                     Size  Modified  │
│ ..                                                       ││ ..                                                       │
│ documents/                                    09-26 20:19││ harbour.jpg                              2.3M 09-26 20:19│
│ photos/                                       09-26 20:19││ market.jpg                               3.0M 09-26 20:19│
│ projects/                                     09-26 20:19││ notes.txt                                 820 09-26 20:19│
│ backup-2026-06.tar.gz                    180K 09-26 20:19││ sunset.jpg                               1.8M 09-26 20:19│
│ notes.md                                 1.2K 09-26 20:19││                                                          │
│ README.md                                4.5K 09-26 20:19││                                                          │
│ shopping-list.txt                          96 09-26 20:19││                                                          │
│                                                          ││                                                          │
│                                                          ││                                                          │
│                                                          ││                                                          │
│ Up to the parent directory                               ││ 2 400 000 B  2026-09-26 20:19:15  STANDARD               │
└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
 Tab Pane  Enter Open  Bksp Up  Esc Backends  c Copy  m Move  r Rename  d Delete  . Hidden  R Reload  q Quit            
A bucket is browsed like a directory, with visible sizes, timestamps and storage class.

Keys

Also listed in the bottom bar.

KeyAction
↑ ↓ / k jMove highlight
← → / h l / TabSwitch pane
EnterEnter a directory, bucket or backend
BackspaceGo to the parent (same as selecting ..)
EscBack to the backend list
Home End / g GJump to the first/last entry
PgUp PgDnScroll a page
cCopy highlighted entry to the other pane
mMove it to the other pane
rRename it
dDelete it
nCreate new directory or bucket when on the bucket list
tCreate a new empty file
SpaceMark/Unmark highlighted entry
iInvert marked entries
*Mark everything / Mark nothing
.Toggle hidden files
RReload the listing
q / Ctrl-CQuit
buckit - rename
┌ ~ ───────────────────────────────────────────────────────┐┌ Backends: ───────────────────────────────────────────────┐
│ Name                                     Size  Modified  ││ Name    Path                                             │
│ ..                                                       ││ Root    /                                                │
│ documents/                                    09-26 20:19││ Home    /home/lasse                                      │
│ photos/                                 ┌─ Rename ────────────────────────┐                                          │
│ 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-26 20:19:11                  ││ Local filesystem at /                                    │
└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
 Tab Pane  Enter Open  Bksp Up  Esc Backends  c Copy  m Move  r Rename  d Delete  . Hidden  R Reload  q Quit            
Rename local files or objects - on S3 it is a server-side copy followed by a delete.

Install

A single binary with zero dependencies on Linux and only standard libraries on macOS.

Homebrew

brew install bitmand/tap/buckit

Linux Download

# Linux (x86_64)
curl -LO https://bitmand.dk/buckit/v0.5.2/buckit-v0.5.2-linux-x86_64
curl -LO https://bitmand.dk/buckit/v0.5.2/buckit-v0.5.2-linux-x86_64.sha256
sha256sum -c buckit-v0.5.2-linux-x86_64.sha256

chmod +x buckit-v0.5.2-linux-x86_64
sudo mv buckit-v0.5.2-linux-x86_64 /usr/local/bin/buckit

macOS Download

# macOS - Apple Silicon (arm64)
curl -LO https://bitmand.dk/buckit/v0.5.2/buckit-v0.5.2-darwin-arm64
curl -LO https://bitmand.dk/buckit/v0.5.2/buckit-v0.5.2-darwin-arm64.sha256
shasum -a 256 -c buckit-v0.5.2-darwin-arm64.sha256

chmod +x buckit-v0.5.2-darwin-arm64
sudo mv buckit-v0.5.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.

Config

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

Example S3 backends

# 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 = ...

Where the {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.

SettingMeaning
typeAlways s3 for now
regionSigning region. Defaults to us-east-1
endpoint_urlFull URL, with {bucket} where the bucket's name goes. Defaults to the AWS region.
aws_access_key_idAccess key
aws_secret_access_keySecret key
aws_access_key_id_commandA command that prints the access key, instead of writing it down
aws_secret_access_key_commandA command that prints the secret key, instead of writing it down
part_size_mbMultipart chunk size. Defaults to 64

Environment config

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_AWS_SECRET_ACCESS_KEY_COMMAND=...   # [garage] aws_secret_access_key_command
BUCKIT_GARAGE_ENDPOINT_URL=https://...            # [garage] endpoint_url

Keys from a password manager

The config file does not have to hold the keys at all.
Name a command instead, and Buckit runs it when it needs the value:

[garage]
type = s3
endpoint_url = https://garage.example.org:3900
region = garage
aws_access_key_id_command     = op read op://Private/S3/access_key_id
aws_secret_access_key_command = op read op://Private/S3/secret_access_key

Anything that prints the value will do — op, pass, gopass, security find-generic-password, vault, or a script of your own.

If the command fails, Buckit says so in red and leaves the pane on the backend list, so you can fix it and try again:

buckit — a locked vault
┌ ~ ───────────────────────────────────────────────────────┐┌ Backends: ───────────────────────────────────────────────┐
│ Name                                     Size  Modified  ││ Name      Path                                           │
│ ..                                                       ││ Root      /                                              │
│ documents/                                    09-26 20:19││ Home      /home/lasse                                    │
│ photos/                                       09-26 20:19││ garage    https://garage.example.org:3900                │
│ projects/                    ┌─ Cannot open garage backend ──────────────────────────┐                               │
│ backup-2026-06.tar.gz        │ aws_secret_access_key_command exited 1: op: could not │                               │
│ notes.md                     │ read op://Private/S3/secret: vault is locked          │                               │
│ README.md                    │                                                       │                               │
│ shopping-list.txt            │                          OK                           │                               │
│                              └───────────────────────────────────────────────────────┘                               │
│                                                          ││                                                          │
│                                                          ││                                                          │
│ Up to the parent directory                               ││ S3 endpoint at https://garage.example.org:3900           │
└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
 Tab Pane  Enter Open  Bksp Up  Esc Backends  c Copy  m Move  r Rename  d Delete  . Hidden  R Reload  q Quit            
A backend that cannot be opened, and the pane left where it can be.

Anything else that stops a backend is reported the same way — a bad endpoint, no route to it, a refused signature. Nothing in that backend can be reached, so there is no sense leaving the pane sitting in it.

Running it

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.

Download

v0.5.2 2026-10-03

PlatformBinaryChecksumRequires
Linux x86_64 buckit-v0.5.2-linux-x86_64 .sha256 nothing
macOS arm64 buckit-v0.5.2-darwin-arm64 .sha256 macOS 26 or later

v0.5.1 2026-10-03

PlatformBinaryChecksumRequires
Linux x86_64 buckit-v0.5.1-linux-x86_64 .sha256 nothing
macOS arm64 buckit-v0.5.1-darwin-arm64 .sha256 macOS 26 or later

v0.5.0 2026-09-29

PlatformBinaryChecksumRequires
Linux x86_64 buckit-v0.5.0-linux-x86_64 .sha256 nothing
macOS arm64 buckit-v0.5.0-darwin-arm64 .sha256 macOS 26 or later

v0.4.0 2026-09-27

v0.3.0 2026-09-26

v0.2.2 2026-09-18

v0.2.1 2026-09-17

v0.2.0 2026-09-16

v0.1.10 2026-09-16

v0.1.9 2026-09-16

v0.1.8 2026-09-16

v0.1.7 2026-09-16

v0.1.6 2026-09-15

v0.1.5 2026-09-15

v0.1.3 2026-09-15

v0.1.2 2026-09-14