Cross-platform TUI for AWS and S3-compatible services — runs on macOS, Linux, and Windows. Powered by Textual and the VMx MVVM framework.
Status: v0.8.0 cut; PyPI publish pending — install from Git until the
aws-tuiproject name is available on PyPI. Headline change from v0.7.0: EMR Serverless as a second first-class service alongside S3 — application picker, job-runs master-detail with state-filter chips, columnized run rows with colored state indicators, on-demand log streaming with a grep filter + LRU cache, clone-and-edit modal for re-running a finished job, and a 4-slot Tab cycle through NavMenu → LEFT → DETAIL → LOGS. The nav rail is now a regular focusable pane with text labels (no collapse mode, no icon emojis). SeeCHANGELOG.mdfor the full per-PR delta.
- Norton-Commander–style dual pane. S3 (or any S3-compatible bucket)
on one side, your local filesystem on the other. Copy and delete
across panes with
candd(confirm modal first); multi-select viaShift+↑/↓cursor extension, modifier+click, or persistent marks. The left-rail nav menu is always visible — Tab cycles in/out of it as a regular pane (post-PR-#94). Move, rename, and the dedicatedvmulti-select-mode entry point are spec'd but deferred to v0.9 — seedocs/keybindings.mdfile operations and action IDs, plus theDeferred / v0.9 roadmapblock in the[0.8.0]section ofCHANGELOG.md. - One-key source switcher.
Shift+Scycles the focused pane through every available source in order:local→ each AWS profile (aws s3 · {profile} · {region}) → eachs3-compatibleconnection (s3-compatible · {name} · {endpoint}) → wrap. With multiple AWS profiles configured locally, this is the fastest way to jump between accounts: one keystroke per profile, the pane re-mounts in place — no:command palette, no modal. The s3-compatible side is open-ended: add as many MinIO / R2 / B2 / Wasabi / Ceph endpoints as you like via the in-app Settings nav page (or by hand in<config-dir>/config.toml) and they join the cycle automatically. The four combos{S3, local} × {S3, local}are reachable per pane independently. - First-class S3-compatible support. MinIO, Cloudflare R2, Backblaze B2, Wasabi, Ceph, SeaweedFS — same code path as native AWS. Path-style addressing toggle and per-vendor docs.
- EMR Serverless (read-only browser + clone-job-run). Second
shipped service, alongside S3. Pick the EMR nav row to
browse applications, drive a master-detail Job Runs pane with
state-filter chips, inspect job-run details (driver, spark
params, execution duration) — all driven by three independent
pollers (apps 60 s / runs 60 s with 6:1 decay when no active
runs / detail 30 s with terminal-state suppression — demo mode
bumps to 30 s / 30 s / 5 s so the clone-state walk stays
visible). Press
con a finished job run to open a clone-and-edit modal that pre-fills every field from the source run and firesstart_job_runon save (PR #83 — landed ahead of the rest of PR-C). Job-run logs are streamable on demand; cancel and the vanilla submit form remain deferred. AWS-only (does not surface for s3-compatible connections). - Silent SSO. Auto-discovers every AWS profile from
~/.aws/{config,credentials}. SSO-backed profiles get a cheap token-cache freshness probe on launch (onestat, one ~1 KB JSON read, sub-millisecond); non-SSO profiles go straight to live boto credential-chain validation. Honors$AWS_PROFILEbetween[defaults].connectionand the first-auto fallback so SSO setups where[default]has no creds still pick the right profile. - Crash-recovery transfer journal. Transfers leave durable
begin/finished/aborted journal records under
<cache-dir>/transfers/<id>.jsonl. Startup resume and true multipart-upload replay/abort remain deferred in v0.8.x. - Crash dump. Unhandled exceptions write a dump to
<cache-dir>/crash/<ts>.txt(traceback, last user actions, and log tail). The interactive recovery modal remains deferred in v0.8.x. - Transfers overlay. Top-right floating box: one row per active transfer with src → dst label, progress bar, and cancel button. Finished entries linger briefly then disappear so newer transfers take their place.
- Ten built-in themes. Four dark originals — Carbon (default),
Voidline (neon), Lattice (mint), Amber CRT (retro) — plus three
light themes (Solarized Light, GitHub Light, One Light) and three
popular community palettes (Nord, Dracula, Gruvbox Dark). Each drives a matching
banner gradient at launch and on every
Tcycle. User overrides via<config-dir>/theme.tcssor full.tcssthemes under<config-dir>/themes/. - In-app S3 connection settings. The left rail's
⚙ Settingsnav peer opens a scrollable settings page (no modal overlay) with a Connections section that lists every configured s3-compatible endpoint and an inline form for add/edit (Save commits + reloads affected panes immediately; Delete prompts for confirmation). Keyboard:,selects Settings. No more hand-editing<config-dir>/config.tomlfor routine endpoint changes. - Keymap schema ready; runtime rebinding deferred. Action ↔
keystroke IDs are defined and validated, but
AwsTuiAppstill routes the wired v0.8.x bindings directly. Seedocs/keybindings.mdcustomizing and action IDs for the current wired list and the v0.9 input-router plan. - Streaming Quick Look (deferred). Spec'd on
Spaceto stream the first 64 KB with a syntax tint, plus a full-file$PAGERshell-out. Thepane.quick_lookaction handler isn't wired in v0.8.x — tracked under[Unreleased] DeferredinCHANGELOG.mdanddocs/keybindings.mdoverlays. - Command palette (deferred). Spec'd on
:orCtrl+Kas a fuzzy-filterable list of every action — including dynamic ones likeconnection switch <name>andtheme switch <name>. In v0.8.x:opens the help overlay as a placeholder andCtrl+Kis unbound; the full palette ships post-v0.8. See[Unreleased] DeferredinCHANGELOG.mdandkeybindings.mdoverlays. - Layered architecture with enforced forbidden edges. View ▸ ViewModel
▸ Service ▸ Domain ▸ Infra, with
app.py/composition.pyas trusted composition roots and services allowed to compose concrete VMs; enforced byscripts/check-layers.sh. Mypy strict-clean. Seedocs/architecture.mdtesting pyramid for the current test-tier table; the default tier runs unit / in-process integration / snapshot / e2e, with a 9-test MinIO tier opt-in viauv run pytest -m integration.
PyPI release of
aws-tuiis in flight — the VMx PyPI blocker has lifted (the framework now ships on PyPI). Until aws-tui's own first PyPI release lands, install from Git:
pipx install git+https://github.com/thekaveh/aws-tui.gitFor development:
git clone https://github.com/thekaveh/aws-tui.git
cd aws-tui
uv sync --frozen --dev
uv run aws-tuiRequirements: Python 3.11 / 3.12 / 3.13 and a current uv that can
read lockfile revision 3 (CI uses astral-sh/setup-uv@v7). Runs on
macOS, Linux, and Windows — see docs/platforms.md
for the recommended terminal + font setup per OS.
Pass AWS_TUI_DEMO=1 (or --demo) to launch with deterministic mock data backing all services:
AWS_TUI_DEMO=1 aws-tui
# or
aws-tui --demoYou'll see four synthetic connections (demo-dev, demo-prod, demo-shared, demo-minio), populated S3 buckets, EMR Serverless applications and job runs across multiple states, and working clone / copy / delete operations. AWS/S3/EMR demo state resets every launch; the local pane is your real filesystem. A persistent DEMO MODE chip in the banner subtitle keeps the no-real-AWS contract obvious.
To verify: aws-tui --version reports (demo: enabled) or (demo: disabled).
aws-tui # launches with the default connectionFor SSO-backed profiles, if you've run aws sso login --profile <name>
recently, aws-tui picks up the cached token silently (no network
round-trip just to render the UI). Otherwise the picker shows the
connection in login needed state — the auth.authenticate action is
spec'd as a in
docs/keybindings.md connection/auth but its
runtime wiring is deferred to v0.9 (the BindingResolver
work — see the Deferred / v0.9 roadmap block in CHANGELOG.md).
Today, run aws sso login --profile <name> in your shell and
relaunch. Non-SSO profiles are attempted directly through boto3; debug
shared credentials, credential_process, env, or role-backed profiles
with aws sts get-caller-identity --profile <name>.
If aws s3 ls works on your shell but aws-tui shows
access denied on the left pane, the most common cause is that
[default] in ~/.aws/config has no creds. Export $AWS_PROFILE
pointing at the working profile and relaunch — the resolver picks it
up between [defaults].connection and the first-auto fallback.
If you have no [connections.*] in <config-dir>/config.toml
and ~/.aws/{config,credentials} is empty, v0.8.x opens the main
screen with a local-only placeholder. A welcome modal exists in the UI
surface but is not wired into startup yet (tracked for v0.9):
welcome to aws-tui
no AWS or S3-compatible connections configured.
add aws profile (runs 'aws configure sso' in your terminal)
add s3-compatible (in-TUI form for MinIO, R2, etc.)
skip for now (you can add later from Settings)
For now, add an AWS profile with aws configure sso / aws sso login,
or open Settings with , and add an S3-compatible connection.
Numbered hierarchically for navigation.
-
User-facing
- Connections (AWS profiles + S3-compatible) — configure connections; how the credential chain resolves; vendor quirks for MinIO / R2 / B2 / Wasabi.
- Keybindings — wired key map, deferred action IDs, and the pending
[keybindings]overlay contract. - Theming — built-in palettes, runtime theme switch,
.tcssoverlay and custom-theme drop-ins. - Cookbook (common recipes) — step-by-step walkthroughs (connect to MinIO, switch theme on the fly, prepare keybinding overlays, resume after a crash).
- Supported platforms — per-OS terminal + font recommendations and Windows launch notes.
- Local AWS test-services harness (
scripts/test-services/) — MinIO Docker Compose + seed for offline development.
-
Contributor-facing
- Architecture — five-layer model + composition root + lifecycle + messaging primer.
- Adding a new service — the
Serviceprotocol + per-layer wiring. - VMx Python cheatsheet — facade pattern, message-protocol shape, lifecycle gotchas.
-
Spec + plans
Historical superpowers specs, plans, and notes are indexed here for provenance; headings are numbered for repository-wide navigation.
- v0.1.0 design spec — authoritative source for behavior + acceptance.
- Settings as a first-class nav page — design + post-ship amendments (PR #54 / #55 / #56). Supersedes the modal-overlay design at
docs/superpowers/specs/2026-06-20-app-settings-shell-and-s3-panel-design.md(kept for git-history continuity, marked SUPERSEDED in-file). - Modal & toast polish — PR #47 modal/toast surface rework.
- Graceful unreachable connections — PR #48/#49 design.
- EMR Serverless service v1 design — decomposed PR-A read-only browser, PR-B cancel + logs, PR-C submit (vanilla + clone), PR-D E2E. Shipped through PRs #76–#84 for the read-only browser, clone-job-run modal, and logs pane/filter work; cancel and vanilla submit remain deferred in the spec's "Status" note.
- Public release pipeline —
release.ymlbuild + Sigstore-signed PyPI publish + Homebrew tap bump, design landing alongside the v0.8.0 cut (PR #95). - Cross-platform readiness — macOS / Linux / Windows parity audit and the install / smoke / docs plan for matching all three.
- Demo mode —
AWS_TUI_DEMO=1(or--demo) boots the full UI against seeded in-memory fakes; ships in PRs #97 / #104. - VMx toolkit adoption — historical case-by-case retrofit of the VM layer to use VMx 2.6.1-era
CompositeVM/FormVM/IDialogServiceprimitives; records the analytical mistakes the design review went through (§1.3) so future VMx migration work does not repeat them. - VMx vNext upstream asks — feedback report for VMx maintainers, derived from the aws-tui toolkit-adoption review and focused on primitives that would reduce custom wrapper code.
- VMx 3.1.0 adoption audit — current VMx 3.1.0 bump report mapping new upstream primitives (
TokenPagedComposition,FilteredCompositeVM,ScoredFilteredCompositeVM,FormVMvalidators,ModalVM,DiscriminatorVM) to aws-tui VM/view refactor candidates. - Implementation plan index — per-milestone and post-tag implementation plans with one-line descriptions; superseded plans (e.g. PR #52 modal-overlay) are kept in-tree but marked.
-
Maintainer-facing
- Recording todo — asciinema + screenshot artifacts the maintainer still needs to record manually.
- Release procedure — cut-a-release checklist: version bump, CHANGELOG, tag, publish, Homebrew bump.
- Homebrew bootstrap — one-shot bootstrap for the
thekaveh/homebrew-aws-tuitap immediately after the first PyPI release. After that, the bump-homebrew job inrelease.ymlopens PRs against the tap automatically. - Consumed contract ledger — pinned external API/tooling contracts checked during maintenance passes.
-
Project meta
- Contributing — development setup and commit conventions.
- Code of Conduct — contributor behavior expectations and enforcement.
- Security policy — vulnerability reporting + supported versions.
- Changelog — per-pass + per-release deltas.
<config-dir> and <cache-dir> are platform-specific; see
docs/platforms.md for exact
macOS, Linux, and Windows paths. Existing legacy XDG directories are
preserved when present.
| Path | Contents |
|---|---|
<config-dir>/config.toml |
Connections + defaults + keybindings |
<config-dir>/theme.tcss |
Optional .tcss overlay over the active theme |
<config-dir>/themes/<name>.tcss |
Optional full custom themes |
<cache-dir>/log/aws-tui.log |
JSON-lines log (rotated 5 MB × 5) |
<cache-dir>/transfers/<id>.jsonl |
Per-transfer crash-recovery journal |
<cache-dir>/crash/<ts>.txt |
Full traceback + log/action tail per crash |
| Variable | Default | Effect |
|---|---|---|
AWS_PROFILE |
unset | Pick this AWS profile at launch when [defaults].connection is unset. Honored between config and first-auto-discovered fallback. |
AWS_DEFAULT_REGION |
unset | Used only by AWS tooling outside aws-tui; aws-tui resolves connection regions from [connections.*].region, AWS profile config, or us-east-1. |
AWS_REGION |
unset | Same caveat as AWS_DEFAULT_REGION: set a profile/config region for aws-tui connection selection. |
AWS_TUI_DEMO |
unset | Truthy values 1, true, and yes launch demo mode with seeded in-memory data. Equivalent to aws-tui --demo. |
${PREFIX}_ACCESS_KEY_ID / ${PREFIX}_SECRET_ACCESS_KEY / optional ${PREFIX}_SESSION_TOKEN |
per-connection | Read by ConnectionResolver when a [connections.<name>] entry in config.toml sets credentials = "env:PREFIX_". See docs/connections.md for the full pattern. |
XDG_CONFIG_HOME |
per-OS default | Linux: used by platformdirs when no legacy ~/.config/aws-tui directory already exists. macOS and Windows use the platform-native location regardless. |
XDG_CACHE_HOME |
per-OS default | Linux: used by platformdirs when no legacy ~/.cache/aws-tui directory already exists. macOS and Windows use the platform-native location regardless. |
AWS_TUI_TRANSFER_LINGER |
3.0 |
Seconds a finished transfer's row stays visible in the transfers overlay before it fades. Test-only knob — short values make pytest runs faster. |
Any $PAGER / $EDITOR semantics during the AWS-CLI shell-out for
SSO setup follow the AWS CLI's own conventions; aws-tui itself does
not read those variables in v0.8.x. The Quick Look full-file $PAGER
shell-out is spec'd but not yet wired (see the
[Unreleased] Deferred block of CHANGELOG.md).
aws-tui is English-only in v0.8.x. User-facing strings are intentionally hardcoded until a localization pass introduces translation bundles and locale-aware formatting.
See CONTRIBUTING.md. License: Apache License 2.0 (with NOTICE). Security: see SECURITY.md.