README.md

November 26, 2025 · View on GitHub

zeroperl is an experimental build of Perl5 in a sandboxed, self-contained WebAssembly module.

Read the full blog here

Build

Requires Docker or Apple Container (macOS).

Docker:

docker build -t zeroperl .
mkdir -p output
docker run --rm -v $(pwd)/output:/output zeroperl cp -r /artifacts/. /output/

Apple Container (macOS):

container build -t zeroperl .
mkdir -p output
container run --rm -v $(pwd)/output:/output zeroperl cp -r /artifacts/. /output/

Output in ./output/:

  • zeroperl.wasm — reactor with asyncify
  • zeroperl_reactor.wasm — reactor without asyncify
  • perl-wasi-prefix/ — Perl library prefix
  • exiftool.min.pl — minified ExifTool (if enabled)

Build args

Docker:

docker build --build-arg PERL_VERSION=5.42.0 --build-arg BUILD_EXIFTOOL=false -t zeroperl .

Apple Container:

container build --build-arg PERL_VERSION=5.42.0 --build-arg BUILD_EXIFTOOL=false -t zeroperl .
Available build arguments
ArgDefault
PERL_VERSION5.42.0Perl source version
EXIFTOOL_VERSION13.42ExifTool version
BUILD_EXIFTOOLtrueInclude ExifTool
STACK_SIZE8388608WASM stack (bytes)
INITIAL_MEMORY33554432WASM initial memory (bytes)
ASYNCIFYtrueEnable asyncify
TRIMtrueStrip unused modules

Iterating on stubs/zeroperl.c

Build from final stage to reuse cached wasi-perl:

Docker:

docker build --target final -t zeroperl .

Apple Container:

container build --target final -t zeroperl .

Testing

The easiest way to test a new build of zeroperl.wasm is to clone the TypeScript wrapper and run its test suite:

git clone https://github.com/6over3/zeroperl-ts

See the zeroperl-ts README for details.

Usage

Note: The first argument passed to Perl must be zeroperl. Depending on your runtime, you may need to map /dev/null as a preopen.