# 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.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).