{"_id":"@brandon.zylstra/zsh-wasm","_rev":"10-d2c075b3f594bb0cc21f790b6966129a","name":"@brandon.zylstra/zsh-wasm","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.0","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.0","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"307141a1cc121d369259b0f52f13e2b59ac572ed","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.0.tgz","fileCount":6,"integrity":"sha512-MKrbl/5rCaTdEi4ALPM4+FzDMK5amoSk+Ofoa3cLgcSh0Ssy1FFNIQsMCwAV2IpGyuocvbjRIkJ+1Ieqk172Og==","signatures":[{"sig":"MEUCIQCmCuvQNkRPMB3hxhkHOn/ZKF6vNCeFTAkka2n/3S1ePwIgDLDFPZgkiuq9cm3XlfHfjeIeRfNaX29kkM35ZcZg/VM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1583548},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"930bf631fca103c35d7b356ea20ec8ff71947180","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"11.14.1","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.0_1779132884724_0.3971015542638838","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.1","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.1","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"5691f1dc8bc85d4795e8c6ef0cd5fc6f64d1ef1b","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.1.tgz","fileCount":7,"integrity":"sha512-qj9E0/j0pbSJVleW6bJw/ZvWoYyf+h0o4WwEJ/GzgliuO9qwp02vL6iOuDjN9fz/UgjgcQ/+R1HZVdj+NF/67A==","signatures":[{"sig":"MEUCIBwKLgrLMGtYCuWn0azwd0vLDS1WFBefDfUk0QhkBd6JAiEA6///RmbCDUPMd4whY4WKJCX7APb1m2O2Ov0+wCKSevE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1587646},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"e3547a3eb4cc6c42854ce20f545c6c0c05afb67b","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"11.14.1","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.1_1779133270322_0.4429619406801535","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.2","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.2","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"77bbcf57e1882ed4c194c373c399c36a537d08ae","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.2.tgz","fileCount":7,"integrity":"sha512-RmMFWPzLDWYs64J7EiwkePL1x8E/OGpVfetuKcWweIGe5kI0GXd2+1POfqJy8+NggHXgheIGyxPv1Usi1nTn0g==","signatures":[{"sig":"MEYCIQD1cmZGYtvNGgucLBCsUfjBr5kxtCsIAHDjGCNCEbSXDQIhAMy0uXAHNj+iJ9qMkWZgiRakrL0otZ1KjMEi6aTuNBEt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1587646},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"e3547a3eb4cc6c42854ce20f545c6c0c05afb67b","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"11.14.1","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.2_1779133991554_0.9020659119122068","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.3","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.3","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"1ad585f952a6771853562b06a4b8aacddfadd7a5","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.3.tgz","fileCount":7,"integrity":"sha512-m/YuQsanjphaXwlTB6GYKFaSJ+EtSoOBvt0E6VjMxJ1a7hS6io/Qh5ddYTTmL0XGuW5sRKbQe6Qn19PbvVKqpw==","signatures":[{"sig":"MEUCICVpik62L7XNL6B+M/eX4vRQNeeKN7buVUbNsFqgd/BiAiEAiQKWyA3DEO+dw+pGTRTthQ1c/7dm6+RBwBiEVatx1SQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1591447},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"d9a346918500b4c29d2918da0a459e76f068c81d","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"11.14.1","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.3_1779138080877_0.37730085430228466","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.5","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.5","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"7c8dbc6662dcdc57f6d93e756d5c6091c186f16b","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.5.tgz","fileCount":7,"integrity":"sha512-FYGnqanA4Arz91r7l3eoRSxFM0+6jQzPdSX4hv8iY8nbmQ1pZ7RyJp+1JvCc2YC8Xga/i8C8OPNlFDXtc8yC+A==","signatures":[{"sig":"MEYCIQDTMfP7j9RQSLEQcNxy/VKNfk37mThflsdc8bY2afUITwIhAO8WR2ukWyxtfBAHOYDLM5ZPPgi7VNz38ngjOhreMA0K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1597410},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"08b0fec4c3d65195dd2ba1833704379c4fecfe03","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"10.8.2","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.5_1783318654303_0.34786648159878997","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@brandon.zylstra/zsh-wasm","version":"0.1.6","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.1.6","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"5d57ef95f87621700516bc49e36a96957be4de44","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.1.6.tgz","fileCount":7,"integrity":"sha512-BEUjxA0R68fBMDpkiKZzfgDLEj6N2EPpWFvFjqQJM/8G6rc1SQMrcOYqLuIEGqRxzq+gPecTb1eKJa90egvazw==","signatures":[{"sig":"MEYCIQDIXfxMsNH2B0b+tOtCdoi/CyyoJuDoQ4hyWuO1O9QJIgIhAKUVtjaPZ8pS9vteIT7775M1W9hA73k9uHWazZUlk7N5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1599091},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"125a897d1af2f5bf222fa37d43a8f1bdb6f8307b","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"10.8.2","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.1.6_1785541256902_0.8058421186559062","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@brandon.zylstra/zsh-wasm","version":"0.3.0","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.3.0","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"5ff1a4e3e53bf66b156f5012341ee8208e953764","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.3.0.tgz","fileCount":7,"integrity":"sha512-MOjg3bDl2T5UtZSMlC7+Gfy18iiiWSirEFsejE6AhTmelVNiHV+UezlvLcHAIsGMSIlEnpGxhBXpYXlTTwEH/g==","signatures":[{"sig":"MEUCIBMG6+KLLQyT3XrUQkHPQwZzw+UuNJljlCQDGd7NF8lyAiEAtFsS8iNvqFoM3Ico6SNCtmc6JUBxM+6TyJnTffpj1pg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1633653},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"6a2e90cd009b844ebdc7f9a6fed9b814b6c9c754","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"10.8.2","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.3.0_1785635175813_0.3522128027172662","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@brandon.zylstra/zsh-wasm","version":"0.5.0","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.5.0","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"8c118735790c9d778c463bf8828616a7f01aba5e","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.5.0.tgz","fileCount":7,"integrity":"sha512-P53rn2cUEgFAYF7icDOVMrXWfXowR42BeRA85Bp2XsskLLDLh3upo7OZcf28CYvpiTU2a9K9h+0Hd1Z3gh5VTQ==","signatures":[{"sig":"MEUCIHMrqDcKbOvKxf4xOyjZuEqhaELLC7s5EPfVKDYokuDJAiEAq0SxlapWbw+Xd4L6d3h096D2FpFYYdB1UevvsJ6u6vY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1667101},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"897a3a05ca21bdea1e31f26b87cfea2cf6a256de","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"10.8.2","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.5.0_1786085444994_0.14609993163308843","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@brandon.zylstra/zsh-wasm","version":"0.4.0","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"Zsh","_id":"@brandon.zylstra/zsh-wasm@0.4.0","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"dist":{"shasum":"a44c8549ebf35433e574a56927a8e240504889dc","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.4.0.tgz","fileCount":7,"integrity":"sha512-p7u+eTn73Vp/t1CARDJiPtzRnOFcf9dh3GPolL5zzomeqoNNbDHCFEt9WoujkTFBn/bG7RgGmkqKpX4TDOSzhA==","signatures":[{"sig":"MEUCIQDoF0myRcIVbDHGC7XmhTliw9CCM6Nvw0Yu9nf/nT11ZQIgJGXq/4AJa6ZymyjIIwWQnqIJB5NCsMTY7RugNBIAa2c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1639298},"main":"zsh-runtime.js","type":"module","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"gitHead":"b7c9215dac051f3f9983973e6daac149295202ce","_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"repository":{"url":"git+https://github.com/brandonzylstra/zsh-wasm.git","type":"git"},"_npmVersion":"10.8.2","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","directories":{},"sideEffects":["zsh.js"],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/zsh-wasm_0.4.0_1786085446322_0.408783817442979","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@brandon.zylstra/zsh-wasm","version":"0.6.0","description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","type":"module","main":"zsh-runtime.js","types":"index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./zsh-runtime.js"}},"scripts":{"prepublishOnly":"node check-built.js"},"keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"license":"SEE LICENSE IN LICENSE","repository":{"type":"git","url":"git+https://github.com/brandonzylstra/zsh-wasm.git"},"sideEffects":["zsh.js"],"_id":"@brandon.zylstra/zsh-wasm@0.6.0","gitHead":"45a99b3dd23213e35cb15cdd68e036825be1d4cb","bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-IyY9whYMQ6Dth7vXGNzxEuylO0fJgjnk+LvciOeWUCkh0Kx2BV3L+3+4ZbvNpJL2fR3dE5wrbQfpZFp4L4ZVMg==","shasum":"caed859c30c7495fc95b1db28fe61c03be40e6c5","tarball":"https://registry.npmjs.org/@brandon.zylstra/zsh-wasm/-/zsh-wasm-0.6.0.tgz","fileCount":9,"unpackedSize":1706960,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon.zylstra%2fzsh-wasm@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCD6+Y8OpeZHpgoSdnmzn7MuITl3kkxEr9H0aKglxA/JAIhAOSGDgXWRat91Kb2r6zkKFDMLWQA0EEzOrzB0vgwC/su"}]},"_npmUser":{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"},"directories":{},"maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/zsh-wasm_0.6.0_1786088274012_0.44123920848586295"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-18T19:34:44.606Z","modified":"2026-08-07T07:37:54.514Z","0.1.0":"2026-05-18T19:34:44.931Z","0.1.1":"2026-05-18T19:41:10.512Z","0.1.2":"2026-05-18T19:53:11.692Z","0.1.3":"2026-05-18T21:01:21.124Z","0.1.5":"2026-07-06T06:17:34.476Z","0.1.6":"2026-07-31T23:40:57.069Z","0.3.0":"2026-08-02T01:46:16.163Z","0.5.0":"2026-08-07T06:50:45.235Z","0.4.0":"2026-08-07T06:50:46.494Z","0.6.0":"2026-08-07T07:37:54.232Z"},"bugs":{"url":"https://github.com/brandonzylstra/zsh-wasm/issues"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/brandonzylstra/zsh-wasm#readme","keywords":["zsh","shell","wasm","webassembly","browser","emscripten"],"repository":{"type":"git","url":"git+https://github.com/brandonzylstra/zsh-wasm.git"},"description":"Zsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser","maintainers":[{"name":"brandon.zylstra","email":"envies.banner.0t@icloud.com"}],"readme":"@brandon.zylstra/zsh-wasm\n=========================\n\nZsh 5.9 compiled to WebAssembly — run a real zsh interpreter in the browser, inside a Web Worker.\n\nInstall\n-------\n\n```\nnpm install @brandon.zylstra/zsh-wasm\n```\n\nUsage\n-----\n\n```js\nimport { runZshScript } from '@brandon.zylstra/zsh-wasm';\n\nconst { stdout, stderr } = await runZshScript('echo \"Hello from zsh $ZSH_VERSION\"');\nconsole.log(stdout); // Hello from zsh 5.9\n\n// Pass stdin\nconst { stdout: out } = await runZshScript(\n    'while IFS= read -r line; do echo \"> $line\"; done',\n    { stdin: 'hello\\nworld' }\n);\n\n// Persistent filesystem via IndexedDB (browser only)\nconst { stdout: files } = await runZshScript('ls /home/user', { fs: 'idbfs' });\n```\n\nThe script runs in a Web Worker — the main thread never blocks.\n\nWorker pool\n-----------\n\nFor high-throughput use, create a pool to run scripts in parallel:\n\n```js\nimport { createPool } from '@brandon.zylstra/zsh-wasm';\n\nconst pool = createPool(4); // 4 workers\nconst results = await Promise.all([\n    pool.run('echo one'),\n    pool.run('echo two'),\n    pool.run('echo three'),\n]);\npool.shutdown();\n```\n\n`runZshScript()` uses a shared pool of size 1 by default; state never leaks between calls.\n\nChoosing the filesystem\n-----------------------\n\nBy default every run starts from a clean in-memory filesystem, so nothing\nsurvives from one call to the next. Pass `fs: 'idbfs'` to keep files written\nunder `/home/user` in IndexedDB, across both later calls and page reloads:\n\n```js\nawait runZshScript('echo saved > /home/user/note', { fs: 'idbfs' });\nawait runZshScript('cat /home/user/note', { fs: 'idbfs' }); // saved\n```\n\nTo change the default for every call instead of passing it each time, set a\nglobal **before** importing the package — it is read once at import:\n\n```js\nglobalThis.ZshWasmConfig = { fs: 'idbfs' };\nconst { runZshScript } = await import('@brandon.zylstra/zsh-wasm');\n```\n\nThe per-call option always wins over the global, so the global is only worth\nusing when you cannot reach every call site.\n\nBuilt-in shims\n--------------\n\nBecause there is no `fork()`, a handful of external utilities are provided as\nzsh functions rather than programs. They are defined in `BUILTINS_PREAMBLE`,\nwhich is prepended to every script automatically: `cp`, `mv`, `rm`, `ln`,\n`find`, `xargs`, `env`, `which`, `date`, `sleep`, `realpath`, `base64`, plus\nstubs that give a clear message for binaries that are genuinely unavailable\n(`curl`, `git`, `python3` and friends return exit code 127 with an explanation).\n\nEverything else in the table above is a real program compiled into the binary,\nnot a shim.\n\nIf your script defines a function with one of those names, yours wins — the\npreamble is prepended, so your later definition replaces it. To replace one\ndeliberately while keeping the rest, append your version:\n\n```js\nimport { runZshScript, BUILTINS_PREAMBLE } from '@brandon.zylstra/zsh-wasm';\n\n// BUILTINS_PREAMBLE is exported so you can inspect it or build on it.\nconsole.log(BUILTINS_PREAMBLE.length); // ~12 KB of zsh\n\nawait runZshScript(`\n    date() { print -- 'always the same day' }\n    date\n`);\n```\n\nThere is no option to skip the preamble. If you need that, say so in an issue.\n\nBundlers\n--------\n\nThree files have to reach the browser: the worker, the Emscripten loader\n(`zsh.js`), and the binary (`zsh.wasm`). The runtime points at all three with\n`new URL('./file', import.meta.url)`, the form bundlers read statically, so a\nbundler emits them as assets and rewrites the URLs to wherever it puts them —\nincluding content-hashed names.\n\n**Vite 5 and Webpack 5: both verified, neither needs configuration.** A project\nthat installs this package and builds gets the worker, the loader and the wasm\nemitted as assets, and runs correctly from the built output. Both were tested\nagainst a real tarball install, running zsh plus a pipeline through the compiled\n`sort`, `tr`, `bc` and `diff`. Webpack minifies `zsh.js` on the way through and\nthat turns out to be harmless.\n\n**esbuild: not verified.** It supports the same convention, so it is expected to\nwork. If it does not, please open an issue.\n\nIf your bundler does not understand that convention, copy `zsh.js` and\n`zsh.wasm` out of the package into a directory it serves verbatim, and make sure\nit does not rename them relative to each other.\n\n> Before 0.6.0 this did not work at all. The worker used to load the runtime\n> through `importScripts('./zsh.js')` — a string, which a bundler cannot see\n> into — so neither the loader nor the wasm was emitted and the page hung on a\n> 404. If you are on 0.5.0 or earlier and bundling, upgrade.\n\nSize\n----\n\nThe wasm binary is the bulk of it, and it is worth knowing before you install.\n\n| File                               | Raw     | Gzipped |\n| ---------------------------------- | ------- | ------- |\n| `zsh.wasm`                         | 1.34 MB | 554 KB  |\n| `zsh.js` (Emscripten loader)       | 215 KB  | 55 KB   |\n| `zsh-runtime.js` + `zsh-worker.js` | 27 KB   | —       |\n\nAbout **610 KB over the wire** gzipped. That buys zsh 5.9 itself plus `sed`,\n`awk`, `bc`, `diff` and seventeen coreutils compiled in as real programs rather\nthan imitations. Interactive line editing and completion are excluded, since\nthere is no terminal.\n\nThe binary is immutable at a versioned URL, so it caches permanently — the cost\nis paid once per release, not per page view.\n\nBrowsers only\n-------------\n\nThis package needs Web Workers and `import.meta.url`. **Node.js is not\nsupported** and there is no plan to support it; use a real zsh subprocess there.\nCalling `runZshScript` outside a browser throws an error saying so rather than\nfailing obscurely.\n\nAvailable commands\n------------------\n\nReal implementations compiled into the wasm binary — these are the tools, not\nimitations of them:\n\n| Command                             | Source          | Notes                                                          |\n| ----------------------------------- | --------------- | -------------------------------------------------------------- |\n| `sed`                               | OpenBSD sed     | `s/pat/repl/[g]`, `-n`, `-e`, `-i`, address ranges, hold space |\n| `awk`                               | one-true-awk    | patterns, BEGIN/END, `-F`, `-v`, gsub/split/printf             |\n| `bc`/`dc`                           | Gavin Howard bc | arbitrary precision, `scale`, `sqrt()`, functions              |\n| `wc`                                | sbase           | `-l` `-w` `-c` `-m`, `total` line for multiple files           |\n| `sort`                              | sbase           | `-b -C -c -d -f -i -k -m -n -o -r -t -u`                       |\n| `cut`                               | sbase           | `-b -c -d -f -n -s`                                            |\n| `head`                              | sbase           | `-n N` `-N` `-c N`                                             |\n| `tail`                              | sbase           | `-n N` `-N` `-n +N` `-c N`                                     |\n| `uniq`                              | sbase           | `-c -d -u -f -s`                                               |\n| `tr`                                | sbase           | full set translation, `-c -C -d -s`                            |\n| `cat`                               | sbase           | `-u`                                                           |\n| `tee`                               | sbase           | `-a -i`                                                        |\n| `seq`                               | sbase           | `-f -s -w`                                                     |\n| `touch`                             | sbase           | `-a -c -m -d -t -T -r`                                         |\n| `mktemp`                            | sbase           | `-d -q -t -u -p`                                               |\n| `ls`                                | sbase           | `-1 -A -a -d -F -h -i -l -p -R -r -t -U -u`; symlink targets   |\n| `basename` / `dirname` / `printenv` | sbase           | POSIX                                                          |\n\nProvided as zsh functions, where the shell knows something a compiled tool\nwould not, or where the tool would need `fork()`:\n\n| Command     | Flags                                                                                    |\n| ----------- | ---------------------------------------------------------------------------------------- |\n| `cp` / `mv` | —                                                                                        |\n| `rm`        | `-f` `-r`/`-rf`                                                                          |\n| `mkdir`     | (native syscall)                                                                         |\n| `ln`        | `-s` `-f` (symlinks only; MEMFS has no hard links)                                       |\n| `grep`      | `-i` `-v` `-n` `-c` `-r`/`-R` `-l` `-o` `-q` `-w` `-e` `-m N` `-A`/`-B`/`-C N` `-H`/`-h` |\n| `find`      | `-name` `-type` `-maxdepth` `-newer`                                                     |\n| `xargs`     | `-I` `-n`                                                                                |\n| `env`       | `VAR=val` `-u VAR`                                                                       |\n| `which`     | knows shell functions and builtins                                                       |\n| `date`      | `+FORMAT`, browser timezone                                                              |\n| `sleep`     | seconds (float), real blocking with COOP+COEP                                            |\n| `realpath`  | —                                                                                        |\n| `base64`    | `-d`/`--decode`                                                                          |\n\nKnown limitations\n-----------------\n\n- **No fork** — process substitution (`<(cmd)`) and unsupported external binaries require `fork()`, which is not available in WebAssembly. `cmd &` runs `cmd` synchronously instead of in the background.\n- **Pipelines run one stage at a time** — `a | b | c` works, but because there are no processes to run in parallel, each stage runs to completion before the next starts, and all of them share this shell. So a pipeline never streams (`cmd | head -1` still runs `cmd` to the end), an assignment in a stage outlives it (`echo x | read value` leaves `value` set), and `exit` in a stage ends the whole script.\n- **`$(...)` runs in-process** — no true subshell isolation; variable assignments inside `$(...)` leak to the parent scope.\n- **`sleep` needs cross-origin isolation for real blocking** — `SharedArrayBuffer` (required for `Atomics.wait`) is only available when the page is cross-origin isolated. Without it, `sleep` is a no-op unless you pass `busySleepFallback: true` to `RunOptions`, which uses a CPU-spinning busy-wait instead. See [Cross-origin isolation](#cross-origin-isolation) below.\n- **`TZ` supports UTC offsets only** — `TZ=UTC`, `TZ=UTC±H`, `TZ=UTC±H:MM`, and `TZ=±HH:MM` work. Named timezones (`TZ=America/New_York`) are not supported (no tzdata); `date` falls back to browser local time with a stderr warning.\n- **stdin is newline-terminated** — a trailing `\\n` is always appended if missing (correct POSIX behavior; transparent to line-oriented tools).\n- **No ZLE** — the interactive line editor and completion system are excluded (no real terminal).\n\nCross-origin isolation\n----------------------\n\n`sleep` uses `Atomics.wait()` for real blocking, which requires [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer), which requires cross-origin isolation.\n\n**Check whether your page is isolated:**\n\n```js\nif (crossOriginIsolated) {\n    // SharedArrayBuffer available — sleep works correctly\n} else {\n    // sleep will be a no-op (or use busySleepFallback: true for a CPU spin-wait)\n}\n```\n\n**Set up cross-origin isolation** by sending these two HTTP headers on your page (not just your assets — the HTML document itself):\n\n```\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: require-corp\n```\n\nCommon server configurations:\n\n```nginx\n# nginx\nadd_header Cross-Origin-Opener-Policy  \"same-origin\";\nadd_header Cross-Origin-Embedder-Policy \"require-corp\";\n```\n\n```apache\n# Apache (.htaccess or VirtualHost)\nHeader set Cross-Origin-Opener-Policy  \"same-origin\"\nHeader set Cross-Origin-Embedder-Policy \"require-corp\"\n```\n\n```js\n// Express\napp.use((req, res, next) => {\n    res.setHeader('Cross-Origin-Opener-Policy',  'same-origin');\n    res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');\n    next();\n});\n```\n\n```js\n// Vite (vite.config.js)\nexport default {\n    server: {\n        headers: {\n            'Cross-Origin-Opener-Policy':  'same-origin',\n            'Cross-Origin-Embedder-Policy': 'require-corp',\n        },\n    },\n};\n```\n\n```json\n// Vercel (vercel.json)\n{\n  \"headers\": [\n    {\n      \"source\": \"/(.*)\",\n      \"headers\": [\n        { \"key\": \"Cross-Origin-Opener-Policy\",  \"value\": \"same-origin\" },\n        { \"key\": \"Cross-Origin-Embedder-Policy\", \"value\": \"require-corp\" }\n      ]\n    }\n  ]\n}\n```\n\n```toml\n# Netlify (_headers file)\n/*\n  Cross-Origin-Opener-Policy: same-origin\n  Cross-Origin-Embedder-Policy: require-corp\n```\n\n> **Note:** COEP `require-corp` means every resource loaded by your page (images, scripts, fonts, iframes) must either be same-origin or served with a `Cross-Origin-Resource-Policy: cross-origin` header. If you load third-party resources that don't set this header, use `credentialless` instead of `require-corp` (supported in Chrome/Edge; Firefox support is in progress).\n\n**Fallback without cross-origin isolation:**\n\nIf you can't set the headers (e.g., a shared hosting environment), you can opt into a CPU-spinning busy-wait:\n\n```js\nawait runZshScript('sleep 1; echo done', { busySleepFallback: true });\n```\n\nThis actually sleeps for the right duration but burns CPU. Fine for short sleeps in development; avoid for long sleeps in production.\n\nDemo\n----\n\n[zsh-wasm demo site](https://github.com/brandonzylstra/zsh-wasm)\n\nLicense\n-------\n\nzsh-wasm's own code is under the Zsh license. See **`LICENSE`**, shipped in this\npackage.\n\n`zsh.wasm` is a single binary containing six separate codebases, and they are\nnot all under that license. **`THIRD_PARTY_LICENSES.md`**, also shipped here,\ncarries all six texts verbatim.\n\n| Bundled              | License                           |\n| -------------------- | --------------------------------- |\n| Zsh 5.9              | Zsh (MIT-like)                    |\n| OpenBSD sed          | BSD-3-Clause                      |\n| one-true-awk         | Lucent 1997                       |\n| Gavin Howard bc      | BSD-2-Clause                      |\n| sbase (17 coreutils) | MIT                               |\n| OpenBSD diff         | ISC + BSD-3-Clause + BSD-4-Clause |\n\nAll six are permissive and none conflicts with another. Two say something about\nnames in advertising, and they say opposite things: the Lucent terms ask that\nLucent not be named in advertising, and the Caldera terms covering OpenBSD\ndiff's `diffreg.c` ask that Caldera *be* acknowledged in advertising. Both bind\nadvertising material only — not the software, not its documentation.\nRedistributing this package does not trigger either.\n\nIf you redistribute the package or a bundle built from it, ship\n`THIRD_PARTY_LICENSES.md` along with it. That is what satisfies the notices.\n","readmeFilename":"README.md"}