Skip to content
Write and compile WebAssembly code with Lua
Branch: master
Clone or download
Latest commit 441e3ef Dec 20, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Markdown example Dec 16, 2018
src Remove lua_close Dec 20, 2018
.gitignore Ensure lua_State is initialized Nov 8, 2018
Dockerfile Support typed arguments, return types Oct 22, 2018
LICENSE Initial commit Oct 11, 2018 Support output file Nov 19, 2018


Write and compile as WebAssembly program by lua script.

Note: this project is still under development. We have to do more improvement


To avoid to polute your environment, we stringly prefer to use prebuilt docker image on docker hub.

How to use

Write lua script

Here is example Hello World script:

function hello_world()
  return 'Hello, WebAssembly Lua!'

Make sure the function declares as global in order to access from C program. And, also you can spcify some function arguments like:

function hello_something(something):
  return ('Hello, %s!'):format(something)

Then, you need to rememeber what type of argument should be supplied and what type of value will return (supports string or int for now).

Write definitions in definition.yml

The definition.yml is configuration for generate / compile WebAssembly binary. Format is following:

  - luaposix

    return : string
      - string

entry_file: hello_world.lua
output_file: hello_world.html

Describes each fields:

Field Type Default description
dependencies array - program dependencies. the list of modules will be installed via luarocks.
functions object - Function definitions. The key is function name which will be exported on WASM.
functions[name].return string - Define function return type.
functions[name].args array - Defined function argument type list.
entry_file strring main.lua the file name of program entry.
output_file strring - the file name of output files.

Compile as WebAssembly program

On docker image, the image has emcc-lua command:

$ docker pull ysugimoto/webassembly-lua
$ docker run --rm -v $PWD:/src ysugimoto/webassembly-lua emcc-lua

The emcc-lua finds definition.yml in current working directory (in this case, $PWD) and start to build. If build successfully, you can see a hello_world.[html,js,wasm] in your directory. The output file is named by entry_file in definition.yml.

Run WebAssembly program

Open created or write HTML to run compiled WebAssembly program like:

<!doctype html>
    <meta charset="UTF-8">
    <title>WebAssembly Lua</title>
    <script src="./hello_world.js"></script>
    Module.onRuntimeInitialized = () => {
      // call your function through the Module.cwrap()
      const helloSomething = Module.cwrap('hello_something', 'string', ['string']);
      console.log(helloSomething('WebAssembly Lua'));

And run local server in your favorite way (e.g python -m http.server) and access to http://localhost:8000/hello_world.html (port may need), then you can see Hello, WebAssembly Lua! message in your browser console.


  • Compile single lua script to WebAssembly binary
  • Support for return type of string and int
  • Support to call function with any arguments
  • Enable to bundle some libraries (e.g. hosted on luarocks, or Independent C libraries)


  • Support to require other lua modules which you defined as other file, installed via luarocks
  • Support to apply function arguments as detected types
  • Works with more complicated script. Now we can work on simple script.
  • Support some structured return type which can use in JavaScript (Array, Object -- especially JSON --)
  • Try to compile various libraries (Now we tried to bundle luaposix, it's fine to work)


Yoshiaki Sugimoto



You can’t perform that action at this time.