Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

yadgar — the client

One binary. yaadgaar login obtains a credential, yaadgaar serve is the MCP server your agent spawns, and everything else manages the machine it runs on (D75, D76).

The command is yaadgaar, and the doubled vowels are not a typo. The Python client this replaces already owns yadgar on PATH, so the transitional client differs in both the PyPI project and the executable — the reasoning is written over BINARY_NAME in src/install/hooks.rs.

Decisions are recorded in yadgarhq/docs — D75 (the proxy that knows no tools), D76 (one binary, and a rules file that is referenced rather than spliced), D72 (the credential), D16 (why the gateway is the only thing that speaks MCP inward).

What it is

A proxy, and deliberately nothing more. tools/list is forwarded to the gateway and its answer returned verbatim; so is tools/call. There is no per-tool code in this repository at all — not a match arm, not a registry, not a feature flag.

That is the boundary rather than an economy. A list the client asserts is a list the client is trusted to filter honestly; forwarding makes the gateway's answer the only answer, and the gateway resolves identity before it replies. It is also what keeps releases uncoupled: this binary lives on people's laptops and the gateway does not, so a client that enumerated tools would make the tool set move at the speed of the slowest machine.

When the gateway is unreachable at spawn, the last tool list is served from cache and calls fail with a plain "gateway unreachable" — because an empty list is indistinguishable from yadgar not being installed, and the agent would silently lose memory and tasks with nothing to report.

Commands

Command What it does
yaadgaar login Asks for the gateway address and your credentials once and stores both together. It registers nothing — install owns every file the agent client reads.
yaadgaar serve The stdio MCP server the agent spawns. Not run by hand.
yaadgaar install Registers the hooks, the rules reference and the MCP entry, in the agent client's user-level config — once per machine, never per repository.
yaadgaar uninstall Removes what install added, and nothing else.
yaadgaar verify Reports drift in the installed environment. Scheduled, not remembered — the daemon cannot see ~/.claude/settings.json, so nothing server-side can ever notice.
yaadgaar hook <event> What settings.json invokes. A hook is a dispatch, not a program.

login then install is the whole setup, and verify is the one to schedule. project_id is derived from the working directory at call time (D53), so one registration serves every repository and a fresh checkout works immediately.

Unattended provisioning

login and enrol are interactive by default: three prompts each, and rpassword reads the password straight off the controlling terminal rather than stdin. A machine with no terminal to answer those prompts — a VM image, a container build, a config-management run — cannot use either command as they stand. Both take flags that remove every prompt:

Flag Commands What it replaces
--gateway <addr> login The "Gateway address" prompt.
--username <name> login The "Username" prompt.
--password-stdin login, enrol The concealed password prompt (enrol's repeat prompt too — there is nothing to compare a single stdin value against).
--token-file <path> enrol The positional token argument or the "paste the enrolment token" prompt.

A fully unattended login:

printf '%s\n' "$PASSWORD" | yaadgaar login --gateway https://gateway.yadgar.internal:18443 \
  --username someone --password-stdin

A fully unattended enrolment:

printf '%s\n' "$NEW_PASSWORD" | yaadgaar enrol --token-file /path/to/token --password-stdin

printf '%s\n', not echo. Under dash (Debian/Ubuntu's /bin/sh) and some other shells, a bare echo interprets backslash escapes in its argument by default — a password containing \n, \t, or similar is silently truncated or rewritten before it ever reaches this client. printf '%s\n' never interprets its argument at all.

--password-stdin requires --gateway and --username on login. Without them, the prompts those two flags remove would still read stdin themselves — consuming the very lines meant for the password. enrol similarly requires the token as the positional argument or via --token-file when --password-stdin is given: the interactive "paste the enrolment token" fallback also reads stdin, and --password-stdin has already claimed it for the password.

The password is read as exactly one line: the first, with its trailing line ending stripped. It is never trimmed — a password can legitimately start, end, or consist of whitespace — and an empty result is refused.

--password-stdin refuses a terminal, unlike docker login, which accepts one. rpassword is used everywhere else in this client precisely so a password is never echoed and never reaches scrollback; reading one off a real terminal through this flag would type it in plain sight instead of concealing it, which is the exact leak this flag exists to close. Redirect input from a file or a pipe.

Nothing about the interactive path changes when none of these flags are given.

Installing

pip install --no-cache-dir yaadgaar
yaadgaar login
yaadgaar install

To upgrade, the same line with --upgrade:

pip install --no-cache-dir --upgrade yaadgaar

--no-cache-dir is not optional while the only releases are prereleases, and it is the whole of the problem. pip caches the simple-index page it fetched for a project. A machine that has resolved yaadgaar once keeps serving itself that page and cannot see anything published since — so an upgrade reports success against a version that is already stale, rather than failing.

Measured on a fresh Debian VM with 0.1.0a2 already on PyPI. The VM's own curl of the simple index showed all six a2 wheels at the same moment pip insisted only a1 existed:

Command What it did
pipx upgrade yaadgaar "already at latest version 0.1.0a1"
pipx install --force --pip-args=--pre yaadgaar installed a1 again
pipx install --force yaadgaar==0.1.0a2 "Could not find a version that satisfies the requirement"
pip install --no-cache-dir yaadgaar==0.1.0a2 worked, first try

Every row is the same cache. The third one is worth reading twice: an EXACT version that PyPI was serving at that moment came back as no such version, which is what a stale index page looks like from the inside.

No --pre and no version pin are needed, and this is measured rather than reasoned — a bare pip download --no-deps --no-cache-dir yaadgaar against a fresh index fetches 0.1.0a2, and pip install --no-cache-dir --upgrade --dry-run yaadgaar resolves to Would install yaadgaar-0.1.0a2. PEP 440 falls back to prereleases when a requirement matches nothing else, so pinning would only fix this README to a version that goes stale on the next release. --pre widens a requirement and does not refetch anything, which is why it changed nothing on the VM.

One command does NOT take that fallback: pip index versions yaadgaar reports "No matching distribution found" while pip index versions --pre yaadgaar lists both. It is a diagnostic, not an install, and it is the one place --pre earns its keep here.

Once a stable release exists, all of this goes away and pipx install yaadgaar / pipx upgrade yaadgaar are the lines. Until then pipx's own upgrade path is the one measured failing above; the pipx equivalent, pipx install --force --pip-args="--no-cache-dir" yaadgaar, is untested — the pip lines are the ones that were actually run.

Rust, shipped to PyPI as wheels via maturin. The language follows the rest of the system; the channel follows the people already using it, and a pip-installable command is not a thing a rewrite gets to take away. A plain GitHub-release binary was rejected for exactly that reason.

The wheel carries the compiled binary and no Python at all — bindings = "bin" in pyproject.toml — so import yaadgaar is not a thing and is not meant to be.

A wheel is per-platform, so there are six: Linux, macOS and Windows, each on x86_64 and aarch64. Every one is built on a runner of its own architecture rather than cross-compiled, and release.yaml refuses to publish unless all six are present — shipping the four that built would leave two platforms silently installing an older version.

Development

cargo build
cargo test
pre-commit run --all-files

There is no Containerfile and no chart here: this repository is not a service, and what it ships is a wheel. CI is the shared workflow in yadgarhq/actions, which detects that and skips the image, chart and proto stages (D62).

To build a wheel locally:

maturin build --release   # → target/wheels/, for THIS machine only

The other five targets are built by .github/workflows/release.yaml, which is this repository's one piece of local CI. The reason it is not in yadgarhq/actions with everything else is written at the top of that file.

Metadata

Release files for yaadgaar 0.1.0a8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for yaadgaar 0.1.0a8
File
yaadgaar-0.1.0a8-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
yaadgaar-0.1.0a8-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
yaadgaar-0.1.0a8-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
yaadgaar-0.1.0a8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
yaadgaar-0.1.0a8-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
yaadgaar-0.1.0a8-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 21.2 MB

Release files / yaadgaar-0.1.0a8-py3-none-win_arm64.whl

Download URL yaadgaar-0.1.0a8-py3-none-win_arm64.whl
Size 3.4 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
c6d8365caa5655cb5e1bc96e9eaa8e194161137c79b639cc7d4a3f9c5d3239e2
BLAKE2b-256 checksum
How to use checksums
c0244eea1c14df8a3c1537ec3205e48cd617ab4e5a46bc0a260ec4f1d65417be
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 30, 2026.

Transparency log

Release files / yaadgaar-0.1.0a8-py3-none-win_amd64.whl

Download URL yaadgaar-0.1.0a8-py3-none-win_amd64.whl
Size 3.4 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
c1a101a8931f938868125cd5f3206832cb938c7a1aab9d28ce474428c9bc0056
BLAKE2b-256 checksum
How to use checksums
ec87d8695a54e0ac6e11c49d30772752bfb91b5a9768cf8169422cf59536319f
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 30, 2026.

Transparency log

Release files / yaadgaar-0.1.0a8-py3-none-manylinux_2_28_aarch64.whl

Download URL yaadgaar-0.1.0a8-py3-none-manylinux_2_28_aarch64.whl
Size 3.5 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
fa5e704edc57abfe0de996f7597fff9535450853f3b8987deb608190db7db55a
BLAKE2b-256 checksum
How to use checksums
18bd45fd439ca9264400612991121a191f817b5becb5e75ef2f2e8403d617033
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 30, 2026.

Transparency log

Release files / yaadgaar-0.1.0a8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL yaadgaar-0.1.0a8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 3.7 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
3cf70c97b46d270450d986c07891c4baa69c795edfa6b80b74eb1f03c69d4e46
BLAKE2b-256 checksum
How to use checksums
626225f791fa9005307879709621223f63ae34654b99b9140b85636e8f048632
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 30, 2026.

Transparency log

Release files / yaadgaar-0.1.0a8-py3-none-macosx_11_0_arm64.whl

Download URL yaadgaar-0.1.0a8-py3-none-macosx_11_0_arm64.whl
Size 3.5 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
bafa9988f592f10c8f370a932474676609d52597295ff2db3e1e6aa23f7ddb7f
BLAKE2b-256 checksum
How to use checksums
6a221957fbe20684eda4ba5f9a570b6d15541a8e95929bc9f1dfc21cbcd07251
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 30, 2026.

Transparency log

Release files / yaadgaar-0.1.0a8-py3-none-macosx_10_12_x86_64.whl

Download URL yaadgaar-0.1.0a8-py3-none-macosx_10_12_x86_64.whl
Size 3.7 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
98f4928fc28902bf0f1410a5a01e999e37b694da2cecb234415953f45ae08fc4
BLAKE2b-256 checksum
How to use checksums
b74835e89009d61f3ed1de402e3508095f712f1e7893e8aca07516cc4e649ed8
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 30, 2026.

Transparency log

Security for yaadgaar 0.1.0a8

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.

Select from 6 files

Attestation for yaadgaar-0.1.0a8-py3-none-win_arm64.whl

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 30, 2026.

Transparency log

A 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.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page