Changelog
Last updated: Aug 2, 2026
Every released version of R2Explorer. These notes are the app's own changelog — the same file that ships with the source — so this page cannot drift from what was actually released.
1.6.0 Latest
Added
- Connection Doctor: a per-connection diagnostic sheet, from the sidebar context menu or the bucket-list toolbar. Where Test Connection reports one row per credential plane, the Doctor goes on to say *what to do about it*: a check can now carry a remediation link and hint pointing at the exact Cloudflare dashboard page or Settings toggle that fixes it, rather than only naming the problem. Covers the API token, Management and Object (S3) APIs, Data Catalog, Analytics, the endpoint, folder access and project data for local connections, iCloud sync state, and Cloudflare budget alerts. Every check is a read, run live each time and never persisted, so the sheet cannot go stale and cannot leak credentials into storage
- Cost & Catalog Monitor: one sheet that answers, across every connection at once, what your R2 spend and Data Catalog state are *and when you last actually asked*. Opened from the bucket-list toolbar or ⇧⌘M. Monitoring is opt-in per connection and off by default, because every check costs a real Cloudflare analytics query: nothing refreshes on a timer, Refresh All sweeps sequentially and can be cancelled mid-run, and opening the sheet only fills in connections that have never been checked rather than re-billing ones that already have a reading. Every card carries the timestamp of its reading. A reading older than four hours, or taken on an earlier calendar day, counts as stale and is *downgraded* rather than shown as current: failures soften to warnings and each message is prefixed with when it was taken, so a two-day-old projection can never paint a connection red. Free covers the sheet, the toggles, Refresh All, month-to-date cost, Data Catalog presence, and the whole freshness and staleness apparatus. Pro adds the projection and budget rows, catalog maintenance grading, deep readiness refresh (capped at five catalog buckets per run, and it says so), and the report export
- Monitor report export (Pro): copy the sweep as Markdown, CSV, or TSV, reusing the existing cost-report formats. The Markdown summary spells out each reading's freshness in words, including whether a re-check failed; the CSV and TSV carry
connection, checked_at, freshness, month_to_date_usd, plusprojected_usdandbudget_usd. Timestamps are UTC ISO-8601 so an export survives crossing time zones - iCloud connections sync: the connections list mirrors across your Macs through
NSUbiquitousKeyValueStore, behind a *Sync connections via iCloud* Settings toggle (on by default) kept separate from the existing iCloud Keychain credential sync, since the two answer different questions. R2 and S3 connections sync; local wrangler connections stay device-specific, because a path only means something on the machine it was made on. Reconciliation is last-writer-wins by revision, and demo/screenshot mode is excluded so fixture data can never reach a real iCloud store
Changed
- The Cost & Catalog Monitor's toolbar entry point moved from the connections sidebar to the bucket list, alongside the new Connection Doctor button, so the two diagnostics sit together. ⇧⌘M is unchanged
KeychainHelpernow distinguishes a missing credential from a Keychain read that was *refused*, because a locked keybag needs different advice than a missing token, and can report whether a stored item is flagged for iCloud Keychain sync- The sidebar budget badge now ages out. Previously an over-budget badge stayed red for the rest of the session; every cost entry now records when it was fetched, the sidebar re-reads on a 30-second tick, and a stale entry degrades to an orange clock rather than staying red. Tooltips gained the reading's timestamp in both states, so the badge says how old its own claim is
- The bucket list refreshes a stale cost glance instead of fetching at most once per connection per session. A manual Refresh on a day-old glance now re-reads it, so the month-to-date captions and the sidebar badge no longer freeze at whatever the first visit of the session happened to find
- Deleting a connection now also clears its monitored preference and its monitor record, alongside the budget and cost-cache entries it already cleared
1.5.0
Added
- Cost & Budget Inspector: account-wide R2 usage and cost, opened from the bucket-list toolbar. The Overview is free and shows month-to-date usage and spend per bucket, read from Cloudflare's analytics API. Pro adds a *Projection & Budget* pane: a projected month-end total, an optional monthly budget per connection, and a badge next to the connection name once the projection runs near or past it. The verdict is held in memory only, never persisted, so a connection can never be badged red on a stale projection from a previous launch
- Month-to-date cost on bucket rows: each bucket row carries its own spend-so-far caption, cached per connection and refreshed once per session so the figure costs no extra Class A operations. The month-to-date number is free; the projected month-end figure beside it appears only under Pro
- Bucket sorting: order the bucket list by name, by month-to-date cost, or by the order the provider returned (now an explicit *Default* choice). The cost sort uses the free month-to-date figure, so it works without Pro, and buckets with no cost figure sort alphabetically after every priced bucket instead of changing position on each re-sort. Persisted across launches
- R2 SQL queries (Pro): a *Query* tab on the Data Catalog sheet that turns the catalog you are already browsing into ready-to-run R2 SQL. Pick a namespace and table from what the catalog actually reported, and it generates
SHOW NAMESPACES,SHOW TABLES IN,DESCRIBE, a sampledSELECT, and itsEXPLAINplan, each copyable as bare SQL for Cloudflare's dashboard editor or wrapped as awrangler r2 sql queryinvocation for your own terminal. R2Explorer never runs them: it is sandboxed and cannot launch processes - AWS IAM Identity Center (SSO) import:
~/.awsprofiles that sign in through IAM Identity Center are recognized and labelled. A profile that needs an external refresh, whether through SSO orcredential_process, now offers the exact commands to run (aws sso login, thenaws configure export-credentials) instead of only explaining why it cannot be imported. Combined with the STS session-token signing added in 1.4.1, the exported temporary credentials connect as-is - Dedicated analytics API token per connection: Cloudflare's R2 API tokens cannot carry *Account Analytics · Read*, so a connection that passes every other health check can still be unable to read cost. A connection can now store an optional second token just for analytics, kept under its own Keychain key. A general account token scoped for both R2 and Analytics still only has to be entered once. Test Connection gains an Analytics API row that warns rather than fails, because analytics is an optional capability layered on an otherwise-working connection
- Measured usage fallback: for connections analytics cannot serve (S3, local, or an under-scoped R2 token), cost can be totalled by walking the bucket instead. Storage only, since operation counts are not knowable this way, and never automatic: listing itself costs Class A operations, so each run is something you opt into
- Cost report export: copy a priced breakdown as Markdown, CSV, or TSV, mirroring the existing Data Catalog and benchmark exports
Changed
- The bucket list header now carries the sort menu and a compact create-bucket button, so both sit with the list they act on instead of in the toolbar. The create button is Pro-gated like the toolbar action it mirrors, and says so in its tooltip when Pro is locked
- R2Explorer Pro is now a $5.99 launch price. Anyone who already owns Pro keeps it, and an unlock bought at the launch price covers every future update
Fixed
[sso-session]blocks in~/.aws/configare no longer read as importable profiles. Every IAM Identity Center configuration contains at least one, so the profile picker was showing a phantom entry that could never be imported, and keys inside that block could attach themselves to whichever profile preceded it- The connection sheet can no longer grow taller than the window
- The App Store listing's privacy URL points at the live host
1.4.1
Added
- Data Catalog Safety Guard (R2 connections): when a bucket has R2 Data Catalog enabled, R2Explorer warns before an out-of-band object mutation (delete, Empty Bucket, rename, upload, or mirror/sync into that bucket), because adding, changing, or deleting objects outside the catalog can leave Iceberg tables pointing at files that no longer exist. The warning is advisory, never a hard block: it explains the risk, offers to open the Data Catalog or copy identifying details, and always lets you proceed. It appears once per bucket per session, and only when the catalog status is actually known, so it never implies a bucket is catalog-free when it could not be checked. Reads its answer from a per-connection catalog lookup, so it does not add a network round-trip to your deletes
- STS session-token signing (S3 connections): sign requests with the session token from temporary AWS credentials, so a connection imported from an
~/.awsprofile that uses short-lived credentials works instead of failing to authenticate
Changed
- Data Catalog token guidance now distinguishes a query token (read-only: R2 Data Catalog Read and R2 Storage Read) from a maintenance token (read-write), reflecting Cloudflare's July 2026 support for read-only Data Catalog API tokens. Query clients like DuckDB, PyIceberg, and R2 SQL no longer need write access they will not use. The readiness panel, the generated
wranglercommands, and the exported shell script all read this guidance from one source, so they can no longer drift
1.4.0
Added
- R2 Data Catalog inspection (R2 connections): a Data Catalog item in the bucket context menu showing catalog status, maintenance configuration, namespaces, and per-namespace table counts. Free, like the rest of the read-only surface
- Data Catalog Maintenance Workbench (Pro): two new tabs on the Data Catalog sheet. - *Readiness* grades the catalog against the maintenance tasks Cloudflare expects you to run (compaction, snapshot expiration, and the API token they need), and says what each gap costs. The headline case: compaction on with expiration off means you store both the original small files and their compacted replacements, indefinitely - *Commands* generates the exact
wrangler r2 bucket catalogcommands to close those gaps, scoped to the catalog or a single table, with the destructive ones quarantined in a Danger zone. R2Explorer never runs them: it is sandboxed and cannot launch processes, so they are generated to copy and run in your own terminal - Readiness and the command set export as Markdown or a shell script - Connection health diagnostics: Test Connection now reports one row per credential plane instead of a single pass/fail, so an R2 token that is valid but missing R2 scope reads differently from one that is simply wrong, and an unreachable S3 endpoint is distinguished from a permission failure
- AWS profile import: read
~/.aws/configand~/.aws/credentialsand prefill a connection from a named profile. Profiles that usecredential_processor session tokens are detected and clearly explained rather than silently half-imported - Benchmark report export: copy results as Markdown, CSV, or TSV, with the endpoint, region, and provider recorded alongside the numbers so a pasted report says which bucket it came from
- Empty Bucket (Pro): a bucket context-menu action that deletes every object in a bucket while keeping the bucket itself, driving the existing delete progress sheet
Changed
- Data Catalog reads coalesce the maintenance-configs endpoint over the catalog body, so the panel reports the authoritative configuration
- Toolbar: the Help button moved after Refresh, and every toolbar control gained a tooltip
Fixed
- The Pro price is shown only once StoreKit resolves it. It previously fell back to a hardcoded
$4.99, which showed a USD figure to users in other storefronts; the paywall and Settings now read "Unlock Pro" until the real localized price arrives - The Empty Bucket sheet is guarded against a stale coordinator and a mismatched selection, so it can no longer act on the wrong bucket
1.3.2
Added
- New Local connection type for local
wrangler dev/ Miniflare projects: browse and edit a project's R2 buckets and objects straight from.wrangler/state/v3/r2on disk, with no credentials required - Folder picker in the connection sheet with a security-scoped bookmark so local access persists across launches, plus a Test Connection that reports the discovered bucket count
1.3.1
Fixed
- Stream browser downloads to disk and persist the custom Downloads folder across launches via a security-scoped bookmark
- Surface Keychain write failures on connection add/update instead of leaving the connection in an inconsistent state
- Return the sync planner to idle when the planning phase is cancelled
- Skip the grandfather check in non-production StoreKit environments so TestFlight and sandbox builds no longer accidentally hand Pro to reviewers and testers
Added
SupportLinkshelper centralising GitHub and issue-tracker URLs
Changed
- R2 management API error-body decode failures are now logged via
os.Loggerinstead of being silently swallowed - File preview pane debug output moved from
print()toos.Logger INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NOset so App Store Connect skips the export-compliance prompt on every TestFlight build
1.3.0
Changed
- R2Explorer is now free to download; read operations (browse, list, download, preview) stay free for everyone
- Write operations (upload, delete, rename, create/delete bucket, mirror/sync, benchmark) require a one-time $4.99 R2Explorer Pro in-app purchase
- Every buyer of R2Explorer 1.2.2 or earlier is grandfathered to Pro silently on first launch via
AppTransaction.originalAppVersion
Added
- Settings pane "Pro" tab with unlock status, in-place purchase, and Restore Purchases
- Paywall sheet presented when attempting a locked action, with product price, feature list, and Restore Purchases
1.2.2
Added
- Rename files and folders from the context menu: safe copy-then-delete with overwrite confirmation, live progress for folder renames, typed "RENAME" gate for jobs over 500 objects, and orphan rollback on partial failure
1.2.0
Added
- Bucket Benchmark feature: right-click any bucket to run upload, download, TTFB, and list tests (1 KB – 10 MB), view latency percentiles (min/avg/p50/p95/max) and throughput, and copy results to clipboard
1.1.0
Added
- Bucket Mirror / Sync feature with cross-connection support and live byte-level progress
- Folder and multi-select deletion progress modal
- Delete concurrency setting (1–16, default 4)
- ⌘R keyboard shortcut to refresh the file view
Improved
- Parallel delete batches with provider-aware chunk sizing
- Download progress reporting during sync transfers
- Sync progress layout stability
- Reliable cancel for sync transfers
Fixed
- Path traversal vulnerability in folder downloads
- Progress starvation in delete and sync operations
- Bucket-create error state handling
- Confirm-delete preference now properly honored