Releases: WithAutonomi/ant-client
Release list
ant 0.3.7-rc.2
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
No changelog entry was recorded for 0.3.7. See the commit history for the changes in this release; these notes will be corrected retroactively.
ant 0.3.7-beta.1
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
No changelog entry was recorded for 0.3.7. See the commit history for the changes in this release; these notes will be corrected retroactively.
ant 0.3.7-rc.1
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
No changelog entry was recorded for 0.3.7. See the commit history for the changes in this release; these notes will be corrected retroactively.
ant 0.3.6
Installation
Linux / macOS (quick-start)
curl -fsSL https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.sh | bashWindows (quick-start)
irm https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.ps1 | iexManual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Fixed
- A client whose routing table has been starved of peers now recovers at runtime
instead of needing a restart. The fix is insaorsa-core0.27.3 and reachesant
through this release's dependency uplift — see
WithAutonomi/saorsa-core#153 (V2-1036).
Internal
- Release notes are now extracted per version rather than always taking the first
CHANGELOG section, so each release ships its own notes (#183).
ant 0.3.6-rc.1
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Fixed
- A client whose routing table has been starved of peers now recovers at runtime
instead of needing a restart. The fix is insaorsa-core0.27.3 and reachesant
through this release's dependency uplift — see
WithAutonomi/saorsa-core#153 (V2-1036).
Internal
- Release notes are now extracted per version rather than always taking the first
CHANGELOG section, so each release ships its own notes (#183).
ant 0.3.5
Installation
Linux / macOS (quick-start)
curl -fsSL https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.sh | bashWindows (quick-start)
irm https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.ps1 | iexManual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Changed (breaking — external-signer merkle API, ADR-0003)
- External-signer merkle uploads are no longer capped at one payment batch (
MAX_LEAVES= 256 chunks ≈ 1 GiB):file_prepare_upload*now partitions the to-upload set intoMerkleTree-sized sub-batches (ExternalPaymentInfo::Merklecarriesprepared_batches: Vec<PreparedMerkleBatch>), the signer pays one transaction per batch, and the newClient::finalize_upload_merkle_multitakes one winner hash per batch.finalize_upload_merkleremains as the single-batch special case. A batch the signer never paid (Nonehash) no longer aborts the upload: paid batches store and the unpaid chunks surface viaError::PartialUpload. - External-signer merkle prepared uploads no longer hold the encrypted file in memory: chunk bodies stay in the on-disk encryption spill (opaque
ExternalChunkStoreinsideExternalPaymentInfo::Merkle, replacing the residentchunk_contents: Vec<Bytes>), and finalize stores them via the wallet path's bounded spill fan-out — peak RAM ~256 MB regardless of file size, plus deferred-retry rounds the external path previously lacked.
Added
Client::file_prepare_upload_with_mode: external-signer prepare with an explicitPaymentModeoverride, mirroring the wallet path'sfile_upload_with_mode.ClientConfig::merkle_external_batch_cap: clamped test seam (3..=MAX_LEAVES) so E2E tests exercise real multi-batch external signing with kilobyte files.- Resumable external-signer finalize for both payment paths, so a post-payment storage shortfall no longer strands the payment (#140).
Client::finalize_upload_resumable(wave-batch) andClient::finalize_upload_merkle_multi_resumable(merkle) — each with a_with_progressvariant — return aFinalizeOutcome:Complete(FileUploadResult), orPartial { result, resume }carrying an opaqueFinalizeResumehandle (Wave/Merkle) that owns the already-paid material (the wave path's paid chunks, or the merkle path's on-disk spill + signed proofs).Client::finalize_resume(+_with_progress) takes that handle and re-drives storage for only the still-unstored chunks against the same on-chain payment — no re-quoting, no second signature, no double payment — and is loopable untilComplete(bound the loop: persistent store failures returnPartialon every call, neverErr). The merkle resumable finalize requires every sub-batch to be paid — a resume handle cannot acquire proofs for unpaid chunks, so a partial payment is rejected up front with a pointer at the non-resumable path. The existing consumingfinalize_upload/finalize_upload_merkle_multiare unchanged (they still accept partial payment and surface a shortfall asError::PartialUpload).
Fixed
- External-signer merkle finalize (
Client::finalize_upload_merkle) now returnsError::PartialUploadwhen chunks remain short of quorum after all retries, matching the wave-batch finalize. Previously it returnedOkwithchunks_failed > 0, which callers (desktop app, mobile FFI) took as success — reporting a paid but not fully retrievable file as complete (#166). ant node start/ant node stopwith--service-namenow resolve the node ID through the daemon API instead of readingnode_registry.jsondirectly, eliminating a race against concurrent registry mutations by the daemon.ant node add --jsonno longer interleaves binary-download progress with the JSON result; progress output now goes to stderr (was stdout) and is suppressed entirely in JSON mode.
Changed
--evm-networkstill defaults toarbitrum-one, except when a devnet manifest carrying an EVM block is loaded: that combination now errors and asks for an explicit choice (localto use the manifest, or a preset to override it). The old behavior silently overrode the manifest's EVM config, producing no-op mainnet-vault transactions on other chains that spent gas and set a useless ANT allowance before every chunk PUT failed payment verification. An explicit preset selected alongside a manifest EVM block now prints a warning that the manifest's EVM config is ignored. No change for mainnet users or read-only operations.- Default network binding changed from IPv4-only to IPv6 dual-stack. Hosts without a working IPv6 stack should pass
--ipv4-onlyto avoid advertising unreachable v6 addresses to the DHT (which causes slow connects and junk address records). ant file uploadnow writes datamaps as<filename>.<extension>.datamapinstead of stripping the extension. Uploadingphoto.jpgproducesphoto.jpg.datamap(wasphoto.datamap). Existing datamaps remain readable.ant file uploadno longer silently overwrites an existing datamap. Repeated uploads of the same source path producename-2.datamap,name-3.datamap, … capped at 100 attempts. Pass--overwriteto restore the previous behaviour.
Added
ant file upload --overwrite: replace any existing<filename>.datamaprather than writing a suffixed sibling.ant file download --datamapno longer requires-o/--output— defaults to the original filename derived from the datamap basename (photo.jpg.datamap→photo.jpg, written to the current directory). Pass-oto override.ant file download --datamapnow reads both msgpack (canonical) and legacy JSON datamaps, so datamaps produced by older versions of the GUI download cleanly via the CLI.
Internal
- CLI-audit thinning (V2-189):
PortRangeparsing (FromStr), envKEY=VALUEparsing (AddNodeOpts::parse_env_vars), and bootstrap-peer resolution (config::resolve_bootstrap_peers) moved from ant-cli into ant-core;node add/node resetdaemon calls now go throughant_core::node::daemon::client(newadd_node/reset/resolve_node_id_by_namefunctions) instead of hand-rolled HTTP; the two CLIProgressReporterimpls collapsed into one. - New
ant_core::datamap_filemodule owns the on-disk datamap format (msgpack canonical, JSON legacy auto-detect on read) and naming convention.ant-cliand consumers likeant-guiroute through this single helper instead of reimplementing serialization.
ant 0.3.5-beta.2
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Changed (breaking — external-signer merkle API, ADR-0003)
- External-signer merkle uploads are no longer capped at one payment batch (
MAX_LEAVES= 256 chunks ≈ 1 GiB):file_prepare_upload*now partitions the to-upload set intoMerkleTree-sized sub-batches (ExternalPaymentInfo::Merklecarriesprepared_batches: Vec<PreparedMerkleBatch>), the signer pays one transaction per batch, and the newClient::finalize_upload_merkle_multitakes one winner hash per batch.finalize_upload_merkleremains as the single-batch special case. A batch the signer never paid (Nonehash) no longer aborts the upload: paid batches store and the unpaid chunks surface viaError::PartialUpload. - External-signer merkle prepared uploads no longer hold the encrypted file in memory: chunk bodies stay in the on-disk encryption spill (opaque
ExternalChunkStoreinsideExternalPaymentInfo::Merkle, replacing the residentchunk_contents: Vec<Bytes>), and finalize stores them via the wallet path's bounded spill fan-out — peak RAM ~256 MB regardless of file size, plus deferred-retry rounds the external path previously lacked.
Added
Client::file_prepare_upload_with_mode: external-signer prepare with an explicitPaymentModeoverride, mirroring the wallet path'sfile_upload_with_mode.ClientConfig::merkle_external_batch_cap: clamped test seam (3..=MAX_LEAVES) so E2E tests exercise real multi-batch external signing with kilobyte files.- Resumable external-signer finalize for both payment paths, so a post-payment storage shortfall no longer strands the payment (#140).
Client::finalize_upload_resumable(wave-batch) andClient::finalize_upload_merkle_multi_resumable(merkle) — each with a_with_progressvariant — return aFinalizeOutcome:Complete(FileUploadResult), orPartial { result, resume }carrying an opaqueFinalizeResumehandle (Wave/Merkle) that owns the already-paid material (the wave path's paid chunks, or the merkle path's on-disk spill + signed proofs).Client::finalize_resume(+_with_progress) takes that handle and re-drives storage for only the still-unstored chunks against the same on-chain payment — no re-quoting, no second signature, no double payment — and is loopable untilComplete(bound the loop: persistent store failures returnPartialon every call, neverErr). The merkle resumable finalize requires every sub-batch to be paid — a resume handle cannot acquire proofs for unpaid chunks, so a partial payment is rejected up front with a pointer at the non-resumable path. The existing consumingfinalize_upload/finalize_upload_merkle_multiare unchanged (they still accept partial payment and surface a shortfall asError::PartialUpload).
Fixed
- External-signer merkle finalize (
Client::finalize_upload_merkle) now returnsError::PartialUploadwhen chunks remain short of quorum after all retries, matching the wave-batch finalize. Previously it returnedOkwithchunks_failed > 0, which callers (desktop app, mobile FFI) took as success — reporting a paid but not fully retrievable file as complete (#166). ant node start/ant node stopwith--service-namenow resolve the node ID through the daemon API instead of readingnode_registry.jsondirectly, eliminating a race against concurrent registry mutations by the daemon.ant node add --jsonno longer interleaves binary-download progress with the JSON result; progress output now goes to stderr (was stdout) and is suppressed entirely in JSON mode.
Changed
--evm-networkstill defaults toarbitrum-one, except when a devnet manifest carrying an EVM block is loaded: that combination now errors and asks for an explicit choice (localto use the manifest, or a preset to override it). The old behavior silently overrode the manifest's EVM config, producing no-op mainnet-vault transactions on other chains that spent gas and set a useless ANT allowance before every chunk PUT failed payment verification. An explicit preset selected alongside a manifest EVM block now prints a warning that the manifest's EVM config is ignored. No change for mainnet users or read-only operations.- Default network binding changed from IPv4-only to IPv6 dual-stack. Hosts without a working IPv6 stack should pass
--ipv4-onlyto avoid advertising unreachable v6 addresses to the DHT (which causes slow connects and junk address records). ant file uploadnow writes datamaps as<filename>.<extension>.datamapinstead of stripping the extension. Uploadingphoto.jpgproducesphoto.jpg.datamap(wasphoto.datamap). Existing datamaps remain readable.ant file uploadno longer silently overwrites an existing datamap. Repeated uploads of the same source path producename-2.datamap,name-3.datamap, … capped at 100 attempts. Pass--overwriteto restore the previous behaviour.
Added
ant file upload --overwrite: replace any existing<filename>.datamaprather than writing a suffixed sibling.ant file download --datamapno longer requires-o/--output— defaults to the original filename derived from the datamap basename (photo.jpg.datamap→photo.jpg, written to the current directory). Pass-oto override.ant file download --datamapnow reads both msgpack (canonical) and legacy JSON datamaps, so datamaps produced by older versions of the GUI download cleanly via the CLI.
Internal
- CLI-audit thinning (V2-189):
PortRangeparsing (FromStr), envKEY=VALUEparsing (AddNodeOpts::parse_env_vars), and bootstrap-peer resolution (config::resolve_bootstrap_peers) moved from ant-cli into ant-core;node add/node resetdaemon calls now go throughant_core::node::daemon::client(newadd_node/reset/resolve_node_id_by_namefunctions) instead of hand-rolled HTTP; the two CLIProgressReporterimpls collapsed into one. - New
ant_core::datamap_filemodule owns the on-disk datamap format (msgpack canonical, JSON legacy auto-detect on read) and naming convention.ant-cliand consumers likeant-guiroute through this single helper instead of reimplementing serialization.
ant 0.3.4
Installation
Linux / macOS (quick-start)
curl -fsSL https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.sh | bashWindows (quick-start)
irm https://raw.githubusercontent.com/WithAutonomi/ant-client/main/install.ps1 | iexManual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Changed (breaking — external-signer merkle API, ADR-0003)
- External-signer merkle uploads are no longer capped at one payment batch (
MAX_LEAVES= 256 chunks ≈ 1 GiB):file_prepare_upload*now partitions the to-upload set intoMerkleTree-sized sub-batches (ExternalPaymentInfo::Merklecarriesprepared_batches: Vec<PreparedMerkleBatch>), the signer pays one transaction per batch, and the newClient::finalize_upload_merkle_multitakes one winner hash per batch.finalize_upload_merkleremains as the single-batch special case. A batch the signer never paid (Nonehash) no longer aborts the upload: paid batches store and the unpaid chunks surface viaError::PartialUpload. - External-signer merkle prepared uploads no longer hold the encrypted file in memory: chunk bodies stay in the on-disk encryption spill (opaque
ExternalChunkStoreinsideExternalPaymentInfo::Merkle, replacing the residentchunk_contents: Vec<Bytes>), and finalize stores them via the wallet path's bounded spill fan-out — peak RAM ~256 MB regardless of file size, plus deferred-retry rounds the external path previously lacked.
Added
Client::file_prepare_upload_with_mode: external-signer prepare with an explicitPaymentModeoverride, mirroring the wallet path'sfile_upload_with_mode.ClientConfig::merkle_external_batch_cap: clamped test seam (3..=MAX_LEAVES) so E2E tests exercise real multi-batch external signing with kilobyte files.
Fixed
- External-signer merkle finalize (
Client::finalize_upload_merkle) now returnsError::PartialUploadwhen chunks remain short of quorum after all retries, matching the wave-batch finalize. Previously it returnedOkwithchunks_failed > 0, which callers (desktop app, mobile FFI) took as success — reporting a paid but not fully retrievable file as complete (#166).
Changed
- Default network binding changed from IPv4-only to IPv6 dual-stack. Hosts without a working IPv6 stack should pass
--ipv4-onlyto avoid advertising unreachable v6 addresses to the DHT (which causes slow connects and junk address records). ant file uploadnow writes datamaps as<filename>.<extension>.datamapinstead of stripping the extension. Uploadingphoto.jpgproducesphoto.jpg.datamap(wasphoto.datamap). Existing datamaps remain readable.ant file uploadno longer silently overwrites an existing datamap. Repeated uploads of the same source path producename-2.datamap,name-3.datamap, … capped at 100 attempts. Pass--overwriteto restore the previous behaviour.
Added
ant file upload --overwrite: replace any existing<filename>.datamaprather than writing a suffixed sibling.ant file download --datamapno longer requires-o/--output— defaults to the original filename derived from the datamap basename (photo.jpg.datamap→photo.jpg, written to the current directory). Pass-oto override.ant file download --datamapnow reads both msgpack (canonical) and legacy JSON datamaps, so datamaps produced by older versions of the GUI download cleanly via the CLI.
Internal
- New
ant_core::datamap_filemodule owns the on-disk datamap format (msgpack canonical, JSON legacy auto-detect on read) and naming convention.ant-cliand consumers likeant-guiroute through this single helper instead of reimplementing serialization.
ant 0.3.5-beta.1
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Changed (breaking — external-signer merkle API, ADR-0003)
- External-signer merkle uploads are no longer capped at one payment batch (
MAX_LEAVES= 256 chunks ≈ 1 GiB):file_prepare_upload*now partitions the to-upload set intoMerkleTree-sized sub-batches (ExternalPaymentInfo::Merklecarriesprepared_batches: Vec<PreparedMerkleBatch>), the signer pays one transaction per batch, and the newClient::finalize_upload_merkle_multitakes one winner hash per batch.finalize_upload_merkleremains as the single-batch special case. A batch the signer never paid (Nonehash) no longer aborts the upload: paid batches store and the unpaid chunks surface viaError::PartialUpload. - External-signer merkle prepared uploads no longer hold the encrypted file in memory: chunk bodies stay in the on-disk encryption spill (opaque
ExternalChunkStoreinsideExternalPaymentInfo::Merkle, replacing the residentchunk_contents: Vec<Bytes>), and finalize stores them via the wallet path's bounded spill fan-out — peak RAM ~256 MB regardless of file size, plus deferred-retry rounds the external path previously lacked.
Added
Client::file_prepare_upload_with_mode: external-signer prepare with an explicitPaymentModeoverride, mirroring the wallet path'sfile_upload_with_mode.ClientConfig::merkle_external_batch_cap: clamped test seam (3..=MAX_LEAVES) so E2E tests exercise real multi-batch external signing with kilobyte files.- Resumable external-signer finalize for both payment paths, so a post-payment storage shortfall no longer strands the payment (#140).
Client::finalize_upload_resumable(wave-batch) andClient::finalize_upload_merkle_multi_resumable(merkle) — each with a_with_progressvariant — return aFinalizeOutcome:Complete(FileUploadResult), orPartial { result, resume }carrying an opaqueFinalizeResumehandle (Wave/Merkle) that owns the already-paid material (the wave path's paid chunks, or the merkle path's on-disk spill + signed proofs).Client::finalize_resume(+_with_progress) takes that handle and re-drives storage for only the still-unstored chunks against the same on-chain payment — no re-quoting, no second signature, no double payment — and is loopable untilComplete(bound the loop: persistent store failures returnPartialon every call, neverErr). The merkle resumable finalize requires every sub-batch to be paid — a resume handle cannot acquire proofs for unpaid chunks, so a partial payment is rejected up front with a pointer at the non-resumable path. The existing consumingfinalize_upload/finalize_upload_merkle_multiare unchanged (they still accept partial payment and surface a shortfall asError::PartialUpload).
Fixed
- External-signer merkle finalize (
Client::finalize_upload_merkle) now returnsError::PartialUploadwhen chunks remain short of quorum after all retries, matching the wave-batch finalize. Previously it returnedOkwithchunks_failed > 0, which callers (desktop app, mobile FFI) took as success — reporting a paid but not fully retrievable file as complete (#166). ant node start/ant node stopwith--service-namenow resolve the node ID through the daemon API instead of readingnode_registry.jsondirectly, eliminating a race against concurrent registry mutations by the daemon.ant node add --jsonno longer interleaves binary-download progress with the JSON result; progress output now goes to stderr (was stdout) and is suppressed entirely in JSON mode.
Changed
--evm-networkstill defaults toarbitrum-one, except when a devnet manifest carrying an EVM block is loaded: that combination now errors and asks for an explicit choice (localto use the manifest, or a preset to override it). The old behavior silently overrode the manifest's EVM config, producing no-op mainnet-vault transactions on other chains that spent gas and set a useless ANT allowance before every chunk PUT failed payment verification. An explicit preset selected alongside a manifest EVM block now prints a warning that the manifest's EVM config is ignored. No change for mainnet users or read-only operations.- Default network binding changed from IPv4-only to IPv6 dual-stack. Hosts without a working IPv6 stack should pass
--ipv4-onlyto avoid advertising unreachable v6 addresses to the DHT (which causes slow connects and junk address records). ant file uploadnow writes datamaps as<filename>.<extension>.datamapinstead of stripping the extension. Uploadingphoto.jpgproducesphoto.jpg.datamap(wasphoto.datamap). Existing datamaps remain readable.ant file uploadno longer silently overwrites an existing datamap. Repeated uploads of the same source path producename-2.datamap,name-3.datamap, … capped at 100 attempts. Pass--overwriteto restore the previous behaviour.
Added
ant file upload --overwrite: replace any existing<filename>.datamaprather than writing a suffixed sibling.ant file download --datamapno longer requires-o/--output— defaults to the original filename derived from the datamap basename (photo.jpg.datamap→photo.jpg, written to the current directory). Pass-oto override.ant file download --datamapnow reads both msgpack (canonical) and legacy JSON datamaps, so datamaps produced by older versions of the GUI download cleanly via the CLI.
Internal
- CLI-audit thinning (V2-189):
PortRangeparsing (FromStr), envKEY=VALUEparsing (AddNodeOpts::parse_env_vars), and bootstrap-peer resolution (config::resolve_bootstrap_peers) moved from ant-cli into ant-core;node add/node resetdaemon calls now go throughant_core::node::daemon::client(newadd_node/reset/resolve_node_id_by_namefunctions) instead of hand-rolled HTTP; the two CLIProgressReporterimpls collapsed into one. - New
ant_core::datamap_filemodule owns the on-disk datamap format (msgpack canonical, JSON legacy auto-detect on read) and naming convention.ant-cliand consumers likeant-guiroute through this single helper instead of reimplementing serialization.
ant 0.3.5-rc.1
This is a pre-release. The quick-start installers below are not used for it —
they always install the latest stableant. Install this build from the assets below.
-beta.N builds are the beta channel of the ant client. Once a beta build is on your
PATH, ant update keeps you on beta: a beta build tracks the beta channel by default,
accepting later -beta.N and stable releases but never a release candidate. To leave the
beta channel, install a stable build manually.
-rc.N builds are cut before the release gates have given a verdict and are not installed
by ant update on any channel.
Installation
Manual download
Download the archive for your platform from the assets below, extract it, and place the ant binary on your PATH. Copy bootstrap_peers.toml to the appropriate config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.config/ant/bootstrap_peers.toml |
| macOS | ~/Library/Application Support/ant/bootstrap_peers.toml |
| Windows | %APPDATA%\ant\bootstrap_peers.toml |
Verification
All release archives are signed with ML-DSA-65 (FIPS 204) post-quantum signatures. Download ant-keygen from WithAutonomi/ant-keygen and the public key from resources/release-signing-key.pub, then verify:
ant-keygen verify --key release-signing-key.pub --input <file> --signature <file>.sig --context ant-release-v1The Windows binary (ant.exe) is additionally signed with a DigiCert EV code-signing certificate. Windows will verify this signature automatically on download and execution.
SHA256 checksums provided in SHA256SUMS.txt.
Detailed Changes
Changed (breaking — external-signer merkle API, ADR-0003)
- External-signer merkle uploads are no longer capped at one payment batch (
MAX_LEAVES= 256 chunks ≈ 1 GiB):file_prepare_upload*now partitions the to-upload set intoMerkleTree-sized sub-batches (ExternalPaymentInfo::Merklecarriesprepared_batches: Vec<PreparedMerkleBatch>), the signer pays one transaction per batch, and the newClient::finalize_upload_merkle_multitakes one winner hash per batch.finalize_upload_merkleremains as the single-batch special case. A batch the signer never paid (Nonehash) no longer aborts the upload: paid batches store and the unpaid chunks surface viaError::PartialUpload. - External-signer merkle prepared uploads no longer hold the encrypted file in memory: chunk bodies stay in the on-disk encryption spill (opaque
ExternalChunkStoreinsideExternalPaymentInfo::Merkle, replacing the residentchunk_contents: Vec<Bytes>), and finalize stores them via the wallet path's bounded spill fan-out — peak RAM ~256 MB regardless of file size, plus deferred-retry rounds the external path previously lacked.
Added
Client::file_prepare_upload_with_mode: external-signer prepare with an explicitPaymentModeoverride, mirroring the wallet path'sfile_upload_with_mode.ClientConfig::merkle_external_batch_cap: clamped test seam (3..=MAX_LEAVES) so E2E tests exercise real multi-batch external signing with kilobyte files.- Resumable external-signer finalize for both payment paths, so a post-payment storage shortfall no longer strands the payment (#140).
Client::finalize_upload_resumable(wave-batch) andClient::finalize_upload_merkle_multi_resumable(merkle) — each with a_with_progressvariant — return aFinalizeOutcome:Complete(FileUploadResult), orPartial { result, resume }carrying an opaqueFinalizeResumehandle (Wave/Merkle) that owns the already-paid material (the wave path's paid chunks, or the merkle path's on-disk spill + signed proofs).Client::finalize_resume(+_with_progress) takes that handle and re-drives storage for only the still-unstored chunks against the same on-chain payment — no re-quoting, no second signature, no double payment — and is loopable untilComplete(bound the loop: persistent store failures returnPartialon every call, neverErr). The merkle resumable finalize requires every sub-batch to be paid — a resume handle cannot acquire proofs for unpaid chunks, so a partial payment is rejected up front with a pointer at the non-resumable path. The existing consumingfinalize_upload/finalize_upload_merkle_multiare unchanged (they still accept partial payment and surface a shortfall asError::PartialUpload).
Fixed
- External-signer merkle finalize (
Client::finalize_upload_merkle) now returnsError::PartialUploadwhen chunks remain short of quorum after all retries, matching the wave-batch finalize. Previously it returnedOkwithchunks_failed > 0, which callers (desktop app, mobile FFI) took as success — reporting a paid but not fully retrievable file as complete (#166). ant node start/ant node stopwith--service-namenow resolve the node ID through the daemon API instead of readingnode_registry.jsondirectly, eliminating a race against concurrent registry mutations by the daemon.ant node add --jsonno longer interleaves binary-download progress with the JSON result; progress output now goes to stderr (was stdout) and is suppressed entirely in JSON mode.
Changed
--evm-networkstill defaults toarbitrum-one, except when a devnet manifest carrying an EVM block is loaded: that combination now errors and asks for an explicit choice (localto use the manifest, or a preset to override it). The old behavior silently overrode the manifest's EVM config, producing no-op mainnet-vault transactions on other chains that spent gas and set a useless ANT allowance before every chunk PUT failed payment verification. An explicit preset selected alongside a manifest EVM block now prints a warning that the manifest's EVM config is ignored. No change for mainnet users or read-only operations.- Default network binding changed from IPv4-only to IPv6 dual-stack. Hosts without a working IPv6 stack should pass
--ipv4-onlyto avoid advertising unreachable v6 addresses to the DHT (which causes slow connects and junk address records). ant file uploadnow writes datamaps as<filename>.<extension>.datamapinstead of stripping the extension. Uploadingphoto.jpgproducesphoto.jpg.datamap(wasphoto.datamap). Existing datamaps remain readable.ant file uploadno longer silently overwrites an existing datamap. Repeated uploads of the same source path producename-2.datamap,name-3.datamap, … capped at 100 attempts. Pass--overwriteto restore the previous behaviour.
Added
ant file upload --overwrite: replace any existing<filename>.datamaprather than writing a suffixed sibling.ant file download --datamapno longer requires-o/--output— defaults to the original filename derived from the datamap basename (photo.jpg.datamap→photo.jpg, written to the current directory). Pass-oto override.ant file download --datamapnow reads both msgpack (canonical) and legacy JSON datamaps, so datamaps produced by older versions of the GUI download cleanly via the CLI.
Internal
- CLI-audit thinning (V2-189):
PortRangeparsing (FromStr), envKEY=VALUEparsing (AddNodeOpts::parse_env_vars), and bootstrap-peer resolution (config::resolve_bootstrap_peers) moved from ant-cli into ant-core;node add/node resetdaemon calls now go throughant_core::node::daemon::client(newadd_node/reset/resolve_node_id_by_namefunctions) instead of hand-rolled HTTP; the two CLIProgressReporterimpls collapsed into one. - New
ant_core::datamap_filemodule owns the on-disk datamap format (msgpack canonical, JSON legacy auto-detect on read) and naming convention.ant-cliand consumers likeant-guiroute through this single helper instead of reimplementing serialization.