---
title: "Goose runs entirely on your machine. That changes what 'agent trust' means."
date: 2026-06-04
summary: "Goose is the only AAIF anchor project whose default operating mode runs entirely on the user's machine. The trust boundary distributed across vendor, registry, and remote tool collapses into the OS the user already trusts. The inversion is a different trust model, not a UX preference."
slug: goose-local-first-trust-model
author: "Damiën Semler"
hero_glyph: brackets
---

[Goose](https://github.com/aaif-goose/goose) shipped v1.34.1 on May 15,
2026 (two days before this post) and crossed 45,400 stars on
GitHub. It is the only [AAIF-anchor
project](https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation)
whose default operating mode is to run entirely on the user's machine.
Claude Code, Cursor, Devin, and the rest of the coding-agent field
default to executing the agent inside a vendor's cloud and reaching into
the user's environment over a protocol. Goose inverts that default. The
agent process runs on your laptop. Its tool calls hit your local file
system, your local terminal, your local MCP servers. The LLM provider
is still remote, but the rest of the agent's blast radius is bounded by
the operating system you're already sitting in front of.

That inversion is not a UX preference. It is a different trust model.
The question a consumer asks of a cloud-mediated agent (*which
vendor's infrastructure is my code running through?*) does not apply
to goose. The question that takes its place is *which local processes,
files, and tools is this agent able to touch?*, and that one the OS
has been answering for decades.

## What goose actually is

A short fact sheet, useful for framing the rest:

- Written in **Rust**, [originally open-sourced by
  Block](https://block.xyz/inside/block-open-source-introduces-codename-goose)
  in early 2025 and [donated to AAIF in December
  2025](https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation)
  alongside MCP and AGENTS.md.
- Ships three interfaces (desktop app, CLI, embeddable API) and
  integrates with 15+ LLM providers including Anthropic, OpenAI,
  Google, Ollama, OpenRouter, Azure, and Bedrock.
- Supports 70+ MCP extensions, run locally by default. Servers can
  also be remote.
- Apache-2.0 licensed, 45,400 stars at time of writing, latest stable
  release v1.34.1 on May 15.

The notable absence from that list: a hosted execution environment.
Goose has no vendor-side runtime. The binary on the user's machine *is*
the agent. That places goose in the same architectural lineage as the
local-first software movement: applications whose primary state lives
on the user's device and whose collaboration happens through explicit
sync, not through a server.

## What the trust boundary actually moves

<svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg" style="max-width:100%;height:auto;display:block;margin:28px auto" role="img" aria-labelledby="goose-title goose-desc">
  <title id="goose-title">Cloud-mediated vs local-first agent trust boundaries</title>
  <desc id="goose-desc">Two stacked diagrams comparing a cloud-mediated agent and a local-first agent. The cloud-mediated agent has three trust boundaries: between user and vendor, between vendor and registry, and between registry and target service. The local-first agent collapses the middle boundaries: agent and tools both live on the user's machine, with only the LLM provider remaining off-machine. The OS boundary becomes the load-bearing trust line.</desc>
  <style>
    .lb { fill: none; stroke: var(--c-fg-3, #6b7280); stroke-width: 1.4; }
    .lc { fill: none; stroke: var(--c-pink, #F472B6); stroke-width: 1.6; }
    .lg { fill: none; stroke: var(--c-violet, #A855F7); stroke-width: 1.6; }
    .lt { font-family: 'Geist', system-ui, sans-serif; font-size: 12px; fill: var(--c-fg, #0a0a0a); }
    .lc-t { font-family: 'Geist', system-ui, sans-serif; font-size: 10px; fill: var(--c-fg-2, #404040); }
    .ll { font-family: 'Geist Mono', ui-monospace, monospace; font-size: 10px; fill: var(--c-fg-4, #9ca3af); letter-spacing: 0.14em; }
    .arrow { stroke: var(--c-fg-3, #6b7280); stroke-width: 1.2; fill: none; marker-end: url(#arrA); }
    .boundary { stroke: var(--c-violet, #A855F7); stroke-width: 1.4; stroke-dasharray: 4 3; }
  </style>
  <defs>
    <marker id="arrA" markerWidth="9" markerHeight="9" refX="8" refY="3" orient="auto">
      <polygon points="0 0, 9 3, 0 6" fill="#6b7280"/>
    </marker>
  </defs>
  <text x="0" y="14" class="ll">CLOUD-MEDIATED AGENT · 4 NESTED TRUST DOMAINS</text>

  <!-- Cloud-mediated row -->
  <rect x="0" y="28" width="90" height="48" rx="4" class="lb"/>
  <text x="45" y="50" text-anchor="middle" class="lt">user</text>
  <text x="45" y="65" text-anchor="middle" class="lc-t">files, creds</text>

  <line x1="92" y1="52" x2="118" y2="52" class="arrow"/>

  <rect x="120" y="28" width="120" height="48" rx="4" class="lb"/>
  <text x="180" y="50" text-anchor="middle" class="lt">vendor cloud</text>
  <text x="180" y="65" text-anchor="middle" class="lc-t">agent runtime</text>

  <line x1="242" y1="52" x2="268" y2="52" class="arrow"/>

  <rect x="270" y="28" width="120" height="48" rx="4" class="lb"/>
  <text x="330" y="50" text-anchor="middle" class="lt">registry</text>
  <text x="330" y="65" text-anchor="middle" class="lc-t">MCP discovery</text>

  <line x1="392" y1="52" x2="418" y2="52" class="arrow"/>

  <rect x="420" y="28" width="120" height="48" rx="4" class="lb"/>
  <text x="480" y="50" text-anchor="middle" class="lt">MCP server</text>
  <text x="480" y="65" text-anchor="middle" class="lc-t">remote tool</text>

  <line x1="542" y1="52" x2="568" y2="52" class="arrow"/>

  <rect x="570" y="28" width="70" height="48" rx="4" class="lb"/>
  <text x="605" y="50" text-anchor="middle" class="lt">service</text>
  <text x="605" y="65" text-anchor="middle" class="lc-t">DB, API</text>

  <text x="0" y="96" class="ll" style="fill:var(--c-violet,#A855F7)">FOUR TRUST BOUNDARIES, ALL LEGIBLE TO ATTACKERS</text>

  <!-- Spacer -->
  <line x1="0" y1="120" x2="640" y2="120" class="lb"/>

  <!-- Local-first row -->
  <text x="0" y="148" class="ll">LOCAL-FIRST AGENT (GOOSE) · 1 BOUNDARY THAT MATTERS</text>

  <!-- Big OS boundary box -->
  <rect x="0" y="160" width="400" height="180" rx="8" class="lc"/>
  <text x="200" y="183" text-anchor="middle" class="lt" style="fill:var(--c-pink,#F472B6); font-weight:600">user's machine · OS trust boundary</text>

  <rect x="20" y="200" width="110" height="48" rx="4" class="lb"/>
  <text x="75" y="222" text-anchor="middle" class="lt">goose agent</text>
  <text x="75" y="237" text-anchor="middle" class="lc-t">local process</text>

  <line x1="132" y1="224" x2="158" y2="224" class="arrow"/>

  <rect x="160" y="200" width="110" height="48" rx="4" class="lb"/>
  <text x="215" y="222" text-anchor="middle" class="lt">local MCP servers</text>
  <text x="215" y="237" text-anchor="middle" class="lc-t">your stdio</text>

  <line x1="272" y1="224" x2="298" y2="224" class="arrow"/>

  <rect x="300" y="200" width="80" height="48" rx="4" class="lb"/>
  <text x="340" y="222" text-anchor="middle" class="lt">your files</text>
  <text x="340" y="237" text-anchor="middle" class="lc-t">filesystem</text>

  <rect x="20" y="265" width="360" height="55" rx="4" class="lb"/>
  <text x="200" y="285" text-anchor="middle" class="lc-t">terminal · git · build tools · dev environment</text>
  <text x="200" y="305" text-anchor="middle" class="lc-t">all reachable, all OS-permission-bound</text>

  <!-- Off-machine boundary -->
  <rect x="430" y="200" width="210" height="48" rx="4" class="lg"/>
  <text x="535" y="222" text-anchor="middle" class="lt" style="fill:var(--c-violet,#A855F7)">LLM provider (off-machine)</text>
  <text x="535" y="237" text-anchor="middle" class="lc-t">Anthropic, OpenAI, Ollama, ...</text>

  <line x1="405" y1="224" x2="428" y2="224" class="boundary"/>

  <text x="535" y="265" text-anchor="middle" class="ll" style="fill:var(--c-violet,#A855F7)">the only network-side trust call</text>
</svg>

The diagram makes the structural difference legible. A cloud-mediated
agent has four trust boundaries that an attacker can target, and each
boundary is the responsibility of a different party. The local-first
agent collapses three of those four boundaries into the OS trust
domain the user already has. The remaining boundary, the agent's
call to its LLM provider, is the only one that crosses the network.

This does not make goose more secure than a cloud-mediated agent in
the unqualified sense. It changes *which threat model is load-bearing*.
A goose user's exposure to a malicious MCP server is the local stdio
[command injection
class](https://agenstry.com/blog/mcp-spec-vs-probe-evidence) that has
been disclosed at population scale this spring. A Cursor user's
exposure to the same class lives on Cursor's infrastructure and is
mediated by Cursor's vetting. Both are real risks. They are different
risks.

## What still leaves the machine

The local-first label is precise but partial. Three things in goose's
default configuration still cross the network:

- **The LLM provider call.** Inference happens at Anthropic, OpenAI,
  Google, Bedrock, Azure, or an [Ollama](https://ollama.ai/)-style
  local LLM if the user chooses it. Local inference removes even this
  boundary; cloud inference does not.
- **Remote MCP servers.** Goose supports both. A remote MCP server
  call carries the same trust properties as a cloud-mediated agent's
  tool call would — vendor identity, transport security, and (per
  [the spec's optional
  authorization](https://agenstry.com/blog/google-mcp-origin-validation-seven-months))
  Origin validation are the user's problem.
- **The extension marketplace.** Goose can install MCP extensions from
  [public sources](https://agenstry.com/blog/mcp-discovery-fragmentation).
  Local-first execution does not mean local-source provenance.

A goose deployment that uses only local LLM inference, only locally
installed and vetted MCP servers, and stays inside its own machine has
collapsed all the network-side trust calls into the LLM model itself.
That is the strongest form of the trust-boundary collapse, and it is
achievable today. Most deployments do not run it. Most use cloud
inference and a mix of local and remote MCP servers, and they get the
partial version of the inversion.

## What this means for registries

If you operate a registry that publishes MCP server claims for use by
cloud-mediated agents, your downstream consumer is the vendor's
runtime. The vendor decides what to do with the claim. If you operate
a registry that publishes MCP server claims for use by goose or a
similar local-first agent, the downstream consumer is the user's
machine. The user decides what to do with the claim.

Those two decisions have different shapes. A vendor can apply
centralized policy: blocklists, scan results, conformance score
gates. A user, by default, applies whatever the agent's CLI surface
exposes to them. The Agenstry-relevant observation is that probe data
*matters more, not less* for local-first agents, because the user has
fewer policy intermediaries between them and the registry. A signed
agent card that hasn't been probed for behavior is a card. The probe
is the user-side defense that a vendor would otherwise apply on the
user's behalf.

The work [Agenstry
publishes](https://agenstry.com) is, at root, the public-side analogue
of the trust check a careful goose user makes before installing an
extension. The user check happens at install time on the machine. The
public probe happens continuously across the population. They compose;
they don't substitute. The interesting question for local-first
adoption is whether the public probe data gets pulled into goose's
extension installer flow as a default signal rather than as a thing
the user has to look up.

## What we're watching

Three things, observable within the next two quarters:

1. **Whether goose ships a probe-aware extension installer.** A flag
   in the installer that surfaces "this MCP server has been probed
   continuously for the last 90 days; here's its conformance funnel"
   would be the cleanest expression of the local-first / probe-data
   composition.
2. **Whether AAIF's project lifecycle policy graduates goose first.**
   The [first
   graduation](https://agenstry.com/blog/aaif-membership-vs-protocol-convergence)
   under AAIF's Growth/Impact/Emeritus stages will signal the
   foundation's actual bar. Goose is the most user-visible AAIF
   anchor; it is also the one most likely to surface conformance
   gaps as it scales.
3. **Whether enterprise teams begin to ship goose internally as a
   local-first replacement for cloud coding agents.** [Uber's
   pattern](https://agenstry.com/blog/uber-1500-agents-gateway) of
   building an MCP gateway implies cloud-side mediation; a parallel
   pattern with local-first agents would shift much of that
   mediation onto the developer's workstation. The first
   public case study will be informative.

The cloud-mediated agent stack is the loud part of this year's agent
infrastructure story. The local-first stack is quieter, smaller, and
asking a slightly different question about what the trust boundary
actually is. Goose's v1.34.1 release is one data point. The next
twelve months will tell whether it is also the architecture pattern
that more of the agent web adopts.

## Sources

- [aaif-goose/goose on GitHub](https://github.com/aaif-goose/goose) — AAIF, latest release v1.34.1 (May 15, 2026), accessed May 17, 2026.
- [Block Open Source Introduces "codename goose"](https://block.xyz/inside/block-open-source-introduces-codename-goose) — Block, 2025.
- [Linux Foundation Announces the Formation of the Agentic AI Foundation](https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation) — Linux Foundation, December 9, 2025.
- [goose documentation](https://goose-docs.ai/) — accessed May 2026.
- [Ollama (local LLM runtime)](https://ollama.ai/) — accessed May 2026.
