A terminal UI for browsing and managing AWS resources
Built with Go and the Charm ecosystem. Inspired by amazing TUIs like lazygit and k9s.
- Browse and manage AWS resources without leaving your terminal
- ReadOnly by default — mutations blocked regardless of IAM permissions until you switch to ReadWrite with
W - Drill-down navigation with a side detail panel on wide terminals (≥120 cols)
- Filterable, sortable tables with vim-style keybindings
- Multi-select with bulk actions (start/stop/delete across selections)
- Syntax-highlighted content viewer with visual selection and yank
- In-app event log, command bar, and fuzzy-search pickers
- Multiple AWS profiles and regions — switch at runtime
- 6 color themes: Catppuccin, Dracula, Nord, and Tokyo Night, plus the light themes Catppuccin Latte and Tokyo Night Day. The default
autopicks Catppuccin or Catppuccin Latte for the background of the terminal - TOML config with XDG support, Nerd Font icons with Unicode fallbacks
- LocalStack integration for local development
| Service | Description |
|---|---|
| S3 | Buckets, objects, versions, presigned URLs, copy/move, create/delete |
| EC2 | Instances, AMIs, security groups, VPCs, subnets, start/stop/reboot/terminate, SSM connect, public AMI search |
| SQS | Queues, message peek, send, purge, delete, DLQ redrive |
On macOS and Linux:
brew install juthrbog/tap/lazycloudgo install github.com/juthrbog/lazycloud@latestThis needs Go 1.26.2 or later. lazycloud --version shows the module version.
The Releases page has archives for Linux, macOS, and Windows, each for amd64 and arm64. The Windows archives are zip files.
Each release also has an SBOM (a list of the Go modules in the binary) for each archive. To make sure that an archive comes from the release workflow of this repository, use one of these commands:
# With the GitHub CLI
gh attestation verify lazycloud_0.6.0_linux_amd64.tar.gz --repo juthrbog/lazycloud
# With cosign: check the signature of checksums.txt, then the archive
cosign verify-blob checksums.txt --bundle checksums.txt.sigstore.json \
--certificate-identity-regexp '^https://github.com/juthrbog/lazycloud/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
sha256sum --ignore-missing -c checksums.txtSSM Connect needs the AWS CLI and the Session Manager plugin on all platforms.
go build -o lazycloud .
./lazycloud# Default AWS profile
./lazycloud
# Specify profile and region
./lazycloud --profile staging --region us-west-2
# Run against LocalStack
./lazycloud --endpoint http://localhost:4566Using Taskfile
task deps # download Go dependencies
task build # build the binary
task run # run against real AWS
task localstack:seed # populate LocalStack with test data (see docs/DEVELOPMENT.md)
task dev # run against LocalStack| Flag | Description |
|---|---|
--profile |
AWS profile (falls back to AWS_PROFILE) |
--region |
AWS region (falls back to AWS_REGION) |
--endpoint |
Endpoint override for LocalStack (falls back to AWS_ENDPOINT_URL) |
--theme |
Color theme: auto (default), catppuccin, catppuccin-latte, dracula, nord, tokyonight, tokyonight-day |
--no-nerd-fonts |
Use plain Unicode icons instead of Nerd Font glyphs |
--config |
Path to config file (default: ~/.config/lazycloud/config.toml) |
--log |
Path to debug log file |
--read-write |
Start in ReadWrite mode (default: ReadOnly) |
--init-config |
Write default config file and exit |
--version |
Print version and exit |
| Key | Action |
|---|---|
j/k or arrows |
Move the cursor |
enter |
Open the resource. On Home, open the service picker |
esc |
Go back, or clear the selection |
/ |
Filter |
space |
Select several rows |
s/S |
Sort / reverse sort. On Home, s opens the service picker |
r |
Refresh |
tab |
Move the focus between the list and the side panel |
backspace |
Go back to the view where you followed a link, with its panel |
W |
Open the mode picker (ReadOnly or ReadWrite) |
P |
Open the profile picker |
R |
Open the region picker |
T |
Open the theme picker |
L |
Open the event log |
: |
Command bar |
? |
Help overlay (full keybinding reference) |
ctrl+x |
Cancel a running operation, such as a download |
q |
Go back. On Home, quit |
Press ? in-app for the complete list including view-specific and panel keybindings. See docs/KEYBINDINGS.md for the keybinding system architecture.
Generate the default config:
./lazycloud --init-configThis creates ~/.config/lazycloud/config.toml (or $XDG_CONFIG_HOME/lazycloud/config.toml):
[aws]
# profile = "default"
# region = "us-east-1"
# endpoint = ""
[display]
theme = "auto" # auto, catppuccin, catppuccin-latte, dracula, nord, tokyonight, tokyonight-day
nerd_fonts = true # false for plain Unicode fallbacks
[log]
# file = "/tmp/lazycloud.log"Precedence: config file < env vars < CLI flags.
Bubble Tea v2 | Lip Gloss v2 | Bubbles v2 | Huh v2 | Chroma | aws-sdk-go-v2 | testify | Taskfile | LocalStack
LazyCloud follows the Elm Architecture via Bubble Tea. Views are pushed onto a navigation stack, AWS calls happen in tea.Cmd goroutines, and the root model routes messages between views, overlays, and the side panel.
internal/aws/ Service interfaces + SDK implementations
internal/views/ Bubble Tea view models (one per resource type)
internal/ui/ Shared components (table, filter, picker, toast, panel)
internal/app/ Root model — message router, layout, route table
internal/nav/ Stack-based navigator
See docs/ARCHITECTURE.md for runtime patterns, scaling strategy, and the guide for adding new services.
go test ./... # unit tests
task test:race # unit tests like CI (race detector, random order)LazyCloud is in early development and not yet accepting contributions. This may change in the future — check back later.
Supported by LocalStack through their Open Source program.
Licensed under the Apache License 2.0.
