{"_id":"@alexjbarnes/cockpit","_rev":"11-5f7b4796d271f5453a5faedef2fda52f","name":"@alexjbarnes/cockpit","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@alexjbarnes/cockpit","version":"0.1.0","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.1.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"435ac15021c9c3b2c5f303176fd33845395a93ac","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.1.0.tgz","fileCount":2010,"integrity":"sha512-x7P0Yafgt3uB8bWdyWG79Rg1jectPvHvKW7PONy3hzgcwKfQCiizpL87+ZoYhCxPRpWTq8mvwknSkhazVMP/7A==","signatures":[{"sig":"MEUCIQD95/hMs8AJvECZ86G5U9ciJfgUy1eg5nVui4H3bo+f/gIgOOg/KxnnDiRQZV2WOfCq9xQUKKn/B/eLrwLOytrhj5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57169022},"engines":{"node":">=20.0.0"},"gitHead":"e37a219876753da18cc50e6cb7e407b2ff3a25f4","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"next build && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"11.6.1","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"^1.1.16","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.4","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.1.0_1777486488926_0.38218742355453106","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alexjbarnes/cockpit","version":"0.1.1","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.1.1","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"f92774fdd78175012c16222d3670830d513751cc","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.1.1.tgz","fileCount":1512,"integrity":"sha512-n71EC7cmvRt//ACWwvW1u1Xu4GbB548v4fzgSy/zuu8mvF7W1AAXWeuiLhCYy5zZHywce78p70dqyBr4RzGmOw==","signatures":[{"sig":"MEUCIQDtWQMryCkh62lEdT+zDUouGzrkn4XHQJ77aCIK8OTYawIgfc7/kyWLVlrqhBnNzV6nU7D/hDJh/eQg8Q7C+ei474U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41478479},"engines":{"node":">=20.0.0"},"gitHead":"fc3a5c19e3099fc075a6c71a3768cc28b875ee7c","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"^1.1.16","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.4","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.1.1_1777494722029_0.0718898642761876","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alexjbarnes/cockpit","version":"0.2.0","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.2.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"8f6d7d5fe0878953828b9d1ad95bcc47a58d0897","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.2.0.tgz","fileCount":1584,"integrity":"sha512-wDz8+4o9s+upmmqRAiNZDRsQNH2FU/zDzcidqWBjs8EzmDuzcpwLXpUUeL/NGmCPJNNa6h3RPlUQku6Vz0CZbQ==","signatures":[{"sig":"MEUCIHkDsMG8u5PxNXJVw1cMyeuIY4MfKbVoIW5wKsdzxx0UAiEAu4IvKnOvWoHh8mF3ci17ciNZXsVvSyy8Mo3Lw7fKuIU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42105321},"engines":{"node":">=20.0.0"},"gitHead":"5e9a793e98beefab76dfc185fe44f00e51490a29","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"^1.1.16","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.4","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.2.0_1778177407264_0.00009552982695448797","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alexjbarnes/cockpit","version":"0.3.0","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.3.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"24b6b3099825cd672809d8ca62fed9c28cebe712","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.3.0.tgz","fileCount":1707,"integrity":"sha512-DKrgIE9JBWqpuYaykdFlDQtOWG4mZ4f1hP9pbxJGFlxRlidQ8KHiVYnM1LbZzMmSXleF9Cb5hPiWIdbaonYJBw==","signatures":[{"sig":"MEUCICM+PVIFKDUF8ykP+/XI3AeiJNMSnz1fqgL3B4DDFDgqAiEA9bm6zI4iJ2xR4bKJfApGTnogLYSjzRztMTnQb9cC4S8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45073238},"engines":{"node":">=20.0.0"},"gitHead":"e2fe41c4c8498f051ecfd1e6ccb836a735ef82a9","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"^1.1.16","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.3.0_1780120540562_0.9293800643455457","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@alexjbarnes/cockpit","version":"0.3.1","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.3.1","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"0ce2dc589a69c2bbf0a2b7007ad13df72fdfe496","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.3.1.tgz","fileCount":1707,"integrity":"sha512-DCQuUNYczVwsEyrFa45JxWJYtNiRRiqdSO2WfNK+3NRDNw+8wjPbx4+TlUwTg4Fio5nMjZDyHRljKFxHN7wqcg==","signatures":[{"sig":"MEYCIQCApXmqvClGlu9GDhKQTZobP++WumeI/cy+MHMfWAL/2wIhAOh7/KAEIuFNXQykeIJhloZO4JssP8zWIhD2dMqfzcU8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45077191},"engines":{"node":">=20.0.0"},"gitHead":"4996467fa7d3b345293fb3411e0569c1b139d3e2","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"^1.1.16","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.3.1_1780152198944_0.7505276019284142","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alexjbarnes/cockpit","version":"0.4.0","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.4.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"3fb5a5acd0cc6963b7178be1eea1fc12f61854fe","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.4.0.tgz","fileCount":1736,"integrity":"sha512-UQ0Aig6CdJcq+4xDIhJrI0N+DTnWsusfYEsu9m2wxfXvgl6X6adM/zXpuJXAGvQgmGEDWRnzLNvl9nyKM7curg==","signatures":[{"sig":"MEYCIQCDzRumSOII6P/ILd7tTN4P7rHAPDfIXy/qTnDfqkff7gIhAIg7MrZTVGXWglS7Ljf0Pf603ZPteLwKrhTubgimUl0u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46908422},"engines":{"node":">=20.0.0"},"gitHead":"970f962ccb024a4a2b1ba8763714ea0a7ca54bfc","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.2.2","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.4.0_1781201675769_0.7446877822107891","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@alexjbarnes/cockpit","version":"0.4.1","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.4.1","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"b2aa88d78a60a2a940529deceb0a80f98e71a35c","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.4.1.tgz","fileCount":1736,"integrity":"sha512-hA7OvO28PESaCVMS2U4dHJN6CNQWukWlWsIvHXY5MhT5n51q1AyP2Jf07tMUIaOIszhww34iZyKGIcyHcdPp6Q==","signatures":[{"sig":"MEQCICsv43NfMk02JnT/uGaFcLg+Ws97Pwbl4EF5BqRIOaP6AiA41yCfjPMrP8XoAB+kCY3zF4jV1GCtF9TVhCf1htwRQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46949035},"engines":{"node":">=20.0.0"},"gitHead":"7dbc130b8ee010a8a91fd81d7c83db27ad8190d1","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.2.2","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^25.6.0","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.4.1_1781346417265_0.4147356231025716","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@alexjbarnes/cockpit","version":"0.4.2","keywords":["claude","claude-code","ai","web-ui"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.4.2","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"c8ce95f10b35da88e6ee20106ac372b3b1cc85a6","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.4.2.tgz","fileCount":1737,"integrity":"sha512-iegn9sr8+yr1yJ2Wo0fxPtgBglh7OHGzmWhbobxcIby6VVav+7sBZ+Dbq5hbbSUU4TLzI8QbSiX/B3Z1cxu/8g==","signatures":[{"sig":"MEUCIQCZC3eJ0UWInjfm1mzroL06kdXHPxrj1xEjA0sVg/rraQIgDoDetqh88Xm2pl4ZbOPkcdSOjGl7+k05FYe2voe9CQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46965849},"engines":{"node":">=20.0.0"},"gitHead":"11907a33bb2f16871ff46fa1bbc7208e044e9f17","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.2.11","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"6.0.3","@types/node":"^26.0.1","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.4.2_1782846341858_0.9781409245037151","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alexjbarnes/cockpit","version":"0.5.0","keywords":["claude","claude-code","anthropic","ai","ai-agents","web-ui","self-hosted","openrouter","scheduled-jobs","pr-review","mcp"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.5.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"361d77287b605ab8ea36b8d056daa3bb416fb378","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.5.0.tgz","fileCount":1775,"integrity":"sha512-nOG07Qn+sMPJwzwNVEn6kXgnLNLft5FCy0CXll4v896ozHMaClvwU0b8GkXXwWoXv3/8HeGbE4s1mZVI2HgTIw==","signatures":[{"sig":"MEQCIG1xbPVrubgF+LkQUWNclrOgGv76nN9l1/G2/nvUsCEnAiAbYaw7g+JoOjf9ppv5sJUaV/OPKjMyALDIJKgwMnmECw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47279580},"engines":{"node":">=20.0.0"},"gitHead":"52fdb17fbd64b5e0dc1f5c6d391adaca32bd84ad","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code: parallel sessions on any device, scheduled jobs, PR reviews, and any model provider","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"^16.2.4","uuid":"^14.0.0","react":"^19","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"^19","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.8.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.2.12","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.2.4","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"7.0.2","@types/node":"^26.0.1","@types/uuid":"^11.0.0","@types/react":"^19","@biomejs/biome":"^2.4.12","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.5.0_1784974327473_0.9620576518339741","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alexjbarnes/cockpit","version":"0.6.0","keywords":["claude","claude-code","anthropic","ai","ai-agents","web-ui","self-hosted","openrouter","scheduled-jobs","pr-review","mcp"],"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","_id":"@alexjbarnes/cockpit@0.6.0","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"homepage":"https://github.com/alexjbarnes/cockpit#readme","bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"bin":{"cockpit":"bin/cockpit.js"},"dist":{"shasum":"c0e70c193e36d4ebc92485f79dad80c3959ecc63","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.6.0.tgz","fileCount":1220,"integrity":"sha512-3v8Vu7Pj2SiyW0Y5jANJi69SbcjKh/xv2iDeao4kVejoEKkOYqCZtD3v81wMIS8OBiyOWiY1K5HHzJPAhDAdqw==","signatures":[{"sig":"MEYCIQCHXOZLfa/mQoi3CslfsJlT0Hl7ijxLZKIKjK0uHAiudgIhAKDPpbHU9ZfPKHJUndPB5FzfVEnvcq2BqnDR6/40AAqm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29902419},"engines":{"node":">=20.0.0"},"gitHead":"54e4f9ef1931862fcb3f250cbfb0688465e44d02","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"overrides":{"postcss":"^8.5.12","@tensorflow/tfjs-node":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code: parallel sessions on any device, scheduled jobs, PR reviews, and any model provider","directories":{},"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"16.3.0","uuid":"^14.0.0","react":"19.2.8","shiki":"^4.0.2","magika":"^1.0.0","node-pty":"^1.2.0-beta.13","react-dom":"19.2.8","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.26.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.3.4","@pierre/theme":"^2.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.3.1","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"7.0.2","@types/node":"^26.0.1","@types/react":"^19","@biomejs/biome":"^2.5.5","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cockpit_0.6.0_1786654440608_0.18484152038883406","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@alexjbarnes/cockpit@0.7.0","bin":{"cockpit":"bin/cockpit.js"},"bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"dist":{"shasum":"47698fda7f0cb10236830d9d3fb3665db1beed3a","tarball":"https://registry.npmjs.org/@alexjbarnes/cockpit/-/cockpit-0.7.0.tgz","fileCount":1244,"integrity":"sha512-b1TmPhtzN26bUlnL/RngSwzmSkbiGYoW+fEOsxAY7CqXSI7VLv53DDyLfiwGzL2I11BNPOUy5EZSQZnkxbk9BQ==","signatures":[{"sig":"MEQCIDyE96ZjHxLKXVSSJKoD5Jh2YiDWQ1uBMaXncIbwqs4ZAiBhxw7F+D5N9jk/uURpnpyVgoJROhRLBpITNkLR1BX5IA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICi5ZqLdX0OVWHS8RaPENCE6dMDNM1aW9OETzGjvSPy4AiA61VN4SwgrMCP3AOHv9cyA5alAgBl/yxUe9AnNLjWGrg=="}],"unpackedSize":26869718},"name":"@alexjbarnes/cockpit","author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"engines":{"node":">=20.0.0"},"gitHead":"8767033494cc03bec71b9f21291f0ac4d57e72d6","license":"Apache-2.0","scripts":{"dev":"tsx watch --env-file=.env.development server.ts","lint":"biome check src/ tests/ server.ts","build":"unset TURBOPACK && next build --webpack && tsc -p tsconfig.server.json && tsc-alias -p tsconfig.server.json","start":"NODE_ENV=production node --env-file=.env.production dist/server.js","format":"biome format --write src/ tests/ server.ts","lint:fix":"biome check --fix src/ tests/ server.ts","prepublishOnly":"npm run build","test:integration":"playwright test --config=tests/integration/playwright.config.ts","pretest:integration":"npm run build"},"version":"0.7.0","_npmUser":{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"},"homepage":"https://github.com/alexjbarnes/cockpit#readme","keywords":["claude","claude-code","anthropic","ai","ai-agents","web-ui","self-hosted","openrouter","scheduled-jobs","pr-review","mcp"],"overrides":{"postcss":"^8.5.12"},"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"_npmVersion":"10.9.8","description":"Web UI for Claude Code: parallel sessions on any device, scheduled jobs, PR reviews, and any model provider","directories":{},"maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"_nodeVersion":"24.10.0","dependencies":{"ws":"^8","clsx":"^2","next":"16.3.0","uuid":"^14.0.0","react":"19.2.8","shiki":"^4.0.2","node-pty":"^1.2.0-beta.13","react-dom":"19.2.8","codemirror":"^6.0.2","remark-gfm":"^4","tailwindcss":"^4","@xterm/xterm":"^6.0.0","lucide-react":"^1.26.0","@dnd-kit/core":"^6.3.1","@pierre/diffs":"1.3.4","@pierre/theme":"^2.0.0","react-markdown":"^10.1.0","tailwind-merge":"^3.5.0","@xterm/addon-fit":"^0.11.0","rehype-highlight":"^7","@dnd-kit/sortable":"^10.0.0","@xterm/addon-webgl":"^0.19.0","@radix-ui/react-slot":"^1.3.1","@tailwindcss/postcss":"^4","@codemirror/lang-yaml":"^6.1.3","class-variance-authority":"^0.7","@codemirror/lang-markdown":"^6.5.0","@modelcontextprotocol/sdk":"^1.29.0","@codemirror/theme-one-dark":"^6.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^4.1.6","@types/ws":"^8","tsc-alias":"^1.8.10","typescript":"7.0.2","@types/node":"^26.0.1","@types/react":"^19","@biomejs/biome":"^2.5.5","@playwright/test":"^1.60.0","@types/react-dom":"^19","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cockpit_0.7.0_1790704378686_0.14173162595999855"}}},"time":{"created":"2026-04-29T18:14:48.836Z","modified":"2026-09-29T17:52:59.099Z","0.1.0":"2026-04-29T18:14:49.457Z","0.1.1":"2026-04-29T20:32:02.505Z","0.2.0":"2026-05-07T18:10:07.765Z","0.3.0":"2026-05-30T05:55:40.896Z","0.3.1":"2026-05-30T14:43:19.428Z","0.4.0":"2026-06-11T18:14:36.127Z","0.4.1":"2026-06-13T10:26:57.592Z","0.4.2":"2026-06-30T19:05:42.157Z","0.5.0":"2026-07-25T10:12:07.839Z","0.6.0":"2026-08-13T20:54:00.908Z","0.7.0":"2026-09-29T17:52:58.884Z"},"bugs":{"url":"https://github.com/alexjbarnes/cockpit/issues"},"author":{"url":"https://github.com/alexjbarnes","name":"Alex Barnes"},"license":"Apache-2.0","homepage":"https://github.com/alexjbarnes/cockpit#readme","keywords":["claude","claude-code","anthropic","ai","ai-agents","web-ui","self-hosted","openrouter","scheduled-jobs","pr-review","mcp"],"repository":{"url":"git+https://github.com/alexjbarnes/cockpit.git","type":"git"},"description":"Web UI for Claude Code: parallel sessions on any device, scheduled jobs, PR reviews, and any model provider","maintainers":[{"name":"alexjbarnes-alex","email":"alexb151@gmail.com"}],"readme":"<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"public/banner-dark.png\" />\n    <img src=\"public/banner-light.png\" width=\"480\" alt=\"Cockpit\" />\n  </picture>\n</p>\n\n<p align=\"center\">A web UI for Claude Code that frees it from your terminal.</p>\n\n## Why\n\nClaude Code is great. It's also a terminal app. One window, one machine, foreground only. Cockpit runs the same engine as a server: sessions live on the server, the browser is just a viewer, and closing your laptop kills nothing.\n\nThe shape is simple: **browser ↔ Cockpit server ↔ the real Claude Code CLI**. Not a reimplementation of the agent loop, the actual CLI, driven headless or through a pseudo-terminal.\n\nFour things follow:\n\n1. **Claude Code on your phone.** Reply from a train, a kitchen, anywhere a browser opens. The session you started at your desk is right there, still working.\n2. **Many sessions running at once.** Switch between projects without juggling tmux panes. Status beacons show which sessions are working, waiting, or idle, and the chat view stitches across `/clear` so long threads keep their full visual history.\n3. **Any model through the full agentic loop.** Tool use, file edits, and permission prompts work the same whether the model is Claude, something free off OpenRouter's catalog, or DeepSeek. Providers that only speak the OpenAI wire format run through a built-in translation proxy, thinking traces included.\n4. **Unattended agents on a schedule.** Not a cron wrapper: each job is a sandboxed run with its own model, its own tool and MCP allowlists, and a time budget, reporting back through an inbox or straight to your phone.\n\nInside a session: a tabbed, split-pane layout holding the chat, a diff viewer for code changes (split or inline), a file viewer with syntax highlighting, and an embedded terminal. Messages sent while Claude is working queue server-side and deliver when the turn ends, and `/btw` answers a quick side question in a separate tool-less Claude without disturbing the run. Plus global search across all sessions (Ctrl+Shift+F), searchable prompt history on the up arrow, and plan-mode approvals when Claude proposes a plan. The sidebar keeps sessions, active reviews, file changes, and file trees in collapsible sections.\n\n**Bring every provider under one roof.** One-key connect to OpenRouter, OpenCode Zen, and DeepSeek, or point Cockpit at any Anthropic-compatible endpoint of your own, each with its own credentials. Connect OpenRouter and its whole catalog is a click away, free models included, with live pricing and a FREE badge shown right in the picker. Curate the list down to the handful you actually use, then pick the model per session and per scheduled job, with 200K or 1M context and a thinking level. Each provider tracks its own spend or balance in the usage panel.\n\nEach session runs in **Stream** mode (headless JSON, the default) or **PTY** mode, which drives the interactive CLI inside a pseudo-terminal. PTY exists for a reason: subscription plans bill programmatic and interactive usage differently, and PTY keeps Cockpit sessions on the interactive side. Switch per session.\n\nIt also takes care of things you usually hand-edit: agents, skills, hooks, MCP servers, plugins, CLAUDE.md memory. All editable from the UI, or conversationally: the built-in Cockpit Assistant is a Claude session wired to Cockpit's own MCP server, so \"create a nightly job that...\" becomes a config change you approve or reject.\n\nPR reviews are a first-class flow. Pick an org, pick a repo, pick a PR. Cockpit reads the diff via the GitHub CLI and starts a Claude session scoped to it. Diff on one side, chat on the other. Active reviews pin to the sidebar alongside your sessions. Day-to-day git lives here too: review the working tree, generate a commit message, commit and push without leaving the browser.\n\n**Scheduled jobs** are where the server earns its keep. Give one a prompt and a schedule (a cron expression or a simple interval) and scope it tightly: its own model and thinking level, the exact tools and MCP servers it is allowed to touch, a run-time budget, how long to keep transcripts. It runs unattended, and each run renders as a normal session transcript you can open later. Results land in an inbox, with optional push to Telegram or ntfy.sh, so a nightly dependency bump or a morning PR-triage pass reaches your phone while you are away from the machine.\n\nRun it on your laptop the way you'd run the TUI. Or run it on a home server and reach it from your phone. Same UI either way.\n\n## Screenshots\n\n<p align=\"center\">\n  <a href=\"docs/screenshots/chat-view.png\"><img src=\"docs/screenshots/chat-view.png\" width=\"48%\" alt=\"Chat view with sessions sidebar\" /></a>\n  <a href=\"docs/screenshots/session-settings.png\"><img src=\"docs/screenshots/session-settings.png\" width=\"48%\" alt=\"Per-session settings popover\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"docs/screenshots/scheduled-jobs.png\"><img src=\"docs/screenshots/scheduled-jobs.png\" width=\"48%\" alt=\"Scheduled jobs page\" /></a>\n  <a href=\"docs/screenshots/pr-review.png\"><img src=\"docs/screenshots/pr-review.png\" width=\"48%\" alt=\"Pull request review with diff and chat\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"docs/screenshots/message-search.png\"><img src=\"docs/screenshots/message-search.png\" width=\"48%\" alt=\"Message search across the transcript\" /></a>\n  <a href=\"docs/screenshots/settings.png\"><img src=\"docs/screenshots/settings.png\" width=\"48%\" alt=\"Settings page\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"docs/screenshots/context-usage.png\"><img src=\"docs/screenshots/context-usage.png\" width=\"48%\" alt=\"Context window usage modal\" /></a>\n  <a href=\"docs/screenshots/account-usage.png\"><img src=\"docs/screenshots/account-usage.png\" width=\"48%\" alt=\"Account usage modal\" /></a>\n</p>\n\n## Quick start\n\n```sh\nnpx @alexjbarnes/cockpit\n```\n\nOr install globally:\n\n```sh\nnpm install -g @alexjbarnes/cockpit\ncockpit\n```\n\nThe startup log prints usable connection URLs (local and network). Open http://localhost:3001 and set a password on first run.\n\n## Prerequisites\n\n- Node.js >= 20\n- [Claude Code CLI](https://www.npmjs.com/package/@anthropic-ai/claude-code) installed and on PATH\n- An Anthropic API key configured for Claude Code\n- [GitHub CLI](https://cli.github.com/) (`gh`) authenticated, if you want PR reviews\n\nTested on Linux and macOS. Windows is unverified.\n\n## Configuration\n\n| Variable | Description | Default |\n|---|---|---|\n| `PORT` | Port the server listens on | `3001` |\n| `HOST` | Bind address | `0.0.0.0` |\n| `COCKPIT_RESET_PASSWORD` | Set to `true` to reset password on next startup | `false` |\n| `COCKPIT_CONFIG_DIR` | Cockpit config location (password, providers, defaults, jobs, inbox) | `~/.cockpit` |\n| `CLAUDE_CONFIG_DIR` | Claude config and transcripts Cockpit reads | `~/.claude` |\n| `COCKPIT_DEBUG` | Set to `1` to write a structured debug log | unset |\n\nSetting `COCKPIT_CONFIG_DIR` and `CLAUDE_CONFIG_DIR` together lets you run isolated instances side by side. See [Settings](docs/settings.md#environment-variables) for the full list.\n\n## Remote access\n\nCockpit binds to `0.0.0.0` by default. On the host machine, open `http://localhost:3001`. From other devices on the same LAN, use the host's local IP (the startup log prints usable URLs).\n\nTo reach Cockpit from outside your LAN, prefer [Tailscale](https://tailscale.com/) over port forwarding. Tailscale gives every device a private IP on a flat network without opening router ports or exposing the server publicly.\n\nTo restrict Cockpit to the host machine only, set `HOST=127.0.0.1`.\n\n## Documentation\n\n- [Sessions](docs/sessions.md): chat, runtime modes, tabbed layout, sidebar, attachments, plan mode, diffs, file view, prompt history, todos, search, session linking\n- [Model providers](docs/providers.md): built-in OpenRouter, OpenCode Zen, and DeepSeek gateways, custom Anthropic-compatible providers, the OpenAI translation proxy, context sizes, model slots, and per-provider usage\n- [Embedded terminal](docs/terminal.md): in-browser shell with themes and mobile support\n- [PR reviews](docs/pr-reviews.md): GitHub PR browsing and review sessions\n- [Scheduled jobs](docs/scheduled-jobs.md): cron-driven Claude Code runs\n- [Settings](docs/settings.md): auth, models, providers, themes, notifications, inbox, updates, agents, skills, hooks, MCP servers, CLAUDE.md\n\n## Development\n\n```sh\nnpm install\nnpm run dev\n```\n\nUnit tests run with `npx vitest run`. The [integration suite](docs/integration-tests.md) drives the real Claude Code CLI against a mock Anthropic API through Playwright, so runtime behaviour is proven rather than assumed. Issues and PRs welcome.\n\n## License\n\nApache 2.0\n","readmeFilename":"README.md"}