mrpbennett/bucky

A beautiful TUI file manager for cloud and remote storage, written in Go.

1

stars

44

commits

Go

primary language

Aug 18, 2026

updated

bucket
claude-code
cloud-storage
gcp-storage
golang
remote-storage
s3
s3-storage
sftp-client
tui
tui-app

README

Bucky logo
Keyboard-first, dual-panel TUI file manager for cloud and remote storage

Go version S3 GCS SFTP License

Bucky brings the Midnight Commander dual-panel experience to your terminal, connecting Amazon S3, Google Cloud Storage, SFTP, and your local filesystem through a single, keyboard-driven interface. Built with Go and the Charm Bracelet stack.


Demo


                                                                                          
                                        App walkthrough GIF                                        
                                                                                          


Features

  • Dual-panel browsing -- remote on the left, local on the right, switchable with Tab
  • Four backends -- S3, GCS, SFTP, and local filesystem through a unified interface
  • Profile picker -- choose a connection at startup, or jump straight in with --profile
  • Two-phase transfers -- arm a transfer on the source panel, confirm on the destination
  • Panel-to-panel sync -- preview-first sync workflow with include/exclude patterns, dry-run, and configurable compare modes
  • Multi-select -- Space to check rows, then bulk transfer, move, or delete
  • Vim-style rename modal -- full normal/insert/visual mode editing for file names
  • File preview -- syntax-highlighted preview overlay with CSV rainbow columns
  • Sort and filter -- by name, size, or date; toggle hidden files; live search with /
  • Metadata pane -- inspect file details and storage-specific metadata
  • Transfer progress -- floating modal with progress bars and cancel support
  • Structured logs -- dedicated log panel for debugging and operation history
  • Theming -- auto, dark, and light modes

Installation

Requirements

  • Go 1.25.0 or newer
  • A terminal with ANSI color support
  • Credentials for any remote backends you plan to use

Install

go install github.com/mrpbennett/bucky/cmd/bucky@latest

Build from source

git clone https://github.com/mrpbennett/bucky.git
cd bucky
go build -o bucky ./cmd/bucky

Run

./bucky                          # launch with profile picker
./bucky --profile prod_s3        # connect directly to a profile
./bucky -p staging_sftp          # short flag

Configuration

Bucky reads a single TOML file at ~/.config/bucky/config.toml. If this file is missing or invalid, Bucky exits with an error.

Global options

theme       = "auto"       # auto | dark | light
sort_by     = "name"       # name | size | date
sort_order  = "asc"        # asc | desc
show_hidden = false
local_start_at_cwd = true # true: launch directory; false: home directory

Sync defaults (optional)

[sync]
dry_run_default      = true
compare_mode         = "mtime_size"   # mtime_size | size_only | exact_timestamps
delete_default       = false
no_overwrite_default = false
concurrency          = 4

Backends

Amazon S3
[profile.prod_s3]
type   = "s3"
bucket = "my-prod-bucket"     # use "*" or omit to list all accessible buckets
region = "us-east-1"          # defaults to us-east-1
prefix = "backups/"

Optional fields: endpoint (for S3-compatible APIs), access_key + secret_key, aws_profile, aws_credentials_file, aws_config_file.

Credential resolution order:

  1. access_key + secret_key (static)
  2. aws_profile (shared config)
  3. AWS default credential chain

Bucky also auto-discovers non-default entries from ~/.aws/credentials and surfaces them as profiles if not already defined.

SFTP
[profile.staging_sftp]
type             = "sftp"
host             = "sftp.example.com"
port             = 22                          # defaults to 22
username         = "deploy"
private_key_path = "~/.ssh/id_ed25519"
known_hosts_path = "~/.ssh/known_hosts"        # defaults to ~/.ssh/known_hosts
prefix           = "/var/data/"

Auth options: password, private_key_path (with optional private_key_passphrase). Both can be combined.

Set insecure_ignore_host_key = true to skip host key verification (not recommended for production).

Google Cloud Storage
[profile.analytics_gcs]
type                 = "gcs"
bucket               = "analytics-bucket"
project_id           = "my-project"
gcp_credentials_file = "~/.config/gcloud/app-credentials.json"
prefix               = "exports/"

Auth: Set gcp_credentials_file for explicit credentials, or rely on Application Default Credentials (gcp_use_adc = true, the default). Optional endpoint override.


Workflows

Two-phase transfer (t)

  1. Focus the source panel and select files with Space (or just position the cursor).
  2. Press t to arm the transfer.
  3. Navigate to the destination directory on the opposite panel.
  4. Press t again from either panel to execute.

Starting from the left (remote) panel downloads; starting from the right (local) panel uploads.


                                                                                          
                                       File transfer workflow GIF                                       
                                                                                          

Two-phase move (m)

  1. Select source items on the remote panel and press m.
  2. Navigate to the destination path, then press m again to execute.

Moves are destructive and only operate within the remote backend.

Sync (s)

  1. Focus the source panel and position the cursor on the directory to sync.
  2. Press s to open the sync setup overlay.
  3. Configure direction, compare mode, include/exclude patterns, and dry-run toggle.
  4. Press Enter to generate a preview plan showing exactly what will change.
  5. Review the plan, then press Enter to execute (or e to return to setup).


                                                                                          
                                            Sync workflow GIF                                           
                                                                                          

File preview (p)

Press p on any file to open a syntax-highlighted preview overlay. CSV and TSV files get rainbow column coloring. Preview reads up to 64 KiB of content.


                                                                                          
                                             File preview GIF                                            
                                                                                          

Rename (R)

Press R to open a Vim-style rename modal with full normal, insert, and visual mode support.


                                                                                          
                                             Rename modal GIF                                            
                                                                                          


Keybindings

Global and Panel Focus
KeyAction
?Toggle help overlay
iToggle metadata pane
TabSwitch between left/right panels
1Focus left panel
2Focus right panel
3Focus log panel
[Toggle left pane
]Toggle right pane
PReturn to profile picker
EscCancel active transfer/move/sync mode
Navigation
KeyAction
Up / kMove cursor up
Down / jMove cursor down
Ctrl+dHalf-page down
Ctrl+uHalf-page up
Enter / lOpen directory
- / hGo to parent directory
ggJump to first row
GJump to last row
q / Ctrl+cQuit app
Selection and File Actions
KeyAction
SpaceToggle selection on current row and advance cursor
aCreate a new directory
tTransfer (two-phase: arm then confirm)
mMove on remote backend (two-phase: arm then confirm)
dDelete with confirmation modal
rRefresh current directory
RRename (opens Vim-style modal)
pPreview file
sOpen sync setup
Sorting, Visibility, and Search
KeyAction
oCycle sort field: name, size, date
OToggle sort direction
.Toggle hidden files
/Open live search
EnterAccept search
EscCancel search

S is reserved for a future repeat-sync shortcut.

Sync Setup / Preview / Summary

Setup overlay:

KeyAction
TabToggle sync direction
cCycle compare mode
d / n / rToggle delete / no-overwrite / dry-run
i / xEdit include / exclude patterns
EnterGenerate preview plan
EscCancel sync

Preview overlay:

KeyAction
EnterExecute sync plan
eReturn to setup
EscCancel

Summary overlay:

KeyAction
Enter / EscClose summary
Rename Modal (Vim-style)

Core:

KeyAction
EnterConfirm rename
Esc (NORMAL)Cancel rename
Esc (INSERT/VISUAL)Return to NORMAL mode

NORMAL mode:

KeyAction
h / lMove left / right
0 / $Start / end of filename
w / e / bWord motions
i / a / I / AEnter INSERT mode
vEnter VISUAL mode
xDelete character under cursor
d + motionDelete by motion
c + motionChange by motion
ddClear whole filename

VISUAL mode:

KeyAction
h / l / w / e / b / 0 / $Adjust selection
dDelete selection
cChange selection, enter INSERT
vExit VISUAL mode
Preview Overlay
KeyAction
p / Esc / BackspaceClose preview
Up / kScroll up
Down / jScroll down
ggTop of preview
GBottom of preview
q / Ctrl+cQuit app

Preview reads up to 64 KiB. CSV/TSV files use rainbow column coloring.

Other Modals

Delete confirmation:

KeyAction
Tab / Left / Right / h / lSwitch button
EnterConfirm
EscCancel

Transfer progress:

KeyAction
EscCancel in-flight transfer

Help overlay:

KeyAction
? / EscClose help

Profile picker:

KeyAction
j / DownNext profile
k / UpPrevious profile
EnterConnect
q / EscQuit

Log panel (focus with 3):

KeyAction
j / DownScroll newer
k / UpScroll older

Development

go build -o bucky ./cmd/bucky     # build binary
go run ./cmd/bucky                 # run without building
go install ./cmd/bucky             # install to $GOPATH/bin
go test ./...                      # run all tests
go vet ./...                       # static analysis
gofmt -w .                         # format code

Project layout

cmd/bucky/main.go        CLI entrypoint
internal/
  backend/               Storage backend interface and implementations
                           s3.go, sftp.go, gcs.go, local.go, multibucket.go
  config/                Config loading and profile parsing
  transfer/              Transfer primitives and progress messages
  ui/
    app.go               Root Bubble Tea model
    browser/             Dual-panel file browser component
    transfer/            Transfer queue and progress display
    status/              Status bar with keybinding hints
assets/                  Logo and static assets
docs/                    Design documents and implementation plan

Architecture

The Backend interface (internal/backend/) is the core abstraction. S3, GCS, SFTP, and Local backends all implement the same interface so the UI layer never deals with storage-specific logic.

The UI layer (internal/ui/) uses Bubble Tea's Elm architecture (Model / Update / View). The root app.go model orchestrates panels, overlays, and the transfer queue.

The Transfer engine (internal/transfer/) runs outside the Bubble Tea event loop via goroutines, pushing progress updates back through program.Send(). Supports concurrent transfers with configurable limits.

Config (internal/config/) parses TOML profiles from ~/.config/bucky/config.toml using Viper.


License

MIT

Contributors

mrpbennett

44 commits

mrpbennett/bucky

A beautiful TUI file manager for cloud and remote storage, written in Go.

1

stars

44

commits

Go

primary language

Aug 18, 2026

updated

bucket
claude-code
cloud-storage
gcp-storage
golang
remote-storage
s3
s3-storage
sftp-client
tui
tui-app

README

Bucky logo
Keyboard-first, dual-panel TUI file manager for cloud and remote storage

Go version S3 GCS SFTP License

Bucky brings the Midnight Commander dual-panel experience to your terminal, connecting Amazon S3, Google Cloud Storage, SFTP, and your local filesystem through a single, keyboard-driven interface. Built with Go and the Charm Bracelet stack.


Demo


                                                                                          
                                        App walkthrough GIF                                        
                                                                                          


Features

  • Dual-panel browsing -- remote on the left, local on the right, switchable with Tab
  • Four backends -- S3, GCS, SFTP, and local filesystem through a unified interface
  • Profile picker -- choose a connection at startup, or jump straight in with --profile
  • Two-phase transfers -- arm a transfer on the source panel, confirm on the destination
  • Panel-to-panel sync -- preview-first sync workflow with include/exclude patterns, dry-run, and configurable compare modes
  • Multi-select -- Space to check rows, then bulk transfer, move, or delete
  • Vim-style rename modal -- full normal/insert/visual mode editing for file names
  • File preview -- syntax-highlighted preview overlay with CSV rainbow columns
  • Sort and filter -- by name, size, or date; toggle hidden files; live search with /
  • Metadata pane -- inspect file details and storage-specific metadata
  • Transfer progress -- floating modal with progress bars and cancel support
  • Structured logs -- dedicated log panel for debugging and operation history
  • Theming -- auto, dark, and light modes

Installation

Requirements

  • Go 1.25.0 or newer
  • A terminal with ANSI color support
  • Credentials for any remote backends you plan to use

Install

go install github.com/mrpbennett/bucky/cmd/bucky@latest

Build from source

git clone https://github.com/mrpbennett/bucky.git
cd bucky
go build -o bucky ./cmd/bucky

Run

./bucky                          # launch with profile picker
./bucky --profile prod_s3        # connect directly to a profile
./bucky -p staging_sftp          # short flag

Configuration

Bucky reads a single TOML file at ~/.config/bucky/config.toml. If this file is missing or invalid, Bucky exits with an error.

Global options

theme       = "auto"       # auto | dark | light
sort_by     = "name"       # name | size | date
sort_order  = "asc"        # asc | desc
show_hidden = false
local_start_at_cwd = true # true: launch directory; false: home directory

Sync defaults (optional)

[sync]
dry_run_default      = true
compare_mode         = "mtime_size"   # mtime_size | size_only | exact_timestamps
delete_default       = false
no_overwrite_default = false
concurrency          = 4

Backends

Amazon S3
[profile.prod_s3]
type   = "s3"
bucket = "my-prod-bucket"     # use "*" or omit to list all accessible buckets
region = "us-east-1"          # defaults to us-east-1
prefix = "backups/"

Optional fields: endpoint (for S3-compatible APIs), access_key + secret_key, aws_profile, aws_credentials_file, aws_config_file.

Credential resolution order:

  1. access_key + secret_key (static)
  2. aws_profile (shared config)
  3. AWS default credential chain

Bucky also auto-discovers non-default entries from ~/.aws/credentials and surfaces them as profiles if not already defined.

SFTP
[profile.staging_sftp]
type             = "sftp"
host             = "sftp.example.com"
port             = 22                          # defaults to 22
username         = "deploy"
private_key_path = "~/.ssh/id_ed25519"
known_hosts_path = "~/.ssh/known_hosts"        # defaults to ~/.ssh/known_hosts
prefix           = "/var/data/"

Auth options: password, private_key_path (with optional private_key_passphrase). Both can be combined.

Set insecure_ignore_host_key = true to skip host key verification (not recommended for production).

Google Cloud Storage
[profile.analytics_gcs]
type                 = "gcs"
bucket               = "analytics-bucket"
project_id           = "my-project"
gcp_credentials_file = "~/.config/gcloud/app-credentials.json"
prefix               = "exports/"

Auth: Set gcp_credentials_file for explicit credentials, or rely on Application Default Credentials (gcp_use_adc = true, the default). Optional endpoint override.


Workflows

Two-phase transfer (t)

  1. Focus the source panel and select files with Space (or just position the cursor).
  2. Press t to arm the transfer.
  3. Navigate to the destination directory on the opposite panel.
  4. Press t again from either panel to execute.

Starting from the left (remote) panel downloads; starting from the right (local) panel uploads.


                                                                                          
                                       File transfer workflow GIF                                       
                                                                                          

Two-phase move (m)

  1. Select source items on the remote panel and press m.
  2. Navigate to the destination path, then press m again to execute.

Moves are destructive and only operate within the remote backend.

Sync (s)

  1. Focus the source panel and position the cursor on the directory to sync.
  2. Press s to open the sync setup overlay.
  3. Configure direction, compare mode, include/exclude patterns, and dry-run toggle.
  4. Press Enter to generate a preview plan showing exactly what will change.
  5. Review the plan, then press Enter to execute (or e to return to setup).


                                                                                          
                                            Sync workflow GIF                                           
                                                                                          

File preview (p)

Press p on any file to open a syntax-highlighted preview overlay. CSV and TSV files get rainbow column coloring. Preview reads up to 64 KiB of content.


                                                                                          
                                             File preview GIF                                            
                                                                                          

Rename (R)

Press R to open a Vim-style rename modal with full normal, insert, and visual mode support.


                                                                                          
                                             Rename modal GIF                                            
                                                                                          


Keybindings

Global and Panel Focus
KeyAction
?Toggle help overlay
iToggle metadata pane
TabSwitch between left/right panels
1Focus left panel
2Focus right panel
3Focus log panel
[Toggle left pane
]Toggle right pane
PReturn to profile picker
EscCancel active transfer/move/sync mode
Navigation
KeyAction
Up / kMove cursor up
Down / jMove cursor down
Ctrl+dHalf-page down
Ctrl+uHalf-page up
Enter / lOpen directory
- / hGo to parent directory
ggJump to first row
GJump to last row
q / Ctrl+cQuit app
Selection and File Actions
KeyAction
SpaceToggle selection on current row and advance cursor
aCreate a new directory
tTransfer (two-phase: arm then confirm)
mMove on remote backend (two-phase: arm then confirm)
dDelete with confirmation modal
rRefresh current directory
RRename (opens Vim-style modal)
pPreview file
sOpen sync setup
Sorting, Visibility, and Search
KeyAction
oCycle sort field: name, size, date
OToggle sort direction
.Toggle hidden files
/Open live search
EnterAccept search
EscCancel search

S is reserved for a future repeat-sync shortcut.

Sync Setup / Preview / Summary

Setup overlay:

KeyAction
TabToggle sync direction
cCycle compare mode
d / n / rToggle delete / no-overwrite / dry-run
i / xEdit include / exclude patterns
EnterGenerate preview plan
EscCancel sync

Preview overlay:

KeyAction
EnterExecute sync plan
eReturn to setup
EscCancel

Summary overlay:

KeyAction
Enter / EscClose summary
Rename Modal (Vim-style)

Core:

KeyAction
EnterConfirm rename
Esc (NORMAL)Cancel rename
Esc (INSERT/VISUAL)Return to NORMAL mode

NORMAL mode:

KeyAction
h / lMove left / right
0 / $Start / end of filename
w / e / bWord motions
i / a / I / AEnter INSERT mode
vEnter VISUAL mode
xDelete character under cursor
d + motionDelete by motion
c + motionChange by motion
ddClear whole filename

VISUAL mode:

KeyAction
h / l / w / e / b / 0 / $Adjust selection
dDelete selection
cChange selection, enter INSERT
vExit VISUAL mode
Preview Overlay
KeyAction
p / Esc / BackspaceClose preview
Up / kScroll up
Down / jScroll down
ggTop of preview
GBottom of preview
q / Ctrl+cQuit app

Preview reads up to 64 KiB. CSV/TSV files use rainbow column coloring.

Other Modals

Delete confirmation:

KeyAction
Tab / Left / Right / h / lSwitch button
EnterConfirm
EscCancel

Transfer progress:

KeyAction
EscCancel in-flight transfer

Help overlay:

KeyAction
? / EscClose help

Profile picker:

KeyAction
j / DownNext profile
k / UpPrevious profile
EnterConnect
q / EscQuit

Log panel (focus with 3):

KeyAction
j / DownScroll newer
k / UpScroll older

Development

go build -o bucky ./cmd/bucky     # build binary
go run ./cmd/bucky                 # run without building
go install ./cmd/bucky             # install to $GOPATH/bin
go test ./...                      # run all tests
go vet ./...                       # static analysis
gofmt -w .                         # format code

Project layout

cmd/bucky/main.go        CLI entrypoint
internal/
  backend/               Storage backend interface and implementations
                           s3.go, sftp.go, gcs.go, local.go, multibucket.go
  config/                Config loading and profile parsing
  transfer/              Transfer primitives and progress messages
  ui/
    app.go               Root Bubble Tea model
    browser/             Dual-panel file browser component
    transfer/            Transfer queue and progress display
    status/              Status bar with keybinding hints
assets/                  Logo and static assets
docs/                    Design documents and implementation plan

Architecture

The Backend interface (internal/backend/) is the core abstraction. S3, GCS, SFTP, and Local backends all implement the same interface so the UI layer never deals with storage-specific logic.

The UI layer (internal/ui/) uses Bubble Tea's Elm architecture (Model / Update / View). The root app.go model orchestrates panels, overlays, and the transfer queue.

The Transfer engine (internal/transfer/) runs outside the Bubble Tea event loop via goroutines, pushing progress updates back through program.Send(). Supports concurrent transfers with configurable limits.

Config (internal/config/) parses TOML profiles from ~/.config/bucky/config.toml using Viper.


License

MIT

Contributors

mrpbennett

44 commits

Languages

Go

100.0%