buckit

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

buckit
 ~ ───────────────────────────────────────────────────────┐ 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            
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-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            
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
/ TabSwitch pane
EnterEnter a directory, bucket or backend
BackspaceGo to the parent (or select ..)
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
.Toggle hidden files
RReload the listing
q / Ctrl-CQuit
buckit - rename
 ~ ───────────────────────────────────────────────────────┐ 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            
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.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 Download

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

Download

v0.2.2

PlatformBinaryChecksumRequires
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

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

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.