{"_id":"relay-tty","_rev":"27-779cad380a3ed67adfb766363df2afd2","name":"relay-tty","dist-tags":{"latest":"1.23.0"},"versions":{"1.0.0":{"name":"relay-tty","version":"1.0.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.0.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"e82486e2717649e2ffd879db2c9d22bc6beb29c6","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.0.0.tgz","fileCount":48,"integrity":"sha512-HIpnr67Ygmve1YqWERUKSI3iAco7kOvyqEnohZOtT48DqMfnV1jtJ9Il7ThXo0B/hHz7y9YCAKLClteQgoajuA==","signatures":[{"sig":"MEUCIDjW9PldJCW5bNfFUl8RBOzxJ4ev2QhHNX9T8EUWoxReAiEA/6VHhwKykfIl3re+2L7JrwLsdrOWGBKiWouIU6Tz804=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806923},"type":"module","engines":{"node":">=18"},"gitHead":"103272b7bc3b958fb5e38bad03eb2da3e3309d2b","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","react-router":"^7.12.0","@react-router/node":"^7.12.0","@react-router/express":"^7.12.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"^5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"^0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@xterm/addon-web-links":"^0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.0.0_1772137584550_0.16006584214653197","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"relay-tty","version":"1.0.1","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.0.1","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"2049c37311e8fa3d8f4e8c7268d97cbcd0ecffe6","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.0.1.tgz","fileCount":48,"integrity":"sha512-SFt1+mgJ+JcUmiHnyw+a1g/H/as8u+vMEjQrEdzcZdHu4XD3XBaRRZ4GsWP6ANBdE1R/DYh18zLvQptplXjymg==","signatures":[{"sig":"MEUCIDclNlZu4MvPpANLO7nov2RD7DI/ta2Y0IXSR73ngbzPAiEAjMWJC7imC6wKWImAn9SzOmL/PZjqhEIITjJD2AjJCQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":807080},"type":"module","engines":{"node":">=18"},"gitHead":"103272b7bc3b958fb5e38bad03eb2da3e3309d2b","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","react-router":"^7.12.0","@react-router/node":"^7.12.0","@react-router/express":"^7.12.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"^5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"^0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@xterm/addon-web-links":"^0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.0.1_1772137800385_0.16866894650939734","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"relay-tty","version":"1.0.2","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.0.2","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"5b8087cc8c350f7d357da0bd5e574460ba9b68b8","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.0.2.tgz","fileCount":48,"integrity":"sha512-Hg/g9kvxa3ff1Ul4i4TrdxwvxzUdmaksrKA0+X//W2crP5kKnRXKSXIL1CP72NwkV416NLX3rxAZ38u3rtBdLw==","signatures":[{"sig":"MEQCIADflNvWhq4eLJUR1EUvqDOOiJHAi+jRn//wIt4OfQgSAiBYxLFqdfjzfwcWLsk+HbNcIjEVfIa8frirAlPOohhp2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":815306},"type":"module","engines":{"node":">=18"},"gitHead":"8f085bc10f9fabf2a47d1ac18e6696ca13dd8a55","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","react-router":"^7.12.0","@react-router/node":"^7.12.0","@react-router/express":"^7.12.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"^5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"^0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@xterm/addon-web-links":"^0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.0.2_1772147372647_0.42644813026488615","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"relay-tty","version":"1.1.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.1.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"d77cc8b001482db54f2d7a7cc168730e977cf3bc","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.1.0.tgz","fileCount":57,"integrity":"sha512-llS8xoH5aaZluIAuf/ZALvIYw9ffyGm/e9E8hVFFCE/62UV1F5bi1A3Z5Yv8G+DaO3dAhjVCnYpuVyHHdmXfIA==","signatures":[{"sig":"MEUCIQDHL6SyUL1upOl/WSbGycK+7MTp6ccTx9npq4DoP/dKZAIgeqDodTm8+r4Fjlyt9Rp4PYp6ZwgIvSIZjQSa94/LPfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":984168},"type":"module","engines":{"node":">=18"},"gitHead":"34675bad4c154747abf4fae18e87d1c9433dee84","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.1.0_1772184156637_0.29904301445071924","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"relay-tty","version":"1.3.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.3.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"305075f577870f7b4722e14e3efb7a01e6e30e52","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.3.0.tgz","fileCount":61,"integrity":"sha512-dngRYWRqMV9wYhj4ViBwuGjR4K6jku1wsP+VTkvspvJJjpYJLxAPuVzsC1e4BRJtUCKpx04h/YIRWh7xb8ET7g==","signatures":[{"sig":"MEUCIQCYMQNlcNt40HeWlAF2RemCFmu2kJFePsm8IznMaEGDCAIgbPeQW1M8jo+UG5iKBSDZosZzw1nyJe+TfvUfUY3qfCg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1029157},"type":"module","engines":{"node":">=18"},"gitHead":"b0990de7e8b58deb027ceeb3314041e16687f9eb","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.3.0_1772225574224_0.8124241484058339","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"relay-tty","version":"1.4.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.4.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"f02e21a2328b9d0281503362695981342b3f78f3","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.4.0.tgz","fileCount":65,"integrity":"sha512-8As81DjzF5y3H5z48CP4/jLDzBAVT3XJl44XlcEw+lznPziTpDHe5iBcjq1WRaxn5qi67yuwddN/k6Q7hYEw7g==","signatures":[{"sig":"MEQCIEdLBieOXKEbGSM1nLgVTq116kRMTC3PFkwTVLc1avszAiA20qJvUmDAe2Nw3LBkv49HwMsX7cbXnrDWYYIBGQhIdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1062428},"type":"module","engines":{"node":">=18"},"gitHead":"a704b4eeddf5ecfc1e1050e1f2a5278ac6e9259d","scripts":{"dev":"tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.4.0_1772232729131_0.862302192610763","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"relay-tty","version":"1.5.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.5.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"2b4521fb26eb47a3e88b9cfe64043319644ef1aa","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.5.0.tgz","fileCount":74,"integrity":"sha512-/zOVxaOk3Vgox3I2NfUNFrkkbKhUl8vLoRnM6ZB5uacm8WJtLIpoZvXjx4yf86IZzKr5VAXtoJFZVE2eLFqHPw==","signatures":[{"sig":"MEUCIQDddgSBrqXAc3qRN5yoUPShJEZTfkx7QgPfgfErJT3AswIgBsIwFQiy1HXvA87IOh2JLvi+u5dRhLMDV0qpTkaJqF0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1215041},"type":"module","engines":{"node":">=18"},"gitHead":"6de64d59b90ea8a57e3d7b09766c6f45f59cda37","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; node scripts/postinstall.js || true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.5.0_1772462142116_0.6372789575103706","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"relay-tty","version":"1.6.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.6.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"d4d0d8eec7d2dba63e67280e272bebd06b1115f5","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.6.0.tgz","fileCount":79,"integrity":"sha512-rKKnuynQBCuds5jxpZJHAFnF/34SuuW+suhc4TNRN9lo40hY2Uggzcp8pWLI5/ObepCJocJkJ9xomGqPgX9kDA==","signatures":[{"sig":"MEYCIQCV3S7sMMnXUAZVdAC9ZTCHLBXdKDjAcICqYrFeFhmeEQIhALkDYzQ6TKbmMHdrZPRdrjZrDaJOGrat7CCC8rpn+8d9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1312865},"type":"module","engines":{"node":">=18"},"gitHead":"1a5977095293f8b6a1ea8394ed186d10eb094874","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; node scripts/postinstall.js || true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.6.0_1772507459811_0.9492892812987286","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"relay-tty","version":"1.7.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.7.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"6b5ff1e28547a606804726de4aec1d5f58f6969d","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.7.0.tgz","fileCount":83,"integrity":"sha512-Vj0BhtJnkBcrxhuDvmQoAF5MCv6iUVV5GfdRqDYN/y9hbp1X5nyCs54x4PwmEgTxeNAGcHJY89x058N/XZUyXA==","signatures":[{"sig":"MEUCID5YTTFuAg7yi/UrpmgQUAF78ukMEFGMIl38sbGR8a1YAiEA57KqV6A7HLpsmhfpSy0K5OLiE9KIH2MPi4MA7GnISCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1387328},"type":"module","engines":{"node":">=18"},"gitHead":"b943485d5ef13b029ae617bb02f7fe599a7414f6","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null; node scripts/postinstall.js || true"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","node-pty":"^1.0.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.7.0_1772655099812_0.30111552054503243","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"relay-tty","version":"1.8.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.8.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"f14dc2d32b0f8f9d008489296e4c12894c8f5ace","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.8.0.tgz","fileCount":79,"integrity":"sha512-pIDJ5ASb1HlF7f4TGOyTpKVfKH4qkuD7Oadi7P1z5wA3s0Lyuv511wwPkOnRameYBGFTLJ4KaAZh4ExqEq/Z6g==","signatures":[{"sig":"MEYCIQDMAxDW0n17wfEThnbOxfJjqQn9Hvjmxa3ISbyLBrIJWwIhAJPvO1tEUETykkr8ac2C7Q0/4TKmA5uO1oOwOkUZQpyZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1478038},"type":"module","engines":{"node":">=18"},"gitHead":"35323933e44b7ad616f58c224ce924d6f3575b09","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.8.0_1772749243928_0.3146789079229826","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"relay-tty","version":"1.9.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.9.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"bc3e698d7e0a795d3dd9e0aa3e98818285fd9b91","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.9.0.tgz","fileCount":83,"integrity":"sha512-ahfrBZzbT8ulYJo5aOfwldX5tNdT+1it0NUgWyio7gLrmdGqEr727VrWLpnIO82UcHvLJesoEQH3ehGDjaQzaA==","signatures":[{"sig":"MEQCIHX4+Zq7FzRw8LQB4SJrOhBXS7en79NeTl4CMGa/gKm5AiAA54PSmFiAE0BXmIob8w83dO4gC82lgDxUwTdbTOSeqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1563139},"type":"module","engines":{"node":">=18"},"gitHead":"d276c72a970b3f3ec1fd2a2e0bf0ba80dc02d749","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.2","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.7.0","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.9.0_1772983560242_0.629533522846123","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"relay-tty","version":"1.10.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.10.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"1746d1a7ae133433ec6ca062fc1523e9a3e10851","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.10.0.tgz","fileCount":84,"integrity":"sha512-jMx0FOVHeg29SmTacPwM78gLUynQMYaHRF05QmRwnWYgeSx0UYQXPrHonrKpBcWW5oxr+MHL5aRs0n8yBCQ8Rw==","signatures":[{"sig":"MEUCIQCO/HgDP1MNLKEopg06Eg/V1eq4xZaePgaSFwX0ABJ6AwIgeo/I6UXj8071iFyOkZENAxZYRmJaC1IlKw2xQ2QlUzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1621591},"type":"module","engines":{"node":">=18"},"gitHead":"fb6d33272ca8e464c4d8a715909ac6dc596991c8","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","morgan":"^1.10.0","express":"^5.1.0","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.10.0_1773160366255_0.3111504993759253","host":"s3://npm-registry-packages-npm-production"}},"1.11.1":{"name":"relay-tty","version":"1.11.1","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.11.1","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"5e84221e0ef69597b554c450aae656094d747724","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.11.1.tgz","fileCount":113,"integrity":"sha512-bxrXM6s8LIsZAxNHBNpLkK1HAr3351NJoI/xgHBtd8WUGtZoBZrhOQ0sKpRKXVm6hdEnLK48M1diapWVcjx2wQ==","signatures":[{"sig":"MEUCIBLEGDag3vIxIYETZT0xuSilWNXOiF3Um66/L41tCBYKAiEAj3QkatpW2AgttfOKozXItszmmmhMQq+g+ozXt61M9Fs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2755984},"type":"module","engines":{"node":">=18"},"gitHead":"727b4c72252c309ea23f4acae79d2397506abedf","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.11.1_1773362070394_0.6930389306766511","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"relay-tty","version":"1.12.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.12.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"bdb70bcd827f02affe2f0d2e8a61da629b794333","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.12.0.tgz","fileCount":121,"integrity":"sha512-kSQlSzeu8TLPEVo9ghlsdgOhd5XY2p1xsP4xOw5PWms6ZofhxHsFMpb5rllG1cIJJ0bRt9Bu/sE6B8WBPFDW3A==","signatures":[{"sig":"MEQCIBfhHvMG8IkLw32KcYCuhgmQyZQSQhulnLQEQ+q5p10NAiAiC7MfQPjSI+MdfFNSUCTpmLp2zKr0RQzyvBEzRfiztA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2790838},"type":"module","engines":{"node":">=18"},"gitHead":"37be1c2ba3194f3c6efcff2e5e3919b984bb1c49","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.12.0_1773446995236_0.1855148480378357","host":"s3://npm-registry-packages-npm-production"}},"1.13.1":{"name":"relay-tty","version":"1.13.1","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.13.1","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"9bdf534634d12867dde674474baa939571123e0d","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.13.1.tgz","fileCount":122,"integrity":"sha512-k1Nk+gy7E2hMluGDjhbh4rLRZS0az07zLYF6zjPB7VBGY2oy9aFV+jixYNrs1c27pwTnimzTY5AwvoGZ+6+qfw==","signatures":[{"sig":"MEQCIADJCg/VRocagEI9jkOUIj7rQSmcmUHk+3rrWoFrUMBzAiAZL7B1Ok1qyurhNWtZquQ+rwbHvGnMu6j81alQkzrVmw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2783822},"type":"module","engines":{"node":">=18"},"gitHead":"52eac7a2e18607a2cbba66cfe25d674d36c357b0","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.13.1_1773460449710_0.0346992763875571","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"relay-tty","version":"1.14.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.14.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"983787c9f4de365fc86e8d4dc66838a4c9872bf5","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.14.0.tgz","fileCount":122,"integrity":"sha512-c4wbq2qkgx1Ka39UFtvBMUlL+tADBv8zY5yLmkqcZHwRevF6Xd6hJKDvr4g07nJZWi0v88qxK59NXBnDaqiZyw==","signatures":[{"sig":"MEUCIQDG8M8eKdD6j65XxvioOHbcGILsQnCBxual+CpBjZ6TRwIgA2uygZwKd6d960Us9H9tPfOiHHhFojXw1LS19fRa7R4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2811516},"type":"module","engines":{"node":">=18"},"gitHead":"b4b7f4052b22fe6c70817bc33719def146147d08","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.14.0_1773692890355_0.31577398700827497","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"relay-tty","version":"1.15.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.15.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"93ca5fb4a57b9c553499bad5f33e926410058f71","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.15.0.tgz","fileCount":129,"integrity":"sha512-xeMhNpjHByarq+jDfnPpMrnfbpMBhneEz+/czMdX03lDLESw94Z5SQvSHJaGDBLKD3ayUw++aOGQ/CZFDyKPXQ==","signatures":[{"sig":"MEUCIGda3N/hmpDtca712ZgvKKP59Pi0SjkqK4yjGVh1VTgqAiEAyJ+3phvnN4XGgWGMQZssBRSo7zKM5CkMthEkmgwfmKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2922226},"type":"module","engines":{"node":">=18"},"gitHead":"f7dd4b8b0abb00f7744c9f384e22c6b0af5f4eaa","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.15.0_1774191039059_0.38414219029862373","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"relay-tty","version":"1.16.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.16.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"4da58f2e63691343f01ccf46729c1c62e6cae4ec","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.16.0.tgz","fileCount":149,"integrity":"sha512-UTt41xNrLoqe6BqaBSVXGppQbrE1xOV9/YHmsZvBLn8MzbUQGCCZvU1Qln/TmnAo9GEKtt22eI9RGQUVrSAKnA==","signatures":[{"sig":"MEQCIApsd38Q8PIwAZgS366SSxo2F7jnJOFnlWBuPc5k6ebWAiB5NpQZnXPCaZzyElm2ktsuyrmWkKiarLLzSUJVde39SQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5124232},"type":"module","engines":{"node":">=18"},"gitHead":"b9e0cf6c439e113cc18096e8b89ed996e81b61e8","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.16.0_1774646530154_0.6811499523284434","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"relay-tty","version":"1.17.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.17.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"fdf992e35a292e6ae66839145bfb8562714c5857","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.17.0.tgz","fileCount":139,"integrity":"sha512-5ajZisZGo4scB+LSq1eAYxEq58RYOjX53lXCBVcc3i8QaasyGXE2/T2En6E+r4ByaLq9lIcTVh3CKxT9iGEPxA==","signatures":[{"sig":"MEQCIAp8GlwikF29D/j5hsH106zQ6ObPnIzWtTFBtUj2dkeAAiBL2rw/i3EPVdvIQYqu4c2bhA4UaCCAeEXYR1x+jt/VEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3023861},"type":"module","engines":{"node":">=18"},"gitHead":"b23937d0052e474d47fa169ad65c550f78efd62f","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.4","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.17.0_1775062484497_0.5725911392680041","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"relay-tty","version":"1.18.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.18.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"506d0e349f9b644dfcd4f27013cc01a9da67c3af","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.18.0.tgz","fileCount":139,"integrity":"sha512-JgMw7lhezUpqfDTNQe3jogvPm7SHrtMLOPFQwtAP3H5cEs8uxmiidLBEM4Yp7aWftrbTelB89ffGSx2fwDsmFg==","signatures":[{"sig":"MEUCIHQEuClPCiGcyCPoK4gtP1R9tz0GTEH2ifJr0fpQZjArAiEAlsZdMvTUy4O2jaPjI3DEEySSVi1/oIF4Wggb4u+zWzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3040140},"type":"module","engines":{"node":">=18"},"gitHead":"e596ba973ac388e421ca7c2a8e618bd97be46d2d","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.7","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.18.0_1775521655856_0.4335144760459886","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"relay-tty","version":"1.19.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.19.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"abcac56470632102c7d16083e3803abb35ea5c7f","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.19.0.tgz","fileCount":143,"integrity":"sha512-bo9UAVRd/lussaPo1FpSEnGW6PqQuKCafiUg+sNT2B14041F1LY9tXFMF10rIPJT1p350j94kOjY7nHCFHSOPA==","signatures":[{"sig":"MEUCIA7SYl19wZRAXGHonVt85hS14azPV3usACECLpxfULm1AiEAukubUW8RLaTO8jimrYgCaV9qxSx/+Kq/ditfaQiBBg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3167405},"type":"module","engines":{"node":">=18"},"gitHead":"328c3cbc9e06b498a0a4a0081ee0a00c7e368ed6","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"10.9.7","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.19.0_1776782586844_0.27127139432452463","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"relay-tty","version":"1.20.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.20.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"3f9b51a6df403a7b9a8f6e472df906a70353a3eb","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.20.0.tgz","fileCount":177,"integrity":"sha512-Amp5RrDTwQx2/R7dwshgsYyst4OSYhgQatOlBvgLrbVFGIuQ0y1iBGW9Ikd7EFwfKxasoEwsYDU2n36pLBOD4Q==","signatures":[{"sig":"MEUCIQDQ5dvyGbTmQVhUE2Yr6KCbZcycnXQex0wCVT8qod+gegIgJWFEp++yFhVdhFeMXAxybirc8bbpbSKqQhmB4cjz+zs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9603662},"type":"module","engines":{"node":">=18"},"gitHead":"6ffbf1140ffc64046fa4e1d0e1d307e41ed29315","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.20.0_1782325776722_0.5137196262113248","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"relay-tty","version":"1.21.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.21.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"1e8f596832a69da94e6c81ebefc97a24ab618af2","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.21.0.tgz","fileCount":180,"integrity":"sha512-WJNTaTqk84oRb1IXlM4XplIxPde/DTo6XIeULYXalMBXjbI/74kDgQdjsaepFrLQZrgwrBO8uR9fU6+oYvCsQA==","signatures":[{"sig":"MEYCIQCVwxI5mlPL6SPi/lXEsAL6BSlKaTH1YagLl3oGD5d9XgIhALzIBil4RtlSUfoOvS29OHdyEAzDXnuGNciVo7Sn95vm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9641784},"type":"module","engines":{"node":">=18"},"gitHead":"8b31585a880e48915a3e2f5414c9705b7439c06d","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"ddrscott","email":"ddrscott@gmail.com"},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.11.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"22.13.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.21.0_1785425729432_0.20289800256303625","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"relay-tty","version":"1.22.0","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"license":"MIT","_id":"relay-tty@1.22.0","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"homepage":"https://github.com/ddrscott/relay-tty","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"dist":{"shasum":"69d9282c850f982f649d41c319677bdad0dda15e","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.22.0.tgz","fileCount":196,"integrity":"sha512-EHe5RekwQ5LWINWNo//1ueos4bfgumok345OhS2JcX2uY09mHSucyWlZAWZb8kr9n5AIZlGBfqApdBsR51fYDg==","signatures":[{"sig":"MEUCICCA+CM0/+XUSnJVuFaN+vn0gse2JPrC+Rz5+Vj6qMg7AiEA5V5y5BVBGfAXE/hmmk6kYlRb5Y3ZbUCB8ZClqCjovCg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/relay-tty@1.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":8026182},"type":"module","engines":{"node":">=18"},"gitHead":"77d16f782f55f0d6ae91e64288715a817e092800","scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","test":"tsc -p tsconfig.node.json && node --test dist/test/*.test.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","check":"./scripts/check.sh","start":"NODE_ENV=production node server.js","prepack":"npm run build","docs:dev":"cd docs && npm run dev","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","docs:build":"cd docs && npm run build","postinstall":"node scripts/postinstall.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","docs:screenshots":"./scripts/screenshots/run.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4b6b8453-2871-47c1-837a-ea570b8d58d8"}},"repository":{"url":"git+https://github.com/ddrscott/relay-tty.git","type":"git"},"_npmVersion":"11.19.1","description":"Terminal relay — run commands locally, access them from anywhere via browser","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ws":"^8.18.0","isbot":"^5.1.0","react":"^19.0.0","cookie":"^1.0.0","marked":"^17.0.4","morgan":"^1.10.0","qrcode":"^1.5.4","express":"^5.1.0","web-push":"^3.6.7","commander":"^13.1.0","react-dom":"^19.0.0","compression":"^1.8.0","@novnc/novnc":"^1.7.0","lucide-react":"^0.575.0","react-router":"^7.12.0","@xterm/headless":"5.5.0","qrcode-terminal":"^0.12.0","@codemirror/view":"^6.39.17","@codemirror/state":"^6.5.4","@react-router/node":"^7.12.0","@xterm/addon-webgl":"0.18.0","@xterm/addon-search":"^0.15.0","@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/language":"^6.12.2","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-json":"^6.0.2","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-yaml":"^6.1.2","@react-router/express":"^7.12.0","@xterm/addon-unicode11":"^0.8.0","@codemirror/lang-python":"^6.2.1","@tailwindcss/typography":"^0.5.19","@codemirror/lang-markdown":"^6.5.0","@codemirror/theme-one-dark":"^6.1.3","@codemirror/lang-javascript":"^6.2.5"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","daisyui":"^5.0.0","@types/ws":"^8.5.0","typescript":"^5.9.3","@types/node":"^22.0.0","tailwindcss":"^4.1.0","@types/react":"^19.0.0","@xterm/xterm":"5.5.0","@types/cookie":"^0.6.0","@types/morgan":"^1.9.0","@types/qrcode":"^1.5.6","@types/express":"^5.0.0","@types/web-push":"^3.6.4","@types/react-dom":"^19.0.0","@xterm/addon-fit":"0.10.0","@react-router/dev":"^7.12.0","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","vite-tsconfig-paths":"^4.3.0","@types/qrcode-terminal":"^0.12.2","@xterm/addon-web-links":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/relay-tty_1.22.0_1789091676507_0.9275418745657629","host":"s3://npm-registry-packages-npm-production"}},"1.23.0":{"name":"relay-tty","version":"1.23.0","description":"Terminal relay — run commands locally, access them from anywhere via browser","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/ddrscott/relay-tty.git"},"homepage":"https://github.com/ddrscott/relay-tty","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"engines":{"node":">=18"},"bin":{"relay":"dist/cli/index.js","relay-tty":"dist/cli/index.js"},"scripts":{"dev":"npm run build:rust; tsc -p tsconfig.node.json && node server.js","build":"npm run build:rust; react-router build && tsc -p tsconfig.node.json","start":"NODE_ENV=production node server.js","start:tunnel":"npm run build && node dist/cli/index.js server start --tunnel","build:cli":"tsc -p tsconfig.node.json","build:rust":"command -v cargo >/dev/null 2>&1 && cargo build --release --manifest-path crates/pty-host/Cargo.toml || true","prepack":"npm run build","test":"tsc -p tsconfig.node.json && node --test ${TEST_REPORTER:+--test-reporter=$TEST_REPORTER} dist/test/*.test.js","check":"./scripts/check.sh","postinstall":"node scripts/postinstall.js","docs:dev":"cd docs && npm run dev","docs:build":"cd docs && npm run build","docs:screenshots":"./scripts/screenshots/run.sh"},"dependencies":{"@codemirror/commands":"^6.10.2","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-css":"^6.3.1","@codemirror/lang-html":"^6.4.11","@codemirror/lang-java":"^6.0.2","@codemirror/lang-javascript":"^6.2.5","@codemirror/lang-json":"^6.0.2","@codemirror/lang-markdown":"^6.5.0","@codemirror/lang-python":"^6.2.1","@codemirror/lang-rust":"^6.0.2","@codemirror/lang-sql":"^6.10.0","@codemirror/lang-xml":"^6.1.0","@codemirror/lang-yaml":"^6.1.2","@codemirror/language":"^6.12.2","@codemirror/state":"^6.5.4","@codemirror/theme-one-dark":"^6.1.3","@codemirror/view":"^6.39.17","@novnc/novnc":"^1.7.0","@react-router/express":"^7.18.3","@react-router/node":"^7.18.3","@tailwindcss/typography":"^0.5.19","@xterm/addon-search":"^0.15.0","@xterm/addon-unicode11":"^0.8.0","@xterm/addon-webgl":"0.18.0","@xterm/headless":"5.5.0","commander":"^13.1.0","compression":"^1.8.0","cookie":"^2.0.1","express":"^5.1.0","isbot":"^5.1.0","lucide-react":"^0.575.0","marked":"^18.0.12","morgan":"^1.10.0","qrcode":"^1.5.4","qrcode-terminal":"^0.12.0","react":"^19.0.0","react-dom":"^19.0.0","react-router":"^7.18.3","web-push":"^3.6.7","ws":"^8.18.0"},"devDependencies":{"@react-router/dev":"^7.18.3","@tailwindcss/vite":"^4.1.0","@types/compression":"^1.7.0","@types/cookie":"^0.6.0","@types/express":"^5.0.0","@types/morgan":"^1.9.0","@types/node":"^22.0.0","@types/qrcode":"^1.5.6","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@types/web-push":"^3.6.4","@types/ws":"^8.5.0","@xterm/addon-fit":"0.10.0","@xterm/addon-web-links":"0.11.0","@xterm/xterm":"5.5.0","daisyui":"^5.0.0","tailwindcss":"^4.1.0","typescript":"^5.9.3","vite":"^6.0.0","vite-tsconfig-paths":"^6.1.1"},"gitHead":"50804a8ae2c47b2df6db92c02dcacc9143653afe","_id":"relay-tty@1.23.0","bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"_nodeVersion":"24.20.0","_npmVersion":"11.19.1","dist":{"integrity":"sha512-pJaAnLqQ0JcyTVkD1o7p98opTfTi/Tdfr+JQKBkA3O8EAUjfK8ar2gX9eBuugiacxRtWTFvF16gRElJTcQr6wQ==","shasum":"198009a10c842044e2744655efb1278983f7eed4","tarball":"https://registry.npmjs.org/relay-tty/-/relay-tty-1.23.0.tgz","fileCount":198,"unpackedSize":8114191,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/relay-tty@1.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBhe9DrAQ06nz0CXDS/vwpozfKY30QxRWCNJ10stm/hrAiEAwsbmR6mgkYUjeLDyKPU5iQDRO1L+PlZIxoVeanKm4TU="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4b6b8453-2871-47c1-837a-ea570b8d58d8"}},"directories":{},"maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/relay-tty_1.23.0_1789488901061_0.2833797601335053"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-26T20:26:24.549Z","modified":"2026-09-15T16:15:01.672Z","1.0.0":"2026-02-26T20:26:24.747Z","1.0.1":"2026-02-26T20:30:00.652Z","1.0.2":"2026-02-26T23:09:32.877Z","1.1.0":"2026-02-27T09:22:36.873Z","1.3.0":"2026-02-27T20:52:54.465Z","1.4.0":"2026-02-27T22:52:09.339Z","1.5.0":"2026-03-02T14:35:42.321Z","1.6.0":"2026-03-03T03:11:00.019Z","1.7.0":"2026-03-04T20:11:40.067Z","1.8.0":"2026-03-05T22:20:44.106Z","1.9.0":"2026-03-08T15:26:00.412Z","1.10.0":"2026-03-10T16:32:46.416Z","1.11.1":"2026-03-13T00:34:30.609Z","1.12.0":"2026-03-14T00:09:55.492Z","1.13.0":"2026-03-14T03:30:48.486Z","1.13.1":"2026-03-14T03:54:09.888Z","1.14.0":"2026-03-16T20:28:10.525Z","1.15.0":"2026-03-22T14:50:39.211Z","1.16.0":"2026-03-27T21:22:10.450Z","1.17.0":"2026-04-01T16:54:44.665Z","1.18.0":"2026-04-07T00:27:36.144Z","1.19.0":"2026-04-21T14:43:07.061Z","1.20.0":"2026-06-24T18:29:37.005Z","1.21.0":"2026-07-30T15:35:29.727Z","1.22.0":"2026-09-11T01:54:36.787Z","1.23.0":"2026-09-15T16:15:01.379Z"},"bugs":{"url":"https://github.com/ddrscott/relay-tty/issues"},"license":"MIT","homepage":"https://github.com/ddrscott/relay-tty","keywords":["terminal","tty","pty","relay","xterm","websocket","remote-terminal"],"repository":{"type":"git","url":"git+https://github.com/ddrscott/relay-tty.git"},"description":"Terminal relay — run commands locally, access them from anywhere via browser","maintainers":[{"name":"ddrscott","email":"ddrscott@gmail.com"}],"readme":"# relay-tty\n\n**Check on your AI coding agents from your phone.** Run Claude Code, Codex, Aider, Goose, or any terminal command on your computer — watch it live from any browser, anywhere, over a single URL. No SSH, no tmux, no port forwarding, no accounts.\n\n```bash\nnpm i -g relay-tty\nrelay server start --tunnel   # prints a QR code + https://<slug>.relaytty.com\nrelay claude                  # now running on your Mac, viewable from your phone\n```\n\nThat's the whole setup. Scan the QR code with your phone, bookmark the URL, and you can peek at your terminal sessions from a tennis tournament, the airport, or the couch.\n\n---\n\n## Why people install this\n\n### 1. You run parallel AI agents and they keep blocking on prompts\n\nYou kicked off a Claude Code session an hour ago. It hit a permission prompt 40 minutes in. You're in a meeting. That's 20 minutes of burned time where the agent was just... waiting. Now multiply that by the 5-20 agent sessions a modern AI-native developer runs in parallel across tmux panes, worktrees, or separate machines.\n\nrelay-tty turns every one of those sessions into a URL you can glance at from your phone. See which one is blocked. Type `y` from your phone. Get back to your life.\n\n### 2. Your computer works while you're away — it needs monitoring\n\nAutonomous agents don't finish on your schedule. A long-running refactor, an overnight test suite, an ML training run — you want to know it's still alive without getting up. relay-tty gives you a bookmarkable dashboard on your phone showing exactly what's on your screen, in real time.\n\n### 3. You want to share a live terminal session with a link\n\nPair debugging, live demos, showing a teammate the wild thing your agent just did, or proving to someone on Twitter that yes, this really works. `relay share <session-id>` gives you a read-only URL with a TTL. Viewers see your terminal live in their browser — no login, no setup on their end.\n\n---\n\n## What it is\n\nrelay-tty is a **terminal relay**: a small local server that hosts terminal sessions and exposes them over WebSocket to browsers. It's three things in one binary:\n\n- **A session host** — each `relay <command>` runs in its own detached `pty-host` process. Sessions survive server restarts, browser disconnects, and laptop sleep. Multiple viewers can watch (or type into) the same session simultaneously.\n- **A web UI** — xterm.js in your browser, rendered as a PWA on mobile. Touch-scroll works properly. Mobile keyboards behave. The UI is designed for checking on agents, not writing code on a phone.\n- **A zero-config tunnel** — `--tunnel` opens an outbound WebSocket to `relaytty.com`, which reverse-proxies your session at `https://<slug>.relaytty.com`. Same slug every time you restart. No accounts, no DNS, no config.\n\n```\n                      ┌────────────────────┐\n                      │   📱 Mobile Phone  │\n                      │    (any browser)   │\n                      └──┬──────┬───────┬──┘\n                         │      │       │\n            ┌────────────┘      │       └────────────┐\n            │                   │                    │\n   ┌────────▼─────────┐ ┌───────▼────────┐ ┌─────────▼────────┐\n   │   Machine A      │ │   Machine B    │ │   Machine C      │\n   │ $ relay claude   │ │ $ relay codex  │ │ $ relay train.py │\n   │  (AI coding)     │ │  (AI coding)   │ │  (ML pipeline)   │\n   └──────────────────┘ └────────────────┘ └──────────────────┘\n    abc1.relaytty.com    efg2.relaytty.com   hij3.relaytty.com\n```\n\n---\n\n## Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/ddrscott/relay-tty/main/install.sh | bash\n```\n\nOr if you already have Node.js (≥ 18):\n\n```bash\nnpm i -g relay-tty\n```\n\nWorks on macOS (Apple Silicon and Intel) and Linux (x86_64, ARM64). On Windows, use [WSL](https://learn.microsoft.com/en-us/windows/wsl/install).\n\n---\n\n## Quick start for AI agents\n\n### Claude Code\n\n```bash\nrelay server start --tunnel       # once, to get your persistent URL\nrelay claude --dangerously-skip-permissions\n# now viewable from your phone at https://<slug>.relaytty.com\n```\n\nRun it once per project in separate terminals and each session gets its own URL on your dashboard. If Claude hits an approval it can't skip, type `y` from your phone and it keeps going.\n\n### OpenAI Codex CLI\n\n```bash\nrelay codex\n```\n\n### Aider\n\n```bash\nrelay aider --model sonnet\n```\n\n### Goose\n\n```bash\nrelay goose session\n```\n\n### Cursor Agent CLI / Opencode / any other TUI\n\n```bash\nrelay opencode\nrelay cursor-agent\nrelay <your-cli-here>\n```\n\nAnything that runs in a terminal works. relay-tty doesn't care — it just hosts the PTY.\n\n### Run 20 at once\n\nA common pattern with parallel agents:\n\n```bash\n# in iTerm / tmux / your terminal of choice, across multiple repos:\ncd project-a && relay --detach claude \"add rate limiting\"\ncd project-b && relay --detach claude \"migrate to postgres\"\ncd project-c && relay --detach claude \"write tests for auth\"\n# ...\n\nrelay list     # see all of them\n```\n\nEach session shows up on your phone's dashboard. Tap the one that's red (blocked) and unblock it. Put your phone away.\n\n---\n\n## Share a session\n\nGive someone a read-only link — no login, no setup on their end.\n\n```bash\nrelay share <session-id>\n# https://abc123.relaytty.com/s/eyJ...\n# Read-only link (expires in 60m)\n```\n\nURL goes to stdout, metadata to stderr (POSIX). Default TTL is 1 hour; max is 24 hours (`--ttl 86400`). Viewers see the terminal stream live but can't type.\n\nUseful for:\n- Pair debugging without screen-sharing\n- Showing a coworker a one-off agent run\n- Demoing in a Slack thread\n- Live-tweeting a long build\n\n---\n\n## Public access with `--tunnel`\n\n`--tunnel` exposes your server at `https://<slug>.relaytty.com` with zero config. On first run, it provisions a stable subdomain and saves it to `~/.config/relay-tty/tunnel.json`. Same URL every time after that.\n\n```bash\nrelay server start --tunnel\n# Tunnel active: https://abc123.relaytty.com\n# [QR code]\n```\n\nThe tunnel is outbound only — your computer initiates the connection to `relaytty.com`. Nothing calls into your machine. This means it works from any network (home, hotel, coffee shop, cellular hotspot) without port forwarding, firewall rules, or a VPN.\n\nCombine with `relay share` to give others read-only links without exposing your full dashboard.\n\n---\n\n## Remote desktop\n\nTurn on **Screen Sharing** in macOS System Settings and a **Desktop** entry appears in the web UI. It opens the host's screen in the browser, through the same tunnel and login as your terminals, signed in with your macOS account. Handy when you need a browser on the host's network or a GUI app you cannot drive from a shell. On Linux, any VNC server on port 5900 works. See the [Remote Desktop guide](https://docs.relaytty.com/how-to/remote-desktop).\n\n---\n\n## CLI reference\n\n```bash\nrelay                        # open the TUI: picker + tmux-style prefix key (Ctrl+B)\nrelay <command>              # run command, attach locally\nrelay --detach <command>     # run command, print URL, return to prompt\nrelay attach <id>            # reattach to an existing session\nrelay list [--json --watch]  # list all sessions (JSON, or a stream of changes)\nrelay info <id> --json       # one session's metadata, including agentState\nrelay send <id> --enter \"y\"  # type into a session from a script\nrelay rename <id> <title>    # pin a title (program titles no longer overwrite it)\nrelay kill <id> [-s TERM]    # signal the foreground process (default INT)\nrelay wait <id> -s blocked   # block until an agent needs input (or --state exited)\nrelay events                 # JSON lines: created, exited, agent_state, title, cwd\nrelay stop <id>              # kill a session\nrelay share <id>             # read-only share link (1h default)\nrelay share <id> --ttl 86400 # 24h TTL\nrelay server start           # start server in foreground (localhost only)\nrelay server start --tunnel  # start with public tunnel\nrelay server install         # install as system service (launchd/systemd)\nrelay server uninstall       # remove the system service\n```\n\nThe CLI prints session URLs to stdout and status info to stderr (POSIX). `Ctrl+]` detaches from a session without killing it. In the TUI, `Ctrl+B n` switches to the next session, `Ctrl+B c` opens a new shell, `Ctrl+B d` detaches; set `prefix = C-a` in `~/.config/relay-tty/relayrc` to change the key. Every command takes `--host <url>` to drive sessions on another machine, so `relay wait` and `relay send` are enough for one agent to run another.\n\n---\n\n## relay-tty vs. the alternatives\n\nMost of the tools in this space solve a slightly different problem. Here's an honest comparison so you can pick the right one.\n\n| Tool            | What it does                                         | Agent-friendly? | Works from phone? | Zero-config public URL? | Session survives disconnect? | Multi-viewer? |\n| --------------- | ---------------------------------------------------- | --------------- | ----------------- | ----------------------- | ---------------------------- | ------------- |\n| **relay-tty**   | Terminal relay + built-in mobile UI + tunnel         | ✅              | ✅ (PWA)          | ✅                      | ✅                           | ✅            |\n| ngrok           | Generic HTTP/TCP tunnel                              | ❌ (no UI)      | Indirect          | ✅ (paid for stable)    | N/A                          | N/A           |\n| Cloudflare Tunnel (`cloudflared`) | Generic tunnel, needs your own server  | ❌ (no UI)      | Indirect          | ✅ (needs DNS config)   | N/A                          | N/A           |\n| ttyd            | Web terminal server                                  | Partial         | Clunky            | ❌                      | ❌                           | ✅            |\n| gotty           | Web terminal server (unmaintained)                   | Partial         | Clunky            | ❌                      | ❌                           | ✅            |\n| wetty           | SSH over web                                         | Partial         | Clunky            | ❌                      | ❌                           | ❌            |\n| tmate           | tmux over SSH with share URL                         | Requires tmux   | Requires SSH app  | ✅                      | ✅                           | ✅            |\n| tmux + mosh     | Persistent sessions over SSH                         | Requires tmux   | Requires SSH app  | ❌                      | ✅                           | ❌            |\n| Screen sharing  | Show your whole desktop                              | Overkill        | ✅                | ❌                      | N/A                          | N/A           |\n\n**TL;DR:** If you want a tunnel, use ngrok or cloudflared. If you want a web terminal you'll host yourself, use ttyd. If you want a mobile-friendly dashboard for AI coding agents that runs with one command and costs nothing, use relay-tty.\n\n---\n\n## FAQ\n\n### How do I check on Claude Code from my phone?\n\nInstall relay-tty, start the server with `--tunnel`, then run `relay claude` instead of `claude`. Your session is now live at `https://<slug>.relaytty.com`. Scan the QR code shown at startup, or bookmark the URL on your phone.\n\n### How do I monitor multiple Claude Code sessions running in parallel?\n\nRun each one with `relay --detach claude \"<task>\"`. They all show up on your dashboard at the tunnel URL. Green = running, yellow = waiting for input, red = blocked. Tap any session to interact with it from your phone.\n\n### Can I send input to my agent from my phone?\n\nYes. The mobile UI is a real interactive terminal (xterm.js), not a screenshot. Type `y`, paste a prompt, send an Enter — works like any terminal.\n\n### Is there a tool that lets me see my terminal on my phone without SSH?\n\nThat's literally what relay-tty is. It's a web-based terminal you can view in any mobile browser — no SSH client, no keys, no ports.\n\n### Does this work with Codex / Aider / Goose / Cursor / opencode / [any CLI]?\n\nYes. `relay <anything>` wraps any process in a PTY that the server hosts. If it runs in your terminal, it runs under relay-tty.\n\n### How is this different from ngrok or Cloudflare Tunnel?\n\nngrok and cloudflared are generic tunnels — they expose a port you already have running. relay-tty is a purpose-built terminal server with a mobile-friendly UI, session persistence, and a bundled tunnel. You get the whole experience with one install.\n\n### How is this different from ttyd or gotty?\n\nttyd and gotty host a single terminal on localhost. You still need a tunnel, auth, a way to share URLs, persistence across restarts, and a UI built for phones. relay-tty includes all of that out of the box.\n\n### Is it free?\n\nThe tunnel at `relaytty.com` is free for individuals, with no accounts and no rate limits that matter. The client is MIT-licensed. You can also self-host the server and skip the tunnel entirely.\n\n### What does the tunnel actually send?\n\nTerminal output bytes over a WebSocket, framed by our binary protocol. See [PROTOCOL.md](PROTOCOL.md) for wire details. Nothing is logged or persisted on `relaytty.com`; frames are relayed in memory and dropped.\n\n### Does my agent know it's being watched?\n\nNo. From the agent's perspective it's just running in a PTY like any other. There are no injected prompts, keystrokes, or environment variables.\n\n### What about security? This sounds like a huge attack surface.\n\nThe tunnel is outbound-only; nothing dials into your machine. Localhost connections skip auth. For remote access, set `JWT_SECRET` to require a bearer token. Share links are read-only and time-limited. You can self-host the server on your own infrastructure to avoid the tunnel entirely.\n\n### Can I use this without the `relaytty.com` tunnel?\n\nYes. `relay server start` (without `--tunnel`) runs on localhost only. Put it behind your own reverse proxy, Cloudflare Tunnel, Tailscale, or VPN. The web UI and CLI work identically.\n\n### Does it work on Windows?\n\nOnly via WSL. Native Windows PTY handling is different enough that we don't support it directly.\n\n### Can I use this for things other than AI agents?\n\nYes. `relay htop`, `relay top`, `relay tail -f logfile`, `relay npm run dev`, `relay python train.py`. Anything that runs in a terminal. The agent framing is just the sharpest use case.\n\n### Will leaving a session running drain my battery or bandwidth?\n\nNo. Idle sessions send almost nothing over the wire — only output bytes when the program actually writes. A waiting Claude Code prompt sends zero bytes per second.\n\n### What happens if my Wi-Fi drops mid-session?\n\nNothing. The session keeps running on your machine. When you reconnect, your phone resumes from the 10MB output ring buffer, so you see recent history instead of a black screen.\n\n### How do I get a persistent URL?\n\n`relay server start --tunnel` saves your subdomain to `~/.config/relay-tty/tunnel.json`. Every subsequent run uses the same `<slug>.relaytty.com`. Bookmark it once.\n\n### What's the latency like?\n\nEnd-to-end under 50ms from most places, because the tunnel endpoint runs on Cloudflare's global edge. You're getting terminal-grade responsiveness from your phone over LTE.\n\n### Can multiple people watch the same session at the same time?\n\nYes. Each viewer gets its own replay of the ring buffer on connect, then lives on the same broadcast stream.\n\n### Does this work with tmux?\n\nYes — you can run `relay tmux` or wrap relay-tty *inside* tmux. Either way. Most people don't bother; `relay list` plus persistent sessions is usually enough to replace what they used tmux for.\n\n### How do I revoke access?\n\nRotate `JWT_SECRET` to invalidate all tokens. Share links expire on their TTL automatically. Close the tunnel with `relay server stop` to take everything offline.\n\n---\n\n## Architecture\n\n```\nPhone Browser                Mac/Linux Host\n┌────────────────┐            ┌──────────────────────────────────┐\n│  Session List  │───loader──▶│ Express + React Router SSR       │\n│  (DaisyUI)     │            │   └─ SessionStore (in-memory)    │\n├────────────────┤            ├──────────────────────────────────┤\n│    xterm.js    │◀────WS────▶│ ws-handler ◀──Unix socket──▶     │\n│    Terminal    │            │   (per-client connection)        │\n└────────────────┘            └──────────┬───────────────────────┘\n                                         │\nCLI: relay htop ────POST /api/sessions──▶│\n     │                                   │\n     └──── attaches locally via WS ──────┘\n\n                            ┌──────────────────────────────────┐\n                            │ pty-host (detached process)      │\n                            │   ├─ Rust binary (forkpty)       │\n                            │   ├─ OutputBuffer (10MB ring)    │\n                            │   └─ Unix socket server          │\n                            │       ~/.relay-tty/sockets/<id>  │\n                            └──────────────────────────────────┘\n                            Survives server restarts. Each session\n                            runs in its own pty-host process.\n```\n\n### Key design decisions\n\n- **Process separation** — each session runs in a detached `pty-host` process that owns the PTY. The pty-host is a Rust binary (`crates/pty-host/`, ~700KB, ~2MB RSS per session). The server can crash, restart, or be upgraded without killing sessions. Metadata is persisted to `~/.relay-tty/sessions/` and sockets live at `~/.relay-tty/sockets/`. On restart, the server discovers and reconnects to surviving sessions.\n- **CLI attaches by default** — `relay bash` creates a session and enters raw TTY mode. `--detach` for fire-and-forget.\n- **10MB output ring buffer** — new clients replay recent output on connect. This is a replay buffer for reconnecting viewers, not a logging system. Use real log infrastructure if you need durable retention.\n- **Per-client socket connections** — each WS client gets its own Unix socket to the pty-host, so each gets independent buffer replay.\n- **Multi-client** — CLI and browser can view/interact with the same session simultaneously.\n- **Localhost auth bypass** — CLI on the same machine skips authentication.\n- **8-char hex session IDs** — short enough for CLI ergonomics.\n\n### WebSocket protocol\n\nBinary frames over WS and length-prefixed frames over Unix sockets. See [PROTOCOL.md](PROTOCOL.md) for the full message type reference, connection flow, and delta resume protocol.\n\n---\n\n## Environment variables\n\nConfigure via `.env` in the project root:\n\n| Variable          | Required         | Description |\n| ----------------- | ---------------- | --- |\n| `JWT_SECRET`      | Yes (for remote) | Secret for signing auth JWTs. Generate with `openssl rand -base64 32` |\n| `PORT`            | No               | Server port (default: `7680`) |\n| `APP_URL`         | No               | Public URL for remote access (e.g., `https://relay.example.com`). Shown on startup and used for Discord notifications |\n| `DISCORD_WEBHOOK` | No               | Discord webhook URL. When set, posts a clickable auth link on startup for quick mobile access |\n\nExample `.env`:\n\n```bash\nJWT_SECRET='your-secret-here'\nPORT=18701\nAPP_URL='https://relay.example.com'\nDISCORD_WEBHOOK='https://discord.com/api/webhooks/...'\n```\n\n---\n\n## Auth\n\nSet `JWT_SECRET` to enable bearer token auth for remote access (e.g., via your own Cloudflare Tunnel). Localhost connections always skip auth.\n\nOn startup, the server prints both local and public URLs:\n\n```\nrelay-tty listening on http://localhost:18701\nPublic URL: https://relay.example.com\nAuth token URL: http://localhost:18701/api/auth/callback?token=eyJ...\n```\n\nVisit the auth token URL in a browser to set the session cookie (30-day expiry). Tokens don't expire on their own — rotate `JWT_SECRET` to revoke all tokens.\n\n### Discord notifications\n\nWhen both `APP_URL` and `DISCORD_WEBHOOK` are set, the server posts a clickable auth link to Discord on startup. Tap it on your phone to authenticate instantly — the callback sets a cookie and redirects to a clean URL. Useful for accessing relay-tty from mobile without copy/pasting tokens.\n\n---\n\n## Tunnel details\n\nThe tunnel opens an outbound WebSocket to `relaytty.com`, which reverse-proxies HTTP and WebSocket traffic back to localhost. It uses an ephemeral local port by default to avoid clashing with a normal `relay server start` instance. Use `--port` to override.\n\nThe `relaytty.com` edge runs on Cloudflare Workers + Durable Objects (see the [relaytty.com](https://github.com/ddrscott/relaytty.com) repo). It relays frames in memory and persists nothing.\n\n---\n\n## Service management\n\n```bash\nrelay server install     # macOS: ~/Library/LaunchAgents/com.relay-tty.plist\n                         # Linux: ~/.config/systemd/user/relay-tty.service\n\nrelay server uninstall   # remove and stop the service\n```\n\n---\n\n## Development\n\n```bash\nnpm run dev          # dev server with Vite HMR (auto-builds Rust if toolchain present)\nnpm run build        # production build (React Router + CLI + Rust pty-host)\nnpm start            # production server\nnpm run check        # everything CI gates on: Rust tests, Node tests, client build\n```\n\nContributors, human or agent, should start with [AGENTS.md](AGENTS.md), which covers setup, verification, issues, and releases. CI runs `npm run check` on Ubuntu and macOS for every pull request.\n\n### Tunnel test environment\n\nA fully isolated test environment is available for testing changes before deploying to production. See [docs/testing.md](docs/testing.md) for setup instructions.\n\n### Rust pty-host\n\nThe PTY session host is a Rust binary, and relay-tty requires it. `npm install` downloads a pre-built one for your platform; build it yourself when working on the host:\n\n```bash\n# Install Rust (if needed)\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n\n# Build the pty-host binary\ncargo build --release --manifest-path crates/pty-host/Cargo.toml\n\n# Rust unit and integration tests\ncargo test --manifest-path crates/pty-host/Cargo.toml\n\n# Node tests, including the integration suites that run the release binary\nnpm test\n```\n\nThe binary also reports 1/5/15-minute throughput averages (like `top` load averages) for every session.\n\n### Parity suite\n\n`test/parity.integration.test.ts` holds the TUI and `relay attach` to one rule: using a session through relay must not be slower or less capable than running the same program in a plain terminal. It runs the client inside a real pty-host acting as the user's terminal and checks keystroke echo latency against a raw shell, that an app's terminal modes (alternate screen, mouse tracking, bracketed paste, cursor keys, cursor visibility) are restored on attach and on every TUI switch and reset when leaving, and that OSC 52 clipboard writes and OSC 9 notifications reach the terminal. Any change to the CLI, the TUI, the client core or pty-host output handling has to keep it green.\n\n### Binary distribution\n\nWhen installed via npm, a postinstall script automatically downloads the pre-built Rust binary for your platform from GitHub releases. Supported platforms:\n\n| Platform | Architecture |\n| -------- | ------------ |\n| macOS    | ARM64 (M1/M2/M3), x86_64 (Intel) |\n| Linux    | x86_64, ARM64 |\n\n> **Windows:** Not natively supported. Use [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) and install relay-tty inside your WSL distribution.\n\nIf the download fails (offline, unsupported platform), the install stops and prints the cargo command that builds the binary. Set `RELAY_SKIP_BINARY_DOWNLOAD=1` to skip the download, for example when you build pty-host yourself.\n\nBinaries are built via GitHub Actions on each tagged release (`v*`). The workflow cross-compiles for all four targets and attaches stripped binaries to the GitHub release.\n\n---\n\n## Tech stack\n\n- **Frontend**: React Router v7 (SSR) + Tailwind v4 + DaisyUI v5 + xterm.js v5\n- **Backend**: Express 5 + ws\n- **PTY Host**: Rust (tokio + forkpty)\n- **CLI**: Commander\n- **Service**: launchd (macOS) / systemd (Linux)\n- **Mobile**: PWA (standalone, no browser chrome) + Web Speech API for voice input\n- **Edge**: Cloudflare Workers + Durable Objects ([relaytty.com repo](https://github.com/ddrscott/relaytty.com))\n\n---\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\n---\n\n## Links\n\n- **Website**: [relaytty.com](https://relaytty.com)\n- **Docs**: [docs.relaytty.com](https://docs.relaytty.com)\n- **Issues**: [github.com/ddrscott/relay-tty/issues](https://github.com/ddrscott/relay-tty/issues)\n","readmeFilename":"README.md"}