{"slug": "portable-remote-connectors", "title": "Portable Remote Connectors", "summary": "Signet is developing a portable remote connector system that allows a single Signet daemon instance to serve multiple harnesses across different machines, with each harness connector distributed as an npm package under the @signetai scope. The system uses simple API key authentication for V1, with the daemon storing only hashed keys and supporting scoped, revocable keys. The design emphasizes small edge adapters that forward session events and call the daemon over a stable API, with shared behavior in a connector-base package.", "body_md": "# Portable Remote Connectors\n\nSignet should support one trusted Signet instance serving every harness the user runs, even when those harnesses run on other machines. The product shape is:\n\nRun Signet once. Point every connector at it with\n\n`SIGNET_DAEMON_URL`\n\nand`SIGNET_API_KEY`\n\n.\n\nThe daemon remains the authority boundary: source truth, memory policy, identity, provenance, session ingestion, search, and background maintenance live there. Harness connectors should be small edge adapters that install into a harness, forward session events, expose Signet tools, and call the daemon over a stable API.\n\n## Distribution model\n\nEach harness connector should be its own npm package, for example:\n\n`@signetai/connector-pi`\n\n`@signetai/connector-codex`\n\n`@signetai/connector-opencode`\n\n`@signetai/connector-claude-code`\n\nThe source workspace package names may remain `@signet/*`\n\n; release staging\nrewrites public npm artifacts to the `@signetai/*`\n\nscope.\n\nConnector packages must remain directly installable for portable use:\n\n```\nnpx -y @signetai/connector-pi install \\\n  --url https://signet-home.tailnet:3850 \\\n  --api-key sig_sk_... \\\n  --agent-id pi-work-laptop\n```\n\nThe Signet CLI may wrap these packages for the local/common path:\n\n```\nsignet connector install pi\nsignet connector install pi --url https://signet-home.tailnet:3850 --api-key sig_sk_... --agent-id pi-work-laptop\n```\n\nShared behavior belongs in the connector-base package (`@signet/connector-base`\n\nin source, published as `@signetai/connector-base`\n\n): config loading, daemon\nclient defaults, API-key handling, request envelopes, timeouts, retries, health\nchecks, and common Signet tool contracts. Harness-specific packages should own\nonly installation and runtime glue required by that harness.\n\n## Auth model\n\nThe default auth primitive is a simple API key. This is intentionally boring: remote connector setup should not require OAuth, a cloud account, or a pairing protocol for V1.\n\nThe CLI must be able to generate connector API keys:\n\n```\nsignet api-key create --name \"work laptop pi\" --connector pi --agent-id pi-work-laptop\nsignet api-key list\nsignet api-key revoke <id-or-prefix>\n```\n\nThe daemon prints the raw key once and stores only a hash:\n\n```\nAPI key created:\n\n  name:      work laptop pi\n  id:        key_...\n  prefix:    ...\n  key:       sig_sk_...\n  role:      agent\n  connector: pi\n\nSave this key now. It will not be shown again.\n\nUse `--json` when automation needs structured fields such as `agentId`,\n`scope`, `permissions`, and `expiresAt`.\n```\n\nConnector requests authenticate with bearer auth:\n\n```\nAuthorization: Bearer sig_sk_...\nX-Signet-Harness: pi\nX-Signet-Connector-Version: 0.140.0\n```\n\nThe public API-key metadata shape should be named, scoped, and revocable. The\nunderlying database row also stores the secret verifier as `key_hash`\n\n; the raw\nkey is never stored.\n\n```\ntype ApiKeyRecord = {\n  id: string;\n  prefix: string;\n  name: string;\n  role: \"admin\" | \"operator\" | \"agent\" | \"readonly\";\n  scope: { project?: string; agent?: string; user?: string };\n  permissions: string[];\n  connector: string | null;\n  harness: string | null;\n  agentId: string | null;\n  allowedProjects: string[];\n  createdAt: string;\n  lastUsedAt: string | null;\n  revokedAt: string | null;\n  expiresAt: string | null;\n};\n```\n\nThe user-facing model is still just a URL and key. Scope and permissions are the safety rails, not the main setup ceremony.\n\n## Request context\n\nEvery remote connector request should carry enough context for the daemon to scope data, attribute events, and preserve provenance:\n\n```\n{\n  \"harness\": \"pi\",\n  \"connectorId\": \"conn_...\",\n  \"agentId\": \"nicholai/pi\",\n  \"machineId\": \"work-laptop\",\n  \"sessionKey\": \"...\",\n  \"project\": {\n    \"cwd\": \"/Users/nicholai/signetai\",\n    \"gitRemote\": \"git@github.com:Signet-AI/signetai.git\",\n    \"gitRoot\": \"...\"\n  }\n}\n```\n\nRemote filesystem paths are evidence, not portable identity. Where possible,\nproject identity should prefer repository metadata such as git remote, root\nfingerprint, and declared workspace name over raw `cwd`\n\nstrings.\n\n## Transport\n\nV1 should use HTTP APIs. WebSocket support can be added later for live context pushes, revocation, status streaming, or long-running connector sessions.\n\nThe same connector should work against:\n\n```\nhttp://127.0.0.1:3850\nhttps://signet-home.tailnet:3850\nhttps://future-relay.signet.ai/...\n```\n\nCloud relay and hosted Signet Cloud are not required for the first remote connector milestone. Tailnet/LAN/self-hosted HTTPS is enough to prove the model.\n\n## Design principle\n\nConnectors are disposable stateless edge adapters. The Signet daemon is the policy engine, authority boundary, source index, memory substrate, and session continuity layer.", "url": "https://wpnews.pro/news/portable-remote-connectors", "canonical_source": "https://signetai.sh/docs/specs/approved/portable-remote-connectors/", "published_at": "2026-07-22 23:48:45+00:00", "updated_at": "2026-07-23 00:03:37.363510+00:00", "lang": "en", "topics": ["developer-tools", "ai-infrastructure"], "entities": ["Signet", "@signetai/connector-pi", "@signetai/connector-codex", "@signetai/connector-opencode", "@signetai/connector-claude-code", "@signet/connector-base", "@signetai/connector-base"], "alternates": {"html": "https://wpnews.pro/news/portable-remote-connectors", "markdown": "https://wpnews.pro/news/portable-remote-connectors.md", "text": "https://wpnews.pro/news/portable-remote-connectors.txt", "jsonld": "https://wpnews.pro/news/portable-remote-connectors.jsonld"}}