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.
Metadata
Release files for rly 0.7.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| rly-0.7.15.tar.gz | 15.3 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| rly-0.7.15-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| rly-0.7.15-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| rly-0.7.15-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| rly-0.7.15-py3-none-macosx_14_0_x86_64.whl | Python 3 | none | macOS 14.0+ x86-64 | Details |
| rly-0.7.15-py3-none-macosx_14_0_arm64.whl | Python 3 | none | macOS 14.0+ ARM64 | Details |
Total release size: 181.7 MB
Release files / rly-0.7.15.tar.gz
| Download URL | rly-0.7.15.tar.gz |
|---|---|
| Size | 15.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4dc9757f525238cd459bde92399a9a5766751f76fedbdd30f95acfbdffb3fada
|
|
BLAKE2b-256 checksum How to use checksums |
9c2a6f30b6799de8df109ca034cc3089420d070d4b2976ae93d00358d37d147f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / rly-0.7.15-py3-none-win_amd64.whl
| Download URL | rly-0.7.15-py3-none-win_amd64.whl |
|---|---|
| Size | 31.4 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
de1590df586ea8182d155ad0d3af2e5c83ff3bcffa6ebf7a143c860f589add7a
|
|
BLAKE2b-256 checksum How to use checksums |
673fabe515661ed3f3b29cd94c82db6bb584c0bf27557dccc02a66cba2a6c4cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / rly-0.7.15-py3-none-manylinux_2_28_x86_64.whl
| Download URL | rly-0.7.15-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 39.4 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
4a41c296d4e2cba73c681596396c47671b1cc259ecdd38bf109d58cd19ce3f20
|
|
BLAKE2b-256 checksum How to use checksums |
a3e5fe019fe12c80cf84688a98d555ad4b4bec85b3fd6dcbc35d9af3b154a532
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / rly-0.7.15-py3-none-manylinux_2_28_aarch64.whl
| Download URL | rly-0.7.15-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 39.0 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
863b67bbd6870c833ca0a31c60cc6e54e4a4c083aace3e2ba18ef20d7507140a
|
|
BLAKE2b-256 checksum How to use checksums |
3136305f81e7c3b256ed4698aff9cf4e40d74475d2b5b3fda3411f73184ffe24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / rly-0.7.15-py3-none-macosx_14_0_x86_64.whl
| Download URL | rly-0.7.15-py3-none-macosx_14_0_x86_64.whl |
|---|---|
| Size | 36.9 MB |
| Tags | Python 3 macOS 14.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
bd2a35b6250f110b5acb219d7a45a601e8aba368a1c60632d0697164509d2440
|
|
BLAKE2b-256 checksum How to use checksums |
0840c30dd452c7c877f22d824d51578b638dda3bb727b8283cca4fe22fb3c77d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logRelease files / rly-0.7.15-py3-none-macosx_14_0_arm64.whl
| Download URL | rly-0.7.15-py3-none-macosx_14_0_arm64.whl |
|---|---|
| Size | 34.9 MB |
| Tags | Python 3 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
40b50d1ba2afdc7be52460a9b013bbb936b6e40bb0b9df0b8d8bf8e791d621aa
|
|
BLAKE2b-256 checksum How to use checksums |
123d2f48604789d5d5547456c885b90ec95d63289644ca05094130dee5907c60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logSecurity for rly 0.7.15
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for rly-0.7.15.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.