→Sync · Open source · Apache-2.0

Sync

Agents and workers share sessions, messages and jobs over one HTTP API. You run the binary. MCP clients use sync-mcp.

Status

v0.1.0. Sessions, messages and jobs with compare-and-swap, on memory or S3-compatible storage. You host it. Session attach and Code offload are not in this release. MCP clients use sync-mcp against the same API.

CAS
JSON objects with If-Match / ETag
org/project
Tenant path and API-key scope
stdio
sync-mcp talks MCP, then HTTP to Sync
Apache-2.0
Open source licence

How it is used

You run one Sync process per environment. Agents and other HTTP clients in an org and project share session documents, append and list thread messages, and create or claim jobs. Auth is a project-scoped bearer key. /healthz is the only open route.

The default store is in memory and is lost on restart. Set SYNC_S3_BUCKET (and the related S3 or R2 variables) when the process should keep objects in object storage.

Sync does not run agents, merge pull requests, or execute jobs. Workers that claim a job are what run the payload.

MCP companion

MCP clients should not call that HTTP API themselves. sync-mcp is a stdio MCP server that wraps Sync and exposes sessions, messages and jobs as tools.

Treat listed messages, labels and job fields as untrusted data. sync_job_create can cause a worker to run command or code_offload work. Use --read-only unless the agent must write, and ask a human before create or claim.

flowchart LR
  MCPClient[MCP client]
  HTTPClient[HTTP client]
  MCP[sync-mcp]
  Sync[aixgo-sync]
  Store[(memory or S3/R2)]
  MCPClient -->|stdio| MCP
  MCP -->|HTTP + API key| Sync
  HTTPClient -->|HTTP + API key| Sync
  Sync --> Store

HTTP clients can call Sync directly. sync-mcp is optional.

Run

bash
# terminal 1
export SYNC_API_KEYS="myorg:myproject:change-me"
aixgo-sync serve

# terminal 2 (optional MCP front end, stdio)
SYNC_BASE_URL=http://localhost:8080 \
SYNC_API_KEY=change-me \
SYNC_ORG=myorg \
SYNC_PROJECT=myproject \
sync-mcp

Listen port is SYNC_PORT or PORT (default 8080). The server will not start without SYNC_API_KEYS unless you set SYNC_INSECURE_NO_AUTH=1 for local throwaway use.

Source

●Security model

Tenant keys, and what they do not cover.

Keys are bound to one org and project. Sync stores and claims jobs. It does not sandbox workers or execute payloads.

Defends against

  • A token is bound to one org and project. A path outside that tenant returns 403.
  • Every route except GET /healthz needs a known key. Unknown paths do not leak as 404 without a key.
  • MCP org and project are fixed at start. Tools have no tenant arguments. --read-only drops write and claim tools.

Does not defend against

  • Process or syscall sandboxing. That is Aixgate, a separate product.
  • Executing or inspecting job payloads. A worker that claims the job is what runs it.
  • Encrypting stored JSON, terminating TLS on the listen socket, OIDC, quotas, or an audit log.
  • Prompt injection. Message, label and job fields are untrusted data.

●Roadmap

What is next, in order.

v0.1.0

  • v0.1.0 CAS store, tenant keys, HTTP sessions, messages and jobs Shipped
  • next Desired-state GET/PUT, session attach, device register Next
  • later Notify plane, Code offload contract, Cloudflare Containers runbook Future