Install · nine products, nine paths
Install walkthrough
Pick the product you want and this page shows that install and nothing else — the commands in order, the setup it shares with the others, the MCP entry to register, and the macOS permission it genuinely needs. Every command here was checked against crate source rather than against a README.
- Paths
- 9 audiences
- Via tctl
- 7 of 9
- MSRV
- Rust 1.94
- Prebuilt for
- macOS arm64, Linux x86_64, Linux arm64
Shared prerequisites
Set up only what your product's roster names. Nothing here is needed by all nine, and every audience below says which of these it wants and how badly.
The tctl control plane
tctl installs seven of the nine products on this page. It prefers a prebuilt tarball on macOS arm64, Linux x86_64 and Linux arm64, verifies its published SHA-256, and falls back to cargo install --locked from crates.io on any other host. It is also the only path that resolves a product’s runtime dependencies for you and keeps macOS signing identities stable across upgrades, so a permission you grant once survives the next install.
curl -sSf https://raw.githubusercontent.com/bobmatnyc/trusty-tools/main/install.sh | sh
A Rust toolchain
Rust 1.94 or newer — the workspace MSRV. Needed only when you build from source: on a prebuilt platform tctl never invokes cargo, and trusty-agents is the one product with no prebuilt at all.
pnpm
Only trusty-agents needs it. trusty-search, trusty-memory and trusty-analyze commit their built Svelte UI to git, so installing those from crates.io never runs a JavaScript build. trusty-agents does not commit its UI: without pnpm the crate still compiles, but its build script writes a placeholder page and the embedded UI does nothing.
git
trusty-agents is installed by cloning this repository. trusty-code reads git metadata for branch context and tga reads git history through git2, so both want a git repository to point at.
16 GB RAM, ~2 GB disk
trusty-search checks available memory at startup; below 16 GB it warns once and runs on a reduced memory tier (smaller embedding cache, BM25 corpus and knowledge-graph caps) instead of refusing to start. TRUSTY_SKIP_RAM_CHECK=1 silences that warning. The disk is for the ONNX embedding model it downloads on first run. Apple Silicon uses CoreML automatically; NVIDIA CUDA is an opt-in --features cuda build.
8 GB RAM, ~500 MB disk
The floor for trusty-analyze and trusty-review, plus room for their model cache.
A model provider key
OpenRouter is the default provider everywhere a key is read. It is required only for trusty-review, which will not produce a review without one. It is optional for trusty-memory, trusty-analyze, trusty-code and trusty-agents: each starts fine with no key and asks for one only when a feature that needs it actually runs. AWS Bedrock is the documented alternative for trusty-analyze and trusty-review.
export OPENROUTER_API_KEY=<your-openrouter-key>
Replace <your-openrouter-key> with the key from your own OpenRouter account — nothing on this page is a real key.
export TRUSTY_LLM_MODEL=<bedrock-model-id> export AWS_REGION=<your-aws-region>
Replace <bedrock-model-id> with a Bedrock model you have access to and <your-aws-region> with the region it is enabled in. These two replace the OpenRouter key rather than joining it.
Claude Code
Recommended, never enforced at install time. trusty-mpm orchestrates Claude Code sessions, so it is what tm drives.
Pick what you are installing
Nine paths. Seven go through tctl; trusty-code and trusty-agents do not, and are the two places the commands genuinely differ rather than just naming a different crate.
Semantic memory, on its own · trusty-memory
A standalone daemon with no external database and nothing else to install first. tctl installs it alone — it has no runtime dependency on any other product.
Before you start
- The tctl control plane recommended The install path this page recommends.
- A model provider key optional trusty-memory reads OPENROUTER_API_KEY for the memory.chat MCP method and the dream cycle’s summarization pass; there is no web chat panel. Everything else works without it.
1 · Install it
One member, no dependency closure.
tctl install trusty-memory
cargo install trusty-memory --locked
The second line is the escape hatch: it pulls the published crates.io release directly, which is also what tctl falls back to off a prebuilt platform.
The Svelte UI ships pre-built inside the crate, so this never runs pnpm.
2 · Find the port it serves on
The daemon picks its port at startup and reports it back. The UI is on the same port, on loopback.
trusty-memory port
3 · Register it as an MCP server
Add the entry to your .mcp.json. The command and args are what the crate’s own CLI parses.
{ "mcpServers": { "trusty-memory": { "command": "trusty-memory", "args": ["serve","--stdio"] } } }
macOS: no permission needed
Nothing to grant. trusty-memory reads $HOME locations only, and it carries no signing identity because it has no permission to preserve.
Hybrid code search, on its own · trusty-search
One machine-wide daemon over as many named project indexes as you like. It is a leaf in the dependency graph — tctl installs it alone.
Before you start
- The tctl control plane recommended The install path this page recommends.
- 16 GB RAM, ~2 GB disk recommended Checked at startup; below this trusty-search still runs, on a reduced memory tier.
1 · Install it
One member, no dependency closure.
tctl install trusty-search
cargo install trusty-search --locked
The Svelte UI ships pre-built inside the crate, so this never runs pnpm.
2 · Start the daemon and read its port
First start downloads the embedding model, which is what the ~2 GB of disk is for.
trusty-search start
trusty-search port
3 · Register it as an MCP server
Add the entry to your .mcp.json.
{ "mcpServers": { "trusty-search": { "command": "trusty-search", "args": ["serve"] } } }
macOS: Full Disk Access
trusty-search is the one product here that needs Full Disk Access, and only when its index data lives on an external or removable volume. An index on the local disk never triggers the prompt. Installing through tctl re-signs the binary under a stable identity, so the grant survives an upgrade.
Both daemons together · trusty-search, trusty-memory
The common pairing: search indexes your code, memory stores what you and your agents learned about it. Neither calls the other — they are complementary, not layered, and each runs fine with the other absent.
Before you start
- The tctl control plane recommended Installs both in one command.
- 16 GB RAM, ~2 GB disk recommended trusty-search recommends this; trusty-memory adds no requirement of its own.
- A model provider key optional Only trusty-memory’s memory.chat MCP method and dream-cycle summarization read OPENROUTER_API_KEY.
1 · Install both
There is no dependency edge between them, so the order does not matter and they can be installed in parallel.
tctl install trusty-search trusty-memory
cargo install trusty-search --locked cargo install trusty-memory --locked
What the two share is a library, not a process: both link the same embedder out of trusty-common. Neither daemon talks to the other over the network.
2 · Register both MCP servers
Two independent entries in the same .mcp.json — each keeps the command and args from its own section.
{ "mcpServers": { "trusty-search": { "command": "trusty-search", "args": ["serve"] }, "trusty-memory": { "command": "trusty-memory", "args": ["serve", "--stdio"] } } }
macOS: Full Disk Access
Only trusty-search needs Full Disk Access, and only for indexes on an external volume. trusty-memory needs nothing — do not grant it anything on trusty-search’s account.
Complexity and smell analysis · trusty-analyze
A leaf install: nothing requires it, and it requires nothing. It is an optional stable-set member, so a missing prebuilt for your platform will not fail a wider tctl run.
Before you start
- The tctl control plane recommended The install path this page recommends.
- 8 GB RAM, ~500 MB disk required Plus room for the model cache.
- A model provider key optional Complexity and smell analysis needs no model at all. Only the deep-analysis pass reads a key.
1 · Install it
One member, no dependency closure.
tctl install trusty-analyze
cargo install trusty-analyze --locked
The Svelte UI ships pre-built inside the crate, so this never runs pnpm.
2 · Register it as an MCP server
Add the entry to your .mcp.json. Both args are required — the crate generates exactly this pair itself.
{ "mcpServers": { "trusty-analyze": { "command": "trusty-analyze", "args": ["serve","--mcp"] } } }
macOS: no permission needed
Nothing to grant. trusty-analyze reads $HOME locations only, the same explicit carve-out trusty-memory gets.
Code review with real context · trusty-review
The one product with a hard runtime dependency on two others. tctl installs three members for you — trusty-review, trusty-search and trusty-analyze — because a review produced without that context is worse than no review.
Before you start
- The tctl control plane recommended It resolves the three-member closure and orders it for you.
- 8 GB RAM, ~500 MB disk required Plus room for the model cache.
- A model provider key required Not optional here, unlike trusty-analyze’s deep pass. Set OPENROUTER_API_KEY, or the two Bedrock variables instead.
1 · Install it, and what it needs
One tctl line installs three members. The cargo path installs one, so bring up trusty-search and trusty-analyze first if you take it.
tctl install trusty-review
cargo install trusty-review --locked
trusty-review checks for both before it starts a review and skips the review entirely if either is unreachable, absent an explicit degraded-mode opt-in.
Install order does not matter under tctl: it resolves the closure and orders it topologically.
2 · Point it at a model
Set the provider key from the prerequisites above before the first review — this is the one product that will not run without it.
3 · Register it as an MCP server
Add the entry to your .mcp.json.
{ "mcpServers": { "trusty-review": { "command": "trusty-review", "args": ["mcp"] } } }["serve", "--stdio"] still parses as an alias, so an older .mcp.json keeps working. ["mcp"] is the current spelling to write.
macOS: no permission needed
Nothing to grant, and this was checked rather than assumed: trusty-review was evaluated alongside trusty-memory and trusty-analyze and deliberately excluded — it walks no $HOME tree and reads no other application’s files.
The session orchestrator · tm, trusty-mpm
tctl installs three members here — trusty-mpm, trusty-memory and trusty-search — because tm injects both MCP servers into every managed session by default.
Before you start
- The tctl control plane recommended It resolves the three-member closure and orders it for you.
- Claude Code recommended tm orchestrates Claude Code sessions. Not enforced at install time.
- A Rust toolchain optional Only if no prebuilt exists for your platform.
1 · Install it, and check what landed
One line installs three binaries. tctl status prints what it manages and what is running.
tctl install trusty-mpm tctl status
cargo install trusty-mpm --locked
The crate ships two binaries, tm and trusty-mpm, from the same source — either name drives it.
2 · Know where its config lives
Configuration is TOML at ~/.config/trusty-mpm/config.toml, honouring $XDG_CONFIG_HOME when you set it.
Two older docs point at a config.yaml and at a trusty-mpmd binary. Neither exists: the file is TOML, and the daemon runs in-process as a mode of tm itself.
3 · Run the daemon
tm owns its own lifecycle rather than handing it to launchd.
tm start
tm stop and tm restart are the other two halves of the same verb set.
macOS: App Data
tm needs the App Data category, and only that. It reads other applications’ $HOME containers — Claude config directories, tmux state — which raises the separate “would like to access data from other apps” prompt. Grant that category and nothing wider. Installing through tctl signs tm and trusty-mpm together under a stable identity, so the grant survives an upgrade.
A per-project coding harness · tcode
Not a tctl product. trusty-code is published on crates.io but is not a stable-set member, so cargo install is the path — tctl install trusty-code fails with an unknown-member error.
Before you start
- git required It reads git metadata for branch context.
- Claude Code optional Useful alongside it, never required by it.
- A model provider key optional Resolved lazily: tcode serve starts with no key, and a key is only demanded the first time a chat or task dispatches to a provider that needs one. OpenRouter is the default route.
1 · Install it from crates.io
The published crate, direct. There is no prebuilt tarball and no tctl membership.
cargo install trusty-code --locked
trusty-code has no Svelte build step, so pnpm is not involved at any point.
Its README points at a GitHub release tag that has never existed — an unreplaced template placeholder. Use the line above.
2 · Run one process per project
The harness is scoped to a project’s .claude/ root, so it is one running process per project rather than one per machine.
tcode serve
macOS: no permission needed
No category applies. trusty-code implements no macOS permission state machine at all: it inherits whatever entitlements it is given, and a refusal from the OS surfaces as an ordinary error. It reads only the directory you navigate to.
The agentic harness · tagent
The only product here with no published crate and no release binary. Cloning this repository and building it is the install path, not a fallback from one.
Before you start
- git required The install starts with a clone.
- A Rust toolchain required Mandatory here — there is no prebuilt and no crates.io package to fall back to.
- pnpm recommended Without it the build still succeeds, but the embedded web UI is a placeholder page.
- A model provider key optional Any ONE of CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY or OPENROUTER_API_KEY, checked in that order. None is required to launch; without one tagent prints an onboarding banner rather than failing.
1 · Clone and build it
This is the same cargo install --path form the project’s own signed-install script uses.
git clone https://github.com/bobmatnyc/trusty-tools cd trusty-tools cargo install --path crates/trusty-agents --locked
tctl install trusty-agents fails — it is not a stable-set member. Older docs naming an open-mpm repository or crate are wrong; neither has ever existed.
2 · Supply one credential, or none
Each credential resolves from the environment, then a project or user .env.local, then the store tagent config keys set writes to. A run against Bedrock or a local Ollama model needs none of the three.
3 · Register it as an MCP server
tagent exposes itself to other MCP clients over stdio.
{ "mcpServers": { "trusty-agents": { "command": "tagent", "args": ["mcp-serve"] } } }
macOS: App Data
tagent needs the App Data category, the same narrow one tm needs and nothing wider. It reads $HOME and project .trusty-agents/ state, and project-local .claude/ directories that live under another application’s data category. Because it is installed outside tctl, its signing identity is not maintained for you — run scripts/install-trusty-agents-signed.sh from the clone if you want the grant to survive a rebuild.
Git analytics · tga
A pure CLI over git history, and the only product whose published version matches this repository exactly. It is an optional stable-set member and a leaf: tctl installs it alone.
Before you start
- The tctl control plane recommended The install path this page recommends.
- git required It reads repository history through git2. SQLite is bundled — nothing to install.
1 · Install it
The package is named tga even though its directory is crates/trusty-git-analytics.
tctl install tga
cargo install tga --locked
Do not copy a built binary onto your PATH by hand. tga’s own user guide still shows a cp and an mv into /usr/local/bin; on macOS that leaves a stale kernel signature cache and the next run is killed in a way that looks like an out-of-memory kill. cargo install renames atomically instead.
2 · Point it at a config file
One global flag, -c or --config, on every subcommand. It defaults to config.yaml resolved against your current directory.
There is no ~/.config/tga/ fallback and no environment-variable override, whatever INSTALL-CONVENTION.md says.
tga has no MCP transport at all — nothing to register, by design.
macOS: no permission needed
Nothing to grant. tga reads local git history and nothing else, which has never raised a prompt.
Already running claude-mpm?
The migration page covers what carries over and what behaves differently, rather than repeating the install.