Direct answers about Linchpin — what it is, how it differs from other agent projects, how to self-host, and what tradeoffs to expect.
Linchpin is an open-source, self-hostable runtime for managed AI agents. It runs as three services and Postgres on a single VM via docker compose up, exposes an HTTP API for agents, environments, and sessions, and streams agent output back via Server-Sent Events. License: Apache-2.0.
LangChain and LangGraph are Python libraries you import into your own application code. Linchpin is a pre-wired runtime — three services plus Postgres — that runs agents as a platform. The HTTP API is language-agnostic. Closer in shape to a managed-agent service than to a library. See Linchpin vs LangGraph for the side-by-side.
OpenHands is a coding agent with its own UI. Linchpin is the runtime layer beneath an agent product. You could build an OpenHands-style coding agent on top of Linchpin; OpenHands is the agent itself, Linchpin is the platform. See Linchpin vs OpenHands.
Linchpin uses OpenRouter for cloud models and Ollama for local models. OpenRouter exposes Claude, GPT, Gemini, Llama, and ~200 others through one OpenAI-compatible API. Routing everything through OpenRouter means one adapter to maintain and one place to set quotas — and OpenRouter handles provider-specific quirks for us.
Yes. Everything — API, connector, console, Postgres — runs under docker compose. A 4 GB VM is the minimum; 16 GB is recommended for production workloads with several concurrent sessions. See self-hosting AI agents on a single VM.
Any cloud model on OpenRouter (~200 models including Claude, GPT-4, Gemini, Llama, Mistral, Qwen) and any local model in Ollama (Llama 3.x, Qwen 2.5, DeepSeek-Coder, Mistral, etc.). The provider is chosen per agent.
Linchpin is pre-1.0 and the API may change before 1.0. The core paths — session lifecycle, event log, sandbox containers, model calls — are stable enough for internal tools and prototypes. Mission-critical customer-facing workloads should wait for 1.0 or run a hosted alternative.
Apache-2.0. Commercial use, modification, distribution, and patent grant are all permitted. The license is in the repo at github.com/linchpinhq/linchpin.
Clone github.com/linchpinhq/linchpin, copy .env.example to .env and set the keys (LINCHPIN_API_KEY, VAULT_ENCRYPTION_KEY, and either OPENROUTER_API_KEY or OLLAMA_HOST), then run docker compose up --build. The console is at localhost:5173 and the API at localhost:8000. See self-hosted AI agents for architecture and example deployments.
Yes — both transports. stdio for community MCP servers spawned as a subprocess inside the per-session sandbox; URL (HTTP-streamable, added in v0.5) for SaaS MCP servers like GitHub Copilot and Linear, with auth resolved through the credential vault. The agent invokes their tools just like the built-in eight (bash, read, write, edit, glob, grep, web_fetch, web_search).
Yes — memory stores, added in v0.3. A memory store is a workspace-scoped filesystem tree mounted into the sandbox at /mnt/memory/<name>/. Path-addressed entries (e.g. /preferences/formatting.md) with a 100 KB cap each, immutable versions on every write with 30-day retention, and per-store read_only or read_write access. The agent reads + writes them naturally; the runtime mirrors changes back to durable storage.
Yes, since v0.6. A coordinator agent can spawn worker threads via POST /v1/sessions/{id}/threads. Each thread is its own session with its own sandbox container and (optionally) its own outcome / agent / resources. Every event a thread emits mirrors up into each ancestor's event log with a thread_id tag, so the coordinator sees one interleaved stream of the whole team. Nesting cap defaults to three levels (configurable).
Yes — outcomes, added in v0.6. Declare an outcome at session create with a free-text definition, a weighted rubric (criteria + weights summing to 1.0), and an agent grader. POST /v1/sessions/{id}/outcome_evaluations records grader results; the session auto-terminates when the score crosses your success threshold (default 0.8, opt-out via auto_terminate: false).
Yes, since v0.5. user.message.content[] accepts {type: "text"}, {type: "image"}, and {type: "document"} blocks. Sources can be inline base64, a URL the model fetches, or a Files-API reference that the orchestrator resolves to bytes before the provider sees it. Images: JPEG / PNG / GIF / WebP. Documents: PDF / text / markdown. The runtime trusts the provider's model-capability claims — unsupported combos surface a clean upstream error.
Linchpin has a credential vault — Fernet-encrypted at rest in Postgres, with the encryption key supplied via VAULT_ENCRYPTION_KEY in the environment. Vaults bind to sessions, and the agent gets credentials injected at runtime; they are never written to disk in plaintext.
Yes, when paired with Ollama. The model runs locally, the runtime runs locally, the event log is in your local Postgres, and the sandbox containers are local. No outbound calls are required at runtime. See local-LLM agents for setup.