{"_id":"@apoorvdarshan/crossposter","_rev":"24-ae0d505f6c1ae1a06bde3a8ef3fa8c68","name":"@apoorvdarshan/crossposter","dist-tags":{"latest":"1.1.16"},"versions":{"0.1.0":{"name":"@apoorvdarshan/crossposter","version":"0.1.0","license":"MIT","_id":"@apoorvdarshan/crossposter@0.1.0","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"de6deb0398cff17189558c63d41d79ae485db877","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-0.1.0.tgz","fileCount":80,"integrity":"sha512-xRoPuSTmcTOP8XyfiBQdq4EJJucaz26652FOamhXHzb0eQIDbdyFpfCUqyc0dGjsSMAaWPOX8ULK0ls2hRaafQ==","signatures":[{"sig":"MEYCIQCEMkZPOoBCt/gFhEXZjkw960jxUU64uxi0+r7E7VaAQQIhALEqlzk5QHSqxBlrHOLyi6z9VTH+xd+nr++LVKWb8po6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":935157},"gitHead":"30650f428215a6c26a2f8f07a8f6ddf48d8f7fec","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.12.1","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_0.1.0_1780688890382_0.9971787108359058","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@apoorvdarshan/crossposter","version":"1.0.0","license":"MIT","_id":"@apoorvdarshan/crossposter@1.0.0","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"d23c6571fb1f909342851b137fef88c3b0ea4274","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.0.0.tgz","fileCount":80,"integrity":"sha512-pTuBF4viYIQ5KRClKV2a1TxGtVMPOG/yFxd1+F/AvB+y/GFN+f1Y6bemUNXv0+kdQ8G0KS6Q6tEdMLvO6/oTYQ==","signatures":[{"sig":"MEUCIQDT3oJT0YEb9DMaDuaOAEx4Qg77+bqqQm1+Hh31RxBcOwIgVz7PBqhv7/QBMWXuEnlCbD5Kd/aONLwXccAYcxshYtw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":940997},"gitHead":"b91847b8a5c619471a18446f6967dbf80988fa67","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.12.1","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.0.0_1780694370534_0.7324270577621854","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@apoorvdarshan/crossposter","version":"1.0.1","license":"MIT","_id":"@apoorvdarshan/crossposter@1.0.1","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"47264a03c32530188c810b26d015dd7c74eda5f7","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.0.1.tgz","fileCount":80,"integrity":"sha512-10V4xf0SBa2Vb1rwKEmCijCurwg+4mGII9otf8tcJ3KDy8HRF2lE9FvEQ1esPM+ltBcEcT2ikpbihtMmVuXYBA==","signatures":[{"sig":"MEUCIQC1+68hmaIJSx2HTO3fQ55ZBWIhmyy5+5zvuXy8KM3fegIgCxqBAXZpiohCuCO6J7g+z1JRJ70bdj47rgJcGC3+KRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":941252},"gitHead":"318dc7c414ba55e4c6651f31ef71c1168100fc57","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.12.1","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.0.1_1780695107056_0.16956571708401613","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@apoorvdarshan/crossposter","version":"1.0.2","license":"MIT","_id":"@apoorvdarshan/crossposter@1.0.2","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"1b267a513e298995b3b85eb63838bced1022f035","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.0.2.tgz","fileCount":80,"integrity":"sha512-z3pVWOrTCXFRb5g7jk9xuhB6XWV3cwv3fCIb8uEoXWpXrGEFl+UJiM2ovXbv2IcYMiJddbQnGbIL6vzf4fsZ7g==","signatures":[{"sig":"MEUCIQC2DOlEQ8Nz8/kkmG0qlx8801KXYlTR9R250cpl6jo0jAIgKVPEmOhfAbFx9tHf2aNSF2KNZLbQOHIcwGOyrjFMmOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":941416},"gitHead":"87a60b7898327a5104599c6f4275331d884ed4cb","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.12.1","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.0.2_1780699128022_0.7383654126082739","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@apoorvdarshan/crossposter","version":"1.0.3","license":"MIT","_id":"@apoorvdarshan/crossposter@1.0.3","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"3f793d4f414fa11331a03d1893c464ae07c2e2a6","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.0.3.tgz","fileCount":81,"integrity":"sha512-snqod7RBdXSEwLbK9fP8I0Eo1HLRSXt+FfqKr9xhRwKSg5yW45KJGaVK8+wet8c1SjG0iqItRAWcWUsW/A6OrQ==","signatures":[{"sig":"MEQCIE/m0wNeHSQ696m5q4fnF6G+jjWt0qKq3fKWQjxe8aoDAiBCJ8SbuMaL3bh0FaSv6Mdcu/HDoGvGs8II5jBDcjrVng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953637},"gitHead":"b8c258b2887089c0218b67e202e8b2e048d089fa","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.12.1","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.0.3_1780950783853_0.7695460309164712","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@apoorvdarshan/crossposter","version":"1.1.0","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.0","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"f2b5e17a580a3e7342d6fe7176d3cc4c32bc9d3d","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.0.tgz","fileCount":87,"integrity":"sha512-3N29IwJGsg2fXk96rOoO69obfQuuSG2nbjmX1hN1ahw+peV8YtNNUZ3NSgDC+hDZ46D1BtrhavShS863n83Jug==","signatures":[{"sig":"MEQCIDauaaJ1ymeVQinNA9X9grgGZnM0TW4xZVN+qjVUYoqEAiAut/ZOVNnPk/hjbCGM8oybN9vFc/6A9lGyJcFkQgKIIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":989858},"gitHead":"3a512677dcc4b9ff32bd2a0b4020500618b5e25b","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.0_1781054650569_0.7383192396872877","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@apoorvdarshan/crossposter","version":"1.1.1","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.1","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"a7cbcf84656c4646bdeb214f5e78735576625b99","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.1.tgz","fileCount":88,"integrity":"sha512-DcS03dZyn47yyC0MB2oyUjKJHY1vb4coSpCDI8L7UJjz39rci7Ge404TYUQSw1l41lFIGRcl4oHfZjFJ0/afdg==","signatures":[{"sig":"MEUCIAvRK8TpjGnZVWORlhbdjIfWoz7xPNF2JfxeWzwKKt2XAiEAldWAgq8bJVMOz9Sp/gfAIiWYUSint/9M+uoea0TdSPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1003830},"gitHead":"9e22a12de0bcc0f1af3c9e36797e8c4b6251f25d","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.1_1781122342032_0.404624916390401","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@apoorvdarshan/crossposter","version":"1.1.2","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.2","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"3036c04e70972d71695503189d39ab0eb3155967","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.2.tgz","fileCount":88,"integrity":"sha512-CqiQUpsJqPz8N8RP7KYsUHxzbKOxcjzYzZhKPWyj/wq8uyhmH1d3lmYskwMcqw43fhMGOqvr/ZbtkHGGu8fdBw==","signatures":[{"sig":"MEUCIQDiARWOrqFdBHps1WXM4v9e/9WszLJa74oBg5tzPNQ0+AIgLpFMJZ0KlYh5fiVhXySm5CFzimdGiB+iDpdMgDJgSjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1004545},"gitHead":"6019d1f512feead2f76f9772b76d118da5882212","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.2_1781209984082_0.12226513374331582","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@apoorvdarshan/crossposter","version":"1.1.3","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.3","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"d1fc3880c89f72a66789b576f58853ddf748f8cd","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.3.tgz","fileCount":88,"integrity":"sha512-Ypf03383RuRHpe63KA9RGuFqLuw128MyaZyyaZ3i0Z7KNb1sRWgmIemI1b9bazzzyCaNfr0CsfU2dsvAQ9E+Nw==","signatures":[{"sig":"MEYCIQDHS/MFSLSgn4Ko0adLgR3Cna+cmQhtJsCxG1bQAiZ2jAIhAPdYdJ3+5OAAjefRLQCvmPRgTHGVgN8Zg16xXqN0rLBY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1004753},"gitHead":"ec476268ba15b86474ee1528adf1332a951081ff","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.3_1781216727971_0.7266221766635768","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@apoorvdarshan/crossposter","version":"1.1.4","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.4","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"e1ab784f4cb8be5700db300042e8b07527270e55","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.4.tgz","fileCount":88,"integrity":"sha512-HAGEAjPMunX+/FkJSCQwWPLnAiZ7A/5Rkg/6UakXkpZ5aHr+7lS13S3Y8UoDHuJL/QuGNEiI42tY7jGToiEEMg==","signatures":[{"sig":"MEUCIQD0JkItj5w+N0sa8z1muFj8KHSL01RvegolStKSpd/iqwIgI658D065BPUn82T4Plla7riAMVhXhsWu9j4LcfIMtlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1008869},"gitHead":"6ec1c7e464409c59bf82d3dac6f1b7e94d2beebe","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.4_1781270679577_0.9993808567859503","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@apoorvdarshan/crossposter","version":"1.1.5","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.5","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"2861901d78d7c04bb4e5b3cb7b8135e3ce671b41","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.5.tgz","fileCount":88,"integrity":"sha512-B5pccQCQikej+Ni/7iRbZ3EZEihqsC+IhROe5O7INf0IUKd6xHIoyzatHWaMR5rA2PSXRKggNiwlmyv1fS94cQ==","signatures":[{"sig":"MEYCIQCGwAoCd/byQM2VU6HlcsveR/QrCdSTWLFwFO3hqZLAGQIhAOeQl6tBR075nMAo0jRgOgsK9Xr67RiF9+Nu94Vue9j2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010513},"gitHead":"a9ebcd392d2a18539e9328feb4c28efaf0472da2","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.5_1781467780353_0.3900824949508941","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@apoorvdarshan/crossposter","version":"1.1.6","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.6","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"76db087002baf3a12e6525192ebf45aef0bee0e1","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.6.tgz","fileCount":95,"integrity":"sha512-flioIyu7lVXw8OmS6m3iM6lrTmfzWlMJ06Dn/KOXmH9XW+uoyCEAfEf2jAJQ7TNtiMrDlTgtWV2bLI5D8r/2sg==","signatures":[{"sig":"MEUCIQCE4LKswNX0LrS0iHZxwGxSQgfSr+hYaCilag7GWJTDHgIgOOPkXpUPpdNSkikuVr2V4U4r0WVOuyzfVeGlMaNhWrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1055255},"gitHead":"1598cefc0aa4663f331e48644a43797eb6cbe557","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.6_1782096319184_0.1443856938106982","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@apoorvdarshan/crossposter","version":"1.1.7","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.7","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"a8d77fd131010b40a1ea73df6698de66b42bce73","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.7.tgz","fileCount":96,"integrity":"sha512-imKuzPtY9rS2ZwD9KTODGmw+ty2k9h+DkldogdTACPYLhWn/LESl66kxgeL5moWy2IrB0D0VZlMlUBPLTLxgEQ==","signatures":[{"sig":"MEYCIQCXaGd7z8hMw5Z6m1q8HQZ1eQZTOSyHUrrTvkirYVsPAQIhAMEAwnSDubdcRYvvM/MXTgMx/eq7RzrXntlyK1HeZd9p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073281},"gitHead":"07a68bd26708ae7910b6d92dec9664fa435da0df","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.7_1782210312705_0.8141701987678986","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@apoorvdarshan/crossposter","version":"1.1.8","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.8","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"d2f23a680f8112e41602025e151074b26b8c8b94","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.8.tgz","fileCount":95,"integrity":"sha512-KSkxnRBd8lF9kbR2HwzjvTj+qcP2PBhHjwigQhJ6z+haIF7I03WDNXptSa3/lH+hfshU04biFJXesz9J8YIrYQ==","signatures":[{"sig":"MEUCICAr1qZ661ILiPZlae2KIZL3wWd0BKX7v6Lll+EeL0rmAiEAivtFenZLvzrBrybSQ8WAR6a8KAdjM9THd4AlbDhNdF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051085},"gitHead":"3444479eefa9d5eae947e5643a76b714f71e4860","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.16.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.3.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.8_1782262425578_0.27479399289728446","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@apoorvdarshan/crossposter","version":"1.1.9","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.9","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"26e6a4b6496278175d2c27018edf77a317385465","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.9.tgz","fileCount":95,"integrity":"sha512-tRAt1pg3Sh6E8NBUy0QEw5rSX3uNMK3KP+wtKAEZbr63O256ugL5IurtJafehTvoq2UiLCpAbcmb0jHGKNQ9GA==","signatures":[{"sig":"MEYCIQDs7bz5dzmcR9LWEOOPGhH7EygflBC3a/jCy6qhXmqGaAIhAN6haS61YV+8WxiPiXboorV8dmqjzWHRCUR01zUlZF9G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1052342},"gitHead":"7db3d54b059cc036d84e5e45b77a75784053b89e","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"11.17.0","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.9_1782890435290_0.8139934134528111","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"@apoorvdarshan/crossposter","version":"1.1.10","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.10","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"aaa96af32ab1659422b36765bb806188dd64f548","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.10.tgz","fileCount":91,"integrity":"sha512-4RrsQyn51Tv2xLrXOTzmEQbJnV9Fj1+b+121vmBv+65iP0GY//W2jT5I9JBFXfYN0E7bBj1H2wyndej84wTklw==","signatures":[{"sig":"MEUCIC/1+4qtAGO/XzCGihk5+ofdn9C4OuSJ8DZbFND+eEqsAiEA/N9+gtt+i/MgqKIpnavG53lOKJcjsxVowmNUAw7fgGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1005502},"gitHead":"588770479a14bb306afe26fed67fd3e62a42266c","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.10_1783315765922_0.8940502612940748","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"@apoorvdarshan/crossposter","version":"1.1.11","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.11","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"14b616160b48915efee866907f148e45d983a77c","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.11.tgz","fileCount":91,"integrity":"sha512-wusPc3VsCA1ufLCAZ6Zkxc8b+aVOs9uotmqeOwwAJjFDe0FWZ8faNG3gVyyUYsuVtkdb1XtTfjliGvk6Q1Larg==","signatures":[{"sig":"MEYCIQC9gmyBoGum1Z5sJAd4eOkp1ctA6H8UBenPt0mFPk0M7wIhANIXb3isKRd5mlEntjOZV4VWRznVzPdOO4Ttk1JUGfzC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1005918},"gitHead":"9ad609d2910004c2d17b7ff4191411fa3207fc01","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.11_1783593240076_0.5725093736815428","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"@apoorvdarshan/crossposter","version":"1.1.12","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.12","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"69df03298e698a952ff4fa0de197021bf3825e2d","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.12.tgz","fileCount":92,"integrity":"sha512-9Yk2XWZZPtPH3y+gHpfr0TAbcVaBk+qH7tGgYgm38uwhWX8NPOC34VA4F4pfKs3EeXiSQGnM1N229AAw14YaOw==","signatures":[{"sig":"MEQCIHOJ258YX7M2BqhkdyKESV4eiCYMZ1fmUNiAhs9B3+HAAiAuu3uQX/FRqWfkzkZ95moBHOoDEVCsYNF8HP6JO2YA3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1019177},"gitHead":"0580cc3f44a986a188db6c587b8164ce61a05ce3","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh","test:browser-verification":"python3 -B -m unittest discover -s tests -p 'test_*.py'"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.12_1785862390535_0.8754759661292808","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"@apoorvdarshan/crossposter","version":"1.1.13","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.13","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"d1458eb30bc390b4b77f44ff057a1e4b62e1af4c","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.13.tgz","fileCount":92,"integrity":"sha512-LPE6koN94nFXFZ0O8yy1Y3/2GZApm8Ag4lPxwplsvBB15fzK+mGC9T008vedx8oduiPq9S6NY7Liqx8hlq00jA==","signatures":[{"sig":"MEQCIEFnt9xapWT7eOXp82s/HyYObyld+buLtAFF2q000qBJAiA6N32pjEiWTpgxKEDgYfxpjoaJy6K/TfYGRd3Trw3mNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1024750},"gitHead":"def9febf704eccf42dd758b1ea3aea715544b89e","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh","test:browser-verification":"python3 -B -m unittest discover -s tests -p 'test_*.py'"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.13_1786528139018_0.3069392596888041","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"@apoorvdarshan/crossposter","version":"1.1.14","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.14","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"9aeef45f57220ec03f88d762a81eafdb31f5373a","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.14.tgz","fileCount":92,"integrity":"sha512-sfZNRvU8fzDWGjjnVdYVeL7fYVBk28eCglvNB7HoGitZWoXRc6X2m6IRkim9AVITnHIlAGVcyvtVGMQF/rvldA==","signatures":[{"sig":"MEYCIQD6ACJNM5TUMgvkKdpoSBmtx7OInr1Rq7Ki7SHBRzD2mAIhAPxQMYi2yWdQfzjwCfGx1S4ZhjqfESIHpsW8NANZfsj+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1025339},"gitHead":"2ef4e5fcd74309ca918b90274143e5ef8df08332","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh","test:browser-verification":"python3 -B -m unittest discover -s tests -p 'test_*.py'"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.14_1786529484958_0.4669126686796523","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"@apoorvdarshan/crossposter","version":"1.1.15","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.15","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"e981833097a77319ad3dcb6c4638e1d5f1a244ca","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.15.tgz","fileCount":92,"integrity":"sha512-TX6Hjf7kcJNlNACd41CvDeOcFbRJjhEvUpMCpJp9PBmgAwj4AxB31jiy5jmoVWNKv7U5Sa3xq2A8xY+Y3+biKA==","signatures":[{"sig":"MEYCIQC6juXM72fiC0wDPNqlUUCtf526Et9L2UtXUZpFmN/AdAIhAOlMxRH/TOPYgFl2kNkrJj0ihiSXXj1whtXpf3yzGOZU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1025634},"gitHead":"c8f6a52de8e82e042e1f3981e32799e156d2af6d","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh","test:browser-verification":"python3 -B -m unittest discover -s tests -p 'test_*.py'"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"deprecated":"No longer maintained. The GitHub repository has been archived.","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.15_1786994867532_0.2604050332608798","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"@apoorvdarshan/crossposter","version":"1.1.16","license":"MIT","_id":"@apoorvdarshan/crossposter@1.1.16","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"homepage":"https://crossposter.apoorvdarshan.com","bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"bin":{"crossposter":"bin/crossposter.mjs"},"dist":{"shasum":"5da07395d5ae99e9831395bfea67b4f5c60f6266","tarball":"https://registry.npmjs.org/@apoorvdarshan/crossposter/-/crossposter-1.1.16.tgz","fileCount":92,"integrity":"sha512-nb4BCjrlo6aalrPj82wp6RDSRnkOcgjoyCowi9z5Y5e+4TmjPH16tNkGOlSSD252xqdYVWr0iJUfJENIiOvzwg==","signatures":[{"sig":"MEUCIQD1guQwZ1iz6i+h2QGEC2frpUf5w3a7W9qp59x3zFeX0gIgHNk68cuvf9CULwctqtfyGCVVLucZvEPVGUCUYSOZJg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1025490},"gitHead":"458ad8a6c5848259d4d4865de97718e2070ace6f","scripts":{"dev":"next dev","lint":"eslint .","build":"next build","start":"next start","dev:local":"node scripts/run-local.mjs","typecheck":"tsc --noEmit","crossposter":"node bin/crossposter.mjs","local:install":"./scripts/install-local-service.sh","local:uninstall":"./scripts/uninstall-local-service.sh","test:browser-verification":"python3 -B -m unittest discover -s tests -p 'test_*.py'"},"_npmUser":{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"},"overrides":{"postcss":"^8.5.10"},"repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"_npmVersion":"10.9.8","description":"Local-first social publishing dashboard for accounts you control.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.1","next":"^15.1.0","react":"^19.0.0","react-dom":"^19.0.0","image-size":"^2.0.2","typescript":"^5.7.2","nostr-tools":"^2.23.5","youtubei.js":"^17.0.1","lucide-react":"^0.468.0","simple-icons":"^16.21.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.17.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.0.2","eslint-config-next":"^15.1.0"},"_npmOperationalInternal":{"tmp":"tmp/crossposter_1.1.16_1787682729858_0.2087727262450425","host":"s3://npm-registry-packages-npm-production"},"deprecated":"No longer maintained. The GitHub repository has been archived."}},"time":{"created":"2026-06-05T19:48:10.258Z","modified":"2026-09-13T09:45:47.641Z","0.1.0":"2026-06-05T19:48:10.618Z","1.0.0":"2026-06-05T21:19:30.845Z","1.0.1":"2026-06-05T21:31:47.285Z","1.0.2":"2026-06-05T22:38:48.212Z","1.0.3":"2026-06-08T20:33:04.011Z","1.1.0":"2026-06-10T01:24:10.782Z","1.1.1":"2026-06-10T20:12:22.288Z","1.1.2":"2026-06-11T20:33:04.376Z","1.1.3":"2026-06-11T22:25:28.190Z","1.1.4":"2026-06-12T13:24:39.766Z","1.1.5":"2026-06-14T20:09:40.548Z","1.1.6":"2026-06-22T02:45:19.331Z","1.1.7":"2026-06-23T10:25:12.872Z","1.1.8":"2026-06-24T00:53:45.790Z","1.1.9":"2026-07-01T07:20:35.453Z","1.1.10":"2026-07-06T05:29:26.066Z","1.1.11":"2026-07-09T10:34:00.264Z","1.1.12":"2026-08-04T16:53:10.683Z","1.1.13":"2026-08-12T09:48:59.185Z","1.1.14":"2026-08-12T10:11:25.165Z","1.1.15":"2026-08-17T19:27:47.708Z","1.1.16":"2026-08-25T18:32:10.131Z"},"bugs":{"url":"https://github.com/apoorvdarshan/crossposter/issues"},"license":"MIT","homepage":"https://crossposter.apoorvdarshan.com","repository":{"url":"git+https://github.com/apoorvdarshan/crossposter.git","type":"git"},"description":"Local-first social publishing dashboard for accounts you control.","maintainers":[{"name":"apoorvdarshan","email":"apoorvdarshan@gmail.com"}],"readme":"<p align=\"center\">\n  <a href=\"https://github.com/apoorvdarshan/homebrew-tap\"><img alt=\"Homebrew\" src=\"https://img.shields.io/badge/Homebrew-tap-FBB040?logo=homebrew&amp;logoColor=black\"></a>\n  <a href=\"https://www.npmjs.com/package/@apoorvdarshan/crossposter\"><img alt=\"npm\" src=\"https://img.shields.io/npm/v/@apoorvdarshan/crossposter?logo=npm\"></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://crossposter.apoorvdarshan.com/assets/logo-crossposter.png\" alt=\"Crossposter logo\" width=\"120\" height=\"120\">\n</p>\n\n<h1 align=\"center\">Crossposter</h1>\n\n<p align=\"center\">\n  <strong>Private crossposting dashboard for your own social accounts.</strong><br>\n  Compose once, attach media, publish now, or schedule posts from a local/self-hosted server.\n</p>\n\n<p align=\"center\">\n  <a href=\"#supported-channels\">Supported Channels</a>\n  · <a href=\"#run-locally\">Run Locally</a>\n  · <a href=\"#provider-setup\">Provider Setup</a>\n  · <a href=\"#security\">Security</a>\n</p>\n\n---\n\n## Overview\n\nCrossposter is a small local/self-hosted publishing dashboard. It is built for\npersonal use: no database, no queue service, and no multi-user product layer.\nPosts can be sent immediately with **Publish now** or saved to the local\nscheduler for a later time.\n\nThis is intentionally not a Postiz-style stack. Full scheduling products usually\nneed services such as Postgres, Redis, queues, workers, and separate background\njobs. Crossposter keeps the surface area narrow so it can run on your Mac, a\nsmall VPS, Render, or a simple Node host. Scheduled posts publish only while\nthat server process is running.\n\n## Unofficial Integrations And Platform Terms\n\nCrossposter includes a mix of official APIs and local unofficial integrations.\nX / Twitter, Instagram, YouTube, Pinterest, and Hacker News may use\ncookies, local sessions, private APIs, third-party tools, or normal web submit\nflows.\n\nUse Crossposter only with accounts, pages, boards, channels, and profiles you\nown or are authorized to manage. You are responsible for each platform's API\nterms, automation rules, rate limits, account policies, and content policies.\nUnofficial integrations can break when platforms change and may trigger login\nchallenges, rate limits, failed posts, or account restrictions.\n\n## Supported Channels\n\n| Channel | Current support |\n| --- | --- |\n| X / Twitter | Local posting through a dedicated, isolated headless browser (one-time login, like Instagram), with text, images, GIFs, and video |\n| LinkedIn | Personal profile posts and approved Page posts, with optional images or MP4 video |\n| Bluesky | Text posts and local image media |\n| Mastodon | Text posts and local media |\n| Instagram | Unofficial local media publishing through an isolated headless browser session |\n| YouTube | Unofficial local video uploads through YouTube.js/InnerTube cookies |\n| Dev.to | Markdown articles |\n| Pinterest | Unofficial local Pin uploads through `py3-pinterest` session folders |\n| Hacker News | Personal link/text submission through HN's normal form flow |\n| Nostr | Kind-1 text notes published to configured relays |\n| Dribbble | Official OAuth shot uploads through the Dribbble API |\n\n## Features\n\n- Dashboard composer for title, body text, channel selection, and media upload\n- Multiple account profiles per provider, selected as publish targets on the dashboard\n- Inline Schedule draft control for local timed posting\n- Scheduler calendar for scanning queued posts by month and reviewing posts by day\n- Scheduler page controls for editing timing and discarding queued or failed posts\n- Per-platform profile configuration from the UI\n- Local config saved to `poster.config.local.json`\n- Local publish history\n- Local media upload storage in `.poster-uploads`\n- Image conversion/compression with quality and target size controls\n- Dribbble crop tool for 400x300 or 800x600 shot images\n- Video conversion/compression to MP4 for supported channels\n- Platform preflight warnings before publishing\n- Per-platform title, post, and media limits shown only when a selected draft\n  exceeds the limit\n- Light/dark/system theme controls\n- macOS auto-start service for `http://localhost:2004`\n\n## Scheduled Posting\n\nUse **Schedule draft** next to **Publish now** on the Dashboard. It opens a\nlocal date/time popup next to the button you clicked, then saves the post to\n`poster.config.local.json`.\n\nManage the queue from:\n\n```text\nhttp://localhost:2004/scheduled\n```\n\nThe Scheduler page lets you:\n\n- view the current month calendar by default\n- click a calendar date to review posts scheduled for that day\n- edit the scheduled timing\n- discard queued or failed posts\n- review target channels, media, and last publish errors\n\nWhen a scheduled post publishes successfully, it is added to local publish\nhistory and removed from the Scheduler queue.\n\nThe scheduler is local/self-hosted. The Crossposter server must be running at\nthe scheduled time:\n\n- `npx @apoorvdarshan/crossposter@latest` pings the scheduler every 30 seconds\n- the macOS auto-start service keeps `http://localhost:2004` alive after login\n- on Render or a VPS, keep the Node service running with persistent disk\n\nIf the server is offline when a post is due, it will publish the next time the\nserver starts and the scheduler tick runs.\n\n## Posting From An Agent (HTTP API)\n\nCrossposter exposes a small local HTTP API (`/api/health`, `/api/config`,\n`/api/media`, `/api/publish`, `/api/scheduled`, `/api/draft`) so an external\nagent or script can publish, schedule, or stage drafts (including media) without\nthe UI. See [`AGENT_POSTING.md`](AGENT_POSTING.md) — a self-contained guide you\ncan hand to an agent so it can post through your running server on\n`http://localhost:2004`.\n\n## Run Locally\n\n### Recommended: Homebrew\n\nInstall the production build and launch it locally:\n\n```bash\nbrew install apoorvdarshan/tap/crossposter\ncrossposter\n```\n\nHomebrew keeps the application code under its managed prefix. Crossposter keeps\nconfig, uploads, browser sessions, schedules, and history separately in\n`~/Library/Application Support/Crossposter` on macOS, so upgrading or\nuninstalling the Formula does not erase local publishing data.\n\nStart it automatically after login:\n\n```bash\nbrew services start crossposter\n```\n\nUpgrade without changing local data:\n\n```bash\nbrew upgrade apoorvdarshan/tap/crossposter\nbrew services restart crossposter\n```\n\n### npx Launcher\n\nUse the npx path when you want Crossposter running on localhost without cloning\nthe repo or installing a global binary:\n\n```bash\nnpx @apoorvdarshan/crossposter@latest\n```\n\nThe launcher opens or prints the local URL:\n\n```text\nhttp://localhost:2004\n```\n\nRun the command from the folder where you want Crossposter data to live. The\nlocal config, uploads, schedule, and history stay in that folder.\n\n```bash\nmkdir -p ~/Crossposter\ncd ~/Crossposter\nnpx @apoorvdarshan/crossposter@latest\n```\n\nIf you already have `poster.config.local.json` or `.poster-uploads`, run npx\nfrom that same folder so the app uses your existing data.\n\nFor a persistent command:\n\n```bash\nnpm install -g @apoorvdarshan/crossposter\ncrossposter\n```\n\nFor development from the Git repo:\n\n```bash\nnpm install\nnpm run dev:local\n```\n\n### Update The Local Package\n\nHomebrew installations are updated only through Homebrew. npm and npx\ninstallations check npm on startup by default and can also update from Settings\n> Version & Updates, or run:\n\n```bash\nnpx @apoorvdarshan/crossposter@latest\n```\n\nTurn off startup update checks from Settings by setting **Auto-update on launch**\nto off.\n\n### Change The Local Port\n\nSet `POSTER_LOCAL_PORT` in Settings or `poster.config.local.json`, then restart\nthe local service.\n\n```bash\nPOSTER_LOCAL_PORT=2080 npx @apoorvdarshan/crossposter@latest\n```\n\n### macOS Auto-Start\n\nFor a Homebrew installation, use Homebrew's managed service:\n\n```bash\nbrew services start crossposter\n```\n\nFor an npm or npx installation, install Crossposter's launchd service:\n\n```bash\ncrossposter install-service\n```\n\nYou can also control it from:\n\n```text\nSettings > Local Settings > Auto-start\n```\n\nTurn on **Always restart localhost** and macOS will keep\n`http://localhost:2004` available after login/restart.\n\nUse a custom port once:\n\n```bash\ncrossposter install-service --port 2080\n```\n\nRemove the service:\n\n```bash\nbrew services stop crossposter\n# npm/npx installation:\ncrossposter uninstall-service\n```\n\n## Configuration\n\nThe app reads configuration from:\n\n1. `poster.config.local.json`\n2. environment variables\n3. defaults in the code\n\n`poster.config.local.json` is gitignored. It is the preferred place for local\ntokens and profile settings because it is managed by the Settings UI.\n\nFor public/self-hosted deployments, set:\n\n```text\nPOSTER_REQUIRE_ADMIN_PASSWORD=true\nPOSTER_ADMIN_PASSWORD=strong-password-here\n```\n\n## Provider Setup\n\n### X / Twitter\n\nX publishing drives a **dedicated, isolated headless browser** — the same\napproach as Instagram. You log in once in a separate window, the session is\nsaved into an isolated per-profile folder (never your personal Chrome), and\nposts are then typed and sent through **X's own web composer**, headlessly.\nBecause X's own frontend generates and signs the request, this avoids the\nhand-crafted-API rate-limit pattern that direct API clients trip.\n\nIt reuses the same browser engine as Instagram. Install it once in Terminal with\n`crossposter install-instagram-browser-deps` (or\n`./scripts/install-instagram-browser-deps.sh` from the Git repo).\n\nRequired field:\n\n```text\nX_BROWSER_PROFILE_DIR\n```\n\nOptional fields:\n\n```text\nX_BROWSER_HEADLESS\nX_BROWSER_TIMEOUT_MS\nX_PYTHON_COMMAND\nX_PREMIUM_LONG_POSTS\n```\n\nSet `X_BROWSER_PROFILE_DIR` to a unique folder per X account, for example\n`.x-browser/apoorvdarshan`. Keep `X_BROWSER_HEADLESS=true` so posting runs\ninvisibly; set it to `false` to watch the browser if X changes its layout or\nshows a checkpoint. Click **Log in to X** in Settings once to sign in (including\n2FA); the session is reused for every post after.\n\nAfter clicking Post, Crossposter verifies X's own `CreateTweet` response and\ncaptures the new status URL. If neither the response nor the success UI can be\nobserved, the result is marked **check** rather than failed; inspect the profile\nbefore retrying because the post may already be live.\n\nSet `X_PREMIUM_LONG_POSTS=true` only for Premium accounts. It raises the X text\nlimit from 280 to 25,000 characters (X Premium long posts) and the video size\nlimit from 512 MB to 16 GB. Free accounts keep the 280 character limit.\n\nMedia limits:\n\n- photos: 5 MB\n- GIFs: 15 MB\n- video: 512 MB, or 16 GB when `X_PREMIUM_LONG_POSTS=true`\n\nUse this only for accounts you control, and keep posting occasional and\nhuman-paced. X is strict about automation and can still challenge, limit, or\nlock accounts for suspicious or high-volume activity.\n\n### LinkedIn\n\nLinkedIn can be connected from the local Settings page after creating a LinkedIn\ndeveloper app.\n\nAdd this callback URL in the LinkedIn app Auth tab:\n\n```text\nhttp://localhost:2004/api/auth/linkedin/callback\n```\n\nFor personal profile posting:\n\n1. Enable **Share on LinkedIn**.\n2. Enable **Sign In with LinkedIn using OpenID Connect**.\n3. Use scopes:\n\n```text\nopenid profile w_member_social\n```\n\n4. Add the LinkedIn client ID and secret in Crossposter.\n5. Click **Connect LinkedIn** from Settings.\n\nThe local callback saves `LINKEDIN_ACCESS_TOKEN` and a personal\n`LINKEDIN_AUTHOR_URN` automatically.\n\nFor LinkedIn Page posting:\n\n1. Create or choose the LinkedIn Page that owns the developer app.\n2. Make sure the signed-in member is an admin or content admin for that Page.\n3. Make sure the LinkedIn app has access to `w_organization_social`.\n4. Use scopes:\n\n```text\nopenid profile w_member_social w_organization_social\n```\n\n5. Click **Connect LinkedIn**.\n6. Replace `LINKEDIN_AUTHOR_URN` with the Page author:\n\n```text\nurn:li:organization:YOUR_PAGE_ORG_ID\n```\n\nValid author examples:\n\n```text\nurn:li:person:YOUR_PERSON_ID\nurn:li:organization:YOUR_PAGE_ORG_ID\n```\n\n`LINKEDIN_VERSION` defaults to `202605`.\n\nLinkedIn local media upload supports JPG, PNG, and GIF images, plus MP4 videos\nbetween 75 KB and 500 MB. Unsupported local media is rejected before publishing.\n\n### Bluesky\n\nCreate a Bluesky app password. Do not use your main account password.\n\nRequired fields:\n\n```text\nBLUESKY_IDENTIFIER\nBLUESKY_APP_PASSWORD\n```\n\n`BLUESKY_IDENTIFIER` should be your handle without `@`, for example:\n\n```text\nname.bsky.social\n```\n\n### Mastodon\n\nCreate an application/access token from your Mastodon instance settings.\n\nRequired fields:\n\n```text\nMASTODON_INSTANCE\nMASTODON_ACCESS_TOKEN\n```\n\nExample instance:\n\n```text\nhttps://mastodon.social\n```\n\nMastodon post text is limited to 500 characters.\n\n### Instagram\n\nInstagram publishing is unofficial local posting through a dedicated, isolated\nheadless browser with a one-time login per account, using its own profile folder\n(separate from your own Chrome profile). It reuses your real signed-in session\n(no stored password) and posts invisibly. It is still automation, not an official\nAPI, so use it for accounts you own and keep posting human-paced.\n\nIt prefers your installed **Google Chrome** (run in a separate, isolated profile),\nfalling back to Playwright's bundled Chromium when Chrome is not installed.\n**Video (MP4/MOV) uploads require Google Chrome** — the bundled Chromium lacks the\nH.264/AAC codecs Instagram's web uploader needs to read video, so it rejects MP4s\nwith \"could not be read by your browser\". Image posts work on either.\n\nInstall the browser engine once (Playwright + Chromium):\n\n```bash\ncrossposter install-instagram-browser-deps\n# or, from a Git clone:\n./scripts/install-instagram-browser-deps.sh\n```\n\nFields:\n\n```text\nINSTAGRAM_BROWSER_PROFILE_DIR   # unique per account, e.g. .instagram-browser/apoorvdarshan\nINSTAGRAM_BROWSER_HEADLESS      # true (invisible posting); false to watch the browser\nINSTAGRAM_BROWSER_TIMEOUT_MS    # login wait + publish step timeout, default 180000\nINSTAGRAM_PYTHON_COMMAND        # optional; defaults to .venv/bin/python, then python3\n```\n\nAdd one profile per Instagram account, give each a unique browser profile\nfolder, then click **Log in to Instagram** in Settings. A real browser window\nopens once so you can sign in (including any 2FA or checkpoint); the session is\nsaved into that folder and reused headlessly afterward. To add another account,\nadd another profile with its own folder and log in again. If Instagram changes\nits create-post layout and a publish fails, set `INSTAGRAM_BROWSER_HEADLESS` to\n`false` to watch the flow.\n\nAfter clicking Share, Crossposter verifies Instagram's media-configure response\nand uses its shortcode as the post/reel URL when available. If confirmation\ncannot be observed, the result is marked **check** and must be verified on the\nprofile before any retry.\n\nSupported media:\n\n- image: JPG, PNG, or WebP up to 8 MB\n- video: MP4 or MOV up to 300 MB\n\n### YouTube\n\nYouTube publishing is unofficial local upload through YouTube.js and InnerTube.\nCrossposter can read cookies from a signed-in Chrome profile at publish time.\n\nTitle becomes the YouTube video title. Post text becomes the description.\n\nRequired field:\n\n```text\nYOUTUBE_COOKIE_SOURCE\n```\n\nOptional fields:\n\n```text\nYOUTUBE_CHROME_PROFILE\nYOUTUBE_COOKIE\nYOUTUBE_PRIVACY\nYOUTUBE_TIMEOUT_MS\n```\n\n`YOUTUBE_PRIVACY` defaults to `PUBLIC`. Common video formats are accepted up to\n256 GB or 12 hours.\n\n### Dev.to\n\nCreate an API key from Dev.to account settings.\n\nRequired field:\n\n```text\nDEVTO_API_KEY\n```\n\nDev.to publishing expects a title and Markdown body text.\n\n### Pinterest\n\nPinterest publishing is unofficial local posting through `py3-pinterest`.\nCrossposter stores one session folder per Pinterest profile.\n\nRequired fields:\n\n```text\nPINTEREST_EMAIL\nPINTEREST_PASSWORD\nPINTEREST_USERNAME\nPINTEREST_BOARD_ID\nPINTEREST_CRED_ROOT\n```\n\nOptional fields:\n\n```text\nPINTEREST_SECTION_ID\nPINTEREST_ALT_TEXT\nPINTEREST_PYTHON_COMMAND\nPINTEREST_TIMEOUT_MS\nPINTEREST_HEADLESS\n```\n\nInstall Python dependencies:\n\n```bash\ncrossposter install-pinterest-deps\n# or, from a Git clone:\n./scripts/install-pinterest-deps.sh\n```\n\nPinterest requires a board ID because every Pin belongs to a board. Title is\nlimited to 100 characters and description/post text is limited to 800\ncharacters.\n\nSupported media:\n\n- image: JPG, PNG, GIF, or WebP up to 20 MB\n- video: MP4 or MOV up to 100 MB\n\n### Hacker News\n\nHacker News has no official write/submit API. Crossposter uses unofficial\npersonal automation through Hacker News' normal login and submit form flow.\n\nRequired fields:\n\n```text\nHACKERNEWS_USERNAME\nHACKERNEWS_PASSWORD\n```\n\nOptional field:\n\n```text\nHACKERNEWS_COOKIE\n```\n\nHow publishing works:\n\n- Title is required.\n- Link is optional. If set, it is submitted as Hacker News' `url` field.\n- Post text is optional for Hacker News. If set, it is submitted as Hacker News'\n  `text` field.\n- Leave Link empty to submit a discussion/text post.\n- For non-Hacker News channels, Crossposter still requires Post text.\n- Local media is ignored.\n- A saved browser cookie can be used before password login.\n\nUse this only for your own Hacker News account and normal personal submissions.\nDo not use it for spam, vote/comment solicitation, or bulk promotional posting.\nIf Hacker News requires browser validation or CAPTCHA for the login, Crossposter\nwill fail and you must submit manually.\n\n### Nostr\n\nNostr publishes signed kind-1 text notes directly to relay WebSocket URLs.\n\nRequired fields:\n\n```text\nNOSTR_PRIVATE_KEY\nNOSTR_RELAYS\n```\n\n`NOSTR_PRIVATE_KEY` can be an `nsec...` key or a 64-character hex private key.\nUse a dedicated Nostr key if you do not want Crossposter to sign as your main\nidentity.\n\n`NOSTR_RELAYS` is a comma or newline separated list of relays:\n\n```text\nwss://relay.example.com,wss://another-relay.example\n```\n\nLocal media is ignored for Nostr. Paste public image/video links into the post\nbody if you want Nostr clients to render media previews.\n\n### Dribbble\n\nDribbble publishing uses the official Dribbble API. Create a Dribbble API app\nand connect the profile from Settings.\n\nCallback URL:\n\n```text\nhttp://localhost:2004/settings/socials/dribbble/callback\n```\n\nRequired after OAuth:\n\n```text\nDRIBBBLE_ACCESS_TOKEN\n```\n\nSetup fields:\n\n```text\nDRIBBBLE_CLIENT_ID\nDRIBBBLE_CLIENT_SECRET\nDRIBBBLE_OAUTH_SCOPES\n```\n\nOptional fields:\n\n```text\nDRIBBBLE_TAGS\nDRIBBBLE_TEAM_ID\nDRIBBBLE_LOW_PROFILE\n```\n\nDribbble requires a title and a local JPG, PNG, or GIF shot image that is\nexactly 400x300 or 800x600 and no larger than 8 MB. Crossposter can crop\nnon-GIF images before publishing.\n\n## Local Media Conversion\n\nThe composer can convert and compress media before publishing:\n\n- images are converted to JPG output with quality, target size, and estimated size\n- videos are transcoded to MP4 with quality and target size controls\n- platform warnings offer conversion only when conversion can fix a selected\n  channel's media problem\n- Dribbble image warnings can open a cropper that outputs a valid 800x600 JPG\n\n## Static Website\n\nThe `web/` folder contains a standalone static docs website with overview,\nquickstart, provider setup, limits, privacy, and terms sections. It is intended\nfor a domain such as:\n\n```text\ncrossposter.apoorvdarshan.com\n```\n\nLive site:\n\n```text\nhttps://crossposter.apoorvdarshan.com\n```\n\nThe static site is deployed as a Cloudflare Worker with static assets:\n\n```bash\ncd web\nnpm install\nnpm run build\nnpx wrangler dev\nnpx wrangler deploy\n```\n\nCloudflare Workers Builds watches `web/*` on `main`, runs `npm run build` from\n`web/`, and deploys with `npx wrangler deploy`. Wrangler publishes `web/dist/`\nand routes `crossposter.apoorvdarshan.com` to the Worker.\n\nFiles:\n\n```text\nweb/index.html\nweb/assets/logo-crossposter.png\nwrangler.jsonc\n```\n\nPrivacy and terms are published inside `web/index.html` so the static website is\nthe canonical policy page.\n\n## Deploy\n\n### Vercel\n\n```bash\nvercel\n```\n\nSet environment variables in Vercel Project Settings. At minimum:\n\n```text\nPOSTER_ADMIN_PASSWORD\nPOSTER_REQUIRE_ADMIN_PASSWORD=true\n```\n\nThen add provider credentials only for the channels you want to use.\n\n### Render Or VPS\n\nRender or a self-hosted Node server can run the same app. Persistent disk is\nrecommended if you want uploaded media and local publish history to survive\nrestarts.\n\n## Security\n\nCrossposter is private by convention, not a full multi-user auth system.\n\nFor local-only use:\n\n```text\nPOSTER_REQUIRE_ADMIN_PASSWORD=false\n```\n\nBefore exposing it publicly:\n\n- set `POSTER_REQUIRE_ADMIN_PASSWORD=true`\n- use a strong `POSTER_ADMIN_PASSWORD`\n- keep `poster.config.local.json` private\n- keep `.instagram-sessions`, `.instagram-browser`, `.pinterest-sessions`, and\n  `.poster-uploads` private\n- never commit API keys, access tokens, refresh tokens, app secrets, browser\n  cookies, session files, or platform passwords\n- only connect accounts, pages, and profiles you own or are authorized to manage\n\n## Contact And Support\n\n- Email: apoorvdarshan@gmail.com\n- Email: ad13dtu@gmail.com\n- X: https://x.com/apoorvdarshan\n- Report an issue: https://github.com/apoorvdarshan/crossposter/issues/new\n- Request a feature: https://github.com/apoorvdarshan/crossposter/issues/new\n- View open issues: https://github.com/apoorvdarshan/crossposter/issues\n\nDo not post API keys, tokens, app secrets, or private account details in public\nissues.\n\n## Star History\n\n<a href=\"https://github.com/apoorvdarshan/crossposter/stargazers\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://crossposter.apoorvdarshan.com/api/star-history.svg?theme=dark&amp;v=3\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://crossposter.apoorvdarshan.com/api/star-history.svg?theme=light&amp;v=3\" />\n    <img alt=\"Crossposter GitHub star history\" src=\"https://crossposter.apoorvdarshan.com/api/star-history.svg?theme=light&amp;v=3\" />\n  </picture>\n</a>\n\n## License\n\nMIT\n","readmeFilename":"README.md"}