A maintained fork of the original Warp project with updated tooling, improved cross-platform builds, and compatibility fixes for modern systems.
This fork focuses on reliable multi-platform builds using Rust, Zig, and cargo-zigbuild, producing binaries for Linux, Windows, and macOS (including Apple Silicon).
- Changes in v1.2.0
- Changes in v1.0.0
- Prebuilt Binaries
- Supported Platforms
- Quickstart with Node.js
- Quickstart with .NET Core
- Quickstart with Java
- How it Works
- macOS Security Considerations
- Authors
- License
- Added macOS Universal binary support (
universal2-apple-darwin), allowing the same executable to run on both Intel and Apple Silicon Macs. - Simplified the cross-compilation toolchain by switching fully to cargo-zigbuild and Zig, removing the need for
osxcross, macOS SDK downloads, and additional signing tools.
This fork introduces several improvements and compatibility fixes compared to the original Warp repository. For a full comparison, see the diff.
The default invocation has changed from:
warp-packer <args>to:
warp-packer pack <args>-i, --input-dir: Directory with your application and dependencies-q, --unique-id: Creates a unique ID for each package (for testing/multiple versions)-p, --prefix: Set a custom name for the extraction directory-n, --no-clean: Prevents overwriting extracted versions in the cache
Prebuilt warp-packer binaries are available on the
GitHub Releases page.
Available platforms:
- Linux (x64, aarch64)
- Windows (x64, aarch64)
- macOS (x64, aarch64, universal)
Example download (Linux x64):
curl -Lo warp-packer \
https://github.com/kirbylink/warp/releases/latest/download/linux-x64.warp-packer
chmod +x warp-packer| Platform | Architecture | Binary |
|---|---|---|
| Linux | x64 | ✅ |
| Linux | ARM64 | ✅ |
| Windows | x64 | ✅ |
| Windows | ARM64 | ✅ |
| macOS | Intel | ✅ |
| macOS | Apple Silicon | ✅ |
| macOS | Universal | ✅ |
Create the directory for the application
mkdir myapp
cd myappCreate main application - app.js
var lodash = require('lodash');
var output = lodash.without([1, 2, 3], 1);
console.log(output);Download Node.js distribution
wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz
xz -dc node-v8.12.0-linux-x64.tar.xz | tar xvf -Install dependencies
node-v8.12.0-linux-x64/bin/npm install lodashRemove unneeded files
rm -r node-v8.12.0-linux-x64/include node-v8.12.0-linux-x64/share node-v8.12.0-linux-x64/lib
rm node-v8.12.0-linux-x64/bin/npm node-v8.12.0-linux-x64/bin/npxCreate launcher script - launch
#!/bin/sh
NODE_DIST=node-v8.12.0-linux-x64
APP_MAIN_JS=app.js
DIR="$(cd "$(dirname "$0")" ; pwd -P)"
NODE_EXE=$DIR/$NODE_DIST/bin/node
NODE_PATH=$DIR/node_modules
APP_MAIN_JS_PATH=$DIR/$APP_MAIN_JS
exec $NODE_EXE $APP_MAIN_JS_PATH $@Make the launcher script executable
chmod +x launchDownload warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
cd ..
curl -Lo warp-packer https://github.com/kirbylink/warp/releases/latest/download/linux-x64.warp-packer
chmod +x warp-packerCreate your self-contained application
./warp-packer pack --arch linux-x64 --input-dir myapp --exec launch --output myapp.bin
chmod +x myapp.binRun your self-contained application
./myapp.bin
[ 2, 3 ]More information about your self-contained application
file myapp.bin
myapp.bin: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=aa53b01be2cde5e0b64450870b1af13b52d5cffb, with debug_info, not stripped
du -hs myapp.bin
17M myapp.binCreate the directory for the application
mkdir myapp
cd myappCreate main application - app.js
var lodash = require('lodash');
var output = lodash.without([1, 2, 3], 1);
console.log(output);Download Node.js distribution
curl -Lo node-v8.12.0-darwin-x64.tar.gz https://nodejs.org/dist/v8.12.0/node-v8.12.0-darwin-x64.tar.gz
tar xvfz node-v8.12.0-darwin-x64.tar.gzInstall dependencies
PATH=node-v8.12.0-darwin-x64/bin npm install lodashRemove unneeded files
rm -r node-v8.12.0-darwin-x64/include node-v8.12.0-darwin-x64/share node-v8.12.0-darwin-x64/lib
rm node-v8.12.0-darwin-x64/bin/npm node-v8.12.0-darwin-x64/bin/npxCreate launcher script* - launch
#!/bin/sh
NODE_DIST=node-v8.12.0-darwin-x64
APP_MAIN_JS=app.js
DIR="$(cd "$(dirname "$0")" ; pwd -P)"
NODE_EXE=$DIR/$NODE_DIST/bin/node
NODE_PATH=$DIR/node_modules
APP_MAIN_JS_PATH=$DIR/$APP_MAIN_JS
exec "$NODE_EXE" "$APP_MAIN_JS_PATH" $@Make the launcher script executable
chmod +x launchDownload warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
cd ..
curl -Lo warp-packer https://github.com/kirbylink/warp/releases/latest/download/macos-x64.warp-packer
chmod +x warp-packerCreate your self-contained application
./warp-packer pack --arch macos-x64 --input-dir myapp --exec launch --output myapp.bin
chmod +x myapp.binRun your self-contained application
./myapp.bin
[ 2, 3 ]More information about your self-contained application
file myapp.bin
myapp.bin: Mach-O 64-bit executable x86_64
du -hs myapp.bin
26M myapp.binCreate the directory for the application
mkdir myapp
cd myappCreate main application - app.js
var lodash = require('lodash');
var output = lodash.without([1, 2, 3], 1);
console.log(output);Download Node.js distribution
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-win-x64.zip -OutFile node-v8.12.0-win-x64.zip
Expand-Archive .\node-v8.12.0-win-x64.zip -DestinationPath .\Install dependencies
.\node-v8.12.0-win-x64\npm install lodashRemove unneeded files
rmdir -Recurse .\node-v8.12.0-win-x64\node_modules\npmCreate launcher script* - launch.cmd
@ECHO OFF
SETLOCAL
SET "NODE_DIST=node-v8.12.0-win-x64"
SET "APP_MAIN_JS=app.js"
SET "NODE_EXE=%~dp0\%NODE_DIST%\node.exe"
SET "NODE_PATH=%~dp0\%NODE_DIST%\node_modules"
SET "APP_MAIN_JS_PATH=%~dp0\%APP_MAIN_JS%"
CALL %NODE_EXE% %APP_MAIN_JS_PATH% %*
EXIT /B %ERRORLEVEL%Download warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
cd ..
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" ; Invoke-WebRequest https://github.com/kirbylink/warp/releases/latest/download/windows-x64.warp-packer.exe -OutFile warp-packer.exeCreate your self-contained application
.\warp-packer --arch windows-x64 --input-dir .\myapp\ --exec launch.cmd --output myapp.exeRun your self-contained application
.\myapp.exe
[ 2, 3 ]
PS $HOME>More information about your self-contained application
"{0:N2} MB" -f ((Get-Item myapp.exe).Length / 1MB)
9.15 MBCreate a simple console application
mkdir myapp
cd myapp
dotnet new console
dotnet run
Hello World!Publish the application with native installer for linux-x64 runtime
dotnet publish -c Release -r linux-x64The application should be published to bin/Release/netcoreapp2.1/linux-x64/publish/
Download warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
curl -Lo warp-packer https://github.com/kirbylink/warp/releases/latest/download/linux-x64.warp-packer
chmod +x warp-packerCreate your self-contained application
./warp-packer pack --arch linux-x64 --input-dir bin/Release/netcoreapp2.1/linux-x64/publish --exec myapp --output myapp
chmod +x myappRun your self-contained application
./myapp
Hello World!More information about your self-contained application
file myapp
myapp: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=13b12e71a63ca1de8537ad7e90c83241f9f87f6c, with debug_info, not stripped
du -hs myapp
34M myappCreate a simple console application
mkdir myapp
cd myapp
dotnet new console
dotnet run
Hello World!Publish the application with native installer for osx-x64 runtime
dotnet publish -c Release -r osx-x64The application should be published to bin/Release/netcoreapp2.1/osx-x64/publish/
Download warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
curl -Lo warp-packer https://github.com/kirbylink/warp/releases/latest/download/macos-x64.warp-packer
chmod +x warp-packerCreate your self-contained application
./warp-packer pack --arch macos-x64 --input-dir bin/Release/netcoreapp2.1/osx-x64/publish --exec myapp --output myapp
chmod +x myappRun your self-contained application
./myapp
Hello World!More information about your self-contained application
file myapp
myapp: Mach-O 64-bit executable x86_64
du -hs myapp
27M myappCreate a simple console application
mkdir myapp
cd myapp
dotnet new console
dotnet run
Hello World!
PS $HOME\myapp>Publish the application with native installer for win10-x64 runtime
dotnet publish -c Release -r win10-x64The application should be published to bin/Release/netcoreapp2.1/win10-x64/publish/
Download warp-packer
If you save warp-packer in a directory in your PATH, you only need to download it once.
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" ; Invoke-WebRequest https://github.com/kirbylink/warp/releases/latest/download/windows-x64.warp-packer.exe -OutFile warp-packer.exeCreate your self-contained application
.\warp-packer --arch windows-x64 --input-dir bin/Release/netcoreapp2.1/win10-x64/publish --exec myapp.exe --output myapp.exeRun your self-contained application
.\myapp.exe
Hello World!
PS $HOME\myapp>More information about your self-contained application
"{0:N2} MB" -f ((Get-Item myapp.exe).Length / 1MB)
28.51 MBWarp can package Java JARs along with a minimal JRE and startup scripts.
🧠 Tip: If you want to skip the manual steps below, check out
java-warp4j— a Java-based tool that automates all of this: It handles JDK downloads,jlink, script creation, and even runswarp-packerinternally.
- Create a Hello World app:
// HelloWorld.java
public final class HelloWorld {
public static void main(final String[] args) {
System.out.println("Hello, world.");
}
}- Compile and bundle as JAR:
javac HelloWorld.java
jar cvfe app.jar HelloWorld HelloWorld.class- Download and unpack a JRE (e.g., from Adoptium):
wget https://.../OpenJDK8U-jre_x64_linux_hotspot_8u412b08.tar.gz
tar -xvf OpenJDK8U-jre_x64_linux_hotspot_8u412b08.tar.gz- Create a bundle folder:
mkdir bundle
cp -r jdk-folder bundle/jre
cp app.jar bundle/- Add a launcher script (
bundle/run.sh):
#!/bin/bash
DIR="$(cd "$(dirname "$0")"; pwd)"
exec "$DIR/jre/bin/java" -jar "$DIR/app.jar" "$@"- Make script executable:
chmod +x bundle/run.sh- Download warp-packer (if not already in PATH):
curl -Lo warp-packer https://github.com/kirbylink/warp/releases/latest/download/linux-x64.warp-packer
chmod +x warp-packer- Create your binary:
./warp-packer pack --arch linux-x64 --input-dir bundle --exec run.sh --output app.bin
chmod +x app.bin- Run your binary:
./app.binWarp combines your runtime and application into a single file using two tools:
warp-runner: The runtime stub that extracts and launches your appwarp-packer: CLI tool that builds the binary, compresses files, and fetcheswarp-runner
The first execution unpacks your app to a cache directory and runs it. Subsequent executions run directly.
- Linux:
$HOME/.local/share/warp/ - macOS:
$HOME/Library/Application Support/warp/ - Windows:
%LOCALAPPDATA%\warp\
Recent versions of macOS include security mechanisms such as Gatekeeper and the quarantine attribute.
When distributing macOS binaries created with warp-packer, users may encounter warnings if the executable:
- is not signed with an Apple Developer certificate, or
- was downloaded from the internet, which automatically adds a quarantine attribute.
In some cases macOS may display messages such as:
- “The application is damaged and can't be opened.”
- “This app cannot be opened because it is from an unidentified developer.”
For local testing, the quarantine attribute can be removed using:
xattr -d com.apple.quarantine <binary>Alternatively, developers distributing macOS applications should consider proper code signing and notarization using Apple's developer tools.
The build process used in this repository applies an ad-hoc code signature to the generated macOS binaries to improve compatibility, but this is not a replacement for official Apple code signing.
- Original Author: Diego Giagio
<diego@giagio.com> - Modifications and enhancements by: @kirbylink
This project is licensed under the MIT License – see the LICENSE file for details.
- Buckaroo: C++ package manager
- Buck (Warp): Build system wrapper
