Guide / Browsers

Browsers

Two resources hold data rather than configuration: an S3 bucket and a DynamoDB table. Each gets a browser that opens inside the detail pane, takes over the keymap while open, and closes with Esc. Z makes it full-width; ? shows its keys.

S3 object browser (o)

o on a bucket opens a file-manager view of it. Folders are the bucket’s /-delimited prefixes; Enter descends, h goes up a level, and / filters the current listing as you type.

KeyAction
Enter / lOpen a folder · preview an object
h / ⌫Up one level
/Filter the current listing
fRecursive: every object under this prefix, flat
VVersion history: every version, including the delete markers a normal listing hides
s / SCycle the sort column / flip the direction
nLoad the next page
iObject metadata panel: size, type, storage class, encryption and KMS key, ETag, user metadata. Tab focuses it, y copies a value, Y copies all
vView the object as text (the head of a large file)
eOpen the object in $EDITOR (up to 1 MiB)
dDownload the object into the working directory
pCopy a presigned GET URL, valid for one hour
yCopy the s3:// URI
BBookmark this object; restoring it reopens the browser at the same key
tOpen a .tfstate in the Terraform state viewer (below)

Version mode is the one to reach for when “the object is gone”: a deleted key is simply absent from a normal listing, but its versions and the delete marker on top are still there, and v, e, d and p all act on the selected version.

The browser makes read calls only: ListObjectsV2, ListObjectVersions, HeadObject and GetObject. A presigned URL is signed locally with your own credentials and is never sent anywhere.

Terraform state viewer

Select a .tfstate (or .tfstate.backup) object in the browser and press t. neboto fetches and parses it, closes the browser, and shows a Terraform State pane: the state version, serial and Terraform version in the header, then one row per resource instance grouped by module, with the Terraform address on the left and the real ARN or id on the right.

root  ·  12 resources

  aws_vpc.main                          vpc-0a1b2c3d4e5f60718        →
  aws_nat_gateway.this[0]               nat-0f9e8d7c6b5a49382        →
  aws_iam_role.app                      arn:aws:iam::123456789012:role/app  →

module.db  ·  3 resources

  aws_db_instance.primary               db-ABCDEFGHIJKLMNOPQRSTUVWXYZ  →

Enter on a row jumps to that resource through the same link-following as any other detail row, across services and regions. That is the point of the viewer: from a state file to the live resource without copying an id into a search box. y copies a row, Esc closes the pane.

count and for_each instances get one row each with their index ([0], ["blue"]), data sources read data.aws_ami.ubuntu, and the pane ends with a per-provider count and the state’s outputs. Nothing is written anywhere: the state is read once with GetObject, parsed in memory, and dropped when the pane closes.

DynamoDB item browser (i)

i on a table opens a query line above a result table. You write conditions, and neboto works out how to read them:

pk = "USER#42" and sk begins_with "ORDER#" and total > 100
status in (pending, shipped) or not coupon exists
address.city = Perth and tags contains gift

The language has and, or, not, =, <>, <, <=, >, >=, between, begins_with, contains, exists and in (…), with nested paths (a.b[0].c) and backticks for awkward names (`order-id`). A quoted value is always a string. A bare one is a number when it looks like one, otherwise a string, and a key attribute’s declared type wins.

Query or Scan. If the query pins an index’s partition key with =, it’s a Query on that index (the table first, then its GSIs and LSIs), with one sort-key condition as part of the key and everything else as the filter. Otherwise it’s a Scan. The plan line under the query says which, on which index, why, and roughly what one read costs in RCU, while you type. Ctrl-N pins an index yourself, for example to scan a sparse GSI.

Reads. Enter reads pages until it has 50 matches or has looked at 5,000 items, whichever comes first, so a selective filter doesn’t come back empty with matches further in. n reads more of the query that ran, Esc stops a read, and ↑ / ↓ on the query line step through that table’s history.

KeyIn the results
EnterOpen the item
/Filter the loaded rows (no API call)
← / →Move between columns and scroll
zSort the loaded rows by the column
nRead more
yCopy
CCopy the read as an aws dynamodb query or scan command, or get-item for the selected item
TabBack to the query line

Key columns are pinned on the left, and the rest follow, most common first. In the item view, v switches between typed rows, JSON and DynamoDB JSON, / finds lines (n / N), V selects, y copies the line’s value or the selection, Y the whole item and e opens it in your editor. The copied CLI command carries --max-items 50 and --page-size so a pasted Scan doesn’t read the whole table.

The same key opens a session browser on a Bedrock AgentCore memory store: actors, their sessions, and the events within, with t switching to the store’s long-term records.