awss3tui
awss3tui is a Textual terminal UI (TUI) and CLI helper for working with Amazon S3 across multiple AWS profiles.
It provides:
- An interactive S3 browser (
s3with no subcommand) - Lightweight wrappers for
aws s3 ls,aws s3 cp, andaws s3 sync - Automatic "best profile" detection for managing multiple roles to reduce profile/session friction
Install
From PyPI:
pip3 install awss3tui
From source (dev/local):
pip3 install -e .
This installs the s3 console script for the TUI and CLI helpers.
Quick Start
Launch the TUI:
s3
Open directly to a bucket/prefix:
s3 s3://my-bucket/path/
# or
s3 my-bucket/path
Force a reindex (bypass cache on startup):
s3 reindex
See more:
s3 --help
Requirements
- Python
>=3.10 - AWS credentials/profiles configured (for example in
~/.aws/config) - AWS CLI available in
PATHfor:s3 login- automatic SSO login flows from the TUI
s3 generate-config- wrapper subcommands (
ls,cp,sync)
Commands
Browser mode (default)
When the first argument is not a known subcommand, s3 treats it as TUI browse mode with optional startup path:
s3 [--profiles ...] [--profile ...] [--region ...] [path]
Notes:
pathmay bes3://bucket/prefixorbucket/prefix.browseis accepted as an alias (s3 browse ...).
s3 reindex
Same as browse mode, but forces a fresh bucket/permission refresh:
s3 reindex [--profiles ...] [--profile ...] [--region ...] [path]
s3 ls
Wrapper around aws s3 ls:
s3 ls [path] [--dry-run] [any aws s3 ls options...]
Behavior:
- Adds
--human-readableunless you already supplied it. - Normalizes
pathtos3://...when needed. - Unknown args are passed through to AWS CLI.
--dry-runprints the resolved command and does not execute it.- auto-selects AWS profiles for s3 ls, s3 cp, and s3 sync using its cached bucket-to-profile mapping, so you usually don’t need to pass --profile. If you do provide --profile, it is respected as an explicit override.
s3 cp
Wrapper around aws s3 cp:
s3 cp <source> <destination> [--dry-run] [any aws s3 cp options...]
Behavior:
- Source/destination are normalized:
- Local-like paths (
.,.., absolute paths,~/..., Windows drive paths) stay local. - Non-local paths are treated as S3 and normalized to
s3://....
- Local-like paths (
--dry-runadds AWS CLI--dryrununless already present, and still runs AWS CLI.- Unknown args are passed through to AWS CLI.
s3 sync
Wrapper around aws s3 sync:
s3 sync <source> <destination> [--dry-run] [any aws s3 sync options...]
Behavior matches cp path normalization and dry-run handling (--dry-run maps to AWS CLI --dryrun).
s3 login
Runs AWS SSO login only for profiles that currently need reauthentication:
s3 login [--profiles dev,prod] [-p dev -p prod]
s3 generate-config
Generates/merges AWS SSO role profiles and prints resulting config to stdout:
s3 generate-config [--sso-session SESSION]
Details:
- Reads AWS config (defaults to
~/.aws/config, respectsAWS_CONFIG_FILE). - Reads SSO access tokens from
~/.aws/sso/cache. - Discovers accounts/roles via AWS SSO APIs.
- Creates/updates profile blocks with
sso_session,sso_account_id,sso_role_name,region=us-east-1, andoutput=json. - Rewrites existing profile
sso_sessionreferences to canonical session names when equivalent sessions exist. - Exits with guidance if no valid cached SSO token exists for a session.
- Writes merged config to stdout (it does not directly edit files for you).
TUI Features
Core UI
- Left pane: bucket/prefix tree.
- Right pane:
- file explorer table (prefixes/objects)
- preview panel
- Draggable split handles for pane resizing.
Profile-aware bucket access
For each bucket, the app probes available profiles and picks the best effective profile:
good: list + read object bytesno_download: list allowed but object read deniedno_view: listing denied
You can manually switch profile per bucket from the profile button in the path bar.
SSO handling
- Startup preflight checks for expired/near-expired SSO tokens and can run
aws sso login. - Runtime operations retry once after SSO reauth when token-expired errors are detected.
- In-flight reauth per profile is deduplicated.
Preview and stats
- File preview loads first
4096bytes, withm/More to fetch additional chunks. .gzfiles are previewed as decompressed text automatically..sam,.bam, and.crampreviews usesamtools view -hbehind the scenes and show a head snippet.- If
samtoolsis not available, those files fall back to the normal byte-based preview. - Syntax highlighting is enabled automatically for Textual-supported languages (for example: JSON, YAML, TOML, XML, Markdown, Python, SQL).
.csvand.tsvhighlighting is enabled whentree-sitter-language-packis installed (included as a project dependency in current versions).m/More is only available for normal byte-based previews and folder recursive scans.- Folder preview shows immediate child stats.
- Press
mon a folder preview to run recursive scan (up to50,000keys; reports partials when truncated).
Download flows
- Download selected file(s) to chosen path.
- Download entire prefix recursively.
- Multi-select in table:
- click: single select
- Ctrl/Cmd-click: toggle
- Shift-click: range select
Favorites and filters
- Favorite a bucket with
Ctrl+F. - Toggle filters from the left pane:
- hide
no_view - hide
no_download - hide empty buckets
- show only favorites
- hide
Keybindings
Global/app:
q: quit immediatelyEsctwice within 1 second: confirm quitr: refresh bucketsCtrl+Lor/: focus path inputAlt+Left/Alt+Right: back/forward navigation historyBackspace: go to parent prefixCtrl+F: toggle favorite bucketSpace: preview selected rowm: preview more / recursive scan
Widget behaviors:
- Tree:
Right: move focus to table
- Table:
Left: move focus to treeEnteron bucket/prefix: openEnteron object: download- double-click on bucket/prefix: open
- Path input:
Down: move focus to tableEnter: navigate to typed path
Local State and Cache
State is stored under:
${XDG_CONFIG_HOME:-~/.config}/awss/bucket-cache.json${XDG_CONFIG_HOME:-~/.config}/awss/config.json
bucket-cache.json stores:
- resolved bucket -> profile mapping
- access classification
- empty-bucket flags
- save timestamp
- hash of
~/.aws/config+~/.aws/credentials
Cache behavior:
- automatically reindexes every ~30 days
- invalidates immediately when AWS config/credentials hash changes
- startup may use cache first;
reindexorrtriggers live refresh - if live refresh fails and cache exists, cached buckets can still be used
config.json stores:
- favorite buckets
- bucket filter toggles
Development
Run tests:
python -m unittest discover -s tests -p "test_*.py"
Current suite covers CLI dispatch/wrappers, service logic, and headless Textual behavior.
Metadata
Release files for awss3tui 0.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| awss3tui-0.7.tar.gz | 52.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| awss3tui-0.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 96.3 kB
Release files / awss3tui-0.7.tar.gz
| Download URL | awss3tui-0.7.tar.gz |
|---|---|
| Size | 52.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
94d93a1bf6a1dc12f3f4b38e75097d5aa497de7adf8cee272e1a1ca2904b1067
|
|
BLAKE2b-256 checksum How to use checksums |
361bcc7be806be05b81fd7109f33e81b6565f798b8ea1feb61c05714f0e242c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 9, 2026.
Transparency logRelease files / awss3tui-0.7-py3-none-any.whl
| Download URL | awss3tui-0.7-py3-none-any.whl |
|---|---|
| Size | 43.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5319f93306650edfd2ce0a5b4f53ea2143123e55c374004b6bfd0b1d08ffdde3
|
|
BLAKE2b-256 checksum How to use checksums |
5e5338a7e95b33836e9e70e2b337c68268f24c11484b8a853ca110a5ca6072b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 9, 2026.
Transparency logSecurity for awss3tui 0.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for awss3tui-0.7.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.