Node.js as a sidecar
In this guide we are going to package a Node.js application to a self contained binary to be used as a sidecar in a Tauri application without requiring the end user to have a Node.js installation. This example tutorial is applicable for desktop operating systems only.
We recommend reading the general sidecar guide first for a deeper understanding of how Tauri sidecars work.
In this example we will create a Node.js application that reads input from the command line process.argv
and writes output to stdout using console.log.
You can leverage alternative inter-process communication systems such as a localhost server, stdin/stdout or local sockets.
Note that each has their own advantages, drawbacks and security concerns.
Prerequisites
An existing Tauri application set up with the shell plugin, that compiles and runs for you locally.
Guide
-
Let’s create a new Node.js project to contain our sidecar implementation. Create a new directory in your Tauri application root folder (in this example we will call it
sidecar-app) and run theinitcommand of your preferred Node.js package manager inside the directory:npm inityarn initpnpm initWe will compile our Node.js application to a self container binary using pkg. Let’s install it as a development dependency:
npm add @yao-pkg/pkg --save-devyarn add @yao-pkg/pkg --devpnpm add @yao-pkg/pkg --save-dev -
Write Sidecar Logic
Now we can start writing JavaScript code that will be executed by our Tauri application.
In this example we will process a command from the command line argmuents and write output to stdout, which means our process will be short lived and only handle a single command at a time. If your application must be long lived, consider using alternative inter-process communication systems.
Let’s create a
index.jsfile in oursidecar-appdirectory and write a basic Node.js app:sidecar-app/index.js const command = process.argv[2];switch (command) {case 'ping':const message = process.argv[3];console.log(`pong, ${message}`);break;default:console.error(`unknown command ${command}`);process.exit(1);} -
To package our Node.js application to a self contained binary, we can run the following
pkgcommand:npm run pkg -- --output appyarn pkg --output apppnpm pkg --output appThis will create the
sidecar-app/appbinary on Linux and macOS, and asidecar-app/app.exeexecutable on Windows. To rename this file to the expected Tauri sidecar filename, we can use the following Node.js script:import { execSync } from 'child_process';import fs from 'fs';const ext = process.platform === 'win32' ? '.exe' : '';const rustInfo = execSync('rustc -vV');const targetTriple = /host: (\S+)/g.exec(rustInfo)[1];if (!targetTriple) {console.error('Failed to determine platform target triple');}fs.renameSync(`app${ext}`,`../src-tauri/binaries/app-${targetTriple}${ext}`); -
Configure the Sidecar in the Tauri Application
Now that we have our Node.js application ready, we can connect it to our Tauri application by configuring the
bundle > externalBinarray:src-tauri/tauri.conf.json {"bundle": {"externalBin": ["binaries/app"]}}The Tauri CLI will handle the bundling of the sidecar binary as long as it exists as
src-tauri/binaries/app-<target-triple>. -
We can run the sidecar binary either from Rust code or directly from JavaScript.
Let’s execute the
pingcommand in the Node.js sidecar directly:import { Command } from '@tauri-apps/plugin-shell';const message = 'Tauri';const command = Command.sidecar('binaries/app', ['ping', message]);const output = await command.execute();const response = output.stdout;Let’s pipe a
pingTauri command to the Node.js sidecar:#[tauri::command]async fn ping(app: tauri::AppHandle, message: String) -> String {let sidecar_command = app.shell().sidecar("app").unwrap().arg("ping").arg(message);let output = sidecar_command.output().unwrap();let response = String::from_utf8(output.stdout).unwrap();response}
© 2025 Tauri Contributors. CC-BY / MIT