# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.3.1] - 2026-06-27
Monthly update.
### Security
#### s3sync
- Harden directory traversal check used when saving S3 objects to local files: reject `.` and `..` path segments (
previously only `../` and`..\` were caught), and detect separators on both `/` and `\`. Does not affect S3 access
itself.
### Fixed
#### s3util-rs
- S3 keys are now taken verbatim from `s3://` paths. Previously `.` and `..` segments were resolved away as if the key
were a filesystem path (e.g. `cp /etc/hosts s3://bucket/..` uploaded to key `hosts`), and `%XX` sequences were
percent-decoded. Keys are now stored exactly as written, matching the AWS CLI.
- Downloading to a bare filename in the current directory (e.g. `cp s3://bucket/key xyz`) no longer fails with
`parent directory does not exist: ''`. Previously this required an explicit `./xyz`; the current directory is now used
correctly when the target has no directory component.
### Changed
- aws-sdk-s3 `v1.133.0 -> v1.137.0`
- Updated other dependencies
### Underlying libraries
```toml
s3sync = "=1.58.9"
s3util-rs = "=1.5.3"
s3rm-rs = "=1.3.8"
s3ls-rs = "=1.0.3"
```
## [1.3.0] - 2026-05-24
Monthly update.
### Added
#### s3util-rs
- `rename` subcommand: atomically rename an object within the same S3 Express One Zone directory bucket using the
RenameObject API.
Both source and target must be in the same bucket (name must end with --x-s3). Supports optional conditional checks.
### Changed
- aws-sdk-s3 `v1.131.0 -> v1.133.0`
- Updated other dependencies
### Underlying libraries
```toml
s3sync = "=1.58.8"
s3util-rs = "=1.5.2"
s3rm-rs = "=1.3.7"
s3ls-rs = "=1.0.2"
```
## [1.2.4] - 2026-05-17
### Changed
#### s3sync
- AWS SDK for Rust does not support the new checksums XXHash64/3/128, MD5, and SHA-512, so an error check has been added
to prevent these from being specified as additional checksums. We plan to remove this restriction when AWS SDK for
Rust supports these new checksums.
### Underlying libraries
```toml
s3sync = "=1.58.7"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.2.3] - 2026-05-09
### Fixed
- `batch-run` now catches panics in dispatched subcommands. A
panicked subcommand surfaces as exit code `101` with a structured
`event = "panicked"` log entry carrying `line`, `raw`, `command`,
and `panic` fields, is recorded as a failure in the summary, and
counts toward `--max-errors` (so `--continue-on-error` and the
failure-threshold flags apply to panics like any other failure).
Previously, in the default sequential mode (`--parallel 1`), a
panic in any subcommand crashed the entire `batch-run` process
with no summary line, no structured log entry, and no chance to
apply the failure-policy flags; in parallel mode the panic was
caught but the recovery log did not identify which line panicked.
### Changed
- All build profiles now use `panic = "unwind"`. The
`release-min-size` profile previously set `panic = "abort"`, which
would have suppressed the new `batch-run` panic recovery for
binaries built under that profile.
### Underlying libraries
Pinned versions are unchanged from 1.2.2:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.2.2] - 2026-05-09
### Changed
- `batch-run` per-line and `--check-format` logs now emit their
details as structured `tracing` fields rather than packing
everything into the message string.
### Underlying libraries
Pinned versions are unchanged from 1.2.1:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.2.1] - 2026-05-09
### Changed
- Documentation: clarified that **Amazon S3 is the only supported
platform**. S3-compatible storage (MinIO, Cloudflare R2,
Backblaze B2, Wasabi, Ceph RGW, DigitalOcean Spaces, IBM COS,
and similar) is provided strictly **as-is**, with **absolutely
no support or assistance**. Bug reports, questions, and
assistance requests regarding S3-compatible storage will not be
addressed.
- Bug report template (`.github/ISSUE_TEMPLATE/bug_report.md`):
tightened the Storage line to state that issues regarding
S3-compatible services will be closed automatically,
unconditionally, and without exception; added a Region field;
added a notice that only clear, reproducible bugs in s7cmd
itself are accepted (no support, questions, feature requests,
or usage help).
### Underlying libraries
Pinned versions are unchanged from 1.2.0:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.2.0] - 2026-05-07
### Added
One new subcommand sourced from `s3util-rs` 1.4.0:
- **Pre-signed URLs** — `presign s3://<BUCKET>/<KEY> [--expires-in N]`
generates a SigV4-signed `GetObject` URL locally and prints it to
stdout. Default `--expires-in` is 3600 seconds; maximum is 604800
seconds (one week). Zero, negative, non-numeric, and over-max
values are rejected at parse time. Bucket-only paths
(`s3://<BUCKET>` or `s3://<BUCKET>/`) and local-path targets are
rejected post-parse and exit 1; unsupported URL schemes (e.g.
`http://...`) are rejected by clap's value-parser and exit 2.
presign is GET-only (no `--source-version-id`) and has no
`--dry-run` (signing is local — no S3 API call is made), matching
`aws s3 presign`.
### Changed
- Bumped `s3util-rs` from 1.3 to 1.4 (vendored CLI sources synced
to match) — this is what brings `presign`.
- Top-level `--help` reorganization: `restore-object` and `presign`
now appear inside the "Object Operations" group (right after
`rm`); the standalone "Object Restore" / "Object Presign"
sections were removed. Per-subcommand `--help` is unchanged.
### Underlying libraries
This release pins the following exact versions of the underlying
libraries:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.1.0] - 2026-05-06
### Added
Nine new subcommands sourced from `s3util-rs` 1.3.0. Each one
mirrors the upstream behavior (argument names, log messages,
exit codes, output JSON shape) and respects s7cmd's
`--dry-run`, `--target-profile`, `batch-run`, and exit-code
conventions.
- **Bucket Replication** — `get-bucket-replication`,
`put-bucket-replication`, `delete-bucket-replication` for
managing cross-region and same-region replication rules.
`put-bucket-replication` accepts the AWS-CLI shape
(top-level `Role` + `Rules`) from a file path or `-` for
stdin (file path only inside `batch-run`, matching the
other `put-*` family).
- **Transfer Acceleration** — `get-bucket-accelerate-configuration`,
`put-bucket-accelerate-configuration` to read and toggle S3
Transfer Acceleration. `put-` takes mutually-exclusive
`--enabled` / `--suspended` flags.
- **Requester Pays** — `get-bucket-request-payment`,
`put-bucket-request-payment` for switching between owner-pays
and requester-pays billing. `put-` takes mutually-exclusive
`--requester` / `--bucket-owner` flags.
- **Policy Status** — `get-bucket-policy-status` to report whether
a bucket policy makes the bucket public
(`{"PolicyStatus": {"IsPublic": …}}`).
- **Object Restore** — `restore-object` to initiate restoration
of S3 Glacier-class archived objects with `--days N` and
`--tier {Standard,Bulk,Expedited}`. Supports
`--source-version-id` for version-targeted restores.
### Changed
- Bumped `s3util-rs` from 1.2 to 1.3 (vendored CLI sources
synced to match). This release also picks up the upstream
bug fixes for output formatting (object-size filters and
version-related fields in lifecycle output, encryption
blocking rules, target grants in logging, `ChecksumSHA512` /
`ChecksumMD5` in object metadata, replication metrics and
RTC time containers) and accepts ISO 8601 (`YYYY-MM-DD`)
dates in lifecycle rules.
### Underlying libraries
This release pins the following exact versions of the underlying
libraries:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.3.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```
## [1.0.0] - 2026-05-04
Initial release.
## [0.3.0] - 2026-05-03
### Added
- **`cp --skip-existing`**: when the target object or file already
exists, skip the copy instead of overwriting. Lets you resume
partial bulk transfers (uploads, downloads, S3-to-S3) without
re-sending objects that already landed at the destination.
Combine with `--dry-run` to preview which objects would be
skipped before running for real.
- **`create-bucket --if-not-exists`**: if the bucket already exists
(and you own it), exit 0 without re-creating. Makes provisioning
scripts idempotent — re-running the same
`create-bucket --if-not-exists s3://my-bucket` is safe whether
or not the bucket is already there. When combined with
`--tagging`, the tagging step is also skipped on the
existing-bucket path.
### Changed
- Bumped `s3util-rs` from 1.1 to 1.2 (vendored CLI sources synced
to match) — this is what brings the two new flags above.
- Expanded the README's *Intended Audience and Issue Tracker Scope*
section: questions about concurrency-induced performance or
resource exhaustion, and questions that belong with AWS, with
the operator of an S3-compatible storage service, or with the
operating system vendor, are now explicitly out of scope for
the issue tracker.
- Added a note in the `batch-run` section of the README clarifying
that while batch-run avoids per-command process startup, it
still constructs a fresh AWS client (credential, region, HTTP
client setup) per command — so it is not intended for
high-throughput parallel processing of large workloads.
### Underlying libraries
This release pins the following exact versions of the underlying
libraries:
```toml
s3sync = "=1.58.6"
s3util-rs = "=1.2.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.0"
```
## [0.2.0] - 2026-05-02
### Added
- **`batch-run` subcommand** for running many s7cmd commands from a
script file (or `-` for stdin). Choose sequential or parallel
execution (`--parallel N`, `0` picks the CPU count) and pick how
failures are handled:
- default: stop on the first non-zero exit (sequential) or stop
spawning new commands (parallel; in-flight lines finish);
- `--continue-on-error`: run every line regardless of outcome;
- `--continue-on-warning`: keep running past warnings (exit codes
`3` and `4`) but still stop on true failures;
- `--max-errors N`: stop once `N` failures have been recorded.
Parse/validation errors (typos, unknown subcommands, bad
arguments) count the same as runtime failures, so
`--max-errors 5` tolerates up to 5 broken lines anywhere.
The final exit code is the worst seen across the whole batch,
ranked by severity (`1` > `2` > `3` > `4` > any other non-zero >
`0`) rather than by numeric value, so an actionable error always
wins over a SIGINT skip or a "not found". A trailing summary
`N succeeded, N failed, N warnings, N skipped, elapsed Ts` is
written to stderr; suppress with `--no-summary`, or pass
`--json-tracing` to emit it as a single-line JSON object instead.
- **Live progress bar in `batch-run`** drawn on TTY stderr in
read-all mode while the run is in progress. Suppress with
`--no-progress` (useful inside terminal multiplexers, `script(1)`,
or CI runners). Streaming mode, non-TTY stderr, and
`--json-tracing` already suppress the bar.
- **`--check-format`** validates a `batch-run` script without
executing anything. It stops at the first problematic line —
prefixed with the script source (file path, or `stdin` for `-`)
and the line number — and exits 1; a clean script logs `format OK`.
- **Per-line tracing in `batch-run`**: each line logs a `start` event
and a matching outcome — `success`, `warning (exit N)`,
`skipped (exit 130)` (Ctrl-C / SIGINT), or `failure (exit N)` —
prefixed with the line number and the original command. `start`
and `success` are info level (silent at the default warn level —
pass `-v`); `warning`, `skipped`, and `failure` are visible
without `-v`. Per-line outcome buckets: `0` → succeeded;
`3` / `4` → warnings; `130` → skipped (never counts toward
`--max-errors`); other non-zero → failed.
- **`--dry-run` on every state-mutating subcommand** (`cp`, `mv`,
`rm`, `create-bucket`, `delete-bucket`, all `put-*` and
`delete-*`). Arguments and inputs are still validated, an
`[dry-run]` log line describes what would have happened, and the
command exits 0 without touching AWS. Read-only commands (`get-*`,
`head-*`, `ls`) intentionally do not accept this flag.
### Changed
- `sync`, `clean`, and `ls` no longer terminate the process on their
own — required so a single failing line inside `batch-run` does not
kill the rest of the batch. Behavior of standalone invocations is
unchanged.
- Bumped `s3util-rs` from 1.0 to 1.1 (vendored CLI sources synced to
match).
### Fixed
- Dispatching `cp` / `mv` could overflow the thread stack on
platforms with small default stacks; the inner futures are now
boxed so dispatch is safe regardless of stack size.
## [0.1.3] - 2026-04-29
### Changed
- Documentation updates.
## [0.1.2] - 2026-04-29
### Added
- `CHANGELOG.md` documenting changes per Keep a Changelog format.
### Changed
- Bumped `s3util-rs` to `1.0.0` and synced vendored CLI sources to upstream `4edffac`. Under `--show-progress`, the
destination line (`-> <path>`) is now printed unconditionally on success.
- Expanded README: scope, non-goals, requirements, installation, and AI-development disclosure.
### Removed
- Dropped Windows UAC manifest infrastructure (`s7cmd.manifest`, `s7cmd.rc`, `embed-resource` build dependency).
## [0.1.1] - 2026-04-29
### Changed
- Bumped `nix` from `0.30.1` to `0.31.2`.
- Dropped `windows-11-arm` runner from CI/CD; pre-built `aarch64-pc-windows-msvc` binaries are not available while the
`LNK1322` (Cortex-A53 erratum #843419) build failure is unresolved.
## [0.1.0] - 2026-04-29
Initial preview release.
### Added
- Object operations: `ls`, `cp`, `mv`, `rm`, `sync`, `clean`.
- Object metadata: `head-object`, `get-object-tagging`, `put-object-tagging`, `delete-object-tagging`.
- Bucket operations: `create-bucket`, `delete-bucket`, `head-bucket`.
- Bucket-level configuration subcommands: tagging, policy, versioning, lifecycle, encryption, CORS, public-access-block,
website, logging, notification.
- Shell completion generation (`--auto-complete-shell`) for bash, elvish, fish, powershell, and zsh.
- E2E test suite covering object/bucket operations against live AWS S3.
- Pre-built binaries for Linux (x86_64, aarch64), macOS (aarch64), and Windows (x86_64).