Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Lua + libUV + jIT = pure awesomesauce
C Lua Makefile Python C++ JavaScript
Branch: legacy
Pull request Compare This branch is 2 commits ahead of luvit:legacy.
Failed to load latest commit information.
bin make luvit report building flags
deps bump openssl to 1.0.1L
examples Add main hook for bundle
include provide a fallback include/
lib/luvit Revert "Merge pull request #510 from squeek502/win32-path-fixes"
src add prepare bindings
tests Revert "Merge pull request #510 from squeek502/win32-path-fixes"
tools changed that MSVC linker whole program optimization does not strip Lu…
.gitattributes Use automatic text detection for everthing not explicitly set.
.gitignore Libuv and luajit upgrade plus 64-bit windows support
.gitmodules Libuv and luajit upgrade plus 64-bit windows support
.travis.yml prettier
ChangeLog bump to 0.10.0
LICENSE.txt Use Apache 2.0 License consistently throughout luvit
Makefile Add zipreader to core and expose instance as
NOTICE.txt Use Apache 2.0 License consistently throughout luvit
README.markdown add blurb for embedding
TODO Trim Whitespace
all.gyp add all target
api.markdown Trim Whitespace
cgi_parity.markdown Update CGI parity notes
common.gypi tweaks for OSX compilation
configure fix(gyp): 32bit luvit build fix
errors.markdown Trim Whitespace
jit deps: luajit: fix luajit build for gyp
luvit.gyp add prepare bindings comment the test script


Luvit (Lua + libUV + jIT = pure awesomesauce)

Build Status

Luvit is an attempt to do something crazy by taking node.js' awesome architecture and dependencies and seeing how it fits in the Lua language.

This project is still under heavy development, but it's showing promise. In initial benchmarking with a hello world server, this is between 2 and 4 times faster than node.js. Version 0.5.0 is the latest release version.

Do you have a question/want to learn more? Make sure to check out the mailing list and drop by our IRC channel, #luvit on Freenode.

-- Load the http library
local HTTP = require("http")

-- Create a simple nodeJS style hello-world server
HTTP.createServer(function (req, res)
  local body = "Hello World\n"
  res:writeHead(200, {
    ["Content-Type"] = "text/plain",
    ["Content-Length"] = #body

-- Give a friendly message
print("Server listening at http://localhost:8080/")

Building from git

Grab a copy of the source code:

git clone --recursive

To use the gyp build system run:

cd luvit
git submodule update --init --recursive
make -C out
tools/ test

To use the Makefile build system (for embedded systems without python) run:

cd luvit
make test


Luvit contains an extremely useful debug API. Lua contains a stack which is used to manipulate the virtual machine and return values to 'C'. It is often very useful to display this stack to aid in debugging. In fact, this API is accessible via C or from Lua.



Displays a backtrace of the current Lua state. Useful when an error happens and you want to get a call stack.

example output:

Lua stack backtrace: error
    in Lua code at luvit/tests/test-crypto.lua:69 fn()
    in Lua code at luvit/lib/luvit/module.lua:67 myloadfile()
    in Lua code at luvit/lib/luvit/luvit.lua:285 (null)()
    in native code
    in Lua code at luvit/lib/luvit/luvit.lua:185 (null)()
    in native code
    in Lua code at [string "    local path = require('uv_native').execpat..."]:1 (null)()


luv_lua_debug_stackdump(L, "a message");

Stackdump is extremly useful from within C modules.



Supports the following commands:

  • quit
  • exit
  • break
  • clear
  • clearall
  • trace
  • bt

The debugger will execute any arbitrary Lua statement by default.


A static library is generated when compiling Luvit. This allows for easy embedding into other projects. LuaJIT, libuv, and all other dependencies are included.

#include <string.h>
#include <stdlib.h>
#include <limits.h> /* PATH_MAX */

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#ifndef WIN32
#include <pthread.h>
#include "uv.h"

#include "luvit.h"
#include "luvit_init.h"
#include "luv.h"

int main(int argc, char *argv[])
  lua_State *L;
  uv_loop_t *loop;

  argv = uv_setup_args(argc, argv);

  L = luaL_newstate();
  if (L == NULL) {
    fprintf(stderr, "luaL_newstate has failed\n");
    return 1;


  loop = uv_default_loop();



  if (luvit_init(L, loop, argc, argv)) {
    fprintf(stderr, "luvit_init has failed\n");
    return 1;

  ... Run a luvit file from memory or disk ...
  ...    or call uv_run ...

  return 0;
Something went wrong with that request. Please try again.