diff --git a/CMakeLists.txt b/CMakeLists.txt
index e9b58ae296b8575332f7cc888d6f761b98ce8dbd..6f7b90a54157877037e442999541b4e324f7d59c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,7 @@ set(PROJECT_LABEL "libjami")
 option(JAMI_NATPMP "Build with NAT-PMP" ON)
 option(JAMI_PUPNP "Build with PUPNP" ON)
 option(JAMI_PLUGIN "Build with plugin support" ON)
+option(JAMI_NODEJS "Build the NODEJS binding" OFF)
 option(JAMI_JNI "Build the JNI binding" OFF)
 option(JAMI_DBUS "Build the DBUS binding" OFF)
 option(JAMI_VIDEO "Build with video support" ON)
@@ -36,6 +37,11 @@ endif()
 
 include(CTest)
 
+if(JAMI_NODEJS)
+    # Required for nodejs binding
+    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+endif()
+
 if(NOT MSVC)
     ################################################################################
     # Contrib
@@ -623,6 +629,72 @@ else()
 
     install (TARGETS ${PROJECT_NAME})
 
+    if (JAMI_NODEJS)
+        # Build nodejs binding
+        include (UseSWIG)
+        find_package(SWIG 4.2 COMPONENTS javascript REQUIRED)
+        file(GLOB NODEJS_INTERFACE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/*.i)
+        add_custom_command(
+            OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/jami_wrapper.cpp
+            COMMAND ${SWIG_EXECUTABLE} -v -c++ -javascript -node -o jami_wrapper.cpp nodejs_interface.i
+            DEPENDS
+            ${NODEJS_INTERFACE_FILES}
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs
+        )
+
+        # Generate binding.gyp
+        # We need to pass the link flags to node-gyp
+        set(_gyp_flags "")
+        get_target_property(_linked_libs ${PROJECT_NAME} LINK_LIBRARIES)
+        foreach(LIB IN LISTS _linked_libs)
+            if ("${LIB}" MATCHES "^PkgConfig::")
+                string(REPLACE "PkgConfig::" "" PKG_NAME ${LIB})
+                string(APPEND _gyp_flags " ${${PKG_NAME}_LDFLAGS}")
+            elseif ("${LIB}" MATCHES ".so$")
+                get_filename_component(LIB_DIRECTORY ${LIB} DIRECTORY)
+                get_filename_component(LIB_NAME_WE ${LIB} NAME_WE)
+                string(REPLACE "lib" "" LIB_NAME_WE ${LIB_NAME_WE})
+                string(APPEND _gyp_flags " -L${LIB_DIRECTORY} -l${LIB_NAME_WE}")
+            elseif (TARGET ${LIB})
+                # TODO generate cmake targets automatically
+                #string(APPEND _gyp_flags " $<TARGET_FILE:${LIB}>")
+            else()
+                string(APPEND _gyp_flags " -l${LIB}")
+            endif()
+        endforeach()
+
+        list(REVERSE _gyp_flags)
+        list(REMOVE_DUPLICATES _gyp_flags)
+        list(REVERSE _gyp_flags)
+
+        foreach(item ${_gyp_flags})
+            if (NOT "${QUOTED_JSON_LIST}" STREQUAL "")
+                set(QUOTED_JSON_LIST "${QUOTED_JSON_LIST},")
+            endif()
+            set(QUOTED_JSON_LIST "${QUOTED_JSON_LIST}\"${item}\"")
+        endforeach()
+        string(REPLACE ";" "," _gyp_flags_str ${QUOTED_JSON_LIST})
+
+        set(JAMI_LINK_LIBRARIES ${_gyp_flags_str})
+        set(JAMI_LINK_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR})
+        configure_file(
+            ${CMAKE_SOURCE_DIR}/bin/nodejs/binding.gyp.in
+            ${CMAKE_SOURCE_DIR}/bin/nodejs/binding.gyp
+        )
+
+        # Build nodejs binding
+        add_custom_target(jamid
+            ALL
+            COMMAND node-gyp rebuild --target=v18.19.1 --arch=x64
+            DEPENDS
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/binding.gyp
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/callback.h
+            ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/jami_wrapper.cpp
+            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs
+        )
+        add_dependencies(jamid ${PROJECT_NAME})
+    endif()
+
     if (JAMI_JNI)
         # Build jni binding
         add_library(${PROJECT_NAME}-jni SHARED ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp)
diff --git a/Dockerfile b/Dockerfile
index 24dfa9cd5713eeac55f33b71595b53c1c82921c2..60986c057cfd944d9df7b2f30c6fad53e1ac0f69 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
 FROM ubuntu:22.04 AS jami-daemon
 
 ARG DEBIAN_FRONTEND=noninteractive
-ARG config_args
+ARG cmake_args
 RUN apt-get update && apt-get install -y \
     autoconf \
     automake \
@@ -45,14 +45,16 @@ RUN apt-get update && apt-get install -y \
     guile-3.0-dev \
     nasm \
     pkg-config \
-    yasm
+    yasm \
+    libcppunit-dev \
+    sip-tester
 
 # Install Node
-RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
+RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
     apt-get install -y nodejs && \
     npm install -g node-gyp
 
-# Install latest Swig (4.1)
+# Install latest Swig (4.2)
 WORKDIR /swig
 RUN git clone https://github.com/swig/swig.git && \
     cd swig && \
@@ -62,17 +64,11 @@ RUN git clone https://github.com/swig/swig.git && \
     make install
 
 WORKDIR /daemon
-COPY contrib/ contrib/
-
-# Build daemon dependencies
-RUN mkdir -p contrib/native && \
-    cd contrib/native && \
-    ../bootstrap && \
-    make -j$(nproc)
 
 COPY . .
 
 # Build the daemon
-RUN ./autogen.sh && \
-    ./configure $config_args && \
+RUN mkdir -p build && \
+    cd build && \
+    cmake .. $cmake_args && \
     make -j$(nproc)
diff --git a/README.md b/README.md
index 1e931393efe1b28ffbea76e26527e95869c95f57..b6f1fe4d5aa58036c324607968773171e1511ebc 100644
--- a/README.md
+++ b/README.md
@@ -198,7 +198,7 @@ docker build --tag jami-daemon .
 # To build with custom build args
 
 ```bash
-docker build --tag jami-daemon --build-arg config_args="--with-nodejs" .
+docker build --tag jami-daemon --build-arg cmake_args="-DJAMI_NODEJS=On" .
 ```
 
 Common Issues
diff --git a/bin/nodejs/.gitignore b/bin/nodejs/.gitignore
index e83f9a84346328c49f9259cc55150a298c9ee758..2a02fa22ddbc7837dbe81679e0b4f2eb172395d5 100644
--- a/bin/nodejs/.gitignore
+++ b/bin/nodejs/.gitignore
@@ -1,2 +1,3 @@
 jami_wrapper.cpp
+binding.gyp
 build/
\ No newline at end of file
diff --git a/bin/nodejs/binding.gyp b/bin/nodejs/binding.gyp.in
similarity index 53%
rename from bin/nodejs/binding.gyp
rename to bin/nodejs/binding.gyp.in
index 7e2f7d87b48d32c324758d90d044ca3ff079085b..23f3b0d1c913aa4ca9faa1975f2bafea4b052c44 100644
--- a/bin/nodejs/binding.gyp
+++ b/bin/nodejs/binding.gyp.in
@@ -4,10 +4,12 @@
       "target_name": "jamid",
       "sources": [ "jami_wrapper.cpp" ],
       'include_dirs': ['../../src/'],
-      'libraries': ['-L<(module_root_dir)/../../src/.libs', '-ljami'],
+      "ldflags": ["-Wl,-Bsymbolic"],
+      'libraries': ['-L@JAMI_LINK_DIRECTORIES@', '-ljami-core', '-lyaml-cpp', @JAMI_LINK_LIBRARIES@],
       'cflags!': [ '-fno-exceptions' ],
       'cflags_cc!': [ '-fno-exceptions', '-fno-rtti', '-std=gnu++1y' ],
-      'cflags_cc': [ '-std=gnu++17' ]
+      'cflags_cc': [ '-std=gnu++17' ],
     }
-  ]
+  ],
+  'variables' : { 'openssl_fips': '' }
 }
\ No newline at end of file