{"id":"4fc9be88-5874-4d0b-a800-f24b801b4c40","slug":"chatgpt2localbridge","kind":"mcp","name":"chatgpt2localbridge","summary":"Codex/ChatGPT plugin app and OAuth MCP connector for approved local workspaces.","owner":"Harzva","repoUrl":"https://github.com/Harzva/chatgpt2localbridge","license":"MIT","licenseTier":"permissive","trust":"community","stars":108,"match":null,"fewStars":false,"format":"mcp","createdAt":"2026-06-19T02:26:19.000Z","addedAt":"2026-10-14T03:45:01.133Z","logoUrl":"https://avatars.githubusercontent.com/u/49864959?u=0827e6ccf15a7d3eab066ad609af872a66e0c572&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra","memory-knowledge"],"tags":["chatgpt","local-first","oauth","chatgpt-connector","codex","plugin-app","chatgpt-plugin-app","codex-plugin-app"],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-18T03:08:41.098Z","sample":false,"url":"https://conduits.dev/tools/chatgpt2localbridge","language":"Swift","transports":["stdio"],"install":{"npm":"chatgpt2localbridge"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n  <img src=\"./docs/assets/logo.png\" alt=\"ChatGPT2LocalBridge logo\" width=\"180\" />\n  <h1>ChatGPT2LocalBridge</h1>\n  <p><strong>Codex / ChatGPT Plugin App for approved local workspaces.</strong></p>\n  <p>\n    <img alt=\"Codex Plugin App\" src=\"https://img.shields.io/badge/Codex-Plugin%20App-7c3aed.svg\" />\n    <img alt=\"ChatGPT Plugin App\" src=\"https://img.shields.io/badge/ChatGPT-Plugin%20App-10a37f.svg\" />\n    <img alt=\"License\" src=\"https://img.shields.io/badge/license-MIT-blue.svg\" />\n    <img alt=\"Node\" src=\"https://img.shields.io/badge/node-%3E%3D20-339933.svg\" />\n    <img alt=\"Rust\" src=\"https://img.shields.io/badge/rust-native%20preview-b7410e.svg\" />\n    <img alt=\"MCP\" src=\"https://img.shields.io/badge/MCP-Streamable%20HTTP-1769e0.svg\" />\n    <img alt=\"Status\" src=\"https://img.shields.io/badge/status-alpha-f59e0b.svg\" />\n    <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/Harzva/chatgpt2localbridge?style=social\" />\n  </p>\n  <p>\n    <a href=\"./docs/index.html\">Pages source</a>\n    ·\n    <a href=\"./docs/showcase.html\">Showcase</a>\n    ·\n    <a href=\"./docs/human-tutorial.html\">Human tutorial</a>\n    ·\n    <a href=\"./docs/agent-computer-use.html\">Agent tutorial</a>\n    ·\n    <a href=\"./docs/authentication-modes.md\">Auth modes</a>\n    ·\n    <a href=\"./docs/linux-deploy.md\">Linux deploy</a>\n    ·\n    <a href=\"./docs/alternatives.md\">Alternatives</a>\n    ·\n    <a href=\"./docs/sync-flows.md\">Sync flows</a>\n    ·\n    <a href=\"./docs/skill-runtime-roadmap.md\">Skill runtime</a>\n    ·\n    <a href=\"./docs/handoff-spec.md\">Handoff spec</a>\n    ·\n    <a href=\"./docs/codex-analytics.md\">Codex analytics</a>\n    ·\n    <a href=\"./docs/evidence.md\">Evidence</a>\n    ·\n    <a href=\"./docs/promo/xhs-note.md\">Promo copy</a>\n    ·\n    <a href=\"./docs/promo/mobile-codex-runner.md\">Mobile promo</a>\n    ·\n    <a href=\"./ROADMAP.md\">Roadmap</a>\n  </p>\n</div>\n\n## Linux One-Click Prompt\n\nRepository: `https://github.com/Harzva/chatgpt2localbridge`\n\nCopy this prompt to a Linux shell agent:\n\n```text\nInstall ChatGPT2LocalBridge from https://github.com/Harzva/chatgpt2localbridge on this Linux host.\nUse one command, keep secrets local, and do not print .env.local, OAuth tokens,\nngrok authtokens, cookies, or unlock codes into chat.\n\nRun:\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | bash\n\nAfter install, report the local health result, the ChatGPT Connector fields, and\nthe tunnel choice. If ngrok is selected, ask me for NGROK_AUTHTOKEN and optional\nNGROK_DOMAIN. If Cloudflare is selected, explain quick tunnel vs named tunnel.\n```\n\nOr run it yourself:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | bash\n```\n\nThe installer prints every Connector field you need to fill in ChatGPT, plus\nngrok and Cloudflare registration links, tunnel tradeoffs, and an agent-safe\nsetup prompt.\n\n![ChatGPT2LocalBridge cover](./docs/assets/cover.png)\n\n<!-- showcase:start -->\n<p align=\"center\">\n  <img src=\"./docs/assets/thumbnail-responsive.png\" alt=\"ChatGPT2LocalBridge responsive preview\" width=\"900\" />\n</p>\n<!-- showcase:end -->\n\nChatGPT2LocalBridge is a self-hosted **Codex / ChatGPT Plugin App**: a local desktop/operator app plus an MCP connector that lets ChatGPT access approved local workspaces after authorization. It is designed for people who want ChatGPT or Codex-style agents to inspect, bundle, download, trace, or operate on local project files without uploading the whole workspace elsewhere.\n\nThe TypeScript build is the full OAuth MCP connector. A small Rust native\npreview also lives in [`rust/chatgpt2localbridge-rs`](./rust/chatgpt2localbridge-rs)\nfor the local operator console, health checks, activity APIs, and a minimal MCP\nsmoke surface.\n\nIn this repository, **plugin app** means a small agent-facing product surface: a local app, a policy file, a tool catalog, trace records, and one or more ChatGPT/Codex-visible MCP tools. It is not a legacy ChatGPT plugin. It is best described as:\n\n- **Codex Plugin App**\n- **ChatGPT Plugin App**\n- **MCP Server**\n- **ChatGPT Custom Connector**\n- **OAuth Local Workspace Bridge**\n\n> Unofficial project. Not affiliated with OpenAI.\n\n## Build Your Own Plugin App\n\nThis project is also an invitation to build more agent-facing plugin apps. A good plugin app should give ChatGPT or Codex a focused tool surface, keep risky operations behind policy, and give the human operator a clear local console.\n\n| Layer | What to build | Example in this repo |\n| --- | --- | --- |\n| Agent interface | MCP tools with concise names, schemas, and safe defaults | `project.bundle`, `policy.read`, `codex.task_start` |\n| Skill runtime | Local skills are discovered through approved roots, manifests, and stable registry tools | `skill.list`, `skill.route`, planned `skill.invoke` |\n| Human control | A local app that shows status, policy, traces, and cancel buttons | Native macOS console |\n| Safety policy | Approved roots, deny globs, auth mode, shell restrictions | `bridge.policy.json` |\n| Distribution | README, GitHub Pages, screenshots, setup prompts, install scripts | `docs/`, `npx github:...`, macOS app bundle |\n\nIf you build your own plugin app, keep the default workflow narrow and readable: one clear problem, one safe tool surface, one local control panel, and one copyable ChatGPT test prompt.\n\nThe next product direction is a **Local Skill OS**: local skills stay in approved\nskill roots, the bridge exposes a stable registry surface, and the app shows\nwhich skills are readable, routable, invokable, or blocked. See the\n[Skill Runtime Roadmap](./docs/skill-runtime-roadmap.md).\n\nThe main execution path is moving toward **Handoff -> Codex Runner**: ChatGPT\ncreates a structured handoff, the bridge validates and stores it, then local\nCodex CLI performs the project work. See the [Handoff Spec](./docs/handoff-spec.md).\n\n## Route\n\n```text\nChatGPT\n  -> OAuth MCP Connector\n  -> HTTPS tunnel\n  -> http://127.0.0.1:3838/mcp\n  -> ChatGPT2LocalBridge\n  -> approved local workspace roots\n```\n\nChatGPT does not directly mount your disk. It calls MCP tools, and every file operation is checked against `bridge.policy.json`.\n\n## Architecture\n\n<p align=\"center\">\n  <img src=\"./docs/assets/architecture-horizontal.png\" alt=\"ChatGPT2LocalBridge horizontal architecture diagram\" width=\"900\" />\n</p>\n\nThe intended product shape is a control plane, not just a raw shell bridge:\n\n- **ChatGPT Web** makes structured MCP calls.\n- **Connector auth** should use OAuth or Secure MCP Tunnel for public access.\n- **Bridge policy** gates roots, deny globs, shell mode, timeouts, and traces.\n- **Tool tiers** guide ChatGPT toward safer project and Codex Runner workflows.\n- **Local app** shows policy, tool calls, logs, diffs, downloads, and cancellable tasks.\n\n## 30-Second Install\n\nLinux one-click installer:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | bash\n```\n\nOptional Linux tunnel helpers:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | TUNNEL=cloudflare bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | TUNNEL=ngrok NGROK_AUTHTOKEN=... NGROK_DOMAIN=my-bridge.ngrok-free.app bash\n```\n\nTemporary GitHub npx install, no clone required:\n\n```bash\nnpx github:Harzva/chatgpt2localbridge init --root ~/Projects\nset -a; source .env.local; set +a\nnpx github:Harzva/chatgpt2localbridge --http 3838\n```\n\nLocal clone flow:\n\n```bash\ngit clone https://github.com/harzva/chatgpt2localbridge.git\ncd chatgpt2localbridge\nnpm install\nnpm run build\nnode dist/index.js init --root ~/Projects\nset -a; source .env.local; set +a\nnode dist/index.js --http 3838\n```\n\nHealth check:\n\n```bash\ncurl -sS http://127.0.0.1:3838/health\n```\n\nLocal operator console:\n\n```text\nhttp://127.0.0.1:3838/app\n```\n\nRust native preview:\n\n```bash\ncargo run --manifest-path rust/chatgpt2localbridge-rs/Cargo.toml -- --http 3842\n```\n\nThe Rust preview intentionally exposes a smaller MCP surface today:\n`initialize`, `tools/list`, `bridge.health`, `bridge.activity`, and `file.list`.\n\nNative macOS app:\n\n```bash\nnpm run macos:install\nopen /Applications/ChatGPT2LocalBridge.app\n```\n\nThe macOS app is a native AppKit/SwiftUI desktop console that embeds the Rust\nengine, uses the repository logo as its `.icns` icon, manages the local `3842`\nservice, and shows the ChatGPT-visible MCP tool catalog, browser bundle prompts,\napproved roots, editable policy, logs, connector tool calls, skill reads, write\nevents, and cloud-download trace records without needing the browser console.\n\nThe native **Policy Center** edits the local policy safely:\n\n- workspace roots stay separate from skill roots\n- the default skill root is `~/.codex/skills`\n- saving creates `bridge.policy.backup.json`\n- policy changes are written to local audit trace\n- the app warns if you expose broad paths such as `~/.codex`\n\n## Downloads And Releases\n\nGitHub Releases provide prebuilt artifacts for local testing:\n\n- `ChatGPT2LocalBridge-macos-*.dmg`: drag-and-run macOS native control\n  console with the Rust companion binary bundled inside the app.\n- `ChatGPT2LocalBridge-macos-*.app.zip`: native macOS control console with the\n  Rust companion binary bundled inside the app.\n- `ChatGPT2LocalBridge-windows-x64-rust-preview.zip`: Windows Rust-native local\n  console preview.\n- `chatgpt2localbridge-*.tgz`: npm package for the full TypeScript OAuth MCP\n  bridge.\n\nThe Windows artifact is currently a Rust preview, while the full OAuth connector\nsurface remains the Node/TypeScript package. Release builds are generated by\n`.github/workflows/release.yml` when a `v*` tag is pushed.\nSee [Windows Roadmap](./docs/windows-roadmap.md) for the current preview scope.\n\nRelease route:\n\n```bash\nnpm run typecheck\nnpm test\nnpm run macos:app\ngit tag v0.1.x\ngit push origin v0.1.x\n```\n\nThe release workflow attaches macOS `.dmg` / `.app.zip`, a Windows Rust preview\nzip, an npm tarball, and SHA256 files.\n\n## ChatGPT Connector Setup\n\n### Choose An Auth Mode\n\nChatGPT's custom connector UI may offer OAuth, No Authentication, and Mixed Authentication. This project supports more than one path, but the safe default depends on where the endpoint is reachable.\n\n| Connector auth | Use when | Notes |\n| --- | --- | --- |\n| OAuth | Any public HTTPS tunnel, including Mac mini with ngrok/Cloudflare or a Linux server tunnel | Recommended default. ChatGPT completes an OAuth code flow and later calls `/mcp` with a bearer token. |\n| No Authentication | Short-lived loopback-only or private-network tests | Works only if the bridge is intentionally running without OAuth. Do not use this on a public tunnel. |\n| Mixed | Advanced per-tool policy where public tools are anonymous and privileged tools require OAuth | Useful later if you split tools by risk. The current public-safe guide keeps the whole connector OAuth-protected. |\n\nIf both OAuth and No Authentication appear to work, prefer OAuth for anything reachable from ChatGPT over the internet. No Authentication means the URL itself is the control surface.\n\nExpose the local server through HTTPS:\n\n```bash\nngrok http 3838 --url=your-fixed-domain.ngrok-free.dev\n```\n\nThen create a ChatGPT Custom Connector:\n\n| Field | Value |\n| --- | --- |\n| Name | `ChatGPT2LocalBridge` |\n| URL | `https://your-fixed-domain.ngrok-free.dev/mcp` |\n| Auth | OAuth |\n\nWhen the authorization page opens, enter the unlock code from `.env.local`. Do not paste unlock codes or tokens into public chats, issues, screenshots, or commits.\n\n### Linux Server Setup\n\nLinux works the same way as Mac mini: run one bridge next to the files you want ChatGPT to see, expose that bridge through HTTPS, then create a separate ChatGPT connector for that machine.\n\nOne-click install directly on the Linux host:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | bash\n```\n\nCommon options:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Harzva/chatgpt2localbridge/main/scripts/linux-one-click-install.sh | WORKSPACE_ROOT=/srv/workspace BRIDGE_PORT=3900 bash\n```\n\nThe installer prints the exact ChatGPT Connector fields, local health checks,\nngrok registration requirements, Cloudflare registration requirements, and a\nlonger agent prompt for safe remote setup.\n\nDeploy from an existing local clone to a remote Linux host:\n\n```bash\nREMOTE=linux-box \\\nREMOTE_WORKSPACE=/srv/workspace \\\nREMOTE_ALLOWED_ROOTS=\"/srv/workspace,/home/agent/projects\" \\\nPUBLIC_BASE_URL=https://linux-bridge.example.com \\\nbash scripts/deploy-linux-bridge.sh\n```\n\nCreate a second connector such as `ChatGPT2LocalBridge Linux` with:\n\n| Field | Value |\n| --- | --- |\n| URL | `https://linux-bridge.example.com/mcp` |\n| Auth | OAuth |\n\nUse separate connectors for separate machines so each policy can stay narrow. See [Linux deployment](./docs/linux-deploy.md).\n\n## Screenshot Walkthrough\n\n| Step | Preview |\n| --- | --- |\n| Initialize local policy | ![Initialize](./docs/assets/screenshots/01-init.png) |\n| Run local MCP server | ![Run](./docs/assets/screenshots/02-run.png) |\n| Review Policy Center | ![Policy Center](./docs/assets/screenshots/09-policy-center.png) |\n| Check `/health` | ![Health](./docs/assets/screenshots/03-health.png) |\n| Create connector | ![Connector](./docs/assets/screenshots/05-connector.png) |\n| Authorize | ![Authorize](./docs/assets/screenshots/06-authorize.png) |\n| Test file listing | ![Success](./docs/assets/screenshots/07-success.png) |\n\n## macOS Screenshot CLI\n\nUse the Mac mini helper when you need real screenshots for README, GitHub Pages,\nrelease notes, or social posts. Outputs default to `docs/assets/app_screenshots`.\n\n```bash\nnpm run shot:selection   # choose any screen area\nnpm run shot:window      # click any window\nnpm run shot:full        # capture the full screen\nnpm run shot:app         # capture the ChatGPT2LocalBridge window bounds\n```\n\nDirect usage:\n\n```bash\nscripts/mac-screenshot.sh --rect 100,120,1280,760 --out docs/assets/app_screenshots/dashboard.png\nscripts/mac-screenshot.sh --app \"ChatGPT2LocalBridge\" --open --copy-path\n```\n\nIf macOS blocks capture, grant Screen Recording permission to Terminal, iTerm,\nor the agent process in System Settings.\n\nFull guides:\n\n- [Human setup tutorial](./docs/human-tutorial.html)\n- [Agent + Computer Use tutorial](./docs/agent-computer-use.html)\n- [Visual showcase gallery](./docs/showcase.html)\n- [Markdown human tutorial](./docs/tutorial-human.md)\n- [Markdown agent tutorial](./docs/tutorial-agent-computer-use.md)\n\n## Main MCP Tools\n\n### Tool Tiers\n\n| Tier | Default use | Tools |\n| --- | --- | --- |\n| High-level agent workflow | Recommended entry point for Web ChatGPT once Codex Runner lands | `codex.task_start`, `codex.status`, `codex.result` |\n| Mid-level project workflow | Preferred today for reading context, checking policy, inspecting diffs, and running tests | `project.bundle`, `policy.read`, `git.diff`, `test.run` |\n| Low-level debug primitives | Advanced local troubleshooting only; avoid as the Web ChatGPT path | `file.read_path`, `file.write`, `shell.exec` |\n\nThe roadmap tracks the move from low-level primitives toward a safer Codex Runner surface. See [ROADMAP.md](./ROADMAP.md).\n\n### Tool Profiles\n\nChatGPT2LocalBridge already uses a profile gate to progressively expose tools:\na small public connector surface, a standard daily surface, and a full debug\nsurface. For clearer public docs, it now accepts both product-facing profile\nnames and the earlier internal aliases:\n\n| Profile | Alias | Use |\n| --- | --- | --- |\n| `minimal` | `chatgpt-app` | Small ChatGPT connector surface with compatibility aliases. Raw shell execution is intentionally not exposed. |\n| `standard` | `normal` | Recommended default for project, policy, skills, git, tests, traces, and Codex task workflows. |\n| `full` | `debug` | Trusted local debugging with low-level file, process, shell, and service tools exposed. |\n| `codex-runner-only` | `codex-runner-only` | High-level Codex task control plane without general project tools. |\n\nSet it with:\n\n```bash\nLOCALBRIDGE_TOOL_PROFILE=standard\n```\n\nUse `minimal` for the first public connector test, `standard` for daily work,\nand `full` only for focused local debugging where you want every raw primitive\nvisible.\n\n`shell_exec` is **not supported in the Web ChatGPT connector profile**. Hosted\nChatGPT safety checks can block shell-like actions before they ever reach your\nlocal bridge, especially commands that enumerate files, use pipes, or combine\nmultiple shell operators. For a smoother connector experience, use\n`file_list` / `local_list_dir` for directories, `batch_read` for bounded\nmulti-file reads, and `handoff_create` -> `codex_task_start` when local Codex\nCLI should run commands. The raw shell tools remain debug-only under the `full`\n/ `debug` profile for trusted local troubleshooting.\n\nThis profile model is part of the bridge's own tool router and progressive\ndisclosure roadmap: expose only the tools needed for the current trust level,\nthen let the local app and trace records explain what happened.\n\n| Area | Examples |\n| --- | --- |\n| Project | `project.snapshot`, `project.bundle`, `project.index`, `project.scripts` |\n| Handoff | `handoff.create` |\n| Policy | `policy.read`, `policy.validate` |\n| Skills | `skill.list`, `skill.search`, `skill.read`, `skill.bundle`, `skill.route` |\n| Code | `code.read`, `code.read_range`, `code.search` |\n| Files | `file.list`, `file.read_path`, `batch_read`, `file.stat`, `file.write`, `file.patch`, `file.delete` |\n| Shell/tests | `shell.exec` for local debug only; `test.detect`, `test.run` |\n| Git | `git.status`, `git.diff`, `git.checkpoint`, `git.revert` |\n| Runtime | `workspace.*`, `task.*`, `process.*`, `port.check` |\n| Cloud sync | `cloud.download` |\n| Bridge | `bridge.status`, `bridge.health`, `bridge.logs`, `bridge.activity`, `service.restart` |\n\nThe full debug-profile MCP tool catalog is generated from MCP `tools/list` into\n[`assets/mcp-tools.json`](./assets/mcp-tools.json):\n\n```bash\nnpm run tools:catalog\n```\n\n`project.bundle` is the recommended multi-file context tool. It returns a\ndirectory summary, selected text files, and optional git diff in one read-only\ncall, so ChatGPT can read local first and then create a cloud-side downloadable\ncopy from the returned content.\n\n`skill.*` tools make local Codex skills readable through the connector without\nturning the whole Codex runtime directory into a workspace. Configure:\n\n```json\n{\n  \"skillRoots\": [\n    \"/Users/YOUR_USERNAME/.codex/skills\"\n  ]\n}\n```\n\nProject-local skills are also discovered from approved project roots at\n`.codex/skills`. Reference files are gated: call `skill.read` on a `SKILL.md`\nfirst, then pass the returned `activationId` to `skill.bundle` so it can include\nreferenced local files such as `references/*.md`.\n\nDo not approve the whole `~/.codex` directory. It can contain sessions,\nattachments, local configuration, and other private runtime files.\n\n## Codex Provider Profiles\n\nCodex Runner can use either the normal Codex CLI login or an OpenAI-compatible\nAPI endpoint. This keeps sub2api optional: run sub2api separately, then point\nthe bridge at its `/v1` endpoint.\n\n```bash\nLOCALBRIDGE_CODEX_BIN=/Users/YOUR_USERNAME/.local/bin/codex\nLOCALBRIDGE_CODEX_PROVIDER=sub2api\nLOCALBRIDGE_CODEX_BASE_URL=http://127.0.0.1:4999/v1\nLOCALBRIDGE_CODEX_API_KEY_ENV=SUB2API_KEY\nSUB2API_KEY=...\n```\n\nThe native app has a Codex Provider page for editing these local settings.\nTrace output records the provider kind and base URL host only; API keys are not\nwritten into tool results or audit logs.\n\nIf ChatGPT shows `spawn codex ENOENT`, the connector and handoff tools are\nworking, but the background service cannot find the Codex CLI. Set\n`LOCALBRIDGE_CODEX_BIN` to the absolute `codex` path, or install Codex in one\nof the service-friendly locations such as `~/.local/bin`, `/opt/homebrew/bin`,\nor `/usr/local/bin`.\n\n## File Sync And Activity\n\n- Local files can be read by ChatGPT through approved MCP tools.\n- Multiple local files can be bundled with `project.bundle`.\n- MCP-read local file content can be re-emitted by ChatGPT as a cloud-side downloadable artifact when the user wants a copy in the conversation.\n- For stable Trace Studio grouping, ask ChatGPT to call `trace.session_start` at the beginning of each conversation, and `task.start` before long multi-step work.\n- ChatGPT/App-provided cloud file download URLs can be written back to local disk with `cloud.download`.\n- Tool calls are persisted to `tool-calls.jsonl`.\n- File writes, downloads, tasks, processes, and service restarts are persisted to `audit.jsonl`.\n- The local console at `/app` and native macOS app show status, tool calls, and audit events.\n\nSee [file sync flows](./docs/sync-flows.md).\n\n## Field Evidence\n\nThe current release includes sanitized evidence from local and ChatGPT connector\ntests: build/test output, macOS app installation, tool catalog counts, write\nsmoke tests, and connector troubleshooting notes. See\n[`docs/evidence.md`](./docs/evidence.md).\n\nLatest connector proof: after recreating the ChatGPT custom connector as\n`attachlocal2chatgpt-v3`, ChatGPT's action list exposed the high-level handoff\nand Codex Runner entry points:\n\n<p align=\"center\">\n  <img src=\"./docs/assets/evidence/chatgpt-v3-codex-runner-tools.svg\" alt=\"ChatGPT connector evidence showing handoff_create, codex_task_start, codex_status, and codex_result\" width=\"900\" />\n</p>\n\nPublic-safe safety evidence from field testing:\n\n<p align=\"center\">\n  <img src=\"./docs/assets/evidence/batch-read-safety-note.svg\" alt=\"Evidence card explaining hosted safety checks can over-block large batch reads and the bridge now prefers bounded batch_read\" width=\"49%\" />\n  <img src=\"./docs/assets/evidence/shell-exec-safety-block.svg\" alt=\"Evidence card showing shell_exec can be blocked by hosted ChatGPT safety checks and is not exposed in the Web ChatGPT connector profile\" width=\"49%\" />\n</p>\n\nField note: keep `xhigh` / `XHigh` mode off by default. In local testing it\nproduced more connector/tool-call errors than the normal profile, so use it only\nfor focused debugging with trace capture enabled.\n\nField note: `codex.result` and `codex_result` return compact summaries by\ndefault. Full logs, diffs, and handoff metadata are opt-in with `includeLog`,\n`includeDiff`, and `includeHandoff` because hosted ChatGPT safety checks can\nblock large execution records or structured payloads.\n\n## Star History\n\n<a href=\"https://www.star-history.com/?repos=Harzva%2Fchatgpt2localbridge&type=date&legend=top-left\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=Harzva/chatgpt2localbridge&type=date&theme=dark&legend=top-left\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=Harzva/chatgpt2localbridge&type=date&legend=top-left\" />\n   <img alt=\"Star History Chart for Harzva/chatgpt2localbridge\" src=\"https://api.star-history.com/chart?repos=Harzva/chatgpt2localbridge&type=date&legend=top-left\" />\n </picture>\n</a>\n\n## Security Defaults\n\n- Do not run unauthenticated on a public URL.\n- Keep `allowedProjectRoots` narrow.\n- Keep `skillRoots` narrow; prefer `~/.codex/skills`, not `~/.codex`.\n- Never commit `.env.local`, `bridge.policy.json`, OAuth stores, tokens, cookies, or unlock codes.\n- Prefer OAuth over URL tokens.\n- Set `LOCALBRIDGE_DASHBOARD_TOKEN` before using `/app`.\n- Review shell deny rules before enabling shell access for broad workspaces.\n\nSee [security model](./docs/security.md).\n\n## Alternatives\n\nOAuth + fixed HTTPS tunnel is the default because it fits ChatGPT Custom Connectors well. Other options exist:\n\n- OpenAI Secure MCP Tunnel, when available to your workspace\n- Cloudflare Tunnel\n- VPS reverse proxy\n- Static bearer token for private clients\n- Loopback-only no-auth testing\n\nSee [alternatives](./docs/alternatives.md).\n\n## GitHub Pages\n\nThe static product site lives in [`docs/`](./docs/index.html). The repository includes a GitHub Actions workflow that deploys it to GitHub Pages after pushing to `main`.\n\n## Development\n\n```bash\nnpm install\nnpm run typecheck\nnpm run tools:catalog\nnpm test\nnpm pack --dry-run\ncargo test --manifest-path rust/chatgpt2localbridge-rs/Cargo.toml\ncargo build --manifest-path rust/chatgpt2localbridge-rs/Cargo.toml\ncargo build --release --manifest-path rust/chatgpt2localbridge-rs/Cargo.toml\nnpm run macos:app\nnpm run macos:install\n```\n\nRender README and docs assets:\n\n```bash\nnpm run docs:assets\nnpm run docs:preview\n```\n\n## Public Release Checklist\n\n- [ ] Enable GitHub Pages with the included workflow.\n- [ ] Confirm `npm test` passes in GitHub Actions.\n- [ ] Confirm the macOS `.dmg` and `.app.zip` download, unzip/mount, and launch.\n- [ ] Confirm the Windows Rust preview starts `http://127.0.0.1:3842/app`.\n- [ ] Keep `.env.local` and `bridge.policy.json` untracked.\n- [ ] Verify the ChatGPT connector uses OAuth and the correct `/mcp` URL.\n\n## License\n\nMIT\n"}