Build the environment for the work once. Run any agent on it.
Connect your existing repos, docs, and sheets with capabilities, procedures, role-scoped access, and persistent working state. Different agents can work against the same live pod without reconstructing the environment for each one.
Token count and latency are live from the dashboard (30-day window). Savings are estimated per task on benchmarks against a strong native bash baseline.
One piece of work, end to end
From spec to tested change.
Shared working state lives in the pod, so the work can pass between harnesses without being rebuilt from a transcript. Every step below runs against the same handles. Roles make responsibilities visible; enforcement happens server-side on every call. Even the review findings live in the pod — the author reads them where the work is.
Read the requirementplans[auth-timeouts.md].section("Timeout handling")
Draft the change, dispatch the checksapi-server[src/handler.go].expand("Handler").draft.edit(...)api-server.test(targets="api")
Hand it to a reviewerapi-server.invoke("codex", "reviewer", ...)Start in Claude. Resume in Codex.
Verify, then publishrunner["run-…"].read() → ci["run-…"].ls() → commit(...)
role / author · draft + testclaude
> plans[auth-timeouts.md].section("Timeout handling")
> api-server[src/handler.go].expand("Handler").draft.edit(...)
> api-server.test(targets="api")
Run dispatched: run-… · Check: ci["run-…"].ls()
> api-server.invoke("codex", "reviewer",
"Review the draft diff and flag risky changes")
Run dispatched: run-… · Check: runner["run-…"].read()
role / reviewer · read + inspectcodex · resumed
> api-server[src/handler.go].draft.diff()
--- a/src/handler.go
+++ b/src/handler.go
@@ -2,7 +2,8 @@
… 1 file(s), +2/-1
> ci["run-…"].ls()
Run [succeeded] · lint: api · test-unit: api
Models and harnesses change. The work environment stays.
Structural handles
State is addressable — sections, symbols, rows, and runs are durable handles that let any harness work at a precise scope. Important inputs, outputs, and state transitions stay addressable instead of becoming ad-hoc copies in a transcript.
Scoped pods
A pod assembles collections (data) and nodes (capabilities) into one surface. Each connection carries a role, so an agent gets exactly the access you grant.
Harness-neutral state
Any harness can target the same pod. The agent is swappable; the handles, drafts, and results stay put.
Pods and nodes
A pod is the live environment for a piece of work.
Each MCP connection uses one pod. Collections connect the organizational state agents work on; nodes add capabilities such as test(), run(), and search(). Roles scope authority, skills carry reusable procedures, and drafts, runs, and results keep working state available across sessions and harnesses.
Collections sync from GitHub, GitLab, and Google Drive — more sources coming. Lynko is the substrate, not the system of record. Your source stays authoritative; supported writes publish back to it.
Skills node
native:skills
Indexes qualified SKILL.md files across the pod so agents can discover, read, pin, and curate reusable playbooks.
CI node
native:ci
Adds test() so draft changes can be checked before they become committed state.
Runner node
native:runner
Adds run() for builds, smoke tests, and commands on a machine you connect over SSH.
Embedding node
native:embedding
Adds search() — semantic search over every qualified collection in the pod.
One URL to connect
Connect your client.
No config file — add one URL as a custom connector. The connection is scoped to one pod, so your agent sees that pod's collections and nodes, nothing else.
Custom connector URL
https://mcp.lynko.ai/mcp
Paste it into Claude, Codex, or Cursor as a custom connector — dynamic client registration handles the rest.
Early access
Build your agent environment on Lynko.
Connect one pod, add one MCP URL, and keep the same scoped state across every harness you use.