ReplyLayer CLI — safe email for AI agents (PyPI launcher)
Project description
rly
rly is the command-line interface for ReplyLayer — safe email for AI agents. Send, receive, reply to, and security-scan transactional and operational email from the terminal or an agent loop. Not a bulk or marketing tool.
This package is the PyPI launcher: it ships a bundled native binary, so no Node toolchain is required.
Looking for the Python library? This package is the CLI. For the importable SDK (
import replylayer), installreplylayerinstead:pip install replylayer.
pipx install rly
rly --help
Installing the rly package exposes both the rly and replylayer
commands — they are aliases for the same launcher, mirroring the npm package.
Examples use the short form:
rly --help # the `replylayer` command is an identical legacy alias
On Debian and Ubuntu systems that enforce PEP 668, plain pip install rly
may fail with externally-managed-environment. Use pipx install rly for a
global CLI install, or install inside a virtual environment:
python3 -m venv .venv
. .venv/bin/activate
pip install rly
On the supported binary-wheel install, the rly command execs a bundled
native replylayer binary directly — no Node toolchain is involved. The
npx rly@<pinned> path is reached only when you explicitly set
RLY_FORCE_NPX=1 (the launcher's emergency fallback). If the bundled binary
is absent (a source/sdist install on an unsupported platform), rly exits
with an actionable error pointing at RLY_FORCE_NPX=1 — it does not fall
back to npx automatically. The version-pin contract still holds for that
npx fallback — the PyPI rly@X.Y.Z resolves the npm rly@X.Y.Z exactly (see
Strict pin policy below).
Requirements
- Python 3.10+
- pipx for the recommended global install path
Optional (fallback only): Node 22+ with
npxonPATHis required only when you opt into the emergencyRLY_FORCE_NPX=1fallback — which is also how you run a source/sdist install on an unsupported platform (setRLY_FORCE_NPX=1with Node onPATH; the launcher does not switch tonpxon its own). The binary wheel needs neither Node nornpx.
Examples
rly auth login
rly mailbox list
rly inbox list --mailbox support-bot
For the full command reference, run rly --help. The complete CLI_GUIDE.md
is also bundled in the npm rly package and readable on GitHub. Public
CLI source and package-trust material (signed SHA256SUMS, GPG key, SLSA
provenance) live at: https://github.com/replylayer/rly
Environment variables
RLY_TIMEOUT_SECONDS
Opt-in subprocess timeout, in seconds. When set, every rly invocation is
bounded by subprocess.run(..., timeout=RLY_TIMEOUT_SECONDS); if the
underlying CLI subprocess does not exit in time the launcher prints a
diagnostic to stderr and exits with code 124. This bounds the bundled-binary
exec on the supported path (and the npx process under RLY_FORCE_NPX=1).
By default there is no timeout, with one narrow exception: the help and
version short-circuits (--help, -h, --version, -V) carry a built-in
10-second timeout. Those commands should never need to touch the network
beyond an initial registry resolve; bounding them lets you diagnose a
restricted-network sandbox without affecting legitimate long-poll commands
like rly inbox wait --timeout 60.
RLY_TIMEOUT_SECONDS=30 rly inbox list --mailbox support-bot
Set the value high enough to cover the slowest command you reasonably expect. Setting it to a non-integer string is treated as "no timeout" (graceful fallback rather than a launcher crash).
RLY_OFFLINE
RLY_OFFLINE is a no-op on the default bundled-binary path — it applies
only under the RLY_FORCE_NPX=1 fallback (the only path that invokes npx).
Set RLY_OFFLINE=1 to force npx to resolve rly from the local
cache only. The launcher passes both --offline on the command line and
npm_config_offline=true in the subprocess environment (belt-and-suspenders;
--prefer-offline is NOT a no-network guarantee).
If the pinned rly version isn't cached locally, npx exits fast
with its own non-zero exit code (typically 1 with ENOTCACHED); the
wrapper passes that exit code through verbatim — it does NOT normalize it
to 124. Exit code 124 is reserved for the wrapper's own timeout branch.
# RLY_OFFLINE only applies under the RLY_FORCE_NPX=1 fallback. Warm the npx
# cache once, online:
RLY_FORCE_NPX=1 rly --version
# Subsequent fallback calls can then run offline:
RLY_FORCE_NPX=1 RLY_OFFLINE=1 rly --version
RLY_OFFLINE=1 is useful in network-restricted CI sandboxes, air-gapped
deployments, or any environment where you want a hard guarantee that the
launcher will not reach out to the npm registry.
Strict pin policy
The PyPI rly@X.Y.Z always resolves the npm rly@X.Y.Z exactly — there is no
@latest resolution and no semver range. The launcher computes the pinned
package string at runtime via importlib.metadata.version('rly'), so the
two artifacts always move together.
This means:
- A published PyPI
rly@X.Y.Zcannot ride a later patch-level npm release; both packages must be republished together by ReplyLayer. - Source installs from the repository between a launcher-only PR and the
paired version bump are intentionally unsupported. Use
pipx install rly(PyPI) ornpm install -g rly(npm) as the supported install paths.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rly-0.7.11.tar.gz.
File metadata
- Download URL: rly-0.7.11.tar.gz
- Upload date:
- Size: 15.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1e9a2bde492dd4382aac4b58ad97d2803d45894204bf886f742cb1bef1d16eb
|
|
| MD5 |
f0858af46c24fa091f808f171c4ac85d
|
|
| BLAKE2b-256 |
b9d81e27bf4a5840e5c2dfd351f78f79cdfa64efdb8b95f2364312c066a2af75
|
Provenance
The following attestation bundles were made for rly-0.7.11.tar.gz:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11.tar.gz -
Subject digest:
f1e9a2bde492dd4382aac4b58ad97d2803d45894204bf886f742cb1bef1d16eb - Sigstore transparency entry: 2082494151
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rly-0.7.11-py3-none-win_amd64.whl.
File metadata
- Download URL: rly-0.7.11-py3-none-win_amd64.whl
- Upload date:
- Size: 31.4 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04c97983e9d1b5df69e12eb8b825290f35a61a4ee3be109734270e5bb06187d9
|
|
| MD5 |
70388c39bb6c5ffd44ade9cddfd0019c
|
|
| BLAKE2b-256 |
b3783437489060acb1fa5886c2cb6079a8b209f8e5dffbdd6541b9947f058a3d
|
Provenance
The following attestation bundles were made for rly-0.7.11-py3-none-win_amd64.whl:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11-py3-none-win_amd64.whl -
Subject digest:
04c97983e9d1b5df69e12eb8b825290f35a61a4ee3be109734270e5bb06187d9 - Sigstore transparency entry: 2082494164
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rly-0.7.11-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: rly-0.7.11-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 39.4 MB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7cfdc7536f38c2d1a4e16f4243bd38995cc358357d0ee3ba20c9c16b0adeb327
|
|
| MD5 |
957cbaaa727bdf3e0a9f12697bee504d
|
|
| BLAKE2b-256 |
29d69a4ed6314ba20ce584d44efb9831b77cdec936c1741c53e1b9d85255a2fc
|
Provenance
The following attestation bundles were made for rly-0.7.11-py3-none-manylinux_2_28_x86_64.whl:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11-py3-none-manylinux_2_28_x86_64.whl -
Subject digest:
7cfdc7536f38c2d1a4e16f4243bd38995cc358357d0ee3ba20c9c16b0adeb327 - Sigstore transparency entry: 2082494173
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rly-0.7.11-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: rly-0.7.11-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 39.0 MB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
291cac375e140a98ccd3b088e78e02e48fe1f7ce0ef8b0ea607333494e90f467
|
|
| MD5 |
21a838d570aef305eece49dd6b8a5f02
|
|
| BLAKE2b-256 |
fec799ae1bb92ca627c46423043d4ee5622744b1f51cfd759df4205daa3cab6e
|
Provenance
The following attestation bundles were made for rly-0.7.11-py3-none-manylinux_2_28_aarch64.whl:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11-py3-none-manylinux_2_28_aarch64.whl -
Subject digest:
291cac375e140a98ccd3b088e78e02e48fe1f7ce0ef8b0ea607333494e90f467 - Sigstore transparency entry: 2082494161
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rly-0.7.11-py3-none-macosx_14_0_x86_64.whl.
File metadata
- Download URL: rly-0.7.11-py3-none-macosx_14_0_x86_64.whl
- Upload date:
- Size: 36.9 MB
- Tags: Python 3, macOS 14.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f1bf7949139a79013d4b52666e74b73af19df9944eebb63ee84dbd5e998b5cf
|
|
| MD5 |
138108120b1d7262334c5dfaaa723df7
|
|
| BLAKE2b-256 |
9503384a4d3f9e0cab3ec795d576cbf20f1ef7dc2c9ba3c012e2523bf694e72d
|
Provenance
The following attestation bundles were made for rly-0.7.11-py3-none-macosx_14_0_x86_64.whl:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11-py3-none-macosx_14_0_x86_64.whl -
Subject digest:
6f1bf7949139a79013d4b52666e74b73af19df9944eebb63ee84dbd5e998b5cf - Sigstore transparency entry: 2082494157
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rly-0.7.11-py3-none-macosx_14_0_arm64.whl.
File metadata
- Download URL: rly-0.7.11-py3-none-macosx_14_0_arm64.whl
- Upload date:
- Size: 34.9 MB
- Tags: Python 3, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32cbaf04d6badb33d88c7876b469ffcbeb6b4327e79f0c7c26583c9a2a8eb2d4
|
|
| MD5 |
17bf9754cdd6697c662cc8db9205df07
|
|
| BLAKE2b-256 |
384fdc7d92edc0be2dd7b98c0bbd2017ad88d6527e080159db6bee2caac4f47d
|
Provenance
The following attestation bundles were made for rly-0.7.11-py3-none-macosx_14_0_arm64.whl:
Publisher:
release-cli-binaries.yml on replylayer/ReplyLayer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rly-0.7.11-py3-none-macosx_14_0_arm64.whl -
Subject digest:
32cbaf04d6badb33d88c7876b469ffcbeb6b4327e79f0c7c26583c9a2a8eb2d4 - Sigstore transparency entry: 2082494177
- Sigstore integration time:
-
Permalink:
replylayer/ReplyLayer@53a2370940ad1bb76714a14067d6cc0db6539129 -
Branch / Tag:
refs/tags/cli-v0.7.11 - Owner: https://github.com/replylayer
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli-binaries.yml@53a2370940ad1bb76714a14067d6cc0db6539129 -
Trigger Event:
push
-
Statement type: