{"_id":"rpi-deploy","_rev":"27-7835c88943eedfca94236053355f7088","name":"rpi-deploy","dist-tags":{"latest":"0.27.0"},"versions":{"0.6.0":{"name":"rpi-deploy","version":"0.6.0","license":"MIT","_id":"rpi-deploy@0.6.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"29d8474e600f2d7a2e07d81a21607161958110f2","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.6.0.tgz","fileCount":75,"integrity":"sha512-NtnsH+zl4KOZH4d0s/4VR4nKFxEwuclrrd8Ub1syQtgLxlbu3RNqYqsc1xOksRXcDJN6hg10AY3X3gHaNnzTJw==","signatures":[{"sig":"MEQCIFdnB4DByL5x5E0vOFJwl+P0GSL9cEezkA41PLqXI+MEAiBuFVdlF2cSU6H3g2ezYIFqVHXCVPEAabs8WXVR3jricA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":623996},"engines":{"node":">=18"},"gitHead":"e81c53e25fc6ea32275ead08b5bc35876ea1fecc","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.6.2","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.6.0_1783089176278_0.3452864279321184","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"rpi-deploy","version":"0.9.0","license":"MIT","_id":"rpi-deploy@0.9.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"9bc7d213d8a8b627dd1c48a57a528e0a5f7681b0","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.9.0.tgz","fileCount":77,"integrity":"sha512-pRGhNd2aGCYwXzPa8JACpB6Lt4hPLOui8FfR3rWMjgmDVHqGMsy839ByPeTwiwkFDzm92bHjMsOXF/yGr2UbOQ==","signatures":[{"sig":"MEYCIQDUJyuwgDwdAeZSDf+mumeHhN8JgK3L0Xn67e+bhKhCJQIhAKW0wfjpFcrs/Vb2PNCS6XJuJGrW/k+EmD0ug8stnYq5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":728776},"engines":{"node":">=18"},"gitHead":"c106737249e33d94bd24033f9184e6c40d950c3f","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.9.0_1783466574059_0.5802934741030397","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"rpi-deploy","version":"0.9.1","license":"MIT","_id":"rpi-deploy@0.9.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"5989e0f8395cfbcc067b78330b20ffbeab70f7f6","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.9.1.tgz","fileCount":77,"integrity":"sha512-B6gfhP9dGS7dr0oDUZdFGhZqCP4a/doVhdpsaXr+zmkJBHY2P1htcrrMq2tPhLY8N2loL9ak1oYpEYyfmaV/Gg==","signatures":[{"sig":"MEUCIGLQRiF2u7pg70vUDrIzEnRppEyCVgGtVnUUmWF0zPxcAiEAxHKMgo6GQT/3s1Fx/sgU2h/3uj/ytgdGeENTbDbl7M8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":732231},"engines":{"node":">=18"},"gitHead":"d87ebab5009f7a2bbbc82fcfb7c815083218efee","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.9.1_1783469710415_0.13537431724069426","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"rpi-deploy","version":"0.10.0","license":"MIT","_id":"rpi-deploy@0.10.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"7afd0e8bef1bd38ab8e3dbc8da326f239124a0d6","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.10.0.tgz","fileCount":77,"integrity":"sha512-DdAyFiLhsM1a6XPsAfc5lo11yNZUXW7fkrtLyvPFo6uhuA6R1KR4y7kVXXTQkBG2i2/8N9O3W98PN7hDLp2FHQ==","signatures":[{"sig":"MEUCIGx+STdXKALLlO6Jldr8I6NjPxVyQIjJFnp+2Y+Bo/5YAiEAiCqCq/WcSex8V2Twzj4uTfaSxtbIWr04qNIuRL7vwII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":744002},"engines":{"node":">=18"},"gitHead":"492012db173ae2d800a4a70ab0c87dcd91f1bddb","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.10.0_1783507399235_0.555815878843263","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"rpi-deploy","version":"0.11.0","license":"MIT","_id":"rpi-deploy@0.11.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"a297376b9e29ac9ac7668937f561ed37a02c95ec","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.11.0.tgz","fileCount":82,"integrity":"sha512-R3zdXG7oxcIxXVJWH89Dmbal5jSfCHFB62CGQQIOhx2CSp7PlSnWGJ8LPc7EuBXKFCpJkYJdAal1WFPEVLwzMw==","signatures":[{"sig":"MEQCIF3QNehdJWZxuqhwUCl4zpKAtpsiB8tOJB5q/7qPaE44AiBTkvLXSLrJidPJgLA3aL4n89RjKTYOv+mV3QrKJ57t0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":764823},"engines":{"node":">=18"},"gitHead":"ed90996a6194433af1d93020c79cc0c5c869face","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.11.0_1783535711953_0.400836032720568","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"rpi-deploy","version":"0.11.1","license":"MIT","_id":"rpi-deploy@0.11.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"1b54c100dc1cecc9c229810a3e529c66f30d4cb3","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.11.1.tgz","fileCount":82,"integrity":"sha512-tdStRVW3Tsb/+NNNhtAiDVhqxu8zBcdI6ChZo/mg4s+EWMw2PGA2r8oYcIkQDeiLoemRkLO5zI5Eok8/L+h1vA==","signatures":[{"sig":"MEYCIQDNapbYZ3JPnzjpTMHgG0ykazggveH2JvludlkAfgd+MwIhAJpmkCg1EF9ez8SvGm84LKOwHkvormbieQeSmHTWbNDC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.11.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":770876},"engines":{"node":">=18"},"gitHead":"e0e059f37e78c09f50c61db0cac3cf62194e97d5","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.11.1_1783546728845_0.18083504264645844","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"rpi-deploy","version":"0.12.0","license":"MIT","_id":"rpi-deploy@0.12.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"94a95dd8a5d3b430e6a4e8a1f799cd410fcbd7d4","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.12.0.tgz","fileCount":82,"integrity":"sha512-o60xrtGclJE7+v85z0I8rkKnXC8YCu+ioNQuT/9pceda3kZVheDCMcE7v351BCZ6x0IIc1uISp6Z7h/EhCb3Ww==","signatures":[{"sig":"MEQCIBZsQHdlEvmjEiaMxaKf/OJF7zB6KKtnOT/DtQl89O7/AiAsf690SMdw33KdhVNcCmYoBFKuVHVWTGWFgkneTHW1jQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":781456},"engines":{"node":">=18"},"gitHead":"ea1eea2fddbbd1c9ddbfa932b3e87146e5c222ba","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.12.0_1783555800148_0.33632516276929936","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"rpi-deploy","version":"0.13.0","license":"MIT","_id":"rpi-deploy@0.13.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"70eab9bf7d21960dcf40aa0e78f4d7f6be2004d9","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.13.0.tgz","fileCount":86,"integrity":"sha512-U0dw610JTAMSYrPiHwrWArcy18fo1CltT+yHwzu+UM1K88wmI6e37fmdxYGUxqjmPbI0QCRb2qJH5bZNiv6Lhw==","signatures":[{"sig":"MEYCIQDM80P/D7D1KFVOoWDic1MhQaUqg3lm5yzXnUXZ6lqJSQIhANFstkWScMNtahtMHOhim4P9eg7FVHCoSTzIeCabPmLb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":846888},"engines":{"node":">=18"},"gitHead":"fa8ec783b4a059ef35c099097bf093d47672f9f2","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.13.0_1783605606565_0.5862145623029769","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"rpi-deploy","version":"0.14.0","license":"MIT","_id":"rpi-deploy@0.14.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"6ea8829c69fc8805a585681fa4a6c9a669eba7e2","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.14.0.tgz","fileCount":87,"integrity":"sha512-91sax0SvxaYRES31BJNkvcUiZbEaso0Z6DbJWWPyhekVvcBrA9x20a96UjqGnksVoa+c1J8kptbbrC+YCx36TA==","signatures":[{"sig":"MEQCIGFkpu3J9GnOYvZSMxGKzSlbLJocP1HjTEbFS6dSkyoIAiByPcm3SNG5oKEPnXBoI829M6ttUlaVGPB1piETwIP32A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":858628},"engines":{"node":">=18"},"gitHead":"8a474330ea9362e28605baf9f5ba563d02cea7a1","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.14.0_1783608727459_0.08195043267215296","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"rpi-deploy","version":"0.16.0","license":"MIT","_id":"rpi-deploy@0.16.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"4bd6de6d6e65674410a28aa382afb24285fb832a","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.16.0.tgz","fileCount":88,"integrity":"sha512-iOFdRm3e4ybK+sA20XVVF/2B/cLlX5dCtNl00wVf0RdfNgfmM6YEhNrWe/5VvwoRWOB29gpuIeN5BselZrWg+Q==","signatures":[{"sig":"MEUCIQCtvVpOFSlOvZ+QZsQiFMcZzyqojTXYlX1AqJttSHTAFgIgOycMjtorwHyUakI+aZlnRR3cC1+A0MHLorVAigmH610=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":900471},"engines":{"node":">=18"},"gitHead":"6e2e7d6dfc2e682599606b9b9359fe277ee5790a","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.16.0_1783629258422_0.45827384953397976","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"rpi-deploy","version":"0.17.0","license":"MIT","_id":"rpi-deploy@0.17.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"4bd81cfd72bf36b1c0d7ec2f7505cfcf10c44d48","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.17.0.tgz","fileCount":88,"integrity":"sha512-MHQtJAwqPhiop3zQXIo75euKzcRSNnLeA9rUYqiyQJEP4u3RP3pdSjoaWSztgEg87taSuWg2meD58lssVk5M/A==","signatures":[{"sig":"MEQCIARws+kYCPwYipxKilw8ZWV9jrEHc2uDJCwzVWjUo+UZAiA/tdFlG+FaJ2ofzUa6F+bt/OC5vDT3N1cBP5eVImDsPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":924699},"engines":{"node":">=18"},"gitHead":"74383252d1015973ee0534711b4f509802ae330d","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.17.0_1783674891084_0.12510044779832508","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"rpi-deploy","version":"0.17.1","license":"MIT","_id":"rpi-deploy@0.17.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"4bf2d3ac851fc5b61c46ffc888c9e5d7e3019ed9","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.17.1.tgz","fileCount":88,"integrity":"sha512-KKil172tNw4yB0rZZb9b/mmjZQ4PBJewgp86sH73NrJFhXraAUDWsvdJM2i8xqZg+Pei/4FoKMCwyXbmloBU8A==","signatures":[{"sig":"MEUCIC3GbPCxn3he99kY2bWjU0rZ7QvZIXOc9zTXjGIYol5TAiEAyQ7pVAuoce+HdjR+EMiXd6cCJaEM/7Bzd2q5uNRT0IE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.17.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":929451},"engines":{"node":">=18"},"gitHead":"39e32ce528d017460c7dd8a0277f56599d3d9730","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.17.1_1783679470223_0.4599255438740637","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"rpi-deploy","version":"0.18.0","license":"MIT","_id":"rpi-deploy@0.18.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"fe011ccd66f288e2875d262c3e3a17ed93e19446","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.18.0.tgz","fileCount":90,"integrity":"sha512-/9kSpxchsYd5nNXzOHrRCkXvmoV5PguDGg0XG7M3Wyk3Th9GDFoixFW2lYgGceG/82ATuXM0GcBwk9VxdRXkZw==","signatures":[{"sig":"MEYCIQCtiZyvVHw340HthlR6oBt156nP1mTxAZPnwc5eLP0awwIhAMcLLI+9dFoaW1hqCii4+LiOFXZKTpTXU/KWrCMx3E5s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":994875},"engines":{"node":">=18"},"gitHead":"9db1e66484fa12313bed177663a2db5fd2711cc9","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.18.0_1783697242692_0.7947746404061176","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"rpi-deploy","version":"0.19.0","license":"MIT","_id":"rpi-deploy@0.19.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"c42b2ff6f1f265fc5282fa3f812c9170236a9af0","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.19.0.tgz","fileCount":90,"integrity":"sha512-Yqfmm1zmKPp9XRoXQvOn64CTBFPE299vXt6XL31lnuFSwlR8dmv/T1B2uM35X4DL1wFaBXSe8jeMIy4DUH4Z8g==","signatures":[{"sig":"MEYCIQD3iKx1z+ozc7GA+rYQgftlFMcE+/Bwcp+HDI4KTeNmKgIhAKtIICtrQ3XG854vb/jW1P2Lo1qpeL1QRhjutsQjTGD4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1002604},"engines":{"node":">=18"},"gitHead":"dfc3fcfe48bff32bb75f933d06cdfbe0dac52b12","scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.19.0_1783704288384_0.5454366007178562","host":"s3://npm-registry-packages-npm-production"}},"0.19.1":{"name":"rpi-deploy","version":"0.19.1","license":"MIT","_id":"rpi-deploy@0.19.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"35c86b69e3f4c7bf3989e233af2c709bb97f3817","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.19.1.tgz","fileCount":90,"integrity":"sha512-f4YS9J43UWqmlU9i9ShS75a5ZaSKipVWU++8UWRw8fkQzhCzSiDxm3YHeuTpfCHgqBasgZAuSOC6I/HNSxutyw==","signatures":[{"sig":"MEYCIQCEYNa1rPR/eHKT2K6uDQUjZ8rNm7TPxMxfutnHbeAERgIhAJAn3R33f1d2V0VzX9ud/cMn8amW4k+4erz8kI6/fJO7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.19.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1005713},"engines":{"node":">=18"},"gitHead":"df6bdfd7a226f93a65dd6d7c0ca4e6f1ae615c13","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.19.1_1783811522032_0.7298048554735193","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"rpi-deploy","version":"0.20.0","license":"MIT","_id":"rpi-deploy@0.20.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"35459cf662f1200775470e9ea22ef5031e5f4189","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.20.0.tgz","fileCount":96,"integrity":"sha512-CTmLfHWGepA0jkBdyrY7lYqWvl+u/MedLCMqhN3ynhWFHEQRt59FOPVqUayZ5IsLHnjqaMoD10rPDh0lAVqyrA==","signatures":[{"sig":"MEUCIQCnWE9yXs7nasUfj3jWoBQbTXpSM2i8UYH42ai7LB/XbAIgUxcZTgoLBIx00SGUIyPty+K4myjBuB6c/iWxWvUmFsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1092171},"engines":{"node":">=18"},"gitHead":"537e115bcba0117f8a1a5915f541f9914de739f8","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.20.0_1783890363936_0.450800624959917","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"rpi-deploy","version":"0.20.1","license":"MIT","_id":"rpi-deploy@0.20.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"66dc690d0fab5b248165b40d1463b12311cd920d","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.20.1.tgz","fileCount":96,"integrity":"sha512-a6doNelj7M8kVgLi4tO75FiX4i7Ii6mFYP9wCrSlBQ4A61vaBd0mkXb23ZkBWTmukzOLF1AP/iLb8pezAbo6Gg==","signatures":[{"sig":"MEUCIQC7rcso59hAv3vS5bffGfhsX8p7GUaw++lgrBWi0gTucwIgefv2xVF7/FxDJEIjTi9n6cxNvUNZg4tGf9HEYT/9tu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.20.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1093264},"engines":{"node":">=18"},"gitHead":"b30cba7f128fa949b177daffbe93c6b35ec138b6","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.20.1_1783892377595_0.7787364146937352","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"rpi-deploy","version":"0.21.0","license":"MIT","_id":"rpi-deploy@0.21.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"2f96f66fb91143bf349529610ac5d84392d0ad3c","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.21.0.tgz","fileCount":97,"integrity":"sha512-EO4SPgsENgBxAn+moDxGQokiw46BHl+IG+RVDLO/MTTFq7MGaPtxcd+1nNLa3xJcHKqbVnmdOvgYBmV7pOuwcg==","signatures":[{"sig":"MEUCIDwZYYw1bZeUmKMPYyIyBA916g5zEfyX9y5V7wWLj4CHAiEAi7m4jYUQiOWjESC3Dz0Idfgfjo6gAU1iJWHhSBJIndE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1116946},"engines":{"node":">=18"},"gitHead":"40faeb9f17f19d499cce28a378e7952e610c724c","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.21.0_1783903491328_0.013861488083405149","host":"s3://npm-registry-packages-npm-production"}},"0.21.1":{"name":"rpi-deploy","version":"0.21.1","license":"MIT","_id":"rpi-deploy@0.21.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"58b84292b527bcb4fb7aa669d4a59c4271a119a5","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.21.1.tgz","fileCount":97,"integrity":"sha512-NZNcRe9/cb4lNDF4MAKIE9Nu9dM2dOKvrBQvasRd4w/Rayl5Cy4BBjQJSGnENzUMkVW0pmkVBNx24hhz32HaOg==","signatures":[{"sig":"MEQCIELuBSVSU5v5nrGdH8x7GAyaQOQss05BR+p3kwwrVfROAiBwhIwGMmwybStM5TydZ+6L3G9yzj/N9gluWh+NPol5NA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.21.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1121439},"engines":{"node":">=18"},"gitHead":"77392308747d33042b66c1fa3e931f7362842e74","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.21.1_1783938398232_0.8735655505590902","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"rpi-deploy","version":"0.22.0","license":"MIT","_id":"rpi-deploy@0.22.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"bf6207cc2b6a0ea3d9f00c8cf8b0d7bc87a65188","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.22.0.tgz","fileCount":100,"integrity":"sha512-EihBRZlvfaWjc/kR61DNq+I1g21W1BneXR9ZEoSlSsaqJq+md6ByhdkpZxunCGu5aXT9u1cH26j/MLShTeZlVQ==","signatures":[{"sig":"MEYCIQD/s9aCdvmU/q9TxXssEjiScYA4rDl7T+pjNiI+47v8FwIhAJ3bq3RR8XnI+iCOjDzGnxszlb1dpsVWFiTmo1c3vcIY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1157398},"engines":{"node":">=18"},"gitHead":"789320a23bef325f53922f5c458fefffe275c85a","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.22.0_1783953896201_0.5825935398769864","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"rpi-deploy","version":"0.23.0","license":"MIT","_id":"rpi-deploy@0.23.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"1cf8902ef9d62ff8c83423db272ab9017823fbc3","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.23.0.tgz","fileCount":100,"integrity":"sha512-CVQ81V5EBu4JcFoK/pNXiBD2E33hfqgkJExgRx6Vq/dzb20T8N3cWxVEQyDA6SlE9kUbCnvCmx3yLHvibonLeg==","signatures":[{"sig":"MEUCIQC2X4iOBJ1dhCaxMmjKOxgZkWYWgApaLFbE+Um74pfI5AIgLRwWu9RId9hF/ze3AoujVIcVYGoOWrO5o4dqf7yLIxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1158557},"engines":{"node":">=18"},"gitHead":"160fb492c68d781a12a6eca8b3dee7392834ab8d","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.23.0_1783976230557_0.8350108098880622","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"rpi-deploy","version":"0.24.0","license":"MIT","_id":"rpi-deploy@0.24.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"0ee93395c71c6c48e0e4717ab1e0cd50b7b234e3","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.24.0.tgz","fileCount":103,"integrity":"sha512-oZbWzlphWQklodm9dUGm5iMT4KuZkZ55d6hz7Qbnm55ApxqDGpyO5hnsQnGSa2BqFH4OujOTQuwTnIoBkpQjDA==","signatures":[{"sig":"MEQCIANq0c5oG1lUm+jOIKpZM6Qb5hV4AvJ8bX6wIe1oHXCwAiAdq2ukOLS95MnaEf9qnrOx2IXJT/5JK1iFx3shzooEgA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1305388},"engines":{"node":">=18"},"gitHead":"8f08afc22b9bf0f213b24d4b5abdd2fb3e96dd06","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.24.0_1784905506787_0.9157185875270017","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"rpi-deploy","version":"0.25.0","license":"MIT","_id":"rpi-deploy@0.25.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"e0c7b2baf4e23d4aadb90b447c20cc64439d099f","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.25.0.tgz","fileCount":103,"integrity":"sha512-OBzLIBnG7Mwi4iGh8pA0eSNcR1FEfwgLlFceQu/Wo3srRVeZBvuCY1ZBHEAtvwrQmK2piDQfez0ehJ6XrdChhw==","signatures":[{"sig":"MEYCIQCggpgiARQJH7JfEbohXnvfSytUyo7YT2YQ12jAEr4fAQIhAMeMp6vftdlg30UXrqFbHfa6hjuyET8BF6VJasq0uFWS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1305145},"engines":{"node":">=18"},"gitHead":"3aacefb97bed925cfb756016bd41f8debf59c90a","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.25.0_1784981123234_0.10625897968634357","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"name":"rpi-deploy","version":"0.25.1","license":"MIT","_id":"rpi-deploy@0.25.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"ae88d1712fbb104e0e8d0fb995c7079785f8a82e","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.25.1.tgz","fileCount":103,"integrity":"sha512-zMTzkCLbkUkAwV3vxuHw3Vda2La9nbKCKpEWXFkqC98xiXBTG+pQ4P1LkwqOL0mAsRTxRZ40ge4xWWB2IgzDWg==","signatures":[{"sig":"MEYCIQDy92qZCi5u+GW2g1WpqsEmhZP4WlWhB0Fu9jjjmNAYnwIhANnV26hFZ58tPdcPpTlnGIEwZKiX1ZnFMpqLpd4JG62A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.25.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1309161},"engines":{"node":">=18"},"gitHead":"766e847bc944cf6c939515b118e8ea652769e7ad","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.25.1_1784988215234_0.8965655413949238","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"rpi-deploy","version":"0.26.0","license":"MIT","_id":"rpi-deploy@0.26.0","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"9179da1da2b2c536536171a50e7e87458c08ba6c","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.26.0.tgz","fileCount":104,"integrity":"sha512-vj+FpFeHgHbUx0upNMcYXq1qWif9YLMZijqBWJjvIzMwKkPbUghZrmeAQdj3eM/+42odZ1fhDselNNDOCWggxg==","signatures":[{"sig":"MEUCIQCViF+3y51g40T9aHdjYS/y6WB87bDzT8DhHHbh64EeOwIgNdB0f1udzK3AEeElUKBpp12xfHnC9IEf53deplJpcZ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.26.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1347455},"engines":{"node":">=18"},"gitHead":"0d4d21edc179f835f6efa0651777d33846ee06c6","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.26.0_1785028448539_0.14562955606549477","host":"s3://npm-registry-packages-npm-production"}},"0.26.1":{"name":"rpi-deploy","version":"0.26.1","license":"MIT","_id":"rpi-deploy@0.26.1","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"os":["linux","darwin","win32"],"bin":{"rpi":"bin/rpi.js"},"dist":{"shasum":"8454e4fd990cca55b64c49b63b4c9f536628f448","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.26.1.tgz","fileCount":104,"integrity":"sha512-O85BB0YupJntDH1iQkyuIEOHu/gKDMrizh3htrS2g2qpfuBbeopGM/zFc6I3FgbH9pSDtveoaqvhrki4kRR7Cw==","signatures":[{"sig":"MEQCIA3FbMCf/U6MwfIrUAM1be/vK2kewXJ1N4/TFag3QbJTAiB6+qt1+QpyqtLWTyAPlPRrKJGvY9eh9SKo/ZpZu56c7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.26.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1347455},"engines":{"node":">=18"},"gitHead":"215f847cfa7639fa45c5c90540dcc087ebca6c08","scripts":{"test:e2e":"node tests/e2e/run.mjs","test:node":"node --test","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","postinstall":"node scripts/postinstall.js","e2e:dev:down":"node tests/e2e/run.mjs --dev-down","prepublishOnly":"node scripts/check-version.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"repository":{"url":"git+https://github.com/khmilevoi/rpi-deploy.git","type":"git"},"_npmVersion":"11.18.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rpi-deploy_0.26.1_1785031218337_0.21752693772813125","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"rpi-deploy","version":"0.27.0","description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/khmilevoi/rpi-deploy.git"},"bin":{"rpi":"bin/rpi.js"},"scripts":{"postinstall":"node scripts/postinstall.js","prepublishOnly":"node scripts/check-version.js","test:node":"node --test","test:e2e":"node tests/e2e/run.mjs","e2e:dev:up":"node tests/e2e/run.mjs --dev-up","e2e:dev:down":"node tests/e2e/run.mjs --dev-down"},"engines":{"node":">=18"},"os":["linux","darwin","win32"],"gitHead":"36411319bb08eb40109c0ee528745c492e53c4a6","_id":"rpi-deploy@0.27.0","bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"homepage":"https://github.com/khmilevoi/rpi-deploy#readme","_nodeVersion":"22.14.0","_npmVersion":"11.18.0","dist":{"integrity":"sha512-5HzlwrvSUzqJKhS9AK5xuSXzJ8AFV51knuXsS+WChK76J/aPaHLZrr4ywzWOU+AEKPN+WN8fmE3cAEviAWLwkQ==","shasum":"b693faabb449c3a50e85f17871f0825c2b841b89","tarball":"https://registry.npmjs.org/rpi-deploy/-/rpi-deploy-0.27.0.tgz","fileCount":110,"unpackedSize":1638388,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/rpi-deploy@0.27.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDeRslFODfzXUo07jqtMKXRxjo47nBzNZZ2lOdUK3xQRAIgVapmGFv/yvVAneNQN+c6lp9J7BNubMS1TvZ14T6PLJ0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a384a8c7-5103-44d0-b3c9-72fff9e84fcb"}},"directories":{},"maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rpi-deploy_0.27.0_1785104717776_0.6350842936183261"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T14:32:56.112Z","modified":"2026-07-26T22:25:18.219Z","0.6.0":"2026-07-03T14:32:56.467Z","0.9.0":"2026-07-07T23:22:54.227Z","0.9.1":"2026-07-08T00:15:10.561Z","0.10.0":"2026-07-08T10:43:19.417Z","0.11.0":"2026-07-08T18:35:12.136Z","0.11.1":"2026-07-08T21:38:48.998Z","0.12.0":"2026-07-09T00:10:00.391Z","0.13.0":"2026-07-09T14:00:06.722Z","0.14.0":"2026-07-09T14:52:07.656Z","0.16.0":"2026-07-09T20:34:18.571Z","0.17.0":"2026-07-10T09:14:51.334Z","0.17.1":"2026-07-10T10:31:10.395Z","0.18.0":"2026-07-10T15:27:22.845Z","0.19.0":"2026-07-10T17:24:48.570Z","0.19.1":"2026-07-11T23:12:02.204Z","0.20.0":"2026-07-12T21:06:04.103Z","0.20.1":"2026-07-12T21:39:37.804Z","0.21.0":"2026-07-13T00:44:51.491Z","0.21.1":"2026-07-13T10:26:38.394Z","0.22.0":"2026-07-13T14:44:56.359Z","0.23.0":"2026-07-13T20:57:10.763Z","0.24.0":"2026-07-24T15:05:07.041Z","0.25.0":"2026-07-25T12:05:23.379Z","0.25.1":"2026-07-25T14:03:35.397Z","0.26.0":"2026-07-26T01:14:08.712Z","0.26.1":"2026-07-26T02:00:18.524Z","0.27.0":"2026-07-26T22:25:17.932Z"},"bugs":{"url":"https://github.com/khmilevoi/rpi-deploy/issues"},"license":"MIT","homepage":"https://github.com/khmilevoi/rpi-deploy#readme","repository":{"type":"git","url":"git+https://github.com/khmilevoi/rpi-deploy.git"},"description":"Deployment tool for Docker Compose projects on Raspberry Pi. Builds the Rust CLI from source on install.","maintainers":[{"name":"khmilevoi.alex","email":"khmilevoi@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"assets/logo.svg\" width=\"120\" alt=\"rpi — raspberry triangle logo\">\n\n# rpi\n\n**Deploy anything to your Pi.**\n\n[![npm](https://img.shields.io/npm/v/rpi-deploy?color=C51A4A&label=npm)](https://www.npmjs.com/package/rpi-deploy)\n[![ci](https://github.com/khmilevoi/rpi-deploy/actions/workflows/ci.yml/badge.svg)](https://github.com/khmilevoi/rpi-deploy/actions/workflows/ci.yml)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n[rpi.iiskelo.com](https://rpi.iiskelo.com) · [Releases](https://github.com/khmilevoi/rpi-deploy/releases) · [Quick Start](#quick-start) · [Commands](#commands) · [`rpi.toml`](#project-configuration-rpitoml)\n\n</div>\n\n---\n\n`rpi` (npm package [`rpi-deploy`](https://www.npmjs.com/package/rpi-deploy)) deploys Docker Compose projects from Git to a Raspberry Pi — or any Linux host with `systemd`. An agent runs on the Pi; the CLI runs on your machine or in CI and reaches the agent through an SSH tunnel to a Unix socket, so the Pi exposes nothing but SSH. On `rpi deploy` the agent clones or fetches the repository, builds the Compose stack, starts the containers, runs a health check, and — if configured — publishes the service to the internet through a Cloudflare Tunnel.\n\n```text\n░░\n▒▒▒▒    r p i\n▓▓▓▓▓▓  deploy · myboard\n▓▓▓▓\n██\n\n✓ fetch (2.1s)\n✓ build (48.3s)\n✓ start (5.6s)\n✓ health (1.2s)\n✓ route (0.8s)\n✓ gc (0.3s)\n\n▸ deployed ✓ myboard  →  https://myboard.example.com · 2 services (58.4s)\n```\n\n## Highlights\n\n- **One-command setup** — `sudo rpi agent setup` bootstraps the Pi (user, dirs, systemd unit); `rpi setup` and `rpi init` wizards configure the client and the project.\n- **No open ports** — the CLI tunnels over your existing SSH access; the agent listens on a Unix socket only.\n- **Staged pipeline view** — `fetch → build → start → health → route → gc`, each stage collapsing into a timed `✓ build (48.3s)` summary.\n- **Private repos without friction** — a deploy-key preflight verifies repo access before the pipeline and registers a read-only deploy key through your local `gh` (the token never leaves your machine, the private key never leaves the Pi). Without `gh` it prints the key and continues by itself once you add it — even picking up a `gh auth login` you run mid-wait.\n- **Encrypted secrets** — `.env` plus arbitrary secret files, sent encrypted, stored age-encrypted on the agent, written into the checkout at deploy time (`.env` `0600`, secret files `0644` by default, both overridable with `[secrets].file_mode`). A named **secret group** is pushed once and attached from `[secrets].groups`, so every branch preview of the project inherits it instead of uploading its own copy.\n- **Cloudflare Tunnel ingress** — one command installs `cloudflared`, creates or adopts the tunnel, and manages DNS entirely through the Cloudflare API. Hand-built tunnels are adopted without a rewrite or downtime.\n- **Stable ports & health checks** — the agent allocates a stable host port per project, writes a Compose override, and probes HTTP (or TCP) before declaring success.\n- **Latest-wins deploy queue** — a newer deploy supersedes the one in flight; `rpi deploy --cancel` aborts.\n- **Admin commands** — declare `[commands]` in `rpi.toml` and run them inside the service container with `rpi command`.\n- **Ops built in** — `rpi logs`, `rpi stats` (`-w` for a live dashboard TUI: CPU / memory / temperature cards with mini charts, plus a per-service table with status pills and memory bars), `rpi status`, `rpi doctor`, `rpi agent logs`, `rpi gc`.\n- **Version-skew aware** — the CLI and agent handshake on `connect`, gate commands against advertised agent features, and print a banner instead of a confusing error when they're out of sync.\n- **Fast install** — `npm install -g rpi-deploy` downloads a checksum-verified prebuilt binary (Windows x64, Linux x64/aarch64) in seconds, falling back to a source build elsewhere. A no-npm `install.sh` one-liner bootstraps binary-only hosts.\n- **Client-triggered updates** — `rpi upgrade` brings the board's agent up to your CLI's version over the existing SSH + sudo path (download → SHA-256 verify → atomic swap → restart), no manual SSH session required.\n- **Environment overlays** — `rpi deploy --env <name>` deploys a project's shared `test` environment or an ephemeral per-branch preview from an `rpi.<env>.toml` overlay next to the base `rpi.toml`, with its own hostname, an optional TTL that self-destructs it, and a one-time `on_create` hook; `rpi env ls/destroy/reset-data` manage the deployed set.\n- **Configuration variables** — any string in `rpi.toml` can reference `${YOUR_VAR}` from `--vars`, or a resolver input like `${git.branch}`/`${env.slug}`; every container also gets the `RPI_*` runtime set (project, environment, branch, hostname, host port, commit sha) without configuring anything.\n\n## Quick Start\n\n**1. On the Raspberry Pi** (Docker and Node.js ≥ 18 are the prerequisites):\n\n```bash\ncurl -fsSL https://get.docker.com | sh\nsudo apt-get install -y nodejs npm\n\nsudo npm install -g rpi-deploy   # prebuilt arm64 binary — seconds, not minutes\nsudo rpi agent setup             # user, dirs, systemd unit; idempotent\nrpi doctor                       # verify the installation\n```\n\n**2. On the developer machine:**\n\n```bash\nnpm install -g rpi-deploy\nrpi setup                        # wizard: SSH profile for your Pi\n```\n\n**3. In the project you want to deploy:**\n\n```bash\nrpi init                         # wizard: generates rpi.toml\nrpi secrets push                 # only if the project needs secrets\nrpi deploy\n```\n\nThat's it — `rpi ls` shows the project, its host port, and its public hostname if one is configured.\n\n## Commands\n\n| Command | Description |\n|---|---|\n| `rpi deploy [--ref <git-ref>] [--no-gh-key] [--env <name> --vars K=V]` | Deploy the current project (reads `./rpi.toml`), or an environment overlay with `--env` |\n| `rpi deploy --cancel` | Cancel active deploys of the current project |\n| `rpi ls` (alias: `rpi ps`) | List projects on the agent |\n| `rpi logs <project> [-f] [--tail N]` | Stream container logs |\n| `rpi stats [project] [--json] [-w\\|--watch] [--interval N]` | CPU / memory / disk / temperature metrics; `-w` opens a full-screen live view with history sparklines |\n| `rpi start\\|stop\\|restart <project>` | Manage containers without a rebuild |\n| `rpi rm <project> [--volumes]` | Remove a project |\n| `rpi status [--json]` | Agent and host overview |\n| `rpi doctor` | Environment self-diagnosis |\n| `rpi gc` | Prune Docker images and build cache on the Pi |\n| `rpi command [name] [-- <args>] [--env <name> --vars K=V]` | Run a `[commands]` entry in the service container; no name lists them |\n| `rpi secrets push [--group <name>] [--merge] [--force] [--apply] [--env <name> --vars K=V]` | Push the env file and secret files to a group, or to this project's own bundle (encrypted at rest); `rpi secrets send` is a deprecated alias with no `--group` |\n| `rpi secrets ls [--group <name>] [--env <name> --vars K=V]` | List the effective merged secrets, or one group's head with `--group` (names, paths, sizes, revisions — values are never transmitted) |\n| `rpi secrets diff [--group <name>] [--env <name> --vars K=V]` | Compare local secret sources against the agent by digest, without pushing |\n| `rpi secrets group ls [--env <name> --vars K=V]` | List this project's secret groups and who attaches each one |\n| `rpi secrets group rm <name> [--force] [--yes] [--env <name> --vars K=V]` | Delete a secret group (prompts for the name unless `--yes`) |\n| `rpi config show [--env <name> --vars K=V]` | Print the resolved `rpi.toml`, overlay merged in, without contacting the agent |\n| `rpi env ls [--all] [--vars K=V]` | List deployed environments for this project, or every environment with `--all` |\n| `rpi env destroy <name>\\|--full-key <key> [--vars K=V] [--yes]` | Tear down an environment: stack, volumes, ingress route, DNS, secrets, registry row |\n| `rpi env reset-data <name>\\|--full-key <key> [--vars K=V] [--yes]` | Wipe an environment's containers and volumes; the next deploy re-runs `on_create` |\n| `rpi setup` | Wizard: server profile + SSH key + client config |\n| `rpi init` | Wizard: generate `rpi.toml` in the current project |\n| `rpi agent setup` | Bootstrap the agent on the Pi (run with `sudo`; idempotent) |\n| `rpi agent status` / `rpi agent logs [-f] [--since 2h]` | Agent health and logs (falls back to `systemctl`/`journalctl` over SSH) |\n| `rpi agent migrate [--list] [--dry-run] [--run <id>] [--all --yes]` | Host-level migrations |\n| `rpi agent uninstall [--purge]` | Remove the agent (keeps data unless `--purge`) |\n\nEvery client command accepts `--server <profile>` to pick a configured server, or `--host`/`--user`/`--key` to connect without a config file.\n\n## How It Works\n\n```text\ndeveloper machine / CI                      Raspberry Pi\n┌──────────────────┐                 ┌────────────────────────────────┐\n│    rpi  (CLI)    │    ssh tunnel   │      rpi agent  (systemd)      │\n│  reads rpi.toml  ├────────────────▶│  /run/rpi/agent.sock           │\n└──────────────────┘                 │  SQLite state · port allocator │\n                                     │  git fetch → compose build     │\n                                     │  → up -d → health → ingress    │\n                                     └────────────────────────────────┘\n```\n\n- `rpi agent run` is a daemon on the Pi, managed by `systemd`. It stores state in SQLite, selects a stable host port from `port_min..port_max`, writes a Compose override binding `127.0.0.1:<host-port>`, runs `docker compose build`, then `docker compose up -d --remove-orphans`, and health-checks the result.\n- `rpi deploy`, `rpi ls`, `rpi secrets …`, and the other client commands run on a developer machine or CI runner and open an SSH tunnel to the agent's Unix socket.\n- Deployments queue latest-wins: pushing a newer deploy supersedes the one in progress.\n- Each deployable project carries an `rpi.toml` at its root. Run `rpi deploy` from the root of *that* project — not from this repository.\n\n## Installation\n\nClient and agent ship in the same npm package; the role comes from what you run after installing. On install the package downloads a prebuilt binary from the matching GitHub Release (Windows x64, Linux x64, Linux aarch64) and verifies its SHA-256 checksum. On other platforms, or when the download fails, it builds the bundled Rust sources (`cargo build --release --locked`; rustup is installed automatically if needed). Set `RPI_DEPLOY_BUILD_FROM_SOURCE=1` to force the source build. Installing with `--ignore-scripts` leaves the CLI unusable — as does npm's `allow-scripts` gate on recent versions, see [Troubleshooting](#troubleshooting).\n\nUpdate on both roles:\n\n```bash\nnpm install -g rpi-deploy@latest  # with sudo on the Pi, unless npm is nvm-managed\nsudo rpi agent setup              # Pi only: swaps the binary and restarts the agent\n```\n\n> [!NOTE]\n> If Node.js comes from `nvm` (or another per-user version manager), `sudo npm`/`sudo rpi` won't be found — `sudo` resets `PATH`. Install without `sudo` and forward `PATH` for the one command that needs root:\n>\n> ```bash\n> npm install -g rpi-deploy\n> sudo env \"PATH=$PATH\" rpi agent setup\n> ```\n>\n> `agent setup` self-installs the binary to `/usr/local/bin/rpi`, which is on root's default `PATH`, so every later `sudo rpi …` works without the wrapper.\n\nUpgrading from v0.5? The command was renamed `pi` → `rpi` and the project config `pi.toml` → `rpi.toml` (hard cutover). See [docs/migration-v0.5-to-v0.6.md](docs/migration-v0.5-to-v0.6.md).\n\n### Installing without npm\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/khmilevoi/rpi-deploy/master/scripts/install.sh | sh\n```\n\nDownloads and verifies the prebuilt binary and installs it to\n`/usr/local/bin` (override with `RPI_INSTALL_DIR`); `RPI_VERSION` pins a\nversion (default: latest). It does not run setup — follow with\n`sudo rpi agent setup` on a Pi, or `rpi setup` on a dev machine.\n\n<details>\n<summary><b>Build from source</b> (instead of npm)</summary>\n\n**On the Pi** (simple, but slow on smaller boards):\n\n```bash\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource \"$HOME/.cargo/env\"\n\ngit clone https://github.com/khmilevoi/rpi-deploy.git\ncd rpi-deploy\ncargo build --release\nsudo install -m 755 target/release/rpi /usr/local/bin/rpi\n```\n\n**Cross-build on the developer machine:**\n\n```bash\ncargo install cross\ncross build --release --target aarch64-unknown-linux-gnu\nscp target/aarch64-unknown-linux-gnu/release/rpi pi-user@pi-host.local:/tmp/rpi\n# then on the Pi:\nsudo install -m 755 /tmp/rpi /usr/local/bin/rpi\n```\n\n**CLI on the developer machine:**\n\n```bash\ncargo install --path crates/bin --locked\n```\n\nIf `rpi` is not found afterwards, add `~/.cargo/bin` (`%USERPROFILE%\\.cargo\\bin` on Windows) to `PATH`.\n\n</details>\n\n<details>\n<summary><b>SSH access</b> — creating and installing a key</summary>\n\nThe CLI needs passwordless SSH to the Pi. Create a key on the developer machine:\n\n```bash\nssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_pi        # PowerShell: $env:USERPROFILE\\.ssh\\id_ed25519_pi\n```\n\nAppend the public key to `~/.ssh/authorized_keys` on the Pi (for the user the CLI will log in as), then test:\n\n```bash\nssh -i ~/.ssh/id_ed25519_pi pi-user@pi-host.local true\n```\n\nOptionally add an SSH profile:\n\n```sshconfig\nHost pi-home\n    HostName pi-host.local\n    User pi-user\n    IdentityFile ~/.ssh/id_ed25519_pi\n    IdentitiesOnly yes\n```\n\n</details>\n\n## Client Configuration\n\nThe CLI reads its config from the user config directory:\n\n- Windows: `%APPDATA%\\pi\\config.toml`\n- macOS/Linux: `~/.config/pi/config.toml`\n\n`rpi setup` creates this file for you; the format is:\n\n```toml\ndefault = \"home\"\n\n[servers.home]\nhost = \"pi-host.local\"\nuser = \"pi-user\"\nkey = \"~/.ssh/id_ed25519_pi\"\n```\n\nSelect a profile per invocation with `--server home` or `PI_SERVER=home`; skip the file entirely with `--host`/`--user`/`--key` (useful in CI). Check the connection with `rpi ls` — with no projects deployed yet it prints `▸ no projects deployed yet`.\n\n### Console theme\n\nOutput uses the raspberry brand theme: a `▸` marker on every message line, the site's green/amber for success/warn, and a pink-to-raspberry triangle banner on `rpi deploy`, bare `rpi`, and `rpi --version`. The banner only appears on an interactive terminal — piped and CI output stays plain. On truecolor terminals (`COLORTERM=truecolor`) colours render as the exact brand `#C51A4A`. Set `PI_THEME=classic` for the pre-brand look; `NO_COLOR` and non-TTY output disable styling entirely.\n\n## Project Configuration: `rpi.toml`\n\nAdd `rpi.toml` to the root of the project you want to deploy (`rpi init` generates it):\n\n```toml\nschema = 1\n\n[project]\nname = \"example-web\"            # Compose project name and the agent's state key\n\n[source]\nrepo = \"git@github.com:you/example-web.git\"\nbranch = \"main\"                 # default ref for `rpi deploy`\n\n[build]\ncompose = \"docker-compose.yml\"  # Compose file inside the repository\n\n[ingress]\nservice = \"web\"                 # Compose service that receives traffic\nport = 3000                     # port inside the container\nhostname = \"app.example.com\"    # optional: public ingress (Cloudflare Tunnel)\n# expose = \"lan\"                # optional: bind 0.0.0.0 instead of 127.0.0.1\n\n[healthcheck]\npath = \"/health\"                # omit for a plain TCP probe\nexpect = \"200\"\ntimeout = \"60s\"\n\n[secrets]\nenv = \".env\"                    # optional, default \".env\"\nfiles = [                       # optional; recreated at the same paths on the Pi\n  \"certs/server.pem\",\n]\n# file_mode = \"0640\"            # optional override; default: 0644 for files, 0600 for .env\n\n[timeouts]                      # optional per-project overrides\nfetch = \"3m\"\nbuild = \"45m\"\nup = \"2m\"\n# command = \"30m\"               # for `rpi command`, default 10m\n```\n\nFor a worker, bot, or internal service that needs no public HTTP ingress, simply omit `ingress.hostname`.\n\nField notes:\n\n- `healthcheck.path` is probed through the allocated host port; without a path the agent uses a TCP probe.\n- `secrets.files` are sent encrypted, stored age-encrypted on the agent, and written `0644` (readable beyond the agent's own account, because a container running as its image's own uid needs to read a bind-mounted secret) into the checkout on every deploy; `secrets.env`'s `.env` file stays `0600`. Paths are relative with forward slashes; `..` is rejected.\n- `secrets.file_mode` overrides both of the modes above with one value — accepted forms are `\"0644\"`/`\"644\"` (owner read, optionally write; group/other read only; no execute or setuid/setgid/sticky bits). It requires an agent `>= 0.26.0` (the `secret-modes` capability) and, since the mode travels with the bundle, only takes effect on the next `rpi secrets push` — a `rpi deploy` that reuses an already-stored bundle keeps whatever mode that bundle was sent with.\n- `expose = \"lan\"` binds the host port on `0.0.0.0`. On a host with a public IPv4 that means the public internet, and Docker bypasses host firewalls (UFW/iptables) for published ports — use it only on trusted networks or behind an external firewall.\n\n### `[commands]` — admin commands (optional)\n\nOne-off admin commands runnable inside the service container with `rpi command`:\n\n```toml\n[commands]\ncreate-invite = \"node scripts/create-invite.js\"\nmigrate = [\"npx\", \"prisma\", \"migrate\", \"deploy\"]\nbackup = \"sh -c 'pg_dump mydb | gzip > /data/backup.gz'\"\n\n[commands.seed]                       # table form: pin a different service\nrun     = \"node dist/scripts/seed.cjs\"\nservice = \"server\"                    # optional; omitted => ingress service\n```\n\n- Values are a string (split with shell-word rules — quotes work, but no variables/pipes/redirects; need a shell? spell out `sh -c '…'`) or an explicit argv array. Names must match `[a-z0-9][a-z0-9_-]*`.\n- Commands are registered on the agent **at deploy time** and run via `docker compose exec -T` in the `ingress.service` container by default. The agent only executes deployed commands — there is no generic remote exec.\n- `rpi command` (no name) lists the deployed commands; extra args after `--` are appended to the declared argv. The remote exit code becomes the `rpi` exit code. Ctrl+C detaches and best-effort kills the run.\n- Output streams to stdout line by line as the command runs — complete and untruncated, with no pane or tail window — so `rpi command migrate > migrate.log` captures exactly what ran. Only the closing verdict goes to stderr. (v0.25 removed `--full`, which existed for the old windowed pane — see [the migration note](docs/migration-command-full-flag.md).)\n\n## Configuration Variables\n\nAny string field of `rpi.toml` can carry a `${...}` reference. Three namespaces, told apart by syntax alone:\n\n```toml\n[source]\nbranch = \"${BRANCH_NAME}\"                        # --vars BRANCH_NAME=feature/login\n\n[ingress]\nhostname = \"${env.slug}.preview.example.com\"     # resolver input; env.* needs --env\n\n[commands]\nbackup = \"sh -c 'tar -C $${HOME} -czf /b.tgz .'\" # $${ is a literal ${, left for the shell\n```\n\n- `${NAME}` — a **user variable** from `--vars NAME=VALUE` (repeatable). Names match `^[A-Z][A-Z0-9_]*$`; nothing is special-cased. `--vars` works with or without `--env`, and a key nothing references is an error, so a typo can't pass silently.\n- `${ns.field}` — a **resolver input**: `${git.branch}`, `${git.sha}`, `${git.short_sha}`, and (with `--env`) `${env.name}`, `${env.slug}`. `${git.*}` is read lazily, only when referenced, so a config that uses none still works outside a repository; a detached `HEAD` is an error telling you to pass the branch via `--vars` rather than silently becoming `HEAD`.\n- `RPI_*` — **runtime variables**, injected by the agent into every container and into `rpi command`'s exec: `RPI_PROJECT`, `RPI_PROJECT_BASE`, `RPI_ENV`, `RPI_ENV_SLUG`, `RPI_BRANCH_NAME`, `RPI_HOSTNAME`, `RPI_HOST_PORT`, `RPI_COMMIT_SHA`. They exist only at runtime — writing `${RPI_...}` in `rpi.toml` is an error — but `${RPI_*}` interpolates in your own `docker-compose.yml`. `rpi config show` prints them as a `[runtime]` preview. Needs an agent `>= 0.27.0`; an older one still deploys, it just injects nothing.\n\n`${...}` is not allowed in `[project].name` (the project key must stay static). `source.branch` is resolved first, `${env.slug}` derives from the result, then every other field is resolved; substituted values are validated afterwards, which is why a raw branch name in `ingress.hostname` fails the DNS check and `${env.slug}` exists.\n\n## Environments\n\nAn overlay file `rpi.<env>.toml` next to `rpi.toml` deploys the same project under a distinct key — a shared `test` environment, or an ephemeral per-branch preview — without duplicating the whole config:\n\n```toml\n# rpi.preview.toml\n[source]\nbranch = \"${BRANCH_NAME}\"\n\n[ingress]\nhostname = \"${env.slug}.preview.example.com\"\n\n[environment]\nttl = \"72h\"                 # optional; the reaper destroys it once expired\non_create = \"migrate\"       # optional; runs once, after the first successful health check\n```\n\n```bash\nrpi deploy --env preview --vars BRANCH_NAME=feature/login\n```\n\n- The overlay merges onto the base field by field — scalars replace, tables merge key by key, `[commands]` and array fields replace wholesale, and an explicit `\"\"` resets a field to unset. The deployed project key becomes `<base>--<env>`, or `<base>--<env>--<slug>` when the config references `${env.slug}`, and its hostname must differ from the base project's.\n- `rpi config show --env preview --vars BRANCH_NAME=feature/login` prints the fully resolved config, plus a `[runtime]` preview of the `RPI_*` variables, without touching the agent — the way to check what a deploy would actually send.\n- `rpi env destroy`/`reset-data` take the same `<env>` and `--vars` as the deploy; when the overlay is gone or no longer resolves, `--full-key <key>` (from `rpi env ls`) targets an environment without reading any config file.\n- `rpi env ls` without `--all` resolves the base `rpi.toml` just to learn the project name it filters by, so it takes `--vars` too; `rpi env ls --all` reads no config file at all and is the way out if that resolution fails.\n- When `source.branch` is computed from a variable but nothing references `${env.slug}`, the resolver warns that the key stays `<base>--<env>` — every branch deploying that environment would share it.\n- With no TTL, an environment lives until `rpi env destroy` removes it. With one, the agent's reaper tears it down on its own once it's past due (`agent.toml`'s `[environments] reap_interval`, default 1h) — as long as it isn't mid-deploy.\n- `on_create` runs exactly once per environment key, after the first successful health check; `rpi env reset-data` clears the flag so the next deploy re-runs it against a clean database.\n\n## Docker Compose Requirements\n\nThe agent publishes your service by writing an override file:\n\n```yaml\nservices:\n  web:\n    ports:\n      - \"127.0.0.1:8000:3000\"\n```\n\nSo the production Compose file should **not** pin a fixed host port itself — that can conflict with the agent's allocator or another project on the same Pi. Use `expose`:\n\n```yaml\nservices:\n  web:\n    build:\n      context: .\n    expose:\n      - \"3000\"\n```\n\nFor runtime files (logs, SQLite, uploads), mount directories instead of individual files that may not exist in a fresh clone, and git-ignore them:\n\n```yaml\nservices:\n  app:\n    environment:\n      DATABASE_URL: file:///data/app.db\n    volumes:\n      - ./data:/data\n```\n\n## Secrets\n\nIf `rpi.toml` has a `[secrets]` section, push the bundle from the project root before the first deploy:\n\n```bash\nrpi secrets push          # save to this project's own bundle; applied by the next deploy\nrpi secrets push --apply  # save and restart the running stack with the new values\nrpi secrets ls            # list the effective merged secrets (never values)\n```\n\n`rpi secrets send` still works as a deprecated alias for `rpi secrets push` with no `--group`.\n\nThe CLI reads the local env file and `[secrets].files`, sends them encrypted, and the agent stores an age-encrypted bundle in `/var/lib/rpi/secrets`. During `rpi deploy` the agent writes them into the project workdir before running Docker Compose. No command or endpoint ever returns a secret value — only names, paths, sizes, revisions and digests, whether pushing, listing, or diffing.\n\n**Secret groups** are a named, reusable set of secrets owned by a base project and attached from `[secrets].groups = [\"shared\"]` in `rpi.toml`, so a new branch preview picks them up on its first deploy instead of needing its own upload:\n\n```bash\nrpi secrets push --group shared  # push (or rotate) the named group once\nrpi secrets group ls             # this project's groups and who attaches each one\nrpi secrets group rm shared      # delete a group (type its name to confirm, or pass --yes)\n```\n\nDeclared groups apply in the order listed, then this deploy key's own bundle on top; a declared group that is missing or empty fails the deploy naming the group. Every push is a conditional write guarded by a revision — a stale push is refused with an HTTP 409 unless `--force` is passed. Deleting a group asks for its name to be typed back (`--yes` skips that; `--force` is a different waiver — \"delete even though a project still declares it\"). Groups require an agent `>= 0.27.0` (the `secret-groups` capability), including for a `rpi deploy` whose `rpi.toml` declares any; `rpi rm <project>` on a base project drops its groups, but `rpi env destroy` never does.\n\nBy default `.env` is written `0600` and every file from `[secrets].files` is written `0644` — deliberately wider, because a container that consumes a bind-mounted secret usually runs as its own image's uid, not the agent's, and Docker has no way to `chown`/`chmod` a `file:`-sourced Compose secret on its own. Set `[secrets].file_mode` (see the sample above) to use one mode for both instead; it requires an agent `>= 0.26.0`. **The mode travels with the bundle**, so changing `file_mode` only takes effect the next time you actually push it — `rpi secrets push` (or `--apply`) — not on a plain `rpi deploy`, which just reuses whatever bundle (and mode) is already stored.\n\n## Private Git Repositories\n\nThe Pi must be able to read `source.repo`. For private repos over SSH, `rpi deploy` runs a **deploy-key preflight** before starting the pipeline:\n\n- With GitHub CLI (`gh`) logged in locally, the CLI registers a read-only deploy key for the repository automatically — the token never leaves your machine, the private key never leaves the Pi.\n- Without `gh`, it prints the agent's public key with instructions and polls every 5 s (up to 10 min) until you add it — and if you run `gh auth login` mid-wait, it switches to automatic registration on the next poll.\n- `--no-gh-key` skips the GitHub API path and always prints the key for manual setup (GitHub: *Repository → Settings → Deploy keys → Add deploy key*; write access is not needed).\n\n## Cloudflare Tunnel\n\nOnly needed when the service must be reachable from the internet; outbound-only services can skip this section.\n\n### Automatic setup (recommended)\n\nOne command bootstraps everything through the Cloudflare API — no `cloudflared tunnel login`, no `cert.pem`:\n\n```bash\nsudo rpi agent setup --with-cloudflared --cf-token-file <path> --domain <zone>\n```\n\nIt installs the `cloudflared` binary for the host's CPU, creates (or adopts) the tunnel, writes the credentials JSON and a validated `config.yml`, fills the `[cloudflare]`/`[cloudflared]` sections of `/etc/rpi/agent.toml`, and enables the `cloudflared` systemd `--user` service. After that every deploy manages tunnel routes and proxied DNS records by itself.\n\n- Pass the token via `--cf-token-file <path>`, `--cf-token-file -` (stdin), or the `CLOUDFLARE_API_TOKEN` environment variable. The inline `--cf-token` flag is deprecated (it leaks via `ps`/shell history).\n- Required token scopes: `Zone:DNS:Edit`, `Zone:Zone:Read`, `Account:Cloudflare Tunnel:Edit`. The account id is derived from the token.\n- `--tunnel <name>` overrides the tunnel name (default: derived from the hostname). `--dry-run` previews the plan.\n- The token is stored at `/var/lib/rpi/cloudflare/token` (`root:rpi-secrets`, mode `0640`).\n- A fresh install is refused when a foreign tunnel is already running on the host.\n\n### Adopting an existing tunnel\n\nIf `/var/lib/rpi/cloudflared/config.yml` already exists (a hand-built tunnel), the same command adopts it instead of recreating anything: the existing `config.yml` is **never rewritten** and `cloudflared` is **not restarted** — hand-written routes and uptime are preserved. The tunnel id is taken from the `tunnel:` key, credentials are checked at the `credentials-file:` path, and the agent config is extended so future deploys manage routes and DNS. `Zone:Zone:Read` + `Zone:DNS:Edit` scopes suffice when `tunnel:` holds a UUID.\n\n### Manual ingress\n\nWithout a `[cloudflared]` section in `/etc/rpi/agent.toml`, deploys still succeed — the agent logs the address to route manually (`hostname -> http://127.0.0.1:<host-port>`; see the port in `rpi ls`). If a project declares `[ingress] hostname` while agent ingress is disabled, the deploy summary and `rpi doctor` warn loudly so a manually-managed route is never silently mismatched.\n\n<details>\n<summary><b>Manual cloudflared configuration</b> (without the API token)</summary>\n\nA typical locally managed `cloudflared` config:\n\n```yaml\ntunnel: <tunnel-id-or-name>\ncredentials-file: /var/lib/rpi/cloudflared/<tunnel-id>.json\n\ningress:\n  - hostname: app.example.com\n    service: http://127.0.0.1:8000\n  - service: http_status:404   # must remain the catch-all\n```\n\nTo let the agent edit this config and manage DNS itself, add both sections to `/etc/rpi/agent.toml`:\n\n```toml\n[cloudflared]\nconfig = \"/var/lib/rpi/cloudflared/config.yml\"\ntunnel = \"home\"\nrestart = [\"systemctl\", \"--user\", \"restart\", \"cloudflared\"]\n\n[cloudflare]\nzone = \"example.com\"\ntoken_file = \"/var/lib/rpi/cloudflare/token\"\n```\n\n`rpi-agent` must be able to read/write `config.yml`, run the `restart` command without a password prompt, and read `token_file` (a token scoped to DNS edit + tunnel read). DNS records (proxied CNAMEs to `<tunnel-id>.cfargotunnel.com`) go through the Cloudflare API. Both sections are required — with `[cloudflared]` alone, ingress falls back to manual with a warning.\n\n</details>\n\n## Agent Management\n\n`sudo rpi agent setup` is idempotent: it creates the `rpi-agent` system user, directories, the systemd unit, and `/etc/rpi/agent.toml` if missing, repairs permissions, and never touches `secret.key` or `state.db`. Re-running it is always safe; `--dry-run` previews.\n\n### Updating the agent\n\nUpdate the rpi binary on a board to a chosen version from your laptop:\n\n```bash\nrpi upgrade                 # bring the board up to this CLI's version\nrpi upgrade --version 0.22.0\nrpi upgrade --version latest --yes\n```\n\n`rpi upgrade` opens `ssh -t <user>@<host> sudo rpi agent update --version <X>`,\nso a board whose sudo needs a password will prompt in your own terminal. It\nreuses your existing SSH profile (`--server` / `PI_SERVER` / default), shows\n`current → target`, and re-reads `/v1/version` afterwards to confirm. It needs\nreal SSH access to the board, so it doesn't apply to the local-dev override and\nerrors out if `PI_AGENT_URL` is set.\n\nOn the board, `rpi agent update` downloads the release archive\n(`rpi-v<version>-<triple>.tar.gz`) from GitHub Releases, verifies its SHA256\nagainst the release `SHA256SUMS`, swaps `/usr/local/bin/rpi`, re-runs the\nidempotent `rpi agent setup`, and restarts `rpi-agent`. If the board was\ninstalled via npm, it refreshes the global `rpi-deploy@<version>` instead.\n\nFor unattended updates, add a narrow sudoers rule (not blanket NOPASSWD):\n\n```\n<login-user> ALL=(root) NOPASSWD: /usr/local/bin/rpi agent update *\n```\n\nHost-level upgrades run through a uniform migration framework:\n\n```bash\nrpi agent migrate --list        # every migration and whether it's applied\nrpi agent migrate --dry-run     # plan only\nrpi agent migrate --run <id>    # apply a specific (disruptive) migration\nrpi agent migrate --all --yes   # apply everything pending\n```\n\nApplied migrations are recorded in `state.db` and never re-run. Non-disruptive ones run automatically during `rpi agent setup`; disruptive ones are only reported there and must be applied explicitly. (Currently registered: `pi-to-rpi`, renaming a legacy `pi-agent` install.)\n\n<details>\n<summary><b>Manual agent install</b> (what <code>rpi agent setup</code> does for you)</summary>\n\nCreate the service user and directories:\n\n```bash\nsudo useradd --system --no-create-home --shell /usr/sbin/nologin rpi-agent || true\nsudo usermod -aG docker rpi-agent\nsudo usermod -aG rpi-agent \"$USER\"   # tunnel access to the socket; re-login after\n\nsudo install -d -m 0750 -o rpi-agent -g rpi-agent /var/lib/rpi\nsudo mkdir -p /etc/rpi\n```\n\nCreate `/etc/rpi/agent.toml`:\n\n```toml\ndata_dir = \"/var/lib/rpi\"\nsocket = \"/run/rpi/agent.sock\"\nport_min = 8000\nport_max = 8999\nbuild_concurrency = 1\nhistory_keep = 50\n\n[timeouts]\nfetch = \"2m\"\nbuild = \"30m\"\nup = \"5m\"\n\n[gc]\ndisk_threshold_percent = 85\n```\n\nCreate `/etc/systemd/system/rpi-agent.service`:\n\n```ini\n[Unit]\nDescription=pi deploy agent\nAfter=network-online.target docker.service\nWants=network-online.target\n\n[Service]\nUser=rpi-agent\nGroup=rpi-agent\nExecStart=/usr/local/bin/rpi agent run --config /etc/rpi/agent.toml\nRuntimeDirectory=pi\nRuntimeDirectoryMode=0750\nRestart=on-failure\nEnvironment=HOME=/var/lib/rpi\nEnvironment=XDG_CONFIG_HOME=/var/lib/rpi/.config\nEnvironment=XDG_CACHE_HOME=/var/lib/rpi/.cache\nWorkingDirectory=/var/lib/rpi\n\n[Install]\nWantedBy=multi-user.target\n```\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable --now rpi-agent\n```\n\n`rpi-agent` is intentionally created without a home directory; the `HOME`/`XDG_*` variables keep Docker/BuildKit from writing to a missing `/home/rpi-agent`.\n\n</details>\n\n## Development\n\n```bash\ncargo test --workspace\n```\n\n### Full Docker end-to-end test\n\nThe production-path e2e test builds the current `rpi` once, starts an isolated\ntarget with real SSH and `/run/rpi/agent.sock`, and deploys a local Git fixture\ninto a dedicated Docker-in-Docker daemon:\n\n```bash\nnpm run test:e2e\n```\n\nRequirements: Node.js 18+, Docker Desktop using Linux containers (or Docker\nEngine on Linux), Docker Compose 2.33.1+, and support for privileged Linux\ncontainers. The command starts a **privileged** `docker:28-dind` service, but it\ndoes not mount the host Docker socket or publish test ports to the host.\n\nThe scenario covers `rpi deploy` over SSH, the agent Unix socket, real Compose\nbuild/up, HTTP health, a stable second deploy, `rpi ls`, and `rpi rm`. It does\nnot cover systemd installation, Cloudflare, secrets, private Git, or ARM.\n\nOn failure, inspect `target/e2e-artifacts/<run-id>`. The launcher records build,\nouter Compose, agent, nested Docker, scenario, and cleanup diagnostics before it\nremoves the run's containers, networks, and volumes. Set `RPI_E2E_KEEP=1` to\nkeep a run's stack around for inspection; the launcher prints the cleanup\ncommand.\n\n### Manual dev stack\n\n`npm run e2e:dev:up` starts the same topology plus a long-lived `client-dev`\ncontainer (Compose profile `dev`, fixed project name `rpi-e2e-dev`):\n\n```bash\ndocker exec -it rpi-e2e-dev-client-dev-1 bash   # rpi CLI + SSH key\ndocker exec -it rpi-e2e-dev-target-1 bash       # agent + sshd + nested Docker\n```\n\nInside `client-dev`, run `source /opt/e2e/lib.sh && e2e_client_init` once, then\nuse `rpi <cmd> --host target --user deploy --key /run/e2e-keys/id_ed25519`.\n`npm run e2e:dev:down` removes the dev stack and its image.\n\nRun a local TCP agent and point the CLI at it:\n\n```bash\ncargo run -p pi -- agent run --config dev/agent.toml\nexport PI_AGENT_URL=\"http://127.0.0.1:7700\"   # PowerShell: $env:PI_AGENT_URL = \"http://127.0.0.1:7700\"\n```\n\n## Troubleshooting\n\n### `npm warn allow-scripts …` / `rpi: binary not built`\n\nnpm blocked the `postinstall` script that installs the binary. Reinstall with the script allowed:\n\n```bash\nnpm install -g --allow-scripts=rpi-deploy rpi-deploy       # add sudo for a system-wide npm\nnpm config set allow-scripts=rpi-deploy --location=user    # persist for future updates\n```\n\n`npm approve-scripts` does not work for a global install (`EGLOBAL` — no project `package.json`).\n\n### `sudo: npm: command not found` / `sudo: rpi: command not found`\n\nNode.js is nvm-managed and `sudo` resets `PATH`. Install without `sudo`, then `sudo env \"PATH=$PATH\" rpi agent setup` once — see the note in [Installation](#installation).\n\n### `rpi ls` does not connect\n\nCheck SSH from the developer machine, then the agent on the Pi:\n\n```bash\nssh -i ~/.ssh/id_ed25519_pi pi-user@pi-host.local true\n\nsystemctl status rpi-agent\njournalctl -u rpi-agent -n 100 --no-pager\nls -l /run/rpi/agent.sock\ngroups \"$USER\"      # must include rpi-agent; open a new SSH session after adding\n```\n\nOn the Pi itself the agent answers directly:\n\n```bash\ncurl --unix-socket /run/rpi/agent.sock http://localhost/v1/version\n```\n\n### Clone fails with `Permission denied (publickey)`\n\nThe Pi cannot authenticate to `source.repo`. Add the deploy key printed by the preflight (or the fetch stage), or configure another SSH key with read access, then rerun `rpi deploy`.\n\n### Docker build fails with `/home/rpi-agent` errors\n\nThe systemd unit must set `HOME=/var/lib/rpi` and the `XDG_*` variables (see the manual install section above), then:\n\n```bash\nsudo systemctl daemon-reload && sudo systemctl restart rpi-agent\n```\n\n### Docker permission denied\n\n```bash\nsudo usermod -aG docker rpi-agent\nsudo systemctl restart rpi-agent\n```\n\n### Compose does not see secrets\n\nRun `rpi secrets push` before `rpi deploy` (or `rpi secrets push --apply` for a running project). If `rpi.toml` declares `[secrets].groups`, `rpi secrets ls` shows the effective merged set and where each entry comes from.\n\n### Health check fails\n\nThe app must listen on `0.0.0.0` inside the container; `[ingress].port` must match the container port; `[healthcheck].path` must exist and answer with `[healthcheck].expect`. On the Pi: `docker compose -p <project> ps` and `curl http://127.0.0.1:<host-port>/health`.\n\n### Host port is in use\n\nA fixed host `ports:` mapping in the Compose file conflicts with the agent's allocator. Remove it and use `expose` — see [Docker Compose Requirements](#docker-compose-requirements).\n\n### CLI and agent versions differ\n\nThe CLI warns when its version differs from the agent's. Update both sides to the same release: `npm install -g rpi-deploy@latest` on both, plus `sudo rpi agent setup` on the Pi.\n\n## Documentation\n\n- [CI deploys with GitHub Actions](docs/ci-github-actions.md)\n- [Migration: `pi` → `rpi` (v0.5 → v0.6)](docs/migration-v0.5-to-v0.6.md)\n- [Migration: `[env]` → `[secrets]`](docs/migration-env-to-secrets.md)\n- [Migration: `rpi command --full` removed (v0.25)](docs/migration-command-full-flag.md)\n- [Migration: configuration variables reach every field (v0.27)](docs/migration-config-variables.md)\n- [Release notes](https://github.com/khmilevoi/rpi-deploy/releases) — full version history\n\n## License\n\n[MIT](LICENSE) © khmilevoi\n","readmeFilename":"README.md"}