{"slug": "cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses", "title": "Cindy, Open-source agent that runs Claude Code and Codex as swappable harnesses", "summary": "Cindy, an open-source AI agent client released under Apache-2.0 by the makecindy project, runs locally on a user's machine and treats Claude Code and Codex as swappable harnesses, letting models and harnesses mix freely and switch mid-task while workspace, memory, skills and tools stay continuous. The pnpm monorepo ships an Electron desktop client and an Expo/React Native mobile client, supports MCP for internal tools, and lets users sign in to the hosted Cindy service, reuse an existing Claude Code or Codex Coding Plan, connect their own API keys, or run local models. The client requires Node.js 22.x, pnpm 10.x (v11 is not yet supported) and Git LFS, and the backend service lives in a separate repository outside the monorepo.", "body_md": "**English** · [简体中文](https://github.com/makecindy/cindy/blob/main/README.zh-CN.md)\n\nCindy is an open-source AI agent that works out of the box. She brings multiple harnesses, models and tools into one agent that finishes real work in your projects and apps. Ready from day one, yours to shape over time.\n\nCindy runs locally on your own machine, using your real files and logged-in\napps. The first supported harnesses are **Claude Code** and **Codex** — more are\nbeing added, and a native harness is in the works. Models and harnesses mix\nfreely and can switch mid-task while your workspace, memory, skills and tools\nstay continuous; one task can even be planned, executed in parallel, and\nreviewed by agents on different harness × model combos. She can drive your\nbrowser, computer and phone, and take work from IM and schedules.\n\nThis repository is the open-source **client** for Cindy — the desktop and mobile\napps plus their shared packages, organized as a pnpm monorepo.\n\nThe client is free to use, and its source code is open under Apache-2.0. Bring\nmodels your way: sign in to the official Cindy service (usage deducted\ntransparently), authorize the **Claude Code / Codex Coding Plan** you already\npay for and keep using it inside Cindy — no duplicate bill — connect your own\nAPI keys, or use local models.\nSee [cindy.app](https://cindy.app) for service details,\n[pricing](https://cindy.app/#pricing), and [downloads](https://cindy.app/download/).\n\nLinux users: see the [Ubuntu, Arch Linux and Omarchy installation guide](https://github.com/makecindy/cindy/blob/main/docs/linux.md)\nfor installation, updates, keyring setup and migration from a manual install.\n\nOpen source means more than visible — it means changeable:\n\n- **Memory** — correct her once and she does it right from then on, shared across harnesses.\n- **Skills** — teach a way of working once and reuse it everywhere; handing them to your team is in the making.\n- **Automation** — recurring work schedules itself, runs itself, reports back.\n- **MCP** — wire your internal tools and business systems into her reach.\n- **Plugins** — reshape features, UI and interactions, shared through an open marketplace*(in the making)* .\n- **Source** — audit, fork, extend, and contribute improvements back under Apache-2.0.\n\nReady out of the box, never boxed in — start with\n[`CONTRIBUTING.en.md`](https://github.com/makecindy/cindy/blob/main/CONTRIBUTING.en.md) and build Cindy with us.\n\n| Path | Description | \n|---|---|\n| `apps/desktop` | Electron desktop client | \n| `apps/mobile` | Expo / React Native mobile client | \n| `packages/*` | Shared client capabilities (auth, device-link, agent orchestration, model providers, …) | \n| `apps/*-bin` | Tool binaries shipped with the desktop app; none are committed — claude-code, codex, and ripgrep are downloaded per platform by `pnpm install` , and the Android platform-tools binaries are fetched (pinned version, sha256-verified) before Windows packaging | \n\n**Not in this repo:** the backend service lives in a separate\nrepository and is not part of this monorepo.\n\n| Mode | Account requirement | Availability | \n|---|---|---|\n| Hosted service | Cindy cloud account | Use Cindy's full hosted service. See [pricing](https://cindy.app/#pricing) . | \n| Skip Sign-In | No Cindy sign-in required | Choose “Skip Sign-In” on the login screen to use local agents; the app then shows the account state as “Not signed in”. Server-backed capabilities are unavailable in this state. | \n\n- **Node.js** 22.x\n- **pnpm** 10.x (v11 is not yet supported)\n- **Git LFS**\n\nContributor setup, Git LFS, dependency updates, and access requirements are maintained in\n[`CONTRIBUTING.en.md`](https://github.com/makecindy/cindy/blob/main/CONTRIBUTING.en.md).\nPlugins are installed through SkillHub or manually.\n\nMinimal entry point:\n\n```\ngit clone https://github.com/makecindy/cindy.git\ncd cindy\ngit lfs pull\npnpm install\n# Mainland China Cindy account\npnpm restart:desktop:remote --region=cn\n\n# Global Cindy account\npnpm restart:desktop:remote --region=global\n```\n\nRemote development uses your own Cindy cloud account and existing login state, so\nyou can continue existing sessions and work while developing the client. Use `cn`\nfor Mainland China accounts and `global` for everyone else; do not rely\non the internal default. Full desktop, mobile, data-isolation, and validation\nworkflows are in [`CONTRIBUTING.en.md`](https://github.com/makecindy/cindy/blob/main/CONTRIBUTING.en.md).\n\n“Skip Sign-In” on the login screen runs local agents without a Cindy account (shown in the app as “Not signed in”), not a connection to a local server. Server-backed capabilities are unavailable in this state.\n\n**About the default servers:** the client connects to Cindy's official cloud\nservices by default (endpoint manifests in\n[`config/endpoint.json`](https://github.com/makecindy/cindy/blob/main/config/endpoint.json) and\n[`config/endpoint.global.json`](https://github.com/makecindy/cindy/blob/main/config/endpoint.global.json); desktop\nauto-updates also come from the official CDN). This is intentional — external\ndevelopers don't need to self-host a server: sign in with your own Cindy\naccount in a dev build and develop / test directly against the official\nservers.\n\nSkill Hub migration uses two separate manifest fields: released clients keep\nusing `skillhubApiBaseUrl` (the deprecated XD proxy), while current clients use\n`cindySkillHubApiBaseUrl`. The current client deliberately does not fall back to\nthe legacy field when the new endpoint is absent.\n\n- [`DESIGN.md`](https://github.com/makecindy/cindy/blob/main/DESIGN.md) — visual design system, color tokens, and UI conventions\n- [`docs/README.md`](https://github.com/makecindy/cindy/blob/main/docs/README.md) — complete documentation and rules index\n- [`docs/auth-realm-routing.md`](https://github.com/makecindy/cindy/blob/main/docs/auth-realm-routing.md) — organization SSO region discovery and session endpoint routing\n- [`CONTRIBUTING.en.md`](https://github.com/makecindy/cindy/blob/main/CONTRIBUTING.en.md) — contributor setup, validation, and submission workflow\n- [`AGENTS.md`](https://github.com/makecindy/cindy/blob/main/AGENTS.md) — engineering rules, launch/runtime contracts, and module boundaries\n- [`docs/dev-rules/`](https://github.com/makecindy/cindy/blob/main/docs/dev-rules) — deep-dive architecture docs (e.g. Orca multi-agent orchestration)\n\nContributions go through pull requests into `main`. Read\n[`CONTRIBUTING.en.md`](https://github.com/makecindy/cindy/blob/main/CONTRIBUTING.en.md) first, then use\n[`.github/PULL_REQUEST_TEMPLATE.md`](https://github.com/makecindy/cindy/blob/main/.github/PULL_REQUEST_TEMPLATE.md).\nEvery commit needs a [Developer Certificate of Origin](https://github.com/makecindy/cindy/blob/main/DCO) sign-off\n(`git commit -s`); a DCO check on each pull request enforces it, and no CLA is\nrequired.\nPlease also follow [`CODE_OF_CONDUCT.en.md`](https://github.com/makecindy/cindy/blob/main/CODE_OF_CONDUCT.en.md). For ordinary\nusage questions, see [`SUPPORT.en.md`](https://github.com/makecindy/cindy/blob/main/SUPPORT.en.md); report security issues\nprivately through [`SECURITY.en.md`](https://github.com/makecindy/cindy/blob/main/SECURITY.en.md).\n\nNever commit credentials or authorization files to the working tree. If you\ndiscover a security issue, follow [`SECURITY.en.md`](https://github.com/makecindy/cindy/blob/main/SECURITY.en.md) to report it\nprivately rather than opening a public issue.\n\n**Official distribution builds** include [TapDB](https://www.taptap.io/tapdb)\nusage analytics for product-level aggregate statistics, including device identifiers,\nOS / app version, startup and activity events. Events are associated with your account\nID after sign-in, so this is not fully anonymous. TapDB does **not** collect chat\ncontent, file content, or working-directory data.\n\n**You can disable usage analytics without editing code**: on Desktop, use\nSettings → About → Usage statistics; on Mobile, use Usage statistics in Settings.\nThe SDK checks the stored privacy-consent state and the statistics preference,\nwhich defaults to on. Accepting the Privacy Policy records consent; a one-time\nmigration also records consent for eligible existing signed-in users.\n\n**Known Mobile exception:** enterprise SSO skips the policy-acceptance step. If no\nanalytics consent record exists and that sign-in is restored after restarting the\napp, the current migration can mark even a new installation as consented. With\nTapDB configured and statistics enabled, reporting can then start without explicit\npolicy acceptance. See [Mobile sign-in restoration](https://github.com/makecindy/cindy/blob/main/apps/mobile/src/auth/AuthContext.tsx)\nand the [consent migration](https://github.com/makecindy/cindy/blob/main/apps/mobile/src/analytics/analyticsConsentStore.ts).\nTurning off Usage statistics prevents reporting from being enabled by this migration.\n\n- Desktop stops subsequent analytics reporting immediately when disabled. Local mode (Skip sign-in) does not report to TapDB.\n- Mobile immediately unlinks the account and stops reports explicitly triggered by Cindy. An already initialized native SDK cannot be uninitialized; fully quit and relaunch the app to keep the SDK uninitialized.\n\nImplementation: [Desktop consent and settings](https://github.com/makecindy/cindy/blob/main/apps/desktop/src/main/analyticsSettingsService.ts),\n[Desktop SDK](https://github.com/makecindy/cindy/blob/main/apps/desktop/src/renderer/analytics/tapdbClient.ts),\n[Mobile consent](https://github.com/makecindy/cindy/blob/main/apps/mobile/src/analytics/analyticsConsentStore.ts), and\n[Mobile SDK](https://github.com/makecindy/cindy/blob/main/apps/mobile/src/analytics/mobileTapdb.ts).\n\nOnline heartbeats and diagnostic logs are separate mechanisms, unaffected by the\nusage statistics switch. Desktop sends heartbeats to Cindy services only during a\nverified cloud sign-in (account ID, platform, and version); local mode sends none.\nDesktop native crash dumps stay local and are never uploaded automatically.\nDiagnostic logs can be uploaded manually; a separate, default-off automatic crash\nlog upload option is also available. Log uploads require privacy consent. See the\n[heartbeat implementation](https://github.com/makecindy/cindy/blob/main/apps/desktop/src/main/heartbeatService.ts) and\n[log upload rules](https://github.com/makecindy/cindy/blob/main/docs/dev-rules/log-upload-and-redaction.md).\n\n**Building from source?** You are not required to keep analytics:\n\n- Desktop development builds do not initialize TapDB by default. Explicitly setting\n`XDT_TAPDB_DEV=1` lifts the build gate but still requires consent and the statistics\npreference. Self-packaged Desktop builds use the same analytics gates as official\nbuilds; you can disable analytics in Settings.\n- Mobile does not initialize the SDK without injected TapDB configuration\n(`clientId` /`clientToken` ). This does not mean all source builds default to off:\nthe self-hosted release pipeline requires nonempty configuration, while local\ndevelopment permits empty values. See the[Mobile build guide](https://github.com/makecindy/cindy/blob/main/apps/mobile/docs/simulator-debugging.md) .\n\nExcept as otherwise noted, the source code in this repository is licensed under\nthe [Apache License, Version 2.0](https://github.com/makecindy/cindy/blob/main/LICENSE). Individual source files do not\ncarry per-file license headers; the repository-root `LICENSE` governs.\n\nModel weights, datasets, prompts, trademarks, and other separately identified\nmaterials may be subject to their own license terms and are not automatically\ncovered by the repository-level Apache-2.0 grant. Third-party open-source\ncomponents retain their own copyright and license. Their attribution notices and\nSPDX SBOMs are managed under [`docs/legal/`](https://github.com/makecindy/cindy/blob/main/docs/legal), with artifact-specific\noutputs in [`docs/legal/notices/`](https://github.com/makecindy/cindy/blob/main/docs/legal/notices). See [` NOTICE`](https://github.com/makecindy/cindy/blob/main/NOTICE)\nfor this project's copyright and attribution information.", "url": "https://wpnews.pro/news/cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses", "canonical_source": "https://github.com/makecindy/cindy", "published_at": "2026-10-27 02:45:00+00:00", "updated_at": "2026-10-27 03:11:43.228467+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "agent-protocols", "artificial-intelligence"], "entities": ["Cindy", "makecindy", "Claude Code", "Codex", "Anthropic", "OpenAI", "Electron", "Expo"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses", "markdown": "https://wpnews.pro/news/cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses.md", "text": "https://wpnews.pro/news/cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses.txt", "jsonld": "https://wpnews.pro/news/cindy-open-source-agent-that-runs-claude-code-and-codex-as-swappable-harnesses.jsonld"}}